Skip to content

Commit

Permalink
deploy: 스타카토 v1.0.0 #310 (#311)
Browse files Browse the repository at this point in the history
* build: 프로젝트 생성 및 의존성 추가

* chore: 사용자 기능 및 권한 추가

* chore: gitignore 재설정

* chore: gitigonre .idea/ 추가

* build: develop-an 브랜치의 CI 설정 #3 (#10)

* build: android-ci.yml 파일 생성

* chore: 오타 및 개행 수정

* chore: working-directory 수정

* build: ktLint 적용 및 format

* ui: 디자인 시스템 구현 #11 (#44)

* ui: color 정의

* ui: shape, selector 추가

* ui: icon 추가

* ui: font family 추가

- pretendard regular, medium, semibold, bold 추가

* ui: typography 정의

* ui: strings 정의

* ui: bottom sheet drag handle drawable 추가

* ui: styles 정의

* ui: detail toolbar 구현

- 상세 화면에서 사용

* ui: dialog, bottom sheet 구현

- 여행 및 방문 기록 삭제 dialog
- 사진 등록 bottom sheet

* ui: 사진 첨부 layout 구현

* feat: 삭제 다이얼로그, 사진 첨부 바텀 시트 fragment 추가

* ui: 세로모드로 고정

* build: data binding 의존성 추가

* style: strings resource 순서 정렬

* style: formatting

* ui: plus icon 추가

* feat: jetpack navigation 및 바텀시트 프래그먼트 추가 #12 (#15)

* build: androidx.navigation 및 dataBinding 의존성 추가

* feat: Binding 화면 클래스 및 bottomSheetNavigation 추가

* feat: TimelineFragment 임시 화면 추가

* feat: TravelFragment 임시 화면 추가

* feat: TravelCreationFragment 임시 화면 추가

* feat: VisitFragment 임시 화면 추가

* feat: VisitCreationFragment 임시 화면 추가

* feat: (여행, 방문 기록) 수정 화면 추가

* feat: (여행, 방문 기록) 생성 화면 이동 구현

* feat: BottomSheetController 설정 및 Navigation 이동 구현

* feat: 뒤로가기 버튼 클릭 시 BottomSheet, Toast 작동 구현

* feat: 여행, 방문 기록 생성을 위한 액티비티 추가 및 이동 구현

* feat: 여행, 방문 기록 수정을 위한 액티비티 추가 및 이동 구현

* build: 중복된 dataBinding 제거

* feat: 공통 이미지 로딩 BindingAdapter 설정 #33 (#41)

* build: dataBinding 사용 설정

* feat: 이미지 로딩 바인딩 어댑터 설정

- Glide, Coil 바인딩 어댑터를 각각 작성
- placeholder 설정

* style: ktlint check

- import 순서 조정

* fix: attribute 개수에 맞추어 BindingAdapter의 value 재설정

* style: 마지막 줄 개행 추가

* feat: placeHolder를 필수 속성으로 변경 및 coil 이미지 로딩 코드 수정

- placeHolder를 ImageView의 필수 속성으로 지정
- Coil BindingAdapter에서 url이 null인 경우에도 이미지를 로드하는 동작이 수행되도록 수정

* ui: 상단바 색상 변경

* build: develop-an의 CI 설정 수정 #38 (#39)

- Git Action에 Secret으로 저장된 LOCAL_PROPERTIES_API_KEY를 변수로 가져온다.
- 가져온 변수를 echo를 활용하여 local.properties에 설정한다.

* build: develop-an 브랜치의 CI 파일 문법 오류 수정 #45 (#46)

* �fix: android-ci.yml 파일의 명령어 수정

LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정

* �fix: android-ci.yml 파일의 명령어 수정 #47 (#48)

LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정

* fix: 파이프라인 제거하여 명령어 수정

* fix: develop-an 브랜치의 CI 파일 명령어 재수정 #47 (#49)

* �fix: android-ci.yml 파일의 명령어 수정

LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정

* fix: 파이프라인 제거하여 명령어 수정

---------

Co-authored-by: Somin Lee <[email protected]>

* fix: 문자열 임을 명시하고 환경변수 설정 위치 조정

* fix: local.properties 생성 시점 수정

* feat: 데이터 패키지 설정 #13 (#35)

* build: 서버 base url의 local.properties 사용 설정 및 BuildConfig 설정

* feat: Retrofit Client 작성

* fix: Merge Conflict 해결

- build.gradle.kts(project, app)의 ktlint 의존성 충돌 해결
- 버전 카탈로그 플러그인 충돌 해결

* feat: DTO 클래스 작성

* style: ktlint check

- 불필요한 import 제거
- 개행 조정
- 콤마 추가

* feat: SerialName 어노테이션의 값을 camelCase로 수정

* refactor: DTO 클래스의 이름 수정

- API 요청으로 직접 보내거나 들어오는 JSON의 경우 DTO 클래스명 뒤에 Request/Response 를 붙이도록 설정
- JSON 안에 속성 값으로 들어가는 JSON은 DTO 클래스명 뒤에 Dto를 붙이도록 설정

* feat: 누락된 Dto 클래스 추가

TimelineResponse.kt
- 타임라인 조회 시 여행 상세 목록을 불러올 때 사용되는 DTO 클래스
- TimelineTravelDto 리스트를 갖는다

* style: ktlint check

* fix: const 키워드 제거

---------

Co-authored-by: hxeyexn <[email protected]>

* feat: 둥근 모서리의 이미지를 로드하는 BindingAdapters 추가 #58 (#59)

* feat: 둥근 모서리로 이미지를 로딩하는 Glide 바인딩 어댑터 작성

- 세 속성이 모두 필요하다.
- glideRoundedCornerImageUrl: 출력하고자 하는 이미지 url
- glidePlaceHolder: placeHolder의 url
- glideRoundingRadius: 모서리의 둥근 정도를 Int로 설정

* feat: 둥근 모서리로 이미지를 로딩하는 Coil 바인딩 어댑터 작성

- 세 속성이 모두 필요하다.
- coilRoundedCornerImageUrl: 출력하고자 하는 이미지 url
- coilPlaceHolder: placeHolder의 url
- coilRoundingRadius: 모서리의 둥근 정도를 Float으로 설정

* fix: centerCrop 설정을 BindingAdapter 에 위임

- xml 속성으로 centerCrop을 주게 되면 Round Corner가 제대로 적용되지 않는 현상 발생
- Glide의 api로 제공되는 centerCrop() 메서드를 활용

* ui: 타임라인 프래그먼트(BottomSheet) 구현 #55 (#71)

* ui: 타임라인 View xml 파일 작성

- 타임라인에 나타날 여행 상세 아이템 xml 작성
  - 썸네일 사진 유무에 따라 뷰를 구분
- 타임라인이 나타날 fragment xml 작성

* feat: 타임라인 여행 상세 아이템 UI 모델 생성

* ui: 썸네일이 없는 여행상세 아이템의 margin 조정

* ui: Timeline RecyclerView의 layoutManager 설정

* ui: xml에서의 UiModel 데이터 바인딩 설정

* feat: ViewHolder 작성

- 썸네일 사진 유무에 따라 다른 ViewHolder로 구분
- 공통된 속성을 정의한 TimelineViewHolder 추상클래스 생성

* feat: TimelineRepository Interface 생성

* feat: 임시 TimelineRepository 구현체 생성

* feat: TimelineViewModel 및 Factory 생성

* feat: TimelineViewType 작성

* feat: TimelineAdapter 작성

* feat: TimelineFragment에 ViewModel과 Adapter 구현

* feat: 이미지 로딩 PlaceHolder drawable 추가 및 적용

* feat: 임시 데이터 연결

* ui: Timeline fragment 의 세부 설정 조정

* ui: Timeline의 Item xml 변경

- 뷰 타입을 3개로 분할: 첫 번째 아이템, 중간 아이템, 마지막 아이템
- 이에 따라 xml 파일 추가 및 view 수정

* feat: ViewType 변경에 따른 Adapter 및 ViewHolder 수정

* refactor: 불필요한 View 및 ViewHolder 제거

* feat: 여행 click 에 대한 event handler 생성 및 설정

* refactor: drawable 이름을 네이밍 컨벤션에 맞게 수정

* ui: RecyclerView의 마진 속성을 패딩 속성으로 변경

* feat: 바텀 시트 디자인 변경 및 툴바와의 상호작용 구현

* ui: 타임라인 글귀 추가

* style: ktlint check

* ui: 둥근 모서리의 이미지로 변경

* ui: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 구현 #52 (#74)

* ui: typography.body textSize 1sp 씩 증가

* feat: DeleteDialogFragment에 Handler 추가

* feat: 툴바의 수정, 삭제 버튼 제어를 위한 ToolbarHandler 추가

