From 22ae1806a3deae01c5270de36cf57432d5b87d69 Mon Sep 17 00:00:00 2001 From: Covy Date: Fri, 7 Jun 2024 19:43:35 +0900 Subject: [PATCH] Release 1.0.0 (#138) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: 이슈 템플릿을 추가한다 * Update bug_report.yml * initial commit * setup ci * Pull request template을 추가한다. * feat : 멀티 모듈을 위한 세팅 (#3) - 버젼 카탈로그 적용 - Build Logic 컨벤션 적용 * Update pull_request_template.md * Update android.yml * feat: network 세팅을 진행한다 (#7) * feat: core:network 모듈추가 * feat: HiltApplication 추가 * feat: Network hilt 모듈 및 Service 세팅 * feat: data 모듈 추가 * feat: google 로그인 api를 구현 --------- Co-authored-by: kwakjoohyeong * feat: Token을 저장하는 dataStore 구현 (#10) Co-authored-by: boogiwoogi * Featrue/#12_CI_빌드_시간_단축 (#13) * Update android.yml * feat: ci secret key 추가 * Feature/#4 구글 소셜 로그인 기능을 개발 (#14) * feat: 구글 소셜 로그인을 위한 기초 세팅 * feat : 구글 로그인 로직 구현 --------- Co-authored-by: boogiwoogi Co-authored-by: chws0508 * Feat/#15 테마 구축 (#16) * feat : 디자인 시스템 구축 * feat : error 수정 * ci 파일 수정 - Google Client Id 에 접근하는 코드와 build하는 코드의 순서를 바꿈 * feat: token interceptor 구현 (#18) * feat: AuthInterceptor 구현 중 * chore: 코드 포맷 * feat: 네트워크 통신을 위한 인터셉터 구현 * feat: 구글 로그인을 통해 access 토근을 받아오는 로직 구현 * feat: signUP 구현 * feat : navigateToLogin 로직 삭제 * feat : 테마 패키지 수정 * feat : suspendOnError를 suspendOnFailure로 수정 * feat : 구글 로그인 에러시 error메세지를 띄우도록 변경 * ci 문법 오류 수정 --------- Co-authored-by: kwakjoohyeong Co-authored-by: chws0508 * feat: 로그인 UI 구현 (#19) * feat: 로그인 화면 구성 * feat: 로그인 이벤트 처리 * feat: 로그인 성공 실패에 대한 이벤트 처리 * feat: 로그인 성공 실패시 snack bar 표현 * feat: splash 화면 구현 (#21) * refactor: auth interceptor hilt 적용 (#23) * feat: splash 화면 구현 * refactor: authinterceptor hilt 적용 * Refactor/#12 빌드속도 개선 (#33) * Update android.yml * fix: gradle caching 순서 변경 * fix: gradle build 제거 * feat: test를 모듈별로 병렬 수행하도록 변경 * feat: save cache로 변경 * fix: save cache 오류 수정 * feat: 빌드 캐시 workflow 추가 * feat: add build commend (#36) * feat: add build commend * feat: 병렬실행으로 변경 * Feat/#25 usecase 적용 (#37) * feat : isLoginUSeCase 구현 * test : MainViewModel test 적용 * feat : GoogleLoginManager Scope인자 제거 * feat : 콜백을 제거하도록 리팩토링 및 ViewModelTest 작성 * test : UseCase테스트 작성 * feat : 에러함수 콜백으로 처리 및 Interceptor retrofit을 이용하도록 수정 (#44) * Feat/#45 UI 비율을 360800 수정 (#46) * fix: 디자인 스펙 수정 375x800 -> 360x800 * chore: 불필요한 import 제거 * refactor: PaddingValues 대신 기본 padding 속성 사용 * Feat/#38 401 로직 구현 (#48) * refactor: TokenRepository와 해당 Repository를 사용하는 usecase 변경 * feat: WithpeaceError 추가 * refactor: nullable하게 변경 * refactor: googleLogin Response 수정 (#50) * refactor: googleLogin Response 수정 * chore: response naming 변경 * 47 게시글 등록 기능을 구현한다 (#51) * feat : 게시글 등록 모듈 생성 * feat : 완료 버튼 생성 * feat : 게시글 등록 기능 UI 구현 완료 * feat : UI기능 전까지 완료 * feat : 이미지 삭제 아이콘 적용 및 스크롤 기능 적용 * feat : 커스텀 갤러리 기능 구현 * feat : 이미지 권한 요청 기능 구현 * feat : 갤러리에서 선택한 이미지를 게시글에서 받도록 구현 * feat : 게시글 등록 API 연동 구현 * feat : 설정창으로 이동 다이얼로그 기능 구현 * feat : StringResource 리팩토링 * feat : Dependency Graph 모듈 볼수 있는 플러그인 추가 * feat : 갤러리 이미지 개수 표현 방식 변경 - 기존: 0/3 - 변경: 2/5 * feat : 이미지 최대 개수 넘을 시 토스트 메세지 띄우는 기능 구현 * feat : 화면 회전시 앱이 안보이는 버그 수정 * feat : GetAlbumImagesUseCase로 네이밍 수정 * feat : Cursor -> Query로 네이밍 수정 * feat : GetAlbumImagesUseCase에서 ImagePagingInfo를 주도록 변경 * feat : 게시글 등록 화면 화면회전 대처 * feat : GalleryViewModel Test 작성 * test : GetAllFoldersUseCaseTest 및 RegisterPostUsecaseTest 작성 * feat : releaseMode Proguard 적용 * feat : suspend 키워드 추가 * feat : 게시글 등록 API Type 컬럼 값 변경 * feat : 앱 난독화 적용 * test : RegisterPostViewModel 테스트 작성 * Feat/#53 바텀 네비게이션을 구현한다 (#55) * feat: bottom navigation 화면 추가 * feat: bottom navigation 적용 * feat: bottom navigation 아이콘 변경 적용 * refactor: string res 추출 * feat : firebase crashlytics 적용 (#59) * feat : firebase crashlytics 적용 * feat : google-services ci에 적용 * feat : google-services ci에 적용 * feat: yml google service 적용 --------- Co-authored-by: Covy * fix : 폴더가 없는 사진은 가져오지 않도록 수정 (#64) * Feat/#57-게시글 목록 조회 UI를 구현한다 (#60) * feat : 게시글 등록 모듈 생성 * feat : 게시글 등록 기능 UI 구현 완료 * feat : UI기능 전까지 완료 * feat : 커스텀 갤러리 기능 구현 * feat : 갤러리에서 선택한 이미지를 게시글에서 받도록 구현 * feat : 게시글 등록 API 연동 구현 * feat : StringResource 리팩토링 * feat : Dependency Graph 모듈 볼수 있는 플러그인 추가 * feat : 화면 회전시 앱이 안보이는 버그 수정 * feat : GetAlbumImagesUseCase로 네이밍 수정 * feat : GetAlbumImagesUseCase에서 ImagePagingInfo를 주도록 변경 * feat : GalleryViewModel Test 작성 * feat : 앱 난독화 적용 * test : RegisterPostViewModel 테스트 작성 * feat : core-ui 모듈 추가 및 PostTopicUiState core-ui로 이동 * refactor : Rebase 충돌 수정 * refactor : 모듈을 post에서 postList로 수정 * refactor : material3 버젼 업 * feat : 게시글 목록 화면 탭 UI 구현 * feat : Tab에 viewModel 상태 적용 * feat : 게시글 목록 UI 구현 완료 * feat : Date 계산 로직 도메인으로 이동 * feat : 사진 변경사항 적용 - 고정 크기로 변경 - 사진이 없을 경우 대처 * Feat/#43 프로필 기능을 개발한다 (#63) * feat/#52 signup 기능을 구현한다 (#74) * Rebase develop * feat: basicTextField 중앙 정렬 적용 * feat: role에 대한 회원가입 화면 이동로직 추가 * feat: 최초 로그인 profile 수정 * refactor: ProfileEditor, NickNameEditor 공용함수화 * fix: 토큰 저장방식 수정 * feat: 최초로그인 구현 * fix: signUp 버튼 클릭시 이벤트 변경 * feat: role, id 로컬 저장 및 따라 자동로그인 로직 추가 * feat: 회원가입 성공시 권한 업그레이드 * fix: refresh header 추가 (#75) * Feat/#61 게시글 상세 UI 구현 (#66) * refactor : Image폴더로 이동 * feat : PostDetail Navigation 로직 작성 * feat : 게시글 등록 모듈 생성 * feat : 게시글 등록 기능 UI 구현 완료 * feat : UI기능 전까지 완료 * feat : 커스텀 갤러리 기능 구현 * feat : 갤러리에서 선택한 이미지를 게시글에서 받도록 구현 * feat : 게시글 등록 API 연동 구현 * feat : StringResource 리팩토링 * feat : Dependency Graph 모듈 볼수 있는 플러그인 추가 * feat : 화면 회전시 앱이 안보이는 버그 수정 * feat : GetAlbumImagesUseCase로 네이밍 수정 * feat : GetAlbumImagesUseCase에서 ImagePagingInfo를 주도록 변경 * feat : GalleryViewModel Test 작성 * feat : 앱 난독화 적용 * test : RegisterPostViewModel 테스트 작성 * refactor : Rebase 충돌 수정 * feat : 게시글 목록 UI 구현 완료 * feat : Date 계산 로직 도메인으로 이동 * feat : PostScreen UI 구현 * feat : NavHost에 postDetail 화면 추가 * feat : 중첩 그래프 적용 및 windowInset 올바르게 적용 * feat : value class로 변경 * feat : 목록에서 detail로 이동하는 로직 구현 * feat : PostDetail 뒤로가기 버튼 적용 * feat : bottomNavigation 로직 변경 * feat : 오류 및 로딩 화면 간단 대응 * feat : Profile 패딩 적용 * feat : TopBar를 공통으로 사용 * feat : 충돌 해결 * fix: Refresh토큰 API 헤더 변경 (#80) * Feat/#67 게시글 목록 기능 구현 (#79) * feat : 게시글 등록 모듈 생성 * feat : 게시글 등록 기능 UI 구현 완료 * feat : UI기능 전까지 완료 * feat : 커스텀 갤러리 기능 구현 * feat : 갤러리에서 선택한 이미지를 게시글에서 받도록 구현 * feat : 게시글 등록 API 연동 구현 * feat : StringResource 리팩토링 * feat : Dependency Graph 모듈 볼수 있는 플러그인 추가 * feat : 화면 회전시 앱이 안보이는 버그 수정 * feat : GetAlbumImagesUseCase로 네이밍 수정 * feat : GetAlbumImagesUseCase에서 ImagePagingInfo를 주도록 변경 * feat : GalleryViewModel Test 작성 * feat : 앱 난독화 적용 * test : RegisterPostViewModel 테스트 작성 * feat : core-ui 모듈 추가 및 PostTopicUiState core-ui로 이동 * refactor : Rebase 충돌 수정 * refactor : 모듈을 post에서 postList로 수정 * refactor : material3 버젼 업 * feat : 게시글 목록 화면 탭 UI 구현 * feat : Tab에 viewModel 상태 적용 * feat : 게시글 목록 UI 구현 완료 * feat : Date 계산 로직 도메인으로 이동 * feat : 사진 변경사항 적용 - 고정 크기로 변경 - 사진이 없을 경우 대처 * feat : 게시글 목록 가져오는 기능 Usecase 및 Repository 로직 구현 * feat : 게시글 목록 조회 Paging 기능 ViewModel 및 View에 적용 * feat : snapshotList를 쓰지 않도록 수정 - snapshotList는 페이징 적용 x * feat : 에러 이벤트 처리 구현 * feat : UiModel 적용 * feat : 리뷰 반영 * Fix/#77 커스텀 갤러리 이미지 validation 추가 (#81) * refactor: image 정보로 mimeType, size 추가 * feat: 타입, 사이즈 검증 로직 추가 * refactor: 리뷰반영 * Feat/#65 게시글 상세 기능 구현 (댓글 x) * refactor : Image폴더로 이동 * feat : PostDetail Navigation 로직 작성 * feat : 게시글 등록 모듈 생성 * feat : 게시글 등록 기능 UI 구현 완료 * feat : UI기능 전까지 완료 * feat : 커스텀 갤러리 기능 구현 * feat : 갤러리에서 선택한 이미지를 게시글에서 받도록 구현 * feat : 게시글 등록 API 연동 구현 * feat : StringResource 리팩토링 * feat : Dependency Graph 모듈 볼수 있는 플러그인 추가 * feat : 화면 회전시 앱이 안보이는 버그 수정 * feat : GetAlbumImagesUseCase로 네이밍 수정 * feat : GetAlbumImagesUseCase에서 ImagePagingInfo를 주도록 변경 * feat : GalleryViewModel Test 작성 * feat : 앱 난독화 적용 * test : RegisterPostViewModel 테스트 작성 * refactor : Rebase 충돌 수정 * feat : 게시글 목록 UI 구현 완료 * feat : Date 계산 로직 도메인으로 이동 * feat : PostScreen UI 구현 * feat : NavHost에 postDetail 화면 추가 * feat : 중첩 그래프 적용 및 windowInset 올바르게 적용 * feat : value class로 변경 * feat : 목록에서 detail로 이동하는 로직 구현 * feat : PostDetail 뒤로가기 버튼 적용 * feat : bottomNavigation 로직 변경 * feat : 오류 및 로딩 화면 간단 대응 * feat : Profile 패딩 적용 * feat : TopBar를 공통으로 사용 * feat : PostDetail Navigation 로직 작성 * refactor : 모듈을 post에서 postList로 수정 * feat : 게시글 목록 UI 구현 완료 * feat : Date 계산 로직 도메인으로 이동 * feat : 게시글 상세 정보 가져오는 API 기능 구현 * feat : 게시글 상세 정보 가져오는 API viewmodel에 적용 * feat : viewModel 적용 오류 수정 * feat: DateUiModel 생성 및 ProfileDetailUiModel 적용 * feat: BottomSheet 구현 * feat: 삭제 API 연동 * feat: 삭제 기능 UI 적용 * feat: 게시글 수정 기능 및 삭제 API 연동 * feat: 게시글 삭제 다이얼로그 적용 * feat: 게시글 등록 바텀네비게이션 등록 * feat: 백스택 오류 수정 * test: 테스트 수정 * feat: 게시글 수정 완료시 , navOptions 수정 * feat: 이미지 등록 이슈 해결 - URL도 파일로 변환 로직 추가 - 이미지 등록 Column 변경 * Fix/#76 프로필 최초 로그인 qa 사안 적용한다 (#86) * fix: 닉네임 검증 로직 수정 * refactor: 프로필 변경 가능 조건 변경 버튼(on off) * fix: token prefix 추가 * fix: conflict 수정 * refactor: naming 수정 * Refactor/#87 오류처리 개선 (#88) * feat: response 확장함수 추가 * refactor: cheongha error로 에러 통일 및 리팩토링 * refactor: logout api 로직 추가 * test: 테스트 수정 * refactor: onAuthExpired 로직 추가 * Paging 성능 개선 및 테스트 작성 (#89) * refactor: 이미지 관련 페이징 수정 - ket 추가 - Data영역으로 PagingSource 파일 이동 - PagingSource 테스트 작성 - GalleryViewModel 테스트 수정 * refactor: PostList 관련 페이징 수정 - ket 추가 - Data영역으로 PagingSource 파일 이동 - PagingSource 테스트 작성 - PostListViewModel 테스트 작성 * Feat/#91 댓글 기능을 구현한다 (#95) * feat : API 연동 * feat : 댓글 기능 구현 * feat : 이미지 회전 이슈 해결 * feat : 이미지 등록 로딩 구현 * feat : url 이미지 회전 이슈 해결 * feat : 로딩 시에는 완료 버튼이 클릭이 안되도록 방지 * feat : 댓글 요청 형식 변경 대응 * refactor : Delay 제거 * refactor : Default값 제거 * refactor : 현재 시간 Zond을 "Asia/Seoul" 로 변경 * refactor : 1초 이하면, 1초 전으로 표시하도록 수정 * refactor : isContentFocused 변수를 추가하여, 내용 TextField 에 Foucs 되있을 때만 키보드 올라오도록 함 (#99) * feat: PostDetail 애니메이션 변경 (#100) * Feat/#90 청년 정책 리스트 기능을 구현한다 (#96) * feat: 청년 정책 API 연동 * feat: pagingSource 추가 * feat: 지역, 분류 도메인 모델 추가 * feat: 시작페이지 수정 * feat: 필터 request 파라미터 적용 * feat: 흰 상태바 적용 * feat: 정책 카드 추가 * feat: 그림자 추가 * feat: UI단 Paging 의존성 추가 * feat: yml local.properties 추가 * fix: yml local.properties 수정 * feat: API View 연동 * feat: API 예외 케이스 추가 * fix: 뷰 패딩 값 수정 * feat: UiModel 적용 * feat: 정책분야 필터 화면 추가 * fix: 필터 UI 수정 * fix: 필터 높이가 맞지 않던 디자인 수정 * feat: 애니메이션 적용 및 필터 기능 완료 * feat: 로고 수정 * fix: 바텀 시트 높이가 맞지 않는 문제 수정 * fix: onSizeChanged로 변경 * feat: 필터 확장 기능 편의성 추가 확장된 필터로 검색한 후 다시 필터화면으로 돌아가면 확장된 상태이다. * feat: 하단 로딩 뷰 추가 * feat: postList 하단 로딩 뷰 추가 * feat/#106 신고 기능 구현 (#109) * refactor : 게시글 신고 모달 패딩조정 * feat : 게시글 신고 기능 구현 * feat : 댓글 신고 기능 구현 * feat: 사용자의 글 다시보지 않기 섹션 제거 --------- Co-authored-by: chws0508 * Feat/#110 1차 출시 준비 (#113) * feat: 앱 이름 수정 * feat: 홈, 스플래시 로고 업데이트 * feat: 브랜드 컬러 업데이트 * feat: 임시 앱 로고 추가 * feat: 워크플로 수정 * feat: Divider -> Spacer 변경 * feat: 마이페이지 로딩화면 추가 * feat: scrollable 추가 * feat: post editor round 추가 * feat: 서비스명 업데이트 * feat: 탈퇴 기능 추가 * Fix/#116 로그인 후 백스택 제거 (#119) * feat: 로그인 성공 후 백스택 제거 로직 추가 * feat: 삭제된 유저 validation 추가 * feat: 본인 댓글 안보이게 수정 * chore: version code 변경 * Feat/#104 firebase analytics 적용 (#124) * fix: 바텀 시트 색 변경 * feat: analytics 모듈 추가 * refactor: gradle 의존성 갱신 * feat: analytics 추가 * Feat/#120 2차 버그 수정 및 개선 (#131) * feat: 게시글 리스트 댓글 수 기능 추가 * feat: app logo 갱신 * feat: 게시글 삭제시, 리스트 반영 로직 추가 * test: 테스트 코드 수정 * Update README.md * Feat/#132 청년 정책 상세 기능 구현 (#133) * feat: 정책 분류 이미지 추가 * feat: analytics 리세팅 * feat: 화면 이벤트 적용 * feat: 키보드 높이 적용 * feat: 로깅 작업 완료 * refactor: 로깅 의존성 주입 방식 변경 EntryPoint 적용 * feat: 정책 상세 화면 이동기능 추가 * Revert "refactor: 로깅 의존성 주입 방식 변경" This reverts commit 77275a3fb2c7d4048ad0f280fb5fa5b6a56e324b. * feat: 정책 상세 데이터 작업 * feat: error 상태 java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern * fix: error 수정 * feat: 하이퍼링크 추가 * feat: title 애니메이션 적용 * feat: padding 수정 * feat: 로깅 작업 * Feat/#134 개인정보 수집 동의 기능 추가 (#136) * feat: 홈 로고 변경 * feat: top app bar 수정 * feat: 정책 상세 추가정보 섹션 추가 * feat: 서비스 이용약관, 개인정보 처리방침 모듈 추가 * feat: 약관 동의 UI 완성 * feat: 정책 상세 UI 수정 * feat: gradle 설정 변경 * feat: 로깅 debug, release 구분 * refactor: 필요없는 로직 제거 * feat: 인앱 업데이트 및 약관 웹뷰 추가 * feat: padding 수정 * chore: 버전코드 수정 --------- Co-authored-by: boogiwoogi Co-authored-by: Choi Woo Seok --- .editorconfig | 4 + .github/ISSUE_TEMPLATE/bug_report.yml | 46 ++ .github/ISSUE_TEMPLATE/feat.yml | 19 + .github/pull_request_template.md | 11 + .github/workflows/android.yml | 65 ++ .github/workflows/build_cache.yml | 63 ++ README.md | 18 +- app/.gitignore | 246 +++++++ app/build.gradle.kts | 66 ++ app/proguard-rules.pro | 37 + app/release/output-metadata.json | 20 + .../withpeace/ExampleInstrumentedTest.kt | 22 + app/src/main/AndroidManifest.xml | 38 ++ app/src/main/ic_app_logo-playstore.png | Bin 0 -> 19562 bytes .../com/withpeace/withpeace/MainActivity.kt | 150 +++++ .../withpeace/MainBottomNavigation.kt | 123 ++++ .../com/withpeace/withpeace/MainUiState.kt | 9 + .../com/withpeace/withpeace/MainViewModel.kt | 47 ++ .../withpeace/WithPeaceApplication.kt | 7 + .../com/withpeace/withpeace/WithpeaceApp.kt | 63 ++ .../withpeace/withpeace/navigation/NavHost.kt | 272 ++++++++ .../res/drawable/ic_app_logo_foreground.xml | 51 ++ app/src/main/res/drawable/ic_bottom_home.xml | 11 + .../res/drawable/ic_bottom_home_select.xml | 10 + .../main/res/drawable/ic_bottom_my_page.xml | 11 + .../res/drawable/ic_bottom_my_page_select.xml | 9 + app/src/main/res/drawable/ic_bottom_post.xml | 20 + .../res/drawable/ic_bottom_post_register.xml | 23 + .../res/drawable/ic_bottom_post_select.xml | 25 + .../res/drawable/ic_launcher_background.xml | 170 +++++ .../res/drawable/ic_launcher_foreground.xml | 30 + app/src/main/res/drawable/ic_upload.xml | 23 + app/src/main/res/drawable/splash_inset.xml | 7 + .../res/mipmap-anydpi-v26/ic_app_logo.xml | 5 + .../mipmap-anydpi-v26/ic_app_logo_round.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_app_logo.webp | Bin 0 -> 1486 bytes .../res/mipmap-hdpi/ic_app_logo_round.webp | Bin 0 -> 3052 bytes app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_app_logo.webp | Bin 0 -> 1054 bytes .../res/mipmap-mdpi/ic_app_logo_round.webp | Bin 0 -> 1994 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_app_logo.webp | Bin 0 -> 1976 bytes .../res/mipmap-xhdpi/ic_app_logo_round.webp | Bin 0 -> 4318 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_app_logo.webp | Bin 0 -> 2918 bytes .../res/mipmap-xxhdpi/ic_app_logo_round.webp | Bin 0 -> 6650 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_app_logo.webp | Bin 0 -> 4052 bytes .../res/mipmap-xxxhdpi/ic_app_logo_round.webp | Bin 0 -> 9236 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values/colors.xml | 10 + .../res/values/ic_app_logo_background.xml | 4 + app/src/main/res/values/strings.xml | 7 + app/src/main/res/values/themes.xml | 28 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../withpeace/withpeace/MainViewModelTest.kt | 69 ++ build-logic/build.gradle.kts | 11 + build-logic/settings.gradle.kts | 18 + build-logic/src/main/kotlin/Extension.kt | 23 + .../kotlin/convention.android.base.gradle.kts | 31 + .../convention.android.compose.gradle.kts | 33 + .../kotlin/convention.android.hilt.gradle.kts | 14 + .../kotlin/convention.application.gradle.kts | 10 + .../kotlin/convention.coroutine.gradle.kts | 6 + .../main/kotlin/convention.data.gradle.kts | 11 + .../main/kotlin/convention.feature.gradle.kts | 19 + .../convention.kotlin.library.gradle.kts | 9 + .../kotlin/convention.test.library.gradle.kts | 6 + build.gradle.kts | 17 + core/analytics/.gitignore | 1 + core/analytics/build.gradle.kts | 17 + core/analytics/consumer-rules.pro | 0 core/analytics/proguard-rules.pro | 24 + .../core/analytics/ExampleInstrumentedTest.kt | 24 + core/analytics/src/main/AndroidManifest.xml | 7 + .../core/analytics/AnalyticsEvent.kt | 29 + .../core/analytics/AnalyticsHelper.kt | 5 + .../core/analytics/AnalyticsModule.kt | 31 + .../core/analytics/FirebaseAnalyticsHelper.kt | 21 + .../core/analytics/NoOpAnalyticsHelper.kt | 5 + .../core/analytics/StubAnalyticsHelper.kt | 13 + .../withpeace/core/analytics/UiHelper.kt | 7 + core/data/.gitignore | 1 + core/data/build.gradle.kts | 44 ++ core/data/consumer-rules.pro | 1 + core/data/proguard-rules.pro | 21 + core/data/src/main/AndroidManifest.xml | 4 + .../core/data/analytics/AnalyticsExtension.kt | 12 + .../core/data/di/RepositoryModule.kt | 54 ++ .../core/data/mapper/ChangedProfileMapper.kt | 12 + .../withpeace/core/data/mapper/DateMapper.kt | 11 + .../core/data/mapper/ImageInfoMapper.kt | 12 + .../core/data/mapper/PostDetailMapper.kt | 37 + .../withpeace/core/data/mapper/PostMapper.kt | 16 + .../core/data/mapper/PostTopicMapper.kt | 21 + .../core/data/mapper/ProfileInfoMapper.kt | 13 + .../withpeace/core/data/mapper/RoleMapper.kt | 11 + .../core/data/mapper/YouthPolicyMapper.kt | 104 +++ .../core/data/paging/ImagePagingSource.kt | 43 ++ .../core/data/paging/PostPagingSource.kt | 85 +++ .../data/paging/YouthPolicyPagingSource.kt | 61 ++ .../repository/DefaultAppUpdateRepository.kt | 26 + .../data/repository/DefaultImageRepository.kt | 44 ++ .../data/repository/DefaultPostRepository.kt | 194 ++++++ .../data/repository/DefaultTokenRepository.kt | 56 ++ .../data/repository/DefaultUserRepository.kt | 181 +++++ .../DefaultYouthPolicyRepository.kt | 36 + .../core/data/util/ApiResponseExtension.kt | 20 + .../withpeace/core/data/util/image.kt | 78 +++ .../core/data/paging/ImagePagingSourceTest.kt | 85 +++ .../core/data/paging/PostPagingSourceTest.kt | 128 ++++ core/datastore/.gitignore | 1 + core/datastore/build.gradle.kts | 16 + core/datastore/consumer-rules.pro | 1 + core/datastore/proguard-rules.pro | 21 + .../core/datastore/ExampleInstrumentedTest.kt | 22 + core/datastore/src/main/AndroidManifest.xml | 4 + .../token/DefaultTokenPreferenceDataSource.kt | 46 ++ .../token/TokenPreferenceDataSource.kt | 15 + .../user/DefaultUserPreferenceDataSource.kt | 45 ++ .../user/UserPreferenceDataSource.kt | 15 + .../core/datastore/di/DataStoreModule.kt | 38 ++ .../di/PreferenceDataSourceModule.kt | 28 + .../core/datastore/ExampleUnitTest.kt | 16 + core/designsystem/.gitignore | 1 + core/designsystem/build.gradle.kts | 9 + core/designsystem/consumer-rules.pro | 0 core/designsystem/proguard-rules.pro | 21 + .../designsystem/src/main/AndroidManifest.xml | 4 + .../core/designsystem/theme/Color.kt | 49 ++ .../core/designsystem/theme/Padding.kt | 9 + .../core/designsystem/theme/Theme.kt | 50 ++ .../withpeace/core/designsystem/theme/Type.kt | 177 +++++ .../withpeace/core/designsystem/ui/Box.kt | 15 + .../withpeace/core/designsystem/ui/Button.kt | 45 ++ .../withpeace/core/designsystem/ui/Card.kt | 41 ++ .../core/designsystem/ui/Checkbox.kt | 61 ++ .../core/designsystem/ui/NoTitleDialog.kt | 90 +++ .../core/designsystem/ui/TitleBar.kt | 29 + .../core/designsystem/ui/TopAppBar.kt | 61 ++ .../designsystem/util/ModifierExtension.kt | 54 ++ .../main/res/drawable/ic_backarrow_left.xml | 5 + .../main/res/drawable/ic_backarrow_right.xml | 5 + .../src/main/res/font/notosans_kr_medium.ttf | Bin 0 -> 6190280 bytes .../src/main/res/font/pretendard_black.ttf | Bin 0 -> 2665004 bytes .../src/main/res/font/pretendard_bold.ttf | Bin 0 -> 2661752 bytes .../main/res/font/pretendard_extra_bold.ttf | Bin 0 -> 2669648 bytes .../main/res/font/pretendard_extra_light.ttf | Bin 0 -> 2838808 bytes .../src/main/res/font/pretendard_light.ttf | Bin 0 -> 2813692 bytes .../src/main/res/font/pretendard_medium.ttf | Bin 0 -> 2701192 bytes .../src/main/res/font/pretendard_regular.ttf | Bin 0 -> 2725828 bytes .../main/res/font/pretendard_semi_bold.ttf | Bin 0 -> 2671468 bytes .../src/main/res/font/pretendard_thin.ttf | Bin 0 -> 2868924 bytes .../src/main/res/values/strings.xml | 4 + core/domain/.gitignore | 1 + core/domain/build.gradle.kts | 9 + .../withpeace/core/domain/model/SignUpInfo.kt | 6 + .../withpeace/core/domain/model/date/Date.kt | 11 + .../core/domain/model/date/DurationFromNow.kt | 39 ++ .../core/domain/model/error/CheonghaError.kt | 3 + .../core/domain/model/error/ClientError.kt | 11 + .../core/domain/model/error/ResponseError.kt | 54 ++ .../core/domain/model/image/ImageFolder.kt | 7 + .../core/domain/model/image/ImageInfo.kt | 29 + .../core/domain/model/image/LimitedImages.kt | 35 + .../model/policy/PolicyClassification.kt | 5 + .../core/domain/model/policy/PolicyFilters.kt | 28 + .../core/domain/model/policy/PolicyRegion.kt | 5 + .../core/domain/model/policy/YouthPolicy.kt | 27 + .../core/domain/model/post/Comment.kt | 16 + .../withpeace/core/domain/model/post/Post.kt | 13 + .../core/domain/model/post/PostContent.kt | 10 + .../core/domain/model/post/PostDetail.kt | 20 + .../core/domain/model/post/PostTitle.kt | 10 + .../core/domain/model/post/PostTopic.kt | 9 + .../core/domain/model/post/RegisterPost.kt | 11 + .../core/domain/model/post/ReportType.kt | 9 + .../domain/model/profile/ChangedProfile.kt | 6 + .../model/profile/ChangingProfileInfo.kt | 7 + .../core/domain/model/profile/Nickname.kt | 17 + .../model/profile/ProfileChangingStatus.kt | 30 + .../core/domain/model/profile/ProfileInfo.kt | 7 + .../withpeace/core/domain/model/role/Role.kt | 5 + .../domain/repository/AppUpdateRepository.kt | 8 + .../core/domain/repository/ImageRepository.kt | 16 + .../core/domain/repository/PostRepository.kt | 51 ++ .../core/domain/repository/TokenRepository.kt | 14 + .../core/domain/repository/UserRepository.kt | 45 ++ .../repository/YouthPolicyRepository.kt | 14 + .../domain/usecase/CheckAppUpdateUseCase.kt | 15 + .../core/domain/usecase/DeletePostUseCase.kt | 15 + .../domain/usecase/GetAlbumImagesUseCase.kt | 14 + .../domain/usecase/GetAllFoldersUseCase.kt | 13 + .../domain/usecase/GetCurrentUserIdUseCase.kt | 12 + .../domain/usecase/GetPostDetailUseCase.kt | 19 + .../core/domain/usecase/GetPostsUseCase.kt | 23 + .../domain/usecase/GetProfileInfoUseCase.kt | 19 + .../domain/usecase/GetYouthPoliciesUseCase.kt | 22 + .../core/domain/usecase/GoogleLoginUseCase.kt | 17 + .../core/domain/usecase/IsLoginUseCase.kt | 12 + .../core/domain/usecase/LogoutUseCase.kt | 13 + .../domain/usecase/RegisterCommentUseCase.kt | 19 + .../domain/usecase/RegisterPostUseCase.kt | 16 + .../domain/usecase/ReportCommentUseCase.kt | 16 + .../core/domain/usecase/ReportPostUseCase.kt | 16 + .../core/domain/usecase/SignUpUseCase.kt | 18 + .../domain/usecase/UpdateProfileUseCase.kt | 41 ++ .../domain/usecase/VerifyNicknameUseCase.kt | 23 + .../core/domain/usecase/WithdrawUseCase.kt | 17 + .../usecase/GetAlbumImagesUseCaseTest.kt | 24 + .../usecase/GetAllFoldersUseCaseTest.kt | 32 + .../domain/usecase/GetPostsUseCaseTest.kt | 31 + .../domain/usecase/GoogleLoginUseCaseTest.kt | 65 ++ .../core/domain/usecase/IsLoginUseCaseTest.kt | 33 + .../domain/usecase/RegisterPostUseCaseTest.kt | 82 +++ .../core/domain/usecase/SignUpUseCaseTest.kt | 66 ++ core/imagestorage/.gitignore | 1 + core/imagestorage/build.gradle.kts | 14 + core/imagestorage/consumer-rules.pro | 0 core/imagestorage/proguard-rules.pro | 21 + .../imagestorage/src/main/AndroidManifest.xml | 4 + .../imagestorage/DefaultImageDataSource.kt | 134 ++++ .../core/imagestorage/ImageDataSource.kt | 13 + .../imagestorage/ImageDataSourceModule.kt | 19 + .../core/imagestorage/ImageFolderEntity.kt | 9 + .../core/imagestorage/ImageInfoEntity.kt | 9 + core/interceptor/.gitignore | 1 + core/interceptor/build.gradle.kts | 21 + core/interceptor/consumer-rules.pro | 1 + core/interceptor/proguard-rules.pro | 21 + core/interceptor/src/main/AndroidManifest.xml | 4 + .../core/interceptor/AuthInterceptor.kt | 78 +++ .../core/interceptor/InterceptorModule.kt | 23 + core/network/.gitignore | 1 + core/network/build.gradle.kts | 38 ++ core/network/consumer-rules.pro | 1 + core/network/proguard-rules.pro | 21 + .../core/network/ExampleInstrumentedTest.kt | 22 + core/network/src/main/AndroidManifest.xml | 4 + .../core/network/di/common/OkHttpUtil.kt | 12 + .../network/di/common/WithPeaceErrorBody.kt | 6 + .../core/network/di/di/NetworkModule.kt | 127 ++++ .../core/network/di/di/ServiceModule.kt | 44 ++ .../core/network/di/request/CommentRequest.kt | 9 + .../network/di/request/NicknameRequest.kt | 8 + .../network/di/request/ReportTypeRequest.kt | 8 + .../core/network/di/request/SignUpRequest.kt | 3 + .../core/network/di/response/BaseResponse.kt | 9 + .../di/response/ChangedProfileResponse.kt | 9 + .../core/network/di/response/LoginResponse.kt | 12 + .../network/di/response/ProfileResponse.kt | 10 + .../core/network/di/response/TokenResponse.kt | 9 + .../di/response/YouthPolicyListResponse.kt | 66 ++ .../di/response/post/CommentResponse.kt | 13 + .../di/response/post/PostDetailResponse.kt | 17 + .../di/response/post/PostIdResponse.kt | 8 + .../network/di/response/post/PostResponse.kt | 14 + .../di/response/post/PostTopicResponse.kt | 10 + .../network/di/service/AppUpdateService.kt | 12 + .../core/network/di/service/AuthService.kt | 29 + .../core/network/di/service/PostService.kt | 74 ++ .../core/network/di/service/UserService.kt | 60 ++ .../network/di/service/YouthPolicyService.kt | 17 + .../withpeace/core/network/ExampleUnitTest.kt | 16 + core/permission/.gitignore | 1 + core/permission/build.gradle.kts | 13 + core/permission/consumer-rules.pro | 0 core/permission/proguard-rules.pro | 21 + core/permission/src/main/AndroidManifest.xml | 4 + .../core/permission/ImagePermission.kt | 145 ++++ .../src/main/res/values/strings.xml | 6 + core/testing/.gitignore | 1 + core/testing/build.gradle.kts | 16 + core/testing/consumer-rules.pro | 0 core/testing/proguard-rules.pro | 21 + core/testing/src/main/AndroidManifest.xml | 4 + .../core/testing/MainDispatcherRule.kt | 23 + core/ui/.gitignore | 1 + core/ui/build.gradle.kts | 21 + core/ui/consumer-rules.pro | 0 core/ui/proguard-rules.pro | 21 + .../core/ui/ExampleInstrumentedTest.kt | 24 + core/ui/src/main/AndroidManifest.xml | 4 + .../withpeace/core/ui/DateUiModel.kt | 92 +++ .../core/ui/analytics/AnalyticsExtension.kt | 42 ++ .../withpeace/core/ui/common/WebView.kt | 91 +++ .../core/ui/policy/ClassificationUiModel.kt | 28 + .../withpeace/core/ui/policy/RegionUiModel.kt | 16 + .../core/ui/policy/YouthPolicyUiModel.kt | 100 +++ .../policy/analytics/PolicyAnalyticsUtil.kt | 39 ++ .../withpeace/core/ui/post/CommentUiModel.kt | 34 + .../core/ui/post/PostDetailUiModel.kt | 39 ++ .../core/ui/post/PostTopicUiModel.kt | 50 ++ .../withpeace/core/ui/post/PostUiModel.kt | 26 + .../core/ui/post/RegisterPostUiModel.kt | 32 + .../core/ui/post/ReportTypeUiModel.kt | 36 + .../ui/post/analytics/PostAnalyticsUtil.kt | 63 ++ .../core/ui/profile/NicknameEditor.kt | 110 +++ .../core/ui/profile/ProfileEditor.kt | 82 +++ .../ui/profile/ProfileNicknameValidUiState.kt | 8 + .../core/ui/serializable/BundleUtil.kt | 24 + .../core/ui/serializable/NaivigationUtil.kt | 18 + .../core/ui/serializable/SerializableType.kt | 12 + core/ui/src/main/res/drawable/ic_app_logo.xml | 46 ++ .../main/res/drawable/ic_default_profile.xml | 24 + core/ui/src/main/res/drawable/ic_economy.xml | 5 + .../main/res/drawable/ic_editor_pencil.xml | 14 + core/ui/src/main/res/drawable/ic_freedom.xml | 7 + core/ui/src/main/res/drawable/ic_hobby.xml | 23 + .../src/main/res/drawable/ic_information.xml | 5 + core/ui/src/main/res/drawable/ic_life.xml | 47 ++ .../main/res/drawable/ic_policy_eductaion.xml | 201 ++++++ .../src/main/res/drawable/ic_policy_job.xml | 132 ++++ .../ic_policy_participation_right.xml | 120 ++++ .../main/res/drawable/ic_policy_resident.xml | 468 +++++++++++++ .../drawable/ic_policy_welfare_culture.xml | 66 ++ core/ui/src/main/res/drawable/ic_question.xml | 9 + core/ui/src/main/res/values/strings.xml | 33 + feature/gallery/.gitignore | 1 + feature/gallery/build.gradle.kts | 20 + feature/gallery/consumer-rules.pro | 0 feature/gallery/proguard-rules.pro | 21 + feature/gallery/src/main/AndroidManifest.xml | 4 + .../feature/gallery/GalleryScreen.kt | 305 +++++++++ .../feature/gallery/GallerySideEffect.kt | 7 + .../feature/gallery/GalleryViewModel.kt | 101 +++ .../gallery/navigation/GalleryNavigation.kt | 42 ++ .../src/main/res/drawable/ic_check.xml | 17 + .../main/res/drawable/ic_picture_select.xml | 7 + .../gallery/src/main/res/values/strings.xml | 6 + .../feature/gallery/GalleryViewModelTest.kt | 188 ++++++ feature/home/.gitignore | 1 + feature/home/build.gradle.kts | 12 + feature/home/consumer-rules.pro | 0 feature/home/proguard-rules.pro | 21 + .../feature/home/ExampleInstrumentedTest.kt | 24 + feature/home/src/main/AndroidManifest.xml | 4 + .../withpeace/feature/home/HomeScreen.kt | 384 +++++++++++ .../withpeace/feature/home/HomeViewModel.kt | 93 +++ .../home/filtersetting/FilterBottomSheet.kt | 327 +++++++++ .../uistate/FilterListUiState.kt | 36 + .../feature/home/navigation/HomeNavigation.kt | 26 + .../home/uistate/PolicyFiltersUiModel.kt | 28 + .../home/src/main/res/drawable/ic_filter.xml | 12 + .../src/main/res/drawable/ic_filter_close.xml | 9 + .../main/res/drawable/ic_filter_expanded.xml | 12 + .../src/main/res/drawable/ic_filter_fold.xml | 12 + .../src/main/res/drawable/ic_home_logo.xml | 15 + .../drawable/ic_home_thumbnail_example.png | Bin 0 -> 3553 bytes feature/home/src/main/res/values/strings.xml | 13 + .../withpeace/feature/home/ExampleUnitTest.kt | 17 + feature/login/.gitignore | 1 + feature/login/build.gradle.kts | 11 + feature/login/consumer-rules.pro | 0 feature/login/proguard-rules.pro | 21 + feature/login/src/main/AndroidManifest.xml | 4 + .../withpeace/feature/login/LoginScreen.kt | 171 +++++ .../withpeace/feature/login/LoginUiEvent.kt | 15 + .../withpeace/feature/login/LoginViewModel.kt | 50 ++ .../login/navigation/LoginNavigation.kt | 27 + .../src/main/res/drawable/img_google_logo.png | Bin 0 -> 884 bytes feature/login/src/main/res/values/strings.xml | 8 + .../feature/login/LoginViewModelTest.kt | 112 ++++ feature/mypage/.gitignore | 1 + feature/mypage/build.gradle.kts | 12 + feature/mypage/consumer-rules.pro | 0 feature/mypage/proguard-rules.pro | 21 + .../feature/mypage/ExampleInstrumentedTest.kt | 24 + feature/mypage/src/main/AndroidManifest.xml | 4 + .../withpeace/feature/mypage/MyPageScreen.kt | 315 +++++++++ .../feature/mypage/MyPageViewModel.kt | 105 +++ .../mypage/navigation/MyPageNavigation.kt | 40 ++ .../feature/mypage/uistate/MyPageUiEvent.kt | 8 + .../mypage/uistate/ProfileInfoMapper.kt | 9 + .../mypage/uistate/ProfileInfoUiModel.kt | 7 + .../feature/mypage/uistate/ProfileUiState.kt | 7 + .../main/res/drawable/ic_default_profile.xml | 24 + .../mypage/src/main/res/values/strings.xml | 13 + .../feature/mypage/ExampleUnitTest.kt | 17 + feature/policyconsent/.gitignore | 1 + feature/policyconsent/build.gradle.kts | 10 + feature/policyconsent/consumer-rules.pro | 0 feature/policyconsent/proguard-rules.pro | 21 + .../policyconsent/ExampleInstrumentedTest.kt | 24 + .../src/main/AndroidManifest.xml | 4 + .../policyconsent/PolicyConsentScreen.kt | 282 ++++++++ .../policyconsent/PolicyConsentViewModel.kt | 72 ++ .../navigation/PolicyConsentNavigation.kt | 28 + .../uistate/PolicyConsentUiEvent.kt | 6 + .../uistate/PolicyConsentUiState.kt | 9 + .../src/main/res/values/strings.xml | 4 + .../feature/policyconsent/ExampleUnitTest.kt | 17 + feature/policydetail/.gitignore | 1 + feature/policydetail/build.gradle.kts | 11 + feature/policydetail/consumer-rules.pro | 0 feature/policydetail/proguard-rules.pro | 21 + .../policydetail/ExampleInstrumentedTest.kt | 24 + .../policydetail/src/main/AndroidManifest.xml | 4 + .../policydetail/PolicyDetailScreen.kt | 372 ++++++++++ .../policydetail/PolicyDetailViewModel.kt | 12 + .../component/DescriptionTitleAndContent.kt | 41 ++ .../HyperLinkDescriptionTitleAndContent.kt | 76 +++ .../navigation/PolicyDetailNavigation.kt | 50 ++ .../feature/policydetail/ExampleUnitTest.kt | 17 + feature/postdetail/.gitignore | 1 + feature/postdetail/build.gradle.kts | 12 + feature/postdetail/consumer-rules.pro | 0 feature/postdetail/proguard-rules.pro | 21 + .../postdetail/ExampleInstrumentedTest.kt | 24 + .../postdetail/src/main/AndroidManifest.xml | 4 + .../feature/postdetail/CommentSection.kt | 262 ++++++++ .../feature/postdetail/PostDetailScreen.kt | 634 ++++++++++++++++++ .../feature/postdetail/PostDetailUiEvent.kt | 15 + .../feature/postdetail/PostDetailUiState.kt | 10 + .../feature/postdetail/PostDetailViewModel.kt | 168 +++++ .../feature/postdetail/PostSection.kt | 239 +++++++ .../postdetail/RegisterCommentSection.kt | 122 ++++ .../navigation/PostDetailNavigation.kt | 51 ++ .../src/main/res/drawable/ic_chat.xml | 9 + .../src/main/res/drawable/ic_complain.xml | 9 + .../src/main/res/drawable/ic_delete.xml | 9 + .../src/main/res/drawable/ic_edit.xml | 13 + .../src/main/res/drawable/ic_hide.xml | 9 + .../src/main/res/drawable/ic_more.xml | 15 + .../src/main/res/drawable/ic_send.xml | 9 + .../src/main/res/values/strings.xml | 21 + .../feature/postdetail/ExampleUnitTest.kt | 17 + feature/postlist/.gitignore | 1 + feature/postlist/build.gradle.kts | 20 + feature/postlist/consumer-rules.pro | 0 feature/postlist/proguard-rules.pro | 21 + .../postlist/ExampleInstrumentedTest.kt | 24 + feature/postlist/src/main/AndroidManifest.xml | 4 + .../feature/postlist/PostListScreen.kt | 292 ++++++++ .../feature/postlist/PostListUiEvent.kt | 7 + .../feature/postlist/PostListViewModel.kt | 86 +++ .../withpeace/feature/postlist/TopicTabs.kt | 69 ++ .../postlist/navigation/PostListNavigation.kt | 35 + .../src/main/res/drawable/ic_comment.xml | 9 + .../postlist/src/main/res/values/strings.xml | 4 + .../feature/postlist/PostListViewModelTest.kt | 104 +++ feature/privacypolicy/.gitignore | 1 + feature/privacypolicy/build.gradle.kts | 10 + feature/privacypolicy/consumer-rules.pro | 0 feature/privacypolicy/proguard-rules.pro | 21 + .../privacypolicy/ExampleInstrumentedTest.kt | 24 + .../src/main/AndroidManifest.xml | 4 + .../privacypolicy/PrivacyPolicyScreen.kt | 44 ++ .../navigation/PrivacyPolicyNavigation.kt | 24 + .../feature/privacypolicy/ExampleUnitTest.kt | 17 + feature/profileeditor/.gitignore | 1 + feature/profileeditor/build.gradle.kts | 12 + feature/profileeditor/consumer-rules.pro | 0 feature/profileeditor/proguard-rules.pro | 21 + .../profileeditor/ExampleInstrumentedTest.kt | 24 + .../src/main/AndroidManifest.xml | 4 + .../app/profileeditor/ProfileEditorScreen.kt | 319 +++++++++ .../profileeditor/ProfileEditorViewModel.kt | 114 ++++ .../app/profileeditor/ProfileModelMapper.kt | 18 + .../navigation/ProfileEditorNavigation.kt | 60 ++ .../uistate/ProfileEditUiEvent.kt | 10 + .../profileeditor/uistate/ProfileUiModel.kt | 7 + .../src/main/res/values/strings.xml | 8 + feature/registerpost/.gitignore | 1 + feature/registerpost/build.gradle.kts | 13 + feature/registerpost/consumer-rules.pro | 0 feature/registerpost/proguard-rules.pro | 21 + .../registerpost/src/main/AndroidManifest.xml | 4 + .../registerpost/RegisterPostScreen.kt | 611 +++++++++++++++++ .../registerpost/RegisterPostUiEvent.kt | 11 + .../registerpost/RegisterPostViewModel.kt | 116 ++++ .../navigation/RegisterPostNavigation.kt | 48 ++ .../main/res/drawable/btn_picture_delete.xml | 7 + .../src/main/res/drawable/ic_camera.xml | 28 + .../src/main/res/values/strings.xml | 10 + .../registerpost/RegisterPostViewModelTest.kt | 195 ++++++ feature/signup/.gitignore | 1 + feature/signup/build.gradle.kts | 13 + feature/signup/consumer-rules.pro | 0 feature/signup/proguard-rules.pro | 21 + .../feature/signup/ExampleInstrumentedTest.kt | 24 + .../withpeace/feature/signup/SignUpMapper.kt | 8 + .../withpeace/feature/signup/SignUpScreen.kt | 160 +++++ .../feature/signup/SignUpViewModel.kt | 98 +++ .../signup/navigation/SignUpNavigation.kt | 37 + .../feature/signup/uistate/SignUpUiEvent.kt | 9 + .../feature/signup/uistate/SignUpUiModel.kt | 6 + .../signup/src/main/res/drawable/app_logo.png | Bin 0 -> 31756 bytes .../signup/src/main/res/values/strings.xml | 8 + .../feature/signup/ExampleUnitTest.kt | 17 + feature/termsofservice/.gitignore | 1 + feature/termsofservice/build.gradle.kts | 10 + feature/termsofservice/consumer-rules.pro | 0 feature/termsofservice/proguard-rules.pro | 21 + .../termsofservice/ExampleInstrumentedTest.kt | 24 + .../src/main/AndroidManifest.xml | 4 + .../termsofservice/TermsOfServiceScreen.kt | 42 ++ .../navigation/TermsOfServiceNavigation.kt | 25 + .../feature/termsofservice/ExampleUnitTest.kt | 17 + google-login/.gitignore | 1 + google-login/build.gradle.kts | 30 + google-login/consumer-rules.pro | 0 google-login/proguard-rules.pro | 21 + google-login/src/main/AndroidManifest.xml | 4 + .../googlelogin/GoogleLoginManager.kt | 52 ++ gradle.properties | 24 + gradle/dependencyGraph.gradle | 131 ++++ gradle/libs.versions.toml | 204 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++ gradlew.bat | 89 +++ settings.gradle.kts | 43 ++ 521 files changed, 18892 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feat.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/android.yml create mode 100644 .github/workflows/build_cache.yml create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/release/output-metadata.json create mode 100644 app/src/androidTest/java/com/withpeace/withpeace/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_app_logo-playstore.png create mode 100644 app/src/main/java/com/withpeace/withpeace/MainActivity.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/MainBottomNavigation.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/MainUiState.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/MainViewModel.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/WithPeaceApplication.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/WithpeaceApp.kt create mode 100644 app/src/main/java/com/withpeace/withpeace/navigation/NavHost.kt create mode 100644 app/src/main/res/drawable/ic_app_logo_foreground.xml create mode 100644 app/src/main/res/drawable/ic_bottom_home.xml create mode 100644 app/src/main/res/drawable/ic_bottom_home_select.xml create mode 100644 app/src/main/res/drawable/ic_bottom_my_page.xml create mode 100644 app/src/main/res/drawable/ic_bottom_my_page_select.xml create mode 100644 app/src/main/res/drawable/ic_bottom_post.xml create mode 100644 app/src/main/res/drawable/ic_bottom_post_register.xml create mode 100644 app/src/main/res/drawable/ic_bottom_post_select.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_upload.xml create mode 100644 app/src/main/res/drawable/splash_inset.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_app_logo.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_app_logo_round.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_app_logo.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_app_logo_round.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_app_logo.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_app_logo_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_app_logo.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_app_logo_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_app_logo.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_app_logo_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_app_logo.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_app_logo_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_app_logo_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/withpeace/withpeace/MainViewModelTest.kt create mode 100644 build-logic/build.gradle.kts create mode 100644 build-logic/settings.gradle.kts create mode 100644 build-logic/src/main/kotlin/Extension.kt create mode 100644 build-logic/src/main/kotlin/convention.android.base.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.android.compose.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.android.hilt.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.application.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.coroutine.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.data.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.feature.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.kotlin.library.gradle.kts create mode 100644 build-logic/src/main/kotlin/convention.test.library.gradle.kts create mode 100644 build.gradle.kts create mode 100644 core/analytics/.gitignore create mode 100644 core/analytics/build.gradle.kts create mode 100644 core/analytics/consumer-rules.pro create mode 100644 core/analytics/proguard-rules.pro create mode 100644 core/analytics/src/androidTest/java/com/withpeace/withpeace/core/analytics/ExampleInstrumentedTest.kt create mode 100644 core/analytics/src/main/AndroidManifest.xml create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/AnalyticsEvent.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/AnalyticsHelper.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/AnalyticsModule.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/FirebaseAnalyticsHelper.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/NoOpAnalyticsHelper.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/StubAnalyticsHelper.kt create mode 100644 core/analytics/src/main/java/com/withpeace/withpeace/core/analytics/UiHelper.kt create mode 100644 core/data/.gitignore create mode 100644 core/data/build.gradle.kts create mode 100644 core/data/consumer-rules.pro create mode 100644 core/data/proguard-rules.pro create mode 100644 core/data/src/main/AndroidManifest.xml create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/analytics/AnalyticsExtension.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/di/RepositoryModule.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/ChangedProfileMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/DateMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/ImageInfoMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/PostDetailMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/PostMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/PostTopicMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/ProfileInfoMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/RoleMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/YouthPolicyMapper.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/ImagePagingSource.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/PostPagingSource.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/YouthPolicyPagingSource.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultAppUpdateRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultImageRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultPostRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultTokenRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultUserRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultYouthPolicyRepository.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/util/ApiResponseExtension.kt create mode 100644 core/data/src/main/kotlin/com/withpeace/withpeace/core/data/util/image.kt create mode 100644 core/data/src/test/kotlin/com/withpeace/withpeace/core/data/paging/ImagePagingSourceTest.kt create mode 100644 core/data/src/test/kotlin/com/withpeace/withpeace/core/data/paging/PostPagingSourceTest.kt create mode 100644 core/datastore/.gitignore create mode 100644 core/datastore/build.gradle.kts create mode 100644 core/datastore/consumer-rules.pro create mode 100644 core/datastore/proguard-rules.pro create mode 100644 core/datastore/src/androidTest/java/com/withpeace/withpeace/core/datastore/ExampleInstrumentedTest.kt create mode 100644 core/datastore/src/main/AndroidManifest.xml create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/dataStore/token/DefaultTokenPreferenceDataSource.kt create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/dataStore/token/TokenPreferenceDataSource.kt create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/dataStore/user/DefaultUserPreferenceDataSource.kt create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/dataStore/user/UserPreferenceDataSource.kt create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/di/DataStoreModule.kt create mode 100644 core/datastore/src/main/java/com/withpeace/withpeace/core/datastore/di/PreferenceDataSourceModule.kt create mode 100644 core/datastore/src/test/java/com/withpeace/withpeace/core/datastore/ExampleUnitTest.kt create mode 100644 core/designsystem/.gitignore create mode 100644 core/designsystem/build.gradle.kts create mode 100644 core/designsystem/consumer-rules.pro create mode 100644 core/designsystem/proguard-rules.pro create mode 100644 core/designsystem/src/main/AndroidManifest.xml create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/theme/Color.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/theme/Padding.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/theme/Theme.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/theme/Type.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/Box.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/Button.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/Card.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/Checkbox.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/NoTitleDialog.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/TitleBar.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/ui/TopAppBar.kt create mode 100644 core/designsystem/src/main/java/com/withpeace/withpeace/core/designsystem/util/ModifierExtension.kt create mode 100644 core/designsystem/src/main/res/drawable/ic_backarrow_left.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_backarrow_right.xml create mode 100644 core/designsystem/src/main/res/font/notosans_kr_medium.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_black.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_bold.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_extra_bold.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_extra_light.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_light.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_medium.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_regular.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_semi_bold.ttf create mode 100644 core/designsystem/src/main/res/font/pretendard_thin.ttf create mode 100644 core/designsystem/src/main/res/values/strings.xml create mode 100644 core/domain/.gitignore create mode 100644 core/domain/build.gradle.kts create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/SignUpInfo.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/date/Date.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/date/DurationFromNow.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/error/CheonghaError.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/error/ClientError.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/error/ResponseError.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/image/ImageFolder.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/image/ImageInfo.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/image/LimitedImages.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyClassification.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyFilters.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyRegion.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicy.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/Comment.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/Post.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/PostContent.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/PostDetail.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/PostTitle.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/PostTopic.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/RegisterPost.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/post/ReportType.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/profile/ChangedProfile.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/profile/ChangingProfileInfo.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/profile/Nickname.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/profile/ProfileChangingStatus.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/profile/ProfileInfo.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/role/Role.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/AppUpdateRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/ImageRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/PostRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/TokenRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/UserRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/repository/YouthPolicyRepository.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/CheckAppUpdateUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/DeletePostUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetAlbumImagesUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetAllFoldersUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetCurrentUserIdUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetPostDetailUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetPostsUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetProfileInfoUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GetYouthPoliciesUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/GoogleLoginUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/IsLoginUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/LogoutUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/RegisterCommentUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/RegisterPostUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/ReportCommentUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/ReportPostUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/SignUpUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/UpdateProfileUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/VerifyNicknameUseCase.kt create mode 100644 core/domain/src/main/java/com/withpeace/withpeace/core/domain/usecase/WithdrawUseCase.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/GetAlbumImagesUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/GetAllFoldersUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/GetPostsUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/GoogleLoginUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/IsLoginUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/RegisterPostUseCaseTest.kt create mode 100644 core/domain/src/test/kotlin/com/withpeace/withpeace/core/domain/usecase/SignUpUseCaseTest.kt create mode 100644 core/imagestorage/.gitignore create mode 100644 core/imagestorage/build.gradle.kts create mode 100644 core/imagestorage/consumer-rules.pro create mode 100644 core/imagestorage/proguard-rules.pro create mode 100644 core/imagestorage/src/main/AndroidManifest.xml create mode 100644 core/imagestorage/src/main/java/com/withpeace/withpeace/core/imagestorage/DefaultImageDataSource.kt create mode 100644 core/imagestorage/src/main/java/com/withpeace/withpeace/core/imagestorage/ImageDataSource.kt create mode 100644 core/imagestorage/src/main/java/com/withpeace/withpeace/core/imagestorage/ImageDataSourceModule.kt create mode 100644 core/imagestorage/src/main/java/com/withpeace/withpeace/core/imagestorage/ImageFolderEntity.kt create mode 100644 core/imagestorage/src/main/java/com/withpeace/withpeace/core/imagestorage/ImageInfoEntity.kt create mode 100644 core/interceptor/.gitignore create mode 100644 core/interceptor/build.gradle.kts create mode 100644 core/interceptor/consumer-rules.pro create mode 100644 core/interceptor/proguard-rules.pro create mode 100644 core/interceptor/src/main/AndroidManifest.xml create mode 100644 core/interceptor/src/main/java/com/withpeace/withpeace/core/interceptor/AuthInterceptor.kt create mode 100644 core/interceptor/src/main/java/com/withpeace/withpeace/core/interceptor/InterceptorModule.kt create mode 100644 core/network/.gitignore create mode 100644 core/network/build.gradle.kts create mode 100644 core/network/consumer-rules.pro create mode 100644 core/network/proguard-rules.pro create mode 100644 core/network/src/androidTest/java/com/withpeace/withpeace/core/network/ExampleInstrumentedTest.kt create mode 100644 core/network/src/main/AndroidManifest.xml create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/common/OkHttpUtil.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/common/WithPeaceErrorBody.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/di/NetworkModule.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/di/ServiceModule.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/request/CommentRequest.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/request/NicknameRequest.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/request/ReportTypeRequest.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/request/SignUpRequest.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/BaseResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/ChangedProfileResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/LoginResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/ProfileResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/TokenResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/YouthPolicyListResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/post/CommentResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/post/PostDetailResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/post/PostIdResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/post/PostResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/post/PostTopicResponse.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/service/AppUpdateService.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/service/AuthService.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/service/PostService.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/service/UserService.kt create mode 100644 core/network/src/main/java/com/withpeace/withpeace/core/network/di/service/YouthPolicyService.kt create mode 100644 core/network/src/test/java/com/withpeace/withpeace/core/network/ExampleUnitTest.kt create mode 100644 core/permission/.gitignore create mode 100644 core/permission/build.gradle.kts create mode 100644 core/permission/consumer-rules.pro create mode 100644 core/permission/proguard-rules.pro create mode 100644 core/permission/src/main/AndroidManifest.xml create mode 100644 core/permission/src/main/java/com/withpeace/withpeace/core/permission/ImagePermission.kt create mode 100644 core/permission/src/main/res/values/strings.xml create mode 100644 core/testing/.gitignore create mode 100644 core/testing/build.gradle.kts create mode 100644 core/testing/consumer-rules.pro create mode 100644 core/testing/proguard-rules.pro create mode 100644 core/testing/src/main/AndroidManifest.xml create mode 100644 core/testing/src/main/java/com/withpeace/withpeace/core/testing/MainDispatcherRule.kt create mode 100644 core/ui/.gitignore create mode 100644 core/ui/build.gradle.kts create mode 100644 core/ui/consumer-rules.pro create mode 100644 core/ui/proguard-rules.pro create mode 100644 core/ui/src/androidTest/java/com/withpeace/withpeace/core/ui/ExampleInstrumentedTest.kt create mode 100644 core/ui/src/main/AndroidManifest.xml create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/DateUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/analytics/AnalyticsExtension.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/common/WebView.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/ClassificationUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/RegionUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/YouthPolicyUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/analytics/PolicyAnalyticsUtil.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/CommentUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/PostDetailUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/PostTopicUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/PostUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/RegisterPostUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/ReportTypeUiModel.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/post/analytics/PostAnalyticsUtil.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/profile/NicknameEditor.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/profile/ProfileEditor.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/profile/ProfileNicknameValidUiState.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/serializable/BundleUtil.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/serializable/NaivigationUtil.kt create mode 100644 core/ui/src/main/java/com/withpeace/withpeace/core/ui/serializable/SerializableType.kt create mode 100644 core/ui/src/main/res/drawable/ic_app_logo.xml create mode 100644 core/ui/src/main/res/drawable/ic_default_profile.xml create mode 100644 core/ui/src/main/res/drawable/ic_economy.xml create mode 100644 core/ui/src/main/res/drawable/ic_editor_pencil.xml create mode 100644 core/ui/src/main/res/drawable/ic_freedom.xml create mode 100644 core/ui/src/main/res/drawable/ic_hobby.xml create mode 100644 core/ui/src/main/res/drawable/ic_information.xml create mode 100644 core/ui/src/main/res/drawable/ic_life.xml create mode 100644 core/ui/src/main/res/drawable/ic_policy_eductaion.xml create mode 100644 core/ui/src/main/res/drawable/ic_policy_job.xml create mode 100644 core/ui/src/main/res/drawable/ic_policy_participation_right.xml create mode 100644 core/ui/src/main/res/drawable/ic_policy_resident.xml create mode 100644 core/ui/src/main/res/drawable/ic_policy_welfare_culture.xml create mode 100644 core/ui/src/main/res/drawable/ic_question.xml create mode 100644 core/ui/src/main/res/values/strings.xml create mode 100644 feature/gallery/.gitignore create mode 100644 feature/gallery/build.gradle.kts create mode 100644 feature/gallery/consumer-rules.pro create mode 100644 feature/gallery/proguard-rules.pro create mode 100644 feature/gallery/src/main/AndroidManifest.xml create mode 100644 feature/gallery/src/main/java/com/withpeace/withpeace/feature/gallery/GalleryScreen.kt create mode 100644 feature/gallery/src/main/java/com/withpeace/withpeace/feature/gallery/GallerySideEffect.kt create mode 100644 feature/gallery/src/main/java/com/withpeace/withpeace/feature/gallery/GalleryViewModel.kt create mode 100644 feature/gallery/src/main/java/com/withpeace/withpeace/feature/gallery/navigation/GalleryNavigation.kt create mode 100644 feature/gallery/src/main/res/drawable/ic_check.xml create mode 100644 feature/gallery/src/main/res/drawable/ic_picture_select.xml create mode 100644 feature/gallery/src/main/res/values/strings.xml create mode 100644 feature/gallery/src/test/java/com/withpeace/withpeace/feature/gallery/GalleryViewModelTest.kt create mode 100644 feature/home/.gitignore create mode 100644 feature/home/build.gradle.kts create mode 100644 feature/home/consumer-rules.pro create mode 100644 feature/home/proguard-rules.pro create mode 100644 feature/home/src/androidTest/java/com/withpeace/withpeace/feature/home/ExampleInstrumentedTest.kt create mode 100644 feature/home/src/main/AndroidManifest.xml create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/HomeScreen.kt create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/HomeViewModel.kt create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/filtersetting/FilterBottomSheet.kt create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/filtersetting/uistate/FilterListUiState.kt create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/navigation/HomeNavigation.kt create mode 100644 feature/home/src/main/java/com/withpeace/withpeace/feature/home/uistate/PolicyFiltersUiModel.kt create mode 100644 feature/home/src/main/res/drawable/ic_filter.xml create mode 100644 feature/home/src/main/res/drawable/ic_filter_close.xml create mode 100644 feature/home/src/main/res/drawable/ic_filter_expanded.xml create mode 100644 feature/home/src/main/res/drawable/ic_filter_fold.xml create mode 100644 feature/home/src/main/res/drawable/ic_home_logo.xml create mode 100644 feature/home/src/main/res/drawable/ic_home_thumbnail_example.png create mode 100644 feature/home/src/main/res/values/strings.xml create mode 100644 feature/home/src/test/java/com/withpeace/withpeace/feature/home/ExampleUnitTest.kt create mode 100644 feature/login/.gitignore create mode 100644 feature/login/build.gradle.kts create mode 100644 feature/login/consumer-rules.pro create mode 100644 feature/login/proguard-rules.pro create mode 100644 feature/login/src/main/AndroidManifest.xml create mode 100644 feature/login/src/main/java/com/withpeace/withpeace/feature/login/LoginScreen.kt create mode 100644 feature/login/src/main/java/com/withpeace/withpeace/feature/login/LoginUiEvent.kt create mode 100644 feature/login/src/main/java/com/withpeace/withpeace/feature/login/LoginViewModel.kt create mode 100644 feature/login/src/main/java/com/withpeace/withpeace/feature/login/navigation/LoginNavigation.kt create mode 100644 feature/login/src/main/res/drawable/img_google_logo.png create mode 100644 feature/login/src/main/res/values/strings.xml create mode 100644 feature/login/src/test/java/com/withpeace/withpeace/feature/login/LoginViewModelTest.kt create mode 100644 feature/mypage/.gitignore create mode 100644 feature/mypage/build.gradle.kts create mode 100644 feature/mypage/consumer-rules.pro create mode 100644 feature/mypage/proguard-rules.pro create mode 100644 feature/mypage/src/androidTest/java/com/withpeace/withpeace/feature/mypage/ExampleInstrumentedTest.kt create mode 100644 feature/mypage/src/main/AndroidManifest.xml create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/MyPageScreen.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/MyPageViewModel.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/navigation/MyPageNavigation.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/uistate/MyPageUiEvent.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/uistate/ProfileInfoMapper.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/uistate/ProfileInfoUiModel.kt create mode 100644 feature/mypage/src/main/java/com/withpeace/withpeace/feature/mypage/uistate/ProfileUiState.kt create mode 100644 feature/mypage/src/main/res/drawable/ic_default_profile.xml create mode 100644 feature/mypage/src/main/res/values/strings.xml create mode 100644 feature/mypage/src/test/java/com/withpeace/withpeace/feature/mypage/ExampleUnitTest.kt create mode 100644 feature/policyconsent/.gitignore create mode 100644 feature/policyconsent/build.gradle.kts create mode 100644 feature/policyconsent/consumer-rules.pro create mode 100644 feature/policyconsent/proguard-rules.pro create mode 100644 feature/policyconsent/src/androidTest/java/com/withpeace/withpeace/feature/policyconsent/ExampleInstrumentedTest.kt create mode 100644 feature/policyconsent/src/main/AndroidManifest.xml create mode 100644 feature/policyconsent/src/main/java/com/withpeace/withpeace/feature/policyconsent/PolicyConsentScreen.kt create mode 100644 feature/policyconsent/src/main/java/com/withpeace/withpeace/feature/policyconsent/PolicyConsentViewModel.kt create mode 100644 feature/policyconsent/src/main/java/com/withpeace/withpeace/feature/policyconsent/navigation/PolicyConsentNavigation.kt create mode 100644 feature/policyconsent/src/main/java/com/withpeace/withpeace/feature/policyconsent/uistate/PolicyConsentUiEvent.kt create mode 100644 feature/policyconsent/src/main/java/com/withpeace/withpeace/feature/policyconsent/uistate/PolicyConsentUiState.kt create mode 100644 feature/policyconsent/src/main/res/values/strings.xml create mode 100644 feature/policyconsent/src/test/java/com/withpeace/withpeace/feature/policyconsent/ExampleUnitTest.kt create mode 100644 feature/policydetail/.gitignore create mode 100644 feature/policydetail/build.gradle.kts create mode 100644 feature/policydetail/consumer-rules.pro create mode 100644 feature/policydetail/proguard-rules.pro create mode 100644 feature/policydetail/src/androidTest/java/com/withpeace/withpeace/feature/policydetail/ExampleInstrumentedTest.kt create mode 100644 feature/policydetail/src/main/AndroidManifest.xml create mode 100644 feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailScreen.kt create mode 100644 feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailViewModel.kt create mode 100644 feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/component/DescriptionTitleAndContent.kt create mode 100644 feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/component/HyperLinkDescriptionTitleAndContent.kt create mode 100644 feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/navigation/PolicyDetailNavigation.kt create mode 100644 feature/policydetail/src/test/java/com/withpeace/withpeace/feature/policydetail/ExampleUnitTest.kt create mode 100644 feature/postdetail/.gitignore create mode 100644 feature/postdetail/build.gradle.kts create mode 100644 feature/postdetail/consumer-rules.pro create mode 100644 feature/postdetail/proguard-rules.pro create mode 100644 feature/postdetail/src/androidTest/java/com/withpeace/withpeace/feature/postdetail/ExampleInstrumentedTest.kt create mode 100644 feature/postdetail/src/main/AndroidManifest.xml create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/CommentSection.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/PostDetailScreen.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/PostDetailUiEvent.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/PostDetailUiState.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/PostDetailViewModel.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/PostSection.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/RegisterCommentSection.kt create mode 100644 feature/postdetail/src/main/java/com/withpeace/withpeace/feature/postdetail/navigation/PostDetailNavigation.kt create mode 100644 feature/postdetail/src/main/res/drawable/ic_chat.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_complain.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_delete.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_edit.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_hide.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_more.xml create mode 100644 feature/postdetail/src/main/res/drawable/ic_send.xml create mode 100644 feature/postdetail/src/main/res/values/strings.xml create mode 100644 feature/postdetail/src/test/java/com/withpeace/withpeace/feature/postdetail/ExampleUnitTest.kt create mode 100644 feature/postlist/.gitignore create mode 100644 feature/postlist/build.gradle.kts create mode 100644 feature/postlist/consumer-rules.pro create mode 100644 feature/postlist/proguard-rules.pro create mode 100644 feature/postlist/src/androidTest/java/com/withpeace/withpeace/feature/postlist/ExampleInstrumentedTest.kt create mode 100644 feature/postlist/src/main/AndroidManifest.xml create mode 100644 feature/postlist/src/main/java/com/withpeace/withpeace/feature/postlist/PostListScreen.kt create mode 100644 feature/postlist/src/main/java/com/withpeace/withpeace/feature/postlist/PostListUiEvent.kt create mode 100644 feature/postlist/src/main/java/com/withpeace/withpeace/feature/postlist/PostListViewModel.kt create mode 100644 feature/postlist/src/main/java/com/withpeace/withpeace/feature/postlist/TopicTabs.kt create mode 100644 feature/postlist/src/main/java/com/withpeace/withpeace/feature/postlist/navigation/PostListNavigation.kt create mode 100644 feature/postlist/src/main/res/drawable/ic_comment.xml create mode 100644 feature/postlist/src/main/res/values/strings.xml create mode 100644 feature/postlist/src/test/java/com/withpeace/withpeace/feature/postlist/PostListViewModelTest.kt create mode 100644 feature/privacypolicy/.gitignore create mode 100644 feature/privacypolicy/build.gradle.kts create mode 100644 feature/privacypolicy/consumer-rules.pro create mode 100644 feature/privacypolicy/proguard-rules.pro create mode 100644 feature/privacypolicy/src/androidTest/java/com/withpeace/withpeace/feature/privacypolicy/ExampleInstrumentedTest.kt create mode 100644 feature/privacypolicy/src/main/AndroidManifest.xml create mode 100644 feature/privacypolicy/src/main/java/com/withpeace/withpeace/feature/privacypolicy/PrivacyPolicyScreen.kt create mode 100644 feature/privacypolicy/src/main/java/com/withpeace/withpeace/feature/privacypolicy/navigation/PrivacyPolicyNavigation.kt create mode 100644 feature/privacypolicy/src/test/java/com/withpeace/withpeace/feature/privacypolicy/ExampleUnitTest.kt create mode 100644 feature/profileeditor/.gitignore create mode 100644 feature/profileeditor/build.gradle.kts create mode 100644 feature/profileeditor/consumer-rules.pro create mode 100644 feature/profileeditor/proguard-rules.pro create mode 100644 feature/profileeditor/src/androidTest/java/com/app/profileeditor/ExampleInstrumentedTest.kt create mode 100644 feature/profileeditor/src/main/AndroidManifest.xml create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/ProfileEditorScreen.kt create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/ProfileEditorViewModel.kt create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/ProfileModelMapper.kt create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/navigation/ProfileEditorNavigation.kt create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/uistate/ProfileEditUiEvent.kt create mode 100644 feature/profileeditor/src/main/java/com/app/profileeditor/uistate/ProfileUiModel.kt create mode 100644 feature/profileeditor/src/main/res/values/strings.xml create mode 100644 feature/registerpost/.gitignore create mode 100644 feature/registerpost/build.gradle.kts create mode 100644 feature/registerpost/consumer-rules.pro create mode 100644 feature/registerpost/proguard-rules.pro create mode 100644 feature/registerpost/src/main/AndroidManifest.xml create mode 100644 feature/registerpost/src/main/java/com/withpeace/withpeace/feature/registerpost/RegisterPostScreen.kt create mode 100644 feature/registerpost/src/main/java/com/withpeace/withpeace/feature/registerpost/RegisterPostUiEvent.kt create mode 100644 feature/registerpost/src/main/java/com/withpeace/withpeace/feature/registerpost/RegisterPostViewModel.kt create mode 100644 feature/registerpost/src/main/java/com/withpeace/withpeace/feature/registerpost/navigation/RegisterPostNavigation.kt create mode 100644 feature/registerpost/src/main/res/drawable/btn_picture_delete.xml create mode 100644 feature/registerpost/src/main/res/drawable/ic_camera.xml create mode 100644 feature/registerpost/src/main/res/values/strings.xml create mode 100644 feature/registerpost/src/test/java/com/withpeace/withpeace/feature/registerpost/RegisterPostViewModelTest.kt create mode 100644 feature/signup/.gitignore create mode 100644 feature/signup/build.gradle.kts create mode 100644 feature/signup/consumer-rules.pro create mode 100644 feature/signup/proguard-rules.pro create mode 100644 feature/signup/src/androidTest/java/com/withpeace/withpeace/feature/signup/ExampleInstrumentedTest.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/SignUpMapper.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/SignUpScreen.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/SignUpViewModel.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/navigation/SignUpNavigation.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/uistate/SignUpUiEvent.kt create mode 100644 feature/signup/src/main/java/com/withpeace/withpeace/feature/signup/uistate/SignUpUiModel.kt create mode 100644 feature/signup/src/main/res/drawable/app_logo.png create mode 100644 feature/signup/src/main/res/values/strings.xml create mode 100644 feature/signup/src/test/java/com/withpeace/withpeace/feature/signup/ExampleUnitTest.kt create mode 100644 feature/termsofservice/.gitignore create mode 100644 feature/termsofservice/build.gradle.kts create mode 100644 feature/termsofservice/consumer-rules.pro create mode 100644 feature/termsofservice/proguard-rules.pro create mode 100644 feature/termsofservice/src/androidTest/java/com/withpeace/withpeace/feature/termsofservice/ExampleInstrumentedTest.kt create mode 100644 feature/termsofservice/src/main/AndroidManifest.xml create mode 100644 feature/termsofservice/src/main/java/com/withpeace/withpeace/feature/termsofservice/TermsOfServiceScreen.kt create mode 100644 feature/termsofservice/src/main/java/com/withpeace/withpeace/feature/termsofservice/navigation/TermsOfServiceNavigation.kt create mode 100644 feature/termsofservice/src/test/java/com/withpeace/withpeace/feature/termsofservice/ExampleUnitTest.kt create mode 100644 google-login/.gitignore create mode 100644 google-login/build.gradle.kts create mode 100644 google-login/consumer-rules.pro create mode 100644 google-login/proguard-rules.pro create mode 100644 google-login/src/main/AndroidManifest.xml create mode 100644 google-login/src/main/kotlin/com/withpeace/withpeace/googlelogin/GoogleLoginManager.kt create mode 100644 gradle.properties create mode 100644 gradle/dependencyGraph.gradle create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..77c75f79 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true +ktlint_function_naming_ignore_when_annotated_with = Composable, Test diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..baf3b77e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,46 @@ +name: "\U0001F41B 버그 제보" +description: 버그를 발견하셨나요? +labels: bug, parent + +body: + - type: textarea + id: bug-description + attributes: + label: 버그 설명 + placeholder: 버그에 대해 설명해주세요. + + - type: textarea + id: expected-behavior + attributes: + label: 예상 동작 + placeholder: 예상했던 동작에 대해 설명해주세요. + + - type: textarea + id: actual-behavior + attributes: + label: 실제 동작 + placeholder: 실제로 일어난 동작을 설명해주세요. + + - type: textarea + id: steps-to-reproduce + attributes: + label: 재현 방법 + placeholder: 순서대로 설명해주세요. + + - type: textarea + id: screenshot + attributes: + label: 스크린샷 첨부 + placeholder: 스크린샷이 있으면 첨부해주세요. + + - type: textarea + id: environment + attributes: + label: 환경 + placeholder: 디바이스, 운영체제, 앱 버전 등을 명시해주세요. + + - type: textarea + id: additional-info + attributes: + label: 비고 + placeholder: 추가적인 정보를 기입해주세요. diff --git a/.github/ISSUE_TEMPLATE/feat.yml b/.github/ISSUE_TEMPLATE/feat.yml new file mode 100644 index 00000000..52907c32 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feat.yml @@ -0,0 +1,19 @@ +name: "⚙️ 기능 개발" +description: "개발 시간 🫡" +body: + - type: textarea + attributes: + label: 기능 설명 + - type: textarea + attributes: + label: 개발 일정 + description: 개발 일정을 적어주세요. + - type: textarea + attributes: + label: 자식 이슈 + description: 현재 이슈의 하위 이슈를 링크해주세요. + description: 개발할 기능에 대한 설명을 적어주세요. + - type: textarea + attributes: + label: 부가 설명 + description: 기타 부가적인 설명을 적어주세요. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..f7a94a9f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## 관련 이슈번호 + +
close # + +## 작업 사항 + +
+ +## 기타 사항 + +
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 00000000..053a272f --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,65 @@ +name: Android CI + +on: + pull_request: + branches: [ "main", "develop" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + # Gradle 캐싱: 빌드 시간과 네트워크 통신을 줄이기 위해 의존성 패키지들을 캐싱하여 재사용 + - name: Cache Gradle packages + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Access Google Client Id + env: + GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} + run: | + echo "GOOGLE_CLIENT_ID=\"$GOOGLE_CLIENT_ID\"" >> local.properties + + - name: Access YOUTH POLICY API KEY + env: + YOUTH_POLICY_API_KEY: ${{ secrets.YOUTH_POLICY_API_KEY }} + run: | + echo "YOUTH_POLICY_API_KEY=\"YOUTH_POLICY_API_KEY\"" >> local.properties + + - name: Access BaseUrl + env: + YOUTH_POLICY_API_KEY: ${{ secrets.BASE_URL }} + run: | + echo "BASE_URL=\"BASE_URL\"" >> local.properties + + - name: Create google-services in app + run: | + echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json + + - name: Create google-services in analytics + run: | + echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./core/analytics/google-services.json + + - name: Run test + run: ./gradlew test --parallel + + - name: Run ktlint + run: ./gradlew ktlintCheck diff --git a/.github/workflows/build_cache.yml b/.github/workflows/build_cache.yml new file mode 100644 index 00000000..8cc6eaf0 --- /dev/null +++ b/.github/workflows/build_cache.yml @@ -0,0 +1,63 @@ +name: Android CI + +on: + push: + branches: ["develop"] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + # Gradle 캐싱: 빌드 시간과 네트워크 통신을 줄이기 위해 의존성 패키지들을 캐싱하여 재사용 + - name: Cache Gradle packages + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Access Google Client Id + env: + GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} + run: | + echo "GOOGLE_CLIENT_ID=\"$GOOGLE_CLIENT_ID\"" >> local.properties + + - name: Access YOUTH POLICY API KEY + env: + YOUTH_POLICY_API_KEY: ${{ secrets.YOUTH_POLICY_API_KEY }} + run: | + echo "YOUTH_POLICY_API_KEY=\"YOUTH_POLICY_API_KEY\"" >> local.properties + + - name: Access BaseUrl + env: + YOUTH_POLICY_API_KEY: ${{ secrets.BASE_URL }} + run: | + echo "BASE_URL=\"BASE_URL\"" >> local.properties + + - name: Create google-services in app + run: | + echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json + + - name: Create google-services in analytics + run: | + echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./core/analytics/google-services.json + + - name: Build with Gradle + run: ./gradlew build + diff --git a/README.md b/README.md index 171bfe40..534a3d98 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# with-peace-android \ No newline at end of file +# 청년을 위한 플랫폼 '청하' + +청하(청춘하랑)는 ‘청춘’과 “함께 높이 날다”라는 의미를 가진 순우리말 ‘하랑’을 합쳐, +우리 청년들이 이루고자 하는 목표를 위해 함께 날아가고자 만들어진 서비스예요. +청하에서 여러분이 이루고자 하는 목표를 위한 첫걸음을 시작해 보세요. + + +|홈|필터|프로필수정| +|:-:|:-:|:-:| +|