* feat: 방문 상세 화면을 위한 VisitDetailUiModel 추가

* ui: PlaceHolder를 위한 xml 파일 추가

* feat: 방문 기록 상세 화면을 위한 VisitAdapter 및 VisitViewHolder 구현

* feat: 임시 VisitViewModel와 VisitViewModelFactory 추가

* feat: VisitFragment 화면 구현

* feat: 방문 기록에 해당하는 여행 선택을 위한 TravelSelectionFragment 구현

* feat: 방문 기록에 해당하는 날짜 선택을 위한 VisitedAtSelectionFragment 구현

* feat: 방문 기록 생성을 위한 VisitCreationActivity 구현

* feat: 방문 기록 수정을 위한 VisitUpdateActivity 구현

* refactor: DialogHandler를 DeleteDialogFragment의 생성자에서 받도록 수정

* refactor: initVisitUpdateDoneButton 중복 로직 제거

* refactor: VisitViewHolderType 메서드 명 변경 of -> from

* refactor: tv_place_name_title을 xml id convention에 맞게 수정

* ui: 여행 화면 구현 #51 (#75)

* ui: 함께 간 사람들 item 구현

* ui: 방문 기록 item 구현

* ui: 여행 상세 화면 구현

* ui: 여행 생성 화면 구현

* ui: 여행 수정 화면 구현

* ui: placeholder에 사용할 drawable 추가

* ui: 여행 삭제 완료 string 추가

* feat: 둥근 모서리 이미지 BindingAdapter 구현

* feat: 함께 간 사람들 adapter 구현

* ui: 여행 상세 화면 NestedScrollView로 변경

- 이전: ScrollView
- 이후: NestedScrollView

* feat: 방문 기록 adapter 구현

* feat: 여행 상세 view 연결

* feat: 함께 간 사람들, 방문 기록 adapter 연결

* feat: 삭제 다이얼로그 handler 구현

* feat: 여행 상세 화면 toolbar handler 구현

- 뒤로가기
- 여행 수정 화면으로 이동
- 삭제 다이얼로그 show

* feat: 여행 -> 방문 기록 화면 이동 구현

* ui: DatePickerStyle 추가

- DatePickerStyle, CustomMaterialCalendarStyle 추가
- staccato_blue 투명도 30 추가

* feat: 여행 저장 버튼, 여행 기간 BindingAdapter 추가

* feat: 여행 생성 view 연결

* feat: 여행 수정 view 연결

* style: formatting
- Exceeded max line length 해결
- 임시 이미지 URL 변경

* refactor: 기간 선택 로직 메서드 분리

* feat: 타임라인의 API 적용 및 MainActivity의 Toolbar 제거 #81 (#93)

* refactor: UI Model의 패키지 경로 변경

* refactor: API 명세 변경에 따른 TimelineTravelDto 수정

* refactor: repository 메서드 수정

- 서버 요청을 비동기적으로 처리하기 위해 suspend 키워드 삽입
- 기존의 임시 데이터 요청 코드를 위해 load 메서드 분리

* feat: Timeline의 API Service 작성

* feat: DataSource 인터페이스 작성

* feat: TimelineDataSource 구현체 생성

* refactor: 년도에 대한 default parameter 설정

* refactor: DataSource의 요청 메서드 네이밍 수정

* feat: http 통신이 가능하도록 Cleartext Traffic 허용 설정

* feat: Authorization Header를 삽입하기 위한 Interceptor 생성

* feat: Client에 HeaderInterceptor 추가

* refactor: errorBody의 message 속성 이름 변경

* feat: 도메인 모델 작성

* feat: Response(dto)에서 도메인 모델로 변환하는 확장함수 구현

* feat: 도메인 모델에서 UI 모델로 변환하는 확장함수 구현

* feat: Repository 수정 및 ViewModel 데이터 연결

* ui: MainActivity의 상단 툴바 제거

* refactor: ViewType에 viewType 속성 추가 및 when에서의 enum 활용

* refactor: Timeline의 공통 ViewHolder를 sealed class로 변경

* style: ktlint check 수행

* fix: Response 데이터의 nullable 속성에 맞추어 DTO 수정 및 누락된 DTO 추가

* fix: 데이터가 비어있는 경우(초기)에만 새로운 여행상세 목록을 받도록 수정

* refactor: lazy 로 지연 초기화 및 timelineService가 하나의 인스턴스로 관리되도록 수정

* fix: Travel의 description에 nullable 속성 추가

API 명세서 잘 좀 보자 제발

* refactor: create 메서드를 private으로 변경

Client 클래스에서 Service를 create 하여 제공 및 캐싱하기 때문에, 불필요한 인스턴스를 생성하지 않도록 create를 public으로 두지 않는 것이 좋다.

* refactor: LocalDateConverters의 패키지 경로 수정

* refactor: 파일의 이름 수정

* style: ktlint check

* refactor: 에러 메시지 상수화

* feat: 특정 여행 상세 조회 api 연결 #82 (#97)

* feat: 특정 여행 상세 조회 api service 구현

* feat: 썸네일, 소개 타입 변경 및 기본 인자 설정

- 변경 data class :  TravelResponse, TravelUiModel
- 이전: String
- 이후: String?

* refactor: MatesUiModel 네이밍 변경

MatesUiModel이 공통적으로 사용될 예정이므로 MemberUiModel로 변경

- 이전: MatesUiModel
- 이후: MemberUiModel

* refactor: VisitUiModel 네이밍 변경

- 여행 상세 방문 기록에 사용되는 UiModel 이름을 명시적으로 변경
- 이전: VisitUiModel
- 이후: TravelVisitUiModel

* feat: 특정 여행 상세 조회에 사용할 domain model 추가

* feat: Api 응답 핸들링 로직 구현

* feat: 특정 여행 상세 조회 data source 구현

* feat: 특정 여행 상세 조회 repository 구현

* feat: 특정 여행 상세 조회 api 연결

* feat: 특정 여행 상세 조회 로직 매개변수 추가

- 타임라인에서 선택된 여행 id를 매개변수로 받도록 변경

* refactor: ApiResponseHandler 이름 오타 수정

* refactor: 에러 메세지 상수화

* feat: 특정 여행 상세 조회 시그니처 변경

- HeaderInterceptor 적용으로 authorization 매개변수 제거

* style: formatting

* feat: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 API 연결 #79 (#99)

* feat: VisitApiService 인터페이스 및 관련 data class 추가

* feat: VisitRepository, RemoteVisitDataSource 및 관련 class 추가

* feat: 각 Visit 화면들의 ViewModelFactory 구현

* feat: 각 Visit 화면들의 UiModel 클래스 및 Mapper 추가

* feat: 여행 선택 및 방문 날짜 선택을 위한 BottomSheetDialogFragment 수정

* feat: VisitFragment API 연결

* feat: VisitCreationActivity API 연결

* feat: VisitUpdateActivity API 연결 준비

* refactor: visitApiService를 StaccatoClient object로 이동

* refactor: TravelVisit 클래스의 visitImage 변수 nullable하게 수정

* refactor: VisitApiService의 중복된 @Header 제거

* refactor: 방문 생성 성공 시 created id를 가져오도록 리팩터링

* chore: 변수명 visitImage로 수정 및 ktLint 적용

* refactor: 여행 수정 완료 동작 구현 및 VisitUpdateActivity 함수 분리

* feat: 여행 생성 api 연결 #98 (#104)

* feat: 여행 생성 api service 구현

* feat: 여행 생성 data source 구현

* feat: 방문 기록 썸네일 타입 변경 및 기본 인자 설정

- 변경 data class :  TravelVisitDto, TravelVisit, TravelVisitUiModel
- 이전: String
- 이후: String?

* build: converter scalars 의존성 추가

* feat: 여행 생성 ApiService 반환값 및 DataSource 시그니처 변경

- 여행 생성 ApiService 반환값 변경
- DataSource 시그니처 변경
- TravelCreation DomainModel 구현
- TravelCreation Dto 변환 Mapper 구현

* feat: Client에 ScalarsConvert 추가

- Header 값을 읽어오기 위해 ScalarsConvert 추가

* feat: 여행 생성 repository 구현

* feat: 여행 생성 api 연결

* feat: TravelViewModel 생성자 변경

- 이전: travelId를 TravelViewModel 생성자로 넣어줌
- 이후: travelId를 loadTravel()의 매개변수로 넣어줌

* ui: map 화면 변경

* refactor: 컨벤션 통일 및 패키지 정리 #112 (#118)

* refactor: bind 네임스페이스 적용

* refactor: BindingAdapters 메서드명 변경

* refactor: 컨벤션 맞게 xml 파일 이름 변경

* refactor: data 패키지 구조 정리

* refactor: RemoteVisitDataSource 컨벤션 따라 네이밍 변경

* refactor: 네트워킹 관련 메서드 이름 변경

- api service, data source, repository

* refactor: presentation 패키지 구조 정리

* refactor: message utils 생성 및 적용

Co-authored-by: s6m1n <[email protected]>
Co-authored-by: Junyoung-WON <[email protected]>

* build: develop-an의 CI 테스트 자동화 추가 및 데모 APK 추출 #78 (#92)

* build: test 자동화 Job 추가

* build: local.properties 생성 시점 변경

* build: 디버그 APK를 빌드하여 업로드하는 workflow 작성

* fix: test Job과 APK build Job에 local.properties 생성 동작 추가

* build: read 전용 권한 제거

* build: Firebase Analytics, Crashlytics 설정 #136 (#143)

* build: Firebase Analytics, Crashlytics 의존성 추가

* chore: google-service.json ignore

* feat: 특정 여행 상세 수정 api 연결 #109 (#146)

* feat: 여행 수정 api service 구현

* feat: 여행 수정 data source 구현

* feat: 여행 수정 repository 구현

* feat: 여행 수정 화면 현재 데이터 로딩 기능 구현

* refactor: 컨벤션 따라 여행 api service의 수정 메서드명 변경

- 이전: updateTravel
- 이후: putTravel

* feat: 특정 여행 상세 수정 api 연결

* refactor: memberImage 타입 변경 및 기본 인자 설정

* refactor: MembersDto 삭제

* refactor: TravelCreationUiModel.kt 삭제

* refactor: TravelCreation 이름 변경

- 이전: TravelCreation
- 이후: NewTravel

* refactor: api 명세서 변경에 따른 도메인 모델 수정 및 여행 코드 리팩터링 #151 (#152)

* refactor: nickName 변수명 변경

- 이전: nickName
- 이후: nickname

* ui: 여행 수정 화면 이미지 속성 수정

- glide -> coil 이용
- scaleType : fitXY -> centerCrop

* style: import 정렬

* feat: 여행 상세 -> 방문 상세로 이동 시 여행 id 전달

* feat: 방문기록 조회 dto 수정

- 방문기록 조회 도메인 변경으로 인해 방문 기록이 조회되지 않음
- 따라서 api 명세서와 일치하도록 dto 수정하여 오류 해결

* refactor: 여행 생성을 위한 viewModel 메서드 분리

* refactor: 여행 조회를 위한 viewModel 메서드 분리

* feat: 여행 수정 handler 구현

* refactor: 여행 default id 변경

- 이전: -1L
- 이후: 0L

* refactor: TravelHandler 구현 위치 변경

- 이전: TravelViewModel
- 이후: TravelFragment

* style: 컨벤션에 맞게 TravelFragment의 메서드 순서 수정

* refactor: TravelFragment의 travelId 초기화 방식 변경

* feat: 여행 생성 및 수정 error toast 구현

* feat: 방문 생성 화면, 방문 수정 화면에서 갤러리 사진 불러오기 구현 #150 (#155)

* feat: PhotoAttachFragment에 PhotoAttachHandler 연결

* feat: PhotoAttachFragment 앨범 접근 권한 관련 로직 구현

- API level 33 이상 : READ_MEDIA_IMAGES
- API level 33 이하 : READ_EXTERNAL_STORAGE
- ActivityResultLauncher를 이용한 권한 요청
- 권한 거부 시, 설정으로 이동하는 스낵바 띄우기

* feat: PhotoAttachFragment 앨범에서 불러온 이미지의 URI 추출하기

* feat: 불러온 이미지의 URI를 호스트 Activity로 전달

- OnUrisSelectedListener 인터페이스 추가

* feat: Uri를 File로 변환하는 메서드 파일 추가

* refactor: pr 리뷰 반영

* refactor: pr 리뷰 반영2

* build: develop-an의 android-ci 수정 #115 (#160)

- local.properties: 파일 생성 후 secrets로부터 base_url 설정
- google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성

* fix: android-ci 환경변수 생성 위치 조정 (#164)

* build: local.properties 와 google-services.json 설정

- local.properties: 파일 생성 후 secrets로부터 base_url 설정
- google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성

* fix: 환경 변수 설정 위치 변경

* build: bash 쉘에 맞는 명령어 활용 #115 (#165)

* build: local.properties 와 google-services.json 설정

- local.properties: 파일 생성 후 secrets로부터 base_url 설정
- google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성

* fix: 환경 변수 설정 위치 변경

* fix: bash 쉘에 적합한 명령어 형식으로 변경

* feat: 특정 여행 상세 삭제 api 연결 #153 (#167)

* feat: 특정 여행 삭제 api service 구현

* feat: 특정 여행 삭제 data source 구현

* feat: 특정 여행 삭제 repository 구현

* feat: 특정 여행 삭제 기능 api 연결

* feat: error handling 방식 수정

- 서버에서 들어오는 error body의 status와 message를 활용하는 방식으로 변경

* refactor: DialogHandler를 독립적으로 관리

* refactor: api path 상수 활용

* refactor: BuildConfig에 token 정의

* refactor: DEFAULT_VALUE 상수 제거

* feat: 여행 생성 기능 api 수정 #169 (#178)

* feat: onUrisSelected 매개변수 가변인자로 변경

* feat: 여행 생성 화면 갤러리 이미지 로딩 기능 구현

* refactor: 이미지 선택 리스너 초기화 메서드명 오타 수정

* refactor: 스낵바 액션 설정 코드 간소화

* feat: TravelRequest 의 여행 썸네일 필드 제거

* refactor: 여행 썸네일 이미지 변수명 수정

* feat: 이미지 전송 기능 구현

* refactor: image url 변수명 변경

- 변수 끝에 url이 오도록

* feat: 여행 생성 progressBar 구현

* ui: 사진 첨부 아이콘 가시성 설정

* feat: 여행 상세 수정 기능 api 변경 및 여행 리팩터링 #180 (#181)

* feat: 여행 수정 화면 갤러리 이미지 로딩 기능 구현

* feat: URL 및 URI 기반 이미지 로딩 BindingAdapter 구현

* feat: 이미지 전송 기능 구현

* feat: 여행 수정 progressBar 구현

* fix: 삭제 불가능한 여행 삭제 시도 관련 에러 토스트 문제 해결

삭제 불가능한 여행을 삭제하려고 시도 -> 방문 조회 -> 뒤로 가기 버튼 클릭 -> 삭제 불가능 에러 토스트가 다시 뜨는 문제가 발생해 이를 해결

* refactor: TravelCreationViewModel의 imageUrl 변수 제거

* ui: 여행 상세 내 방문 기록 이미지 scaleType 속성 설정

* ui: 여행 생성 썸네일 이미지 scaleType 속성 설정

* fix: 여행 소개 미입력 시 여행이 생성 되지 않는 오류 해결

* refactor: 타임라인 화면 리팩터링 #162 (#179)

* ui: 타임라인 RecyclerView의 크기 조정 및 여백 수정

* feat: Activity와 Fragment 간 데이터를 공유하는 공유 ViewModel 생성

* feat: 공유 ViewModel을 이용하여 타임라인 업데이트 여부를 공유

* refactor: RecyclerView.Adapter에서 ListAdapter로 변환

* refactor: 처음 타임라인을 불러오는 동작을 ViewModel 초기화 시에 수행

* fix: ListAdapter 수정

- 불필요한 travels 프로퍼티와 getItemCounts 메서드 제거
- currentList를 사용하는 것으로 변경

* refactor: 에러 핸들링 방식 수정 및 ViewModel 수정

- TimelineDefaultRepository로 네이밍 변경
- ApiResponseHandler와 ResponseResult를 이용하여 에러 핸들링 처리
- TimelineViewModel 에러 메시지 LiveData 사용
- 그 외 repository, dataSource 프로퍼티 이름 수정하여 통일

* refactor: MutableLiveData의 값 업데이트를 setValue로 변경 및 메서드 분리

* style: ktlint 적용

* feat: 3차 스프린트에서 수정된 방문 기록 상세 API 연결 #163 (#183)

* feat: 방문 상세 생성 API 연결

* feat: 방문 상세 수정, 삭제 API 연결

* feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용

* feat: 방문 기록 생성 화면 사진 다중 선택 구현

* feat: 방문 기록 생성 이미지 업로드 구현

* feat: 방문 기록 생성 및 수정 시 로딩과 토스트 추가

* feat: 닉네임을 활용한 로그인 기능 구현 #124 (#172)

* ui: 로그인 화면 구성

- 로그인 화면에서 사용되는 텍스트를 strings에 추가
- 로그인 버튼 스타일에 대한 style 생성
- xml 임시로 작성

* ui: 앱 로고 삽입 및 margin 조정

- 임시 로고 이미지 저장
- 로고 크기 및 마진 조정

* feat: 로그인 API Service 작성 및 Retrofit 객체 생성

* feat: 로그인 DataSource 작성

* feat: 로그인 Repository 생성

* feat: 사용자 정보를 저장하는 SharedPreferences Manager 생성

- 토큰 값 불러오기 및 저장
- 추후 사용자 닉네임, 사용자 프로필 이미지 등의 정보 저장 가능

* feat: Application 생성 및 사용자 정보 Preferences Manager 캐싱

* ui: Splash Screen 화면 구성을 위한 테마 생성

* feat: Preferences 로부터 사용자 토큰 값을 가져와 헤더에 추가하도록 변경

* refactor: Repository 네이밍 통일

* refactor: DataSource 기본 인자 추가

* feat: LoginViewModel 및 Handler 작성

* feat: LoginViewModel 을 생성하는 ViewModel Factory 작성

* feat: LoginActivity 작성 및 양방향 데이터 바인딩 적용

* feat: StaccatoApplication과 LoginActivity 설정 및 LoginActivity를 시작 화면으로 변경

* style: 불필요한 namespace 제거 및 lint 확인

* refactor: LoginViewModel과 Factory를 viewmodel 패키지로 분리

* refactor: TimelineViewModel과 Factory를 viewmodel 패키지로 분리

* style: ktlint 적용

* fix: 불필요한 ConverterFactory 제거

- 더 이상 사용하지 않는 text/plain 변환용 ScalarsConverterFactory 제거

* feat: 닉네임 로그인 요청 및 응답에 대한 DTO 작성

* refactor: 로그인 요청, 응답 시 DTO 활용

* fix: 토큰 값을 불러오고 및 저장하는 동작의 비동기 처리 및 화면 전환 개선

* refactor: 토큰 값을 캐싱하여 저장하는 TokenManager 생성 및 적용

- 매번 runBlocking을 통해 Preference에 저장된 토큰 값을 불러오는 것은 네트워크 성능을 저하시킨다.
- 따라서, token 값을 캐싱하여 저장하는 TokenManager를 활용한다.
  - 첫 네트워크 요청 시에만 토큰을 불러오는 작업을 동기적으로 처리하기 위해 Main Thread가 Blocking 된다.
  - TokenManager가 Preference로부터 가져온 토큰을 캐싱하여 저장한다.
  - 이후 요청부터는 캐시된 토큰을 가져오므로 Main Thread가 Blocking 되지 않는다.

* style: ktlint 적용

* feat: Night 모드 비활성화

* refactor: 여행 기간 날짜 형식 변환을 BindingAdapter에서 수행

- TimelineTravelUiModel 프로퍼티 수정
  - UiModel의 여행기간 날짜를 LocalDate로 갖도록 통일
  - 추후 날짜 관련 UI가 변경되었을 때 확장성 고려
- BindingAdapters에 날짜 형식 변환해주는 메서드 작성

* chore: 주석 처리된 Log 코드 삭제

* style: xml View의 ID 네이밍 컨벤션 적용

* ui: 앱 심볼 로고 추가 및 스플래시 스크린에 적용

* feat: 방문 상세 생성 API 연결

* ui: 배경 색을 흰 색으로 지정

* feat: 키보드 활성화 상태에서 화면 터치 시 키보드를 내리는 기능 추가

* style: ktlint 적용

* feat: 방문 상세 수정, 삭제 API 연결

* feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용

* fix: merge 과정에서 발생한 id값 네이밍 충돌 해결

* build: 앱 version code와 version name 수정

* feat: 방문 기록 생성 화면 사진 다중 선택 구현

* feat: 방문 기록 생성 이미지 업로드 구현

* feat: 스플래시 스크린 시간 조정 및 데모 시연용 토큰 활성화

* fix: 동일한 사진이 여러 장 업로드되는 버그 수정

* feat: 기존 로그인 기능으로 롤백

---------

Co-authored-by: somin <[email protected]>

* fix: 테스트 배포를 위한 버그 수정 #198 (#219)

* style: formatting

* fix: 무한 로딩 오류 수정

* fix: 여행 생성 오류 수정

* add: 앱 아이콘 변경

* ui: timeline empty view 추가

* feat: timeline empty view 가시성 설정

* ui: 여행 내 방문 기록 empty view 추가 및 가시성 설정

* ui: 방문 기록 내 로그 미지원 기능 view 추가

* feat: 사진 첨부 카메라 미지원 기능 알림 추가

* ui: 필수값 표기 style 정의

* ui: 여행 생성 및 수정 필수값 표기 추가

* ui: 방문 기록 생성 및 수정 필수값 표기 추가

* feat: 생성, 수정, 로그인 시 다중 요청 전송을 막기 위한 화면 터치 제한

* feat: 장소 생성의 사진 첨부 리사이클러뷰 구현

- 사진 추가 & 삭제 구현
- GridLayout으로 변경
- 사진 중복 없이 최대 5장으로 제한
- 새로 추가된 사진이 기존 사진 뒤에 더해지도록 구현

* chore: 방문 생성 화면 rv_photo_attach로 xml id 수정

* ui: app icon 및 splash icon 변경

* refactor: xml ID 네이밍 컨벤션 적용

---------

Co-authored-by: somin <[email protected]>
Co-authored-by: Junyoung-WON <[email protected]>

* �refactor: 도메인명 변경에 따라 travel을 memory로 수정 #217 (#231)

* refactor: 패키지명 travel -> memory로 수정

* refactor: dto의 TravelMapper 를 MemoryMapper 로 네이밍 변경

* refactor: 여행(현 추억) 생성 response dto 네이밍 변경

- TravelCreationResponse -> MemoryCreationResponse

* refactor: 여행(현 추억) request dto 네이밍 변경

- TravelRequest -> MemoryRequest

* refactor: 여행(현 추억) 조회 response dto 네이밍 변경

- TravelResponse -> MemoryResponse

* refactor: 여행(현 추억) 수정 request dto 네이밍 변경

- TravelUpdateRequest -> MemoryUpdateRequest

* refactor: 여행(현 추억) 내 방문 dto 네이밍 변경

- TravelVisitDto -> MemoryVisitDto

* refactor: 타임라인 여행(현 추억) item의 dto 네이밍 변경

- TimelineTravelDto -> TimelineMemoryDto

* refactor: 여행(현 추억) ApiService 네이밍 변경

- TravelApiService -> MemoryApiService

* refactor: 여행(현 추억) DataSource 네이밍 변경

- TravelDataSource -> MemoryDataSource
- TravelRemoteDataSource -> MemoryRemoteDataSource

* refactor: 여행(현 추억) Repository 네이밍 변경

- TravelRepository -> MemoryRepository
- TravelDefaultRepository -> MemoryDefaultRepository

* style: TimelineMapper import 재정렬

* refactor: NewTravel 도메인명을 NewMemory로 변경

* refactor: Travel 도메인명을 Memory로 변경

* refactor: TravelVisit 도메인명을 MemoryVisit으로 변경

* refactor: presentation의 TravelMapper 명 변경

- TravelMapper -> MemoryMapper

* refactor: 여행(현 추억) ui 모델명 변경

- TravelUiModel -> MemoryUiModel
- TravelVisitUiModel -> MemoryVisitUiModel

* refactor: 여행(현 추억) view model 명 변경

- TravelViewModel -> MemoryViewModel
- TravelViewModelFactory -> MemoryViewModelFactory

* refactor: MemoryApiService의 Path 변경

- travel을 memory로 변경
- travels을 memories로 변경

* refactor: Memory 관련 dto 변수명 변경

- travel을 memory로 변경

* refactor: Timeline Dto의 Memory 관련 변수명 변경

- travel을 memory로 변경
- travels를 memories로 변경

* refactor: Memory 관련 도메인 모델의 변수명 변경

- travel을 memory로 변경

* refactor: Memory 관련 ui 모델의 변수명 변경

- travel을 memory로 변경

* refactor: data layer의 Memory 관련 함수 및 변수명 변경

- travel을 memory로 변경

* refactor: 방문 생성 request dto의 travelId 변수명 변경

- travelId -> memoryId

* refactor: 여행(현 추억) 조회 view model 및 fragment의 네이밍 변경

- travel -> memory

* refactor: fragment_travel 의 리소스 네이밍 변경

- travel -> memory
- strings.xml의 리소스명 변경

* refactor: TravelCreationActivity 네이밍 변경

- TravelCreationActivity -> MemoryCreationActivity

* refactor: 여행(현 추억) 생성의 ViewModel 관련 네이밍 변경

- TravelCreationViewModel -> MemoryCreationViewModel
- TravelCreationViewModelFactory -> MemoryCreationViewModelFactory
- 관련 함수 및 변수명 변경
  - travel -> memory

* refactor: 여행(현 추억) 생성, 수정에 관한 xml 리소스 명 변경

- travel -> memory
- strings.xml 의 관련 리소스 수정

* refactor: 여행(현 추억) 수정 Activity, Handler 의 네이밍 변경

- travel -> memory

* refactor: 여행(현 추억) 수정 ViewModel 의 네이밍 변경

- 관련 함수 및 변수 명 변경
  - travel -> memory
- Factory 클래스명 변경

* refactor: 여행(현 추억) 생성, 수정에서의 파일 변환 메서드명 변경

- travel -> memory
- 자식 파일 명 상수화

* refactor: Timeline 의 UI 모델 및 Travel ID Key 의 리네이밍

- travel -> memory 로 일괄 변경

* refactor: presentation/timeline 내 travel 도메인명 변경

- travel -> memory
- TimelineMapper 내 domain model -> ui model 변환 메서드명 변경

* refactor: dto/MemoryMapper 내 domain 변환 메서드명 변경

- dto/MemoryMapper 내 domain model을 dto로 변환하는 메서드명 변경
- travel -> memory

* refactor: dummyTravel 을 dummyMemory 로 변경

* refactor: MainActivity 내 travel을 memory로 변경

* refactor: activity_main 내 travel을 memory로 변경

* refactor: TimeLineApiService 내 GET 메서드 path 수정

- travels -> memories

* refactor: MemoryFragment 내 travel 을 memory 로 변경

- MemoryFragment, fragment_memory 내 travel 을 memory 로 변경

* refactor: MemoryViewModel 내 error message 변수명 변경

- TRAVEL_ERROR_MESSAGE -> MEMORY_ERROR_MESSAGE

* refactor: navigation graph 내 travel을 memory로 변경

* refactor: VisitUpdateActivity 내 extra 키 값 수정

- TRAVEL_ID_KEY -> MEMORY_ID_KEY
- TRAVEL_TITLE_KEY -> MEMORY_TITLE_KEY

* refactor: VisitFragment 내 travel을 memory로 변경

* refactor: VisitUpdateActivity 내 travel을 memory로 변경

* refactor: VisitUpdateViewModel 내 travel을 memory로 변경

* refactor: VisitTravelUiModel을 VisitMemoryUiModel로 변경

* refactor: 방문 수정 xml의 travel을 memory로 변경

* refactor: 여행(현 추억) 선택 xml 내 travel을 memory로 변경

* refactor: 여행 선택 바텀 시트 내 travel을 memory로 변경

- TravelSelectionFragment -> MemorySelectionFragment 로 수정
- TravelSelectionHandler -> MemorySelectionHandler 로 수정
- TravelSelectionFragment 내 메서드명 수정
- TravelSelectionHandler 내 매개변수명 수정

* refactor: VisitRepository와 구현체의 메서드 내 매개변수명 통일

* refactor: VisitsViewHolder 내 travel을 memory로 변경

* refactor: VisitCreationActivity 내 travel을 memory로 변경

* refactor: VisitCreationViewModel 내 travel을 memory로 변경

* refactor: 방문 생성 xml 내 travel을 memory로 변경

* refactor: BindingAdapters 내 travel을 memory로 변경

* refactor: strings 내 travel을 memory로 변경

- strings 내 '여행'을 '추억'으로 수정

Co-authored-by: Junyoung-WON <[email protected]>
Co-authored-by: s6m1n <[email protected]>

* refactor: visit, visit log 도메인명 수정 #218 (#237)

* refactor: VisitApiService 내 visit을 moment 로 변경

- 파일명 수정
- path 수정
- 메서드명 수정
- 매개변수명 수정

* refactor: data/visit 패키지명을 moment로 변경

* refactor: data/dto/visit 패키지명을 moment로 변경

* refactor: VisitCreationRequest 네이밍 변경

- 이전: VisitCreationRequest
- 이후: MomentCreationRequest

* style: StaccatoClient import 재정렬

* refactor: VisitCreationResponse 네이밍 변경

- 이전: VisitCreationResponse
- 이후: MomentCreationResponse
- 필드명 변경 : visitId -> momentId

* refactor: VisitResponse 네이밍 변경

- 이전: VisitResponse
- 이후: MomentResponse
- VisitResponse 필드 내 visit을 moment로 변경
- VisitResponse 필드 내 visitLogs SerialName을 comments로 변경

* refactor: VisitUpdateRequest 네이밍 변경

- 이전: VisitUpdateRequest
- 이후: MomentUpdateRequest
- VisitUpdateRequest 필드 내 visit을 moment로 변경

* refactor: VisitLogDto 내 SerialName 변경

- visitLogId를 commentId로 변경

* refactor: MemoryResponse 내 visits SerialName 변경

- visits를 moments로 변경

* refactor: VisitCreationViewModel 내 FORM_DATA_NAME 변경

- 이전: visitImageFiles
- 이후: momentImageFiles

* refactor: MemoryVisitDto 내 visit를 moment로 변경

- MemoryVisitDto -> MemoryMomentDto로 변경
- visitId -> momentId로 변경
- visitImageUrl -> momentImageUrl로 변경

* refactor: VisitRemoteDataSource 내 visit을 moment로 변경

- VisitRemoteDataSource -> MomentRemoteDataSource로 변경
- 메서드명 변경
- 매개변수명 변경

* refactor: MomentRepository 및 구현체 내 visit을 moment로 변경

- VisitRepository -> MomentRepository로 변경
- VisitDefaultRepository -> MomentDefaultRepository로 변경
- 메서드명 변경
- 매개변수명 변경

* refactor: Visit 도메인 모델명 및 변수명 변경

- Visit -> Moment로 변경
- visitLogs -> comments로 변경

* refactor: Memory 도에인 모델의 visits을 moments로 변경

* refactor: MemoryVisit 도메인 모델 내 visit을 moment로 변경

* refactor: MemoryResponse의 visits 필드명을 moments로 변경

* refactor: dto/mapper/VisitMapper를 MomentMapper로 변경

* refactor: presentation/visit 패키지명을 moment로 변경

* refactor: VisitViewHolderType 네이밍 변경

- VisitViewHolderType -> MomentViewHolderType
- enum 상수명 변경
  - VISIT_DEFAULT -> MOMENT_DEFAULT
  - MY_VISIT_LOG -> MY_COMMENTS

* refactor: VisitViewHolder 네이밍 변경

- VisitViewHolder -> MomentViewHolder
- VisitDefaultViewHolder -> MomentDefaultViewHolder
- MyVisitLogViewHolder -> MyCommentViewHolder

* refactor: VisitAdapter 내 visit을 moment로 변경

- VisitAdapter -> MomentAdapter 로 변경
- visit -> moment 로 변경

* refactor: MomentAdapter 내 visit log를 comments로 변경

* refactor: VisitDetailUiModel 내 visit을 moment로 변경

- VisitDetailUiModel -> MomentDetailUiModel
- VisitDefaultUiModel -> MomentDefaultUiModel
- visitImageUrls -> momentImageUrls

* refactor: VisitLogUiModel을 CommentsUiModel로 변경

* refactor: VISIT_ID_KEY extra key id 네이밍 변경

- VISIT_ID_KEY -> MOMENT_ID_KEY

* refactor: VisitFragment 내 visit을 moment로 변경

* refactor: VisitViewModel 내 visit을 moment로 변경

- VisitViewModel -> MomentViewModel로 변경
- VisitViewModelFactory -> MomentViewModelFactory로 변경

* refactor: VisitMemoryUiModel 네이밍 변경

- VisitMemoryUiModel -> MomentMemoryUiModel로 변경

* refactor: presentation/visitcreation 패키지명 momentcreation으로 변경

* refactor: VisitCreationActivity 내 visit을 moment로 변경

- VisitCreationActivity -> MomentCreationActivity로 변경

* refactor: VisitCreationHandler 네이밍 변경

- VisitCreationHandler -> MomentCreationHandler로 변경

* refactor: VisitCreationViewModel 내 visit을 moment로 변경

- VisitCreationViewModel -> MomentCreationViewModel로 변경
- 메서드 및 변수명 변경

* refactor: 여행 -> 추억, 방문 기록 -> 스타카토로 도메인명 변경

* feat: s3 api 연결 #239 (#241)

* feat: ImageResponse, ImageApiService 구현

* feat: ImageRepository 및 구현체 구현

Co-authored-by: s6m1n <[email protected]>

* fix: 추억 기능 버그 수정 #246 (#252)

* fix: 일부 EditText 개행 불가 처리 및 키보드 숨김 처리 #247 (#249)

* ui: 닉네임과 추억 생성, 수정 제목 입력 시 줄바꿈 제한

* fix: 키보드 활성화 상태에서 빈 화면 터치로 키보드 숨김 처리

- 메서드 명 변경: setHideKeyboardAction -> setHidingKeyboardAction

* style: 클래스 내 override 메서드의 순서 변경

- 팀 코드 컨벤션에 맞게 순서 재정렬
  - override 메서드를 상단에 둔다.

* style: ktlint 적용

* fix: root뷰 터치 시 클릭 이벤트가 발생하지 않는 오류 수정

- 원인 분석: ConstraintLayout 내부 Toolbar 및 ScrollView, 그리고 그 자식 View들이 클릭 이벤트를 가로채기 때문에, 바인딩 된 최상단 root 뷰인 ConstraintLayout의 클릭 이벤트가 동작하지 않는다.

- 해결 방법: 여러 클릭 이벤트를 가로채는 dispatchTouchEvent 메서드를 오버라이드하여, 터치된 부분이 현재 포커스가 되지 않은 View(키보드 바깥 화면) 범위라면, 키보드를 숨기는 동작을 추가하였다.

* refactor: 키보드 숨김 동작을 handler 바인딩으로 적용

- LoginHandler 에 화면 터치에 대한 동작을 추가, 화면 터치 시 키보드를 숨김 처리하는 동작을 바인딩으로 설정
- InputMethodManager 인스턴스를 지연초기화하여 저장

* refactor: InputMethodManager 인스턴스를 lazy로 지연 초기화

* fix: 닉네임, 제목 입력 칸의 키보드 액션 버튼 변경

- 키보드의 액션 타입을 Search에서 Done으로 변경

* style: ktlint 적용

* refactor: 타임라인 리팩터링 #232 (#263)

* refactor: TimelineViewModelFactory의 생성자 파라미터 추가

- 내부 프로퍼티에 속해있던 TimelineRepository를 생성자 프로퍼티로 변경

* fix: 추억 목록 아이템이 하나일 때의 View 수정

- 아이템 개수가 하나일 때는 타임라인의 선이 나타나지 않도록 변경

* chore: 코루틴 예외 처리 로그에context 출력

* refactor: 메서드 분리 및 순서 재정렬

- 코드 컨벤션: override 메서드는 상단에 위치한다

* refactor: TimelineViewModel 생성 팩토리 메서드 활용

* style: ktlint 적용

* ui: 화면 전환에 사용될 twin animation 효과 생성

* ui: animation 효과 활용하여 화면 전환 애니메이션 적용

* ui: Main 화면의 배경 색을 하얀색(#FFFFFF)으로 지정

* style: ktlint 적용

* feat: 기분 선택 기능 구현 및 스타카토 조회 화면 구조 변경 #191 (#289)

* feat: 기분 수정 요청을 보내는 Request Dto 작성

* feat: MomentApiService 에 기분 수정 요청에 대한 API 작성

* feat: 기분 수정 요청에 대한 DataSource 메서드 작성

* feat: 기분 도메인 모델 생성

* feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성

* ui: 기분 아이콘 이미지 리소스 추가

* ui: 기분 아이콘의 테두리를 selector로 생성

- 선택/미선택에 따라 다른 ui를 나타낸다

* ui: 기분 아이콘에 사용할 style 지정

* fix: API 변경에 따라 DTO 및 Mapper 변경

- 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경

* fix: 순간 DTO에 기분 필드 추가

- 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정

* feat: 기분 선택 api에 필요한 repository 메서드 작성

* feat: 기분 uiModel 생성

* feat: 댓글에 대한 UI 모델 생성

* feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성

* feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성

* feat: 댓글 화면 구성 및 Adapter, Fragment 작성

* feat: 순간(현 스타카토)의 Ui Model Mapper 변경

MomentDetailUiModel.CommentsUiModel -> CommentUiModel

MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel

Feeling을 Ui Model로 변환하는 Mapper 추가

* feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성

* feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성

* fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정

* fix: 누락된 ViewModel 데이터 바인딩 설정

* feat: 순간 조회 화면 재구성

* refactor: 네비게이션 action 및 id 네이밍 수정

visit -> moment로 수정

* refactor: 방문 -> 순간 으로 키워드 변경

* refactor: 불필요한 클래스 및 xml 파일 제거

* style: ktlint 적용

* feat: 추억 API 변경사항 반영 및 리팩터링 #259 (#265)

* ui: 추억 생성 화면 사진 로드 시 coil 라이브러리 사용

* ui: 삭제 버튼 아이콘 추가

* ui: 추억 생성 화면 사진 삭제 버튼 추가

* feat: 추억 생성 view model의 imageUri 설정 매개변수 타입 변경

* feat: 추억 생성 화면 사진 삭제 구현

* feat: 추억 수정 화면 사진 첨부 icon 가시성 설정

* ui: 추억 수정 화면 사진 삭제 버튼 추가

* feat: 추억 수정 화면 사진 삭제 버튼 가시성 설정

* feat: 추억 수정 view model의 imageUri 설정 매개변수 타입 변경

* feat: 추억 수정 화면 사진 삭제 구현

* fix: 추억 생성 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정

* fix: 추억 수정 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정

* feat: MemoryRequest dto에 썸네일 사진 url 필드 추가

* feat: 추억 생성 메서드의 시그니처 변경

- MemoryApiService 내 추억 생성 메서드의 시그니처 변경
- 위 변경에 따른 DataSource, Repository, ViewModel의 추억 생성 관련 메서드 시그니처 변경

* feat: 추억 생성 view model 주 생성자로 ImageRepository 주입

* feat: 추억 생성 화면의 썸네일 사진 저장 기능 구현

* feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 생성 화면)

- 추억 생성 화면에서 서버에 저장된 사진을 로드하는 기능 구현
- UI에 불러온 사진을 표시하는 로직 수정

* feat: 추억 생성 시 썸네일 사진 url 추가

* refactor: MemoryRequest의 추억 썸네일 사진 기본 인자 값 null로 설정

* feat: 추억 수정 메서드의 시그니처 변경

* feat: 추억 수정 view model 주 생성자로 ImageRepository 주입

* feat: 추억 수정 화면의 썸네일 사진 저장 기능 구현

* feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 수정 화면)

- 추억 수정 화면에서 서버에 저장된 사진을 로드하는 기능 구현
- UI에 불러온 사진을 표시하는 로직 수정

* feat: 추억 수정 시 썸네일 사진 url 추가

* refactor: 불필요한 MemoryUpdateRequest 제거

* ui: empty view 캐릭터 이미지 추가

* ui: 추억 설명글 유무에 따른 가시성 설정

* ui: 함께 한 사람들 가시성 gone 으로 설정

- 4차 스프린트 범위에서 제외됨

* feat: 이미지 선택 옵션 추가 (단일 선택 및 다중 선택 지원)

* ui: TextInputLayout, TextInputEditText Style 정의

* ui: 추억 생성 화면 입력란 TextInputLayout으로 변경

- counter 속성 사용을 위해 TextInputLayout으로 변경함

* ui: 추억 수정 화면 입력란 TextInputLayout으로 변경

- counter 속성 사용을 위해 TextInputLayout으로 변경함

* ui: 추억 조회 화면 썸네일 사진 유무에 따른 가시성 설정

* ui: empty view 캐릭터 이미지 크기 변경

* ui: 앱 이름 Staccato_AN -> Staccato 로 수정

* refactor: 추억 생성 및 수정 화면 메서드 순서 정리

* ui: 제목용 TextInputEditTextStyle 정의 및 적용

* ui: 추억 생성 및 수정 화면 썸네일 coilPlaceHolder 변경

- 이전: shape_place_holder_rectangle
- 이후: shape_all_gray1_8dp

* refactor: 삭제 다이얼로그 show 메서드 호출 방식 변경

- apply를 사용하지 않는 방식으로 변경

* ui: 코멘트 미지원 안내 view 추가

* feat: 스타카토 생성, 수정 화면 사진 및 완료 버튼 개선 #242 (#291)

* feat: (스타카토 생성 화면) 사진 드래그로 순서 변경 기능 구현

* refactor: data 패키지에 S3 이미지 API 분리 적용

* refactor: AttachedPhotoUiModel 및 프로그래스바 추가

* feat: recyclerView에서 지워진 사진의 job cancel 처리

* refactor: editText를 TextInputLayout로 수정

* feat: (스타카토 수정 화면) 사진 드래그로 순서 변경 / 로딩 구현

* refactor: 프로퍼티 네임 변경 및 visitedAt LocalDateTime으로 수정

* style: ktlint 적용

* build: 구글 맵 API 사용에 따른 CI 수정 #296 (#297)

* build: 구글 맵 api key를 저장하는 파일을 설정하는 명령어 작성

* refactor: defaults 에 설정된 shell 설정에 따라 추가적인 shell 설정 삭제

* feat: Google Map 연결, 스타카토 목록 조회 API 연결 #54 (#295)

* build: google map 의존성 추가

* build: 구글맵 관련 properties ignore 추가

* build: 구글맵 api key 설정

* feat: Google Map 연결

* feat: MainActivity Handler 구현

* ui: 추억 및 스타카토 생성 메뉴 추가

* ui: popup menu style 정의

* feat: 추억 생성 및 수정 menu 연결

- handler 연결
- 메서드 분리

* feat: 위치 권한 요청 구현

- ACCESS_FINE_LOCATION 권한 요청
- ACCESS_COARSE_LOCATION 권한 요청

* feat: 현 위치 표시

* style: MainActivity formatting

* feat: locationPermissions 타입 변경

- 이전: List<String>
- 이후: Array<String>

* feat: MomentLocationDto, MomentLocationResponse 추가

* feat: 스타카토 목록 조회 api service 구현

* feat: 스타카토 목록 조회 data source 구현

* feat: MomentLocation 도메인 모델 구현

* feat: MomentLocationDto를 도메인 모델로 변환하는 mapper 구현

* feat: 스타카토 목록 조회 repository 구현

* feat: 스타카토 목록 조회 view model 구현

* feat: 스타카토 목록을 marker로 표시

* refactor: home 패키지명을 maps로 변경

* feat: 마커 클릭 시 스타카토 상세로 이동 기능 구현

* feat: 스타카토 조회 추억 id, 제목 필드 추가

* feat: 마지막 위치 위경도 찾기

* refactor: 안드로이드 1차 QA 반영 #299 (#301)

* refactor: 안드로이드 1차 QA 반영

* refactor: 안드로이드 1차 QA 반영2

* refactor: 안드로이드 1차 QA 반영3

* refactor: 삭제 메시지 변경

* fix: 스타카토 조회 화면 스택 관리 및 ui 수정 #304 (#306)

* feat: 지도 화면에서 스타카토 조회 화면으로 이동 시 스택 관리

* feat: 타임라인 화면에서 추억이 존재하지 않을 때 추억 생성 버튼 추가

* ui: 스타카토 조회 화면 툴바 위치 고정

* build: Android CD 적용 #300 (#308)

* build: CD 워크플로우 yml 파일 작성

* build: keystore 접근을 위한 build.gradle.kts 파일 설정

* build: 기존 apk 추출 ci 파일 수정

- demo 버전의 apk를 추출 및 배포하는 목적에 맞게 파일 명 수정
- apk 빌드 후 테스트를 수행하는 job 추가
- firebase 앱 배포에 아티팩트 업로드하는 job 추가

* fix: ci 파일에도 keystore 생성 job 추가

* fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 수정

* fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정

* fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정

* fix: ci 파일에 키스토어 관련 설정 적용

* fix: 키스토어 관련 명령어 일부 수정

* fix: build.gradle.kts 불필요한 괄호 제거

* fix: keystore.properties 로 부터 프로퍼티를 가져오는 형식 변경

* fix: upload-artifact step에서 빌드 파일의 upload 경로 수정 (#316)

upload-artifact 는 defaults 설정의 working-directory 경로가 적용되지 않음

* fix: android cd 재수정 (2차) #317 (#319)

* fix: upload-artifact 빌드 파일의 upload 경로 3차 수정

* fix: 배포 시 빌드 파일의 경로 수정

* fix: 빌드 파일의 upload 경로 수정 및 파일이 없는 경우 에러 처리

* fix: 빌드 파일의 upload 경로 4차 수정

* fix: 빌드 파일의 upload 경로 5차 수정

* fix: 빌드 파일의 upload 경로 6차 수정

- 디렉터리 경로 생성 후 upload 실행

* fix: 빌드 파일의 upload 경로 7차 수정

github의 workspace 환경변수(절대경로) 활용

* fix: clean test 제거 및 디버그용 파일 경로 탐색 명령어 추가

* fix: 디버그용 파일 경로 검색 명령어 수정

* fix: 디버그용 파일 경로 검색 명령어 삭제

* fix: 디버그용 파일 검색 명령어 삭제 및 업로드 파일 경로명 수정

* feat: 스타카토 생성 시 현 위치의 주소를 가져오는 기능 구현 #314 (#324)

* feat: MainActivity에서 주소를 가져오는 로직 삭제

* feat: 스타카토 생성 시 현 위치의 주소를 가져오는 로직 구현

* refactor: 메서드 순서 정렬

* refactor: 스타카토 조회 화면 ViewPager2 적용 및 UI 아이콘 개선 #318 (#320)

* refactor: 아이콘 추가 및 UI 개선

* feat: 스타카토 상세 사진 Viewpager 적용

* feat: 스타카토 상세 사진 Viewpager에 dot indicator 추가

* style: ktLint Format

* feat: 메인 지도 화면에서 스타카토 생성하는 플로우 구현 #321 (#327)

* feat: 날짜로 추억 목록 불러오는 getMemories API 추가

* feat: 메인에서 스타카토 생성 시 추억 목록 선택 가능

* feat: 스타카토 생성 시 역지오코딩과 추억 선택 연동

* build: debug와 release로 buildTypes 분리 (#329)

- appName, appId, baseUrl 분리
- release에 난독화 적용

* build: debug 와 release 배포 분기에 따른 CD 수정

- CD에 대한 트리거 재설정 : main 브랜치에 대한 push 및 pr

* fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 #326 (#330)

* refactor: 지도 화면 onResume에서 스타카토 목록 load

* refactor: 스타카토 목록 로드 메서드명 변경

- 이전: loadMoments
- 이후: loadStaccatos

* feat: 공유 view model에 스타카토 목록 업데이트 상태 추가

* fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결

* feat: 지도 로드 시 현위치로 이동하도록 구현

* build: ci 및 cd 파일 수정

ci - 불필요한 gradle 빌드 및 테스트 제거
cd - 타겟 브랜치 develop 제거

* feat: 댓글 조회, 생성, 삭제 기능 구현 #290 (#331)

* feat: 기분 수정 요청을 보내는 Request Dto 작성

* feat: MomentApiService 에 기분 수정 요청에 대한 API 작성

* feat: 기분 수정 요청에 대한 DataSource 메서드 작성

* feat: 기분 도메인 모델 생성

* feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성

* ui: 기분 아이콘 이미지 리소스 추가

* ui: 기분 아이콘의 테두리를 selector로 생성

- 선택/미선택에 따라 다른 ui를 나타낸다

* ui: 기분 아이콘에 사용할 style 지정

* fix: API 변경에 따라 DTO 및 Mapper 변경

- 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경

* fix: 순간 DTO에 기분 필드 추가

- 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정

* feat: 기분 선택 api에 필요한 repository 메서드 작성

* feat: 기분 uiModel 생성

* feat: 댓글에 대한 UI 모델 생성

* feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성

* feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성

* feat: 댓글 화면 구성 및 Adapter, Fragment 작성

* feat: 순간(현 스타카토)의 Ui Model Mapper 변경

MomentDetailUiModel.CommentsUiModel -> CommentUiModel

MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel

Feeling을 Ui Model로 변환하는 Mapper 추가

* feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성

* feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성

* fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정

* fix: 누락된 ViewModel 데이터 바인딩 설정

* feat: 순간 조회 화면 재구성

* refactor: 네비게이션 action 및 id 네이밍 수정

visit -> moment로 수정

* refactor: 방문 -> 순간 으로 키워드 변경

* refactor: 불필요한 클래스 및 xml 파일 제거

* ui: xml 컨벤션에 맞추어진 타 사용자의 댓글 ui 구성

* feat: 댓글 API의 DTO 작성

* feat: 댓글 API Service 작성

* feat: 댓글 CRUD DataSource 작성

* refactor: CommentApiService 각 메서드의 반환 값을 Response로 변경

* feat: CommentApiService 를 create

* feat: CommentDataSource 구현체 생성

* refactor: 댓글 Dto 클래스 네이밍 변경

- VisitLogDto -> CommentDto

* refactor: CommentDto 의 ID 프로퍼티 네이밍 변경

- visitLogId -> commentId

* refactor: VisitLog 도메인 모델 클래스의 네이밍 변경

- VisitLog -> Comment

* refactor: Comment 도메인 모델의 ID 프로퍼티 네이밍 변경

- visitLogId -> commentId

* feat: 새로운 댓글 도메인 모델 생성

* feat: CommentRepository 작성

* feat: Domain 모델과 DTO 모델을 변환해주는 Mapper 작성

- CommentDto를 Comment로 변환하는 메서드를 CommentMapper.kt로 이동

* feat: CommentRepository의 기본 구현체 작성

* feat: 댓글 ViewModel, Factory 작성 및 Comment 불러오기 구현

* ui: ViewModel 데이터바인딩 및 빈 댓글 문구에 대한 strings 설정

* feat: CommentsViewModel 활용 및 옵저빙

* feat: 댓글 조회, 생성, 삭제 기능 구현

* chore: ktlint 적용

* feat: 추억 생성 및 수정 이미지 로딩 중 표시 및 저장 버튼 비활성화 #332 (#334)

* feat: 추억 생성 이미지 로딩 중 표시

* feat: 추억 수정 이미지 로딩 중 표시

* feat: 추억 생성 및 수정 이미지 로딩 중 저장 버튼 비활성화

* style: formatting

---------

Co-authored-by: Somin Lee <[email protected]>
Co-authored-by: hodu <[email protected]>
Co-authored-by: Junyoung-WON <[email protected]>
Co-authored-by: s6m1n <[email protected]>
  • Loading branch information
5 people authored Aug 23, 2024
1 parent 6fec4dc commit 725bde0
Show file tree
Hide file tree
Showing 323 changed files with 12,799 additions and 0 deletions.
92 changes: 92 additions & 0 deletions .github/workflows/android-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Android CI/CD for release

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

env:
BASE_URL: ${{ secrets.BASE_URL }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
SECRETS_PROPERTIES: ${{ secrets.SECRETS_PROPERTIES }}
LOCAL_DEFAULTS_PROPERTIES: ${{ secrets.LOCAL_DEFAULTS_PROPERTIES }}
UPLOAD_KEY_STORE_JKS: ${{ secrets.UPLOAD_KEY_STORE_JKS }}
KEY_STORE_PROPERTIES: ${{ secrets.KEY_STORE_PROPERTIES }}

jobs:
android-cd:
name: Run Android CI/CD for release
runs-on: ubuntu-latest

defaults:
run:
shell: bash
working-directory: ./android/Staccato_AN

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Create local.properties
run: |
touch local.properties
- name: Set Base Url in local.properties
run: |
echo "base_url=\"$BASE_URL\"" >> local.properties
- name: Create google-services.json
run: |
echo $GOOGLE_SERVICES_JSON > ./app/google-services.json
- name: Create secrets.properties
run: |
echo $SECRETS_PROPERTIES > secrets.properties
- name: Create local.defaults.properties
run: |
echo $LOCAL_DEFAULTS_PROPERTIES > local.defaults.properties
- name: Create KeyStore File and Properties
run: |
mkdir -p ./app/signing
echo "$UPLOAD_KEY_STORE_JKS" | base64 --decode > ./app/signing/upload_key_store.jks
echo "$KEY_STORE_PROPERTIES" > ./app/signing/keystore.properties
- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build Release APK
run: ./gradlew assembleRelease

- name: Build Release AAB
run: ./gradlew bundleRelease

- name: Upload Release APK
uses: actions/upload-artifact@v3
with:
name: app-release.apk
path: android/Staccato_AN/app/build/outputs/apk/release/app-release.apk

- name: Upload Release AAB
uses: actions/upload-artifact@v3
with:
name: app-release.aab
path: android/Staccato_AN/app/build/outputs/bundle/release/app-release.aab

# - name: Upload On Google Play
# uses: r0adkll/upload-google-play@v1
# with:
# serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
# packageName: com.woowacourse.staccato
# releaseFiles: android/Staccato_AN/app/build/outputs/bundle/release/app-release.aab
# track: internal
88 changes: 88 additions & 0 deletions .github/workflows/android-ci-cd-demo-apk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
name: Android CI/CD for generating demo APK

on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]

env:
BASE_URL: ${{ secrets.BASE_URL }}
DEV_BASE_URL: ${{ secrets.DEV_BASE_URL }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
SECRETS_PROPERTIES: ${{ secrets.SECRETS_PROPERTIES }}
LOCAL_DEFAULTS_PROPERTIES: ${{ secrets.LOCAL_DEFAULTS_PROPERTIES }}
UPLOAD_KEY_STORE_JKS: ${{ secrets.UPLOAD_KEY_STORE_JKS }}
KEY_STORE_PROPERTIES: ${{ secrets.KEY_STORE_PROPERTIES }}

jobs:
apk:
name: Generate APK
runs-on: ubuntu-latest

defaults:
run:
shell: bash
working-directory: ./android/Staccato_AN

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Create local.properties
run: |
touch local.properties
- name: Set Base Url in local.properties
run: |
echo "base_url=\"$BASE_URL\"" >> local.properties
- name: Set Develop Base Url in local.properties
run: |
echo "dev_base_url=\"$DEV_BASE_URL\"" >> local.properties
- name: Create google-services.json
run: |
echo $GOOGLE_SERVICES_JSON > ./app/google-services.json
- name: Create secrets.properties
run: |
echo $SECRETS_PROPERTIES > secrets.properties
- name: Create local.defaults.properties
run: |
echo $LOCAL_DEFAULTS_PROPERTIES > local.defaults.properties
- name: Create KeyStore File and Properties
run: |
mkdir -p ./app/signing
echo "$UPLOAD_KEY_STORE_JKS" | base64 --decode > ./app/signing/upload_key_store.jks
echo "$KEY_STORE_PROPERTIES" > ./app/signing/keystore.properties
- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build Debug APK
run: ./gradlew assembleDebug

- name: Upload Debug APK
uses: actions/upload-artifact@v3
with:
name: app-debug.apk
path: android/Staccato_AN/app/build/outputs/apk/debug/app-debug.apk

- name: Upload Artifact to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{secrets.FIREBASE_APP_ID}}
serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
groups: staccato_tester
file: android/Staccato_AN/app/build/outputs/apk/debug/app-debug.apk
137 changes: 137 additions & 0 deletions .github/workflows/android-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: Android CI for develop-an

on:
push:
branches: [ "develop-an" ]
pull_request:
branches: [ "develop-an" ]

env:
BASE_URL: ${{ secrets.BASE_URL }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
SECRETS_PROPERTIES: ${{ secrets.SECRETS_PROPERTIES }}
LOCAL_DEFAULTS_PROPERTIES: ${{ secrets.LOCAL_DEFAULTS_PROPERTIES }}
UPLOAD_KEY_STORE_JKS: ${{ secrets.UPLOAD_KEY_STORE_JKS }}
KEY_STORE_PROPERTIES: ${{ secrets.KEY_STORE_PROPERTIES }}

jobs:
test:
name: Run Unit Tests
runs-on: ubuntu-latest

defaults:
run:
shell: bash
working-directory: ./android/Staccato_AN

permissions:
contents: read

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Create local.properties
run: |
touch local.properties
- name: Set Base Url in local.properties
run: |
echo "base_url=\"$BASE_URL\"" >> local.properties
- name: Create google-services.json
run: |
echo $GOOGLE_SERVICES_JSON > ./app/google-services.json
- name: Create secrets.properties
run: |
echo $SECRETS_PROPERTIES > secrets.properties
- name: Create local.defaults.properties
run: |
echo $LOCAL_DEFAULTS_PROPERTIES > local.defaults.properties
- name: Create KeyStore File and Properties
run: |
mkdir ./app/signing
echo "$UPLOAD_KEY_STORE_JKS" | base64 --decode > ./app/signing/upload_key_store.jks
echo $KEY_STORE_PROPERTIES > ./app/signing/keystore.properties
- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Clean test
run: ./gradlew clean test

build:
needs: test
name: Build and Run
runs-on: ubuntu-latest

defaults:
run:
shell: bash
working-directory: ./android/Staccato_AN

permissions:
contents: read

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Create local.properties
run: |
touch local.properties
shell: bash

- name: Set Base Url in local.properties
run: |
echo "base_url=\"$BASE_URL\"" >> local.properties
shell: bash

- name: Create google-services.json
run: |
echo $GOOGLE_SERVICES_JSON > ./app/google-services.json
shell: bash

- name: Create secrets.properties
run: |
echo $SECRETS_PROPERTIES > secrets.properties
shell: bash

- name: Create local.defaults.properties
run: |
echo $LOCAL_DEFAULTS_PROPERTIES > local.defaults.properties
shell: bash

- name: Create KeyStore File and Properties
run: |
mkdir -p ./app/signing
echo "$UPLOAD_KEY_STORE_JKS" | base64 --decode > ./app/signing/upload_key_store.jks
echo "$KEY_STORE_PROPERTIES" > ./app/signing/keystore.properties
- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Run ktlint
run: ./gradlew ktlintCheck

- name: Build with Gradle
run: ./gradlew build
3 changes: 3 additions & 0 deletions android/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions android/.idea/android.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions android/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions android/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions android/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 725bde0

Please sign in to comment.