├── .github ├── ISSUE_TEMPLATE │ ├── bug.yml │ └── todo.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── Init.yml │ ├── cd.yml │ └── ci.yml ├── .gitignore ├── .idea ├── .gitignore └── inspectionProfiles │ └── Project_Default.xml ├── LICENSE ├── README.md ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts └── src │ └── main │ └── kotlin │ ├── Dependency.kt │ ├── Project.kt │ └── Version.kt ├── data ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── semicolon │ │ └── data │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── semicolon │ │ │ └── data │ │ │ ├── background │ │ │ ├── task │ │ │ │ ├── ExerciseBackgroundTask.kt │ │ │ │ └── ExerciseBackgroundTaskImpl.kt │ │ │ └── worker │ │ │ │ ├── CustomWorkerFactory.kt │ │ │ │ ├── LocationTrackingWorker.kt │ │ │ │ └── SynchronizeExerciseWorker.kt │ │ │ ├── interceptor │ │ │ └── AuthorizationInterceptor.kt │ │ │ ├── local │ │ │ ├── converter │ │ │ │ └── TypeConverters.kt │ │ │ ├── dao │ │ │ │ ├── .gitkeep │ │ │ │ ├── BadgeDao.kt │ │ │ │ ├── ChallengeDao.kt │ │ │ │ ├── LevelDao.kt │ │ │ │ ├── LocationRecordDao.kt │ │ │ │ ├── NoticeDao.kt │ │ │ │ ├── NotificationDao.kt │ │ │ │ ├── RankDao.kt │ │ │ │ ├── SchoolDao.kt │ │ │ │ └── UserDao.kt │ │ │ ├── database │ │ │ │ ├── .gitkeep │ │ │ │ └── WalkHubDataBase.kt │ │ │ ├── datasource │ │ │ │ ├── .gitkeep │ │ │ │ ├── LocalBadgeDataSource.kt │ │ │ │ ├── LocalBadgeDataSourceImpl.kt │ │ │ │ ├── LocalChallengeDataSource.kt │ │ │ │ ├── LocalChallengeDataSourceImpl.kt │ │ │ │ ├── LocalExerciseDataSource.kt │ │ │ │ ├── LocalExerciseDataSourceImpl.kt │ │ │ │ ├── LocalLevelDataSource.kt │ │ │ │ ├── LocalLevelDataSourceImpl.kt │ │ │ │ ├── LocalNoticeDataSource.kt │ │ │ │ ├── LocalNoticeDataSourceImpl.kt │ │ │ │ ├── LocalNotificationDataSource.kt │ │ │ │ ├── LocalNotificationDataSourceImpl.kt │ │ │ │ ├── LocalRankDataSource.kt │ │ │ │ ├── LocalRankDataSourceImpl.kt │ │ │ │ ├── LocalSchoolDataSource.kt │ │ │ │ ├── LocalSchoolDataSourceImpl.kt │ │ │ │ ├── LocalUserDataSource.kt │ │ │ │ └── LocalUserDataSourceImpl.kt │ │ │ ├── entity │ │ │ │ ├── .gitkeep │ │ │ │ ├── badge │ │ │ │ │ ├── FetchMyBadgesRoomEntity.kt │ │ │ │ │ ├── FetchNewBadgesRoomEntity.kt │ │ │ │ │ └── FetchUserBadgesRoomEntity.kt │ │ │ │ ├── challenge │ │ │ │ │ ├── ChallengeAndDetail.kt │ │ │ │ │ ├── ChallengeDetailRoomEntity.kt │ │ │ │ │ ├── ChallengeParticipantRoomEntity.kt │ │ │ │ │ └── ChallengeRoomEntity.kt │ │ │ │ ├── exercise │ │ │ │ │ ├── LocationRecordEntity.kt │ │ │ │ │ ├── LocationRecordRoomEntity.kt │ │ │ │ │ └── WalkRecordEntity.kt │ │ │ │ ├── level │ │ │ │ │ └── LevelRoomEntity.kt │ │ │ │ ├── notice │ │ │ │ │ └── NoticeListRoomEntity.kt │ │ │ │ ├── notification │ │ │ │ │ ├── NotificationRoomEntity.kt │ │ │ │ │ └── NotificationStatusRoomEntity.kt │ │ │ │ ├── rank │ │ │ │ │ ├── FetchMySchoolRankRoomEntity.kt │ │ │ │ │ ├── OurSchoolUserRankRoomEntity.kt │ │ │ │ │ ├── SchoolRankAndSearchRoomEntity.kt │ │ │ │ │ ├── SearchUserRoomEntity.kt │ │ │ │ │ └── UserRankRoomEntity.kt │ │ │ │ ├── school │ │ │ │ │ └── SchoolDetailRoomEntity.kt │ │ │ │ └── user │ │ │ │ │ ├── FetchAuthInfoRoomEntity.kt │ │ │ │ │ ├── FetchCaloriesLevelRoomEntity.kt │ │ │ │ │ ├── FetchDailyGoalRoomEntity.kt │ │ │ │ │ ├── FetchInfoRoomEntity.kt │ │ │ │ │ ├── FetchUserHealthRoomEntity.kt │ │ │ │ │ ├── UserMyPageRoomEntity.kt │ │ │ │ │ └── UserProfileRoomEntity.kt │ │ │ ├── param │ │ │ │ └── PeriodParam.kt │ │ │ └── storage │ │ │ │ ├── AuthDataStorage.kt │ │ │ │ ├── AuthDataStorageImpl.kt │ │ │ │ ├── ExerciseInfoDataStorage.kt │ │ │ │ ├── ExerciseInfoDataStorageImpl.kt │ │ │ │ ├── FitnessAccumulateDataStorage.kt │ │ │ │ ├── FitnessAccumulateDataStorageImpl.kt │ │ │ │ ├── FitnessDataStorage.kt │ │ │ │ ├── FitnessDataStorageImpl.kt │ │ │ │ ├── SpeedDataStorage.kt │ │ │ │ └── SpeedDataStorageImpl.kt │ │ │ ├── remote │ │ │ ├── api │ │ │ │ ├── BadgeApi.kt │ │ │ │ ├── ChallengeApi.kt │ │ │ │ ├── ExerciseApi.kt │ │ │ │ ├── ImagesApi.kt │ │ │ │ ├── LevelApi.kt │ │ │ │ ├── NoticesApi.kt │ │ │ │ ├── NotificationApi.kt │ │ │ │ ├── RankApi.kt │ │ │ │ ├── SchoolApi.kt │ │ │ │ └── UserApi.kt │ │ │ ├── datasource │ │ │ │ ├── RemoteBadgeDataSource.kt │ │ │ │ ├── RemoteBadgeDataSourceImpl.kt │ │ │ │ ├── RemoteChallengeDateSource.kt │ │ │ │ ├── RemoteChallengeDateSourceImpl.kt │ │ │ │ ├── RemoteExerciseDataSource.kt │ │ │ │ ├── RemoteExerciseDataSourceImpl.kt │ │ │ │ ├── RemoteImagesDataSource.kt │ │ │ │ ├── RemoteImagesDataSourceImpl.kt │ │ │ │ ├── RemoteLevelDataSource.kt │ │ │ │ ├── RemoteLevelDataSourceImpl.kt │ │ │ │ ├── RemoteNoticeDataSource.kt │ │ │ │ ├── RemoteNoticeDataSourceImpl.kt │ │ │ │ ├── RemoteNotificationDataSource.kt │ │ │ │ ├── RemoteNotificationDataSourceImpl.kt │ │ │ │ ├── RemoteRankDataSource.kt │ │ │ │ ├── RemoteRankDataSourceImpl.kt │ │ │ │ ├── RemoteSchoolDataSource.kt │ │ │ │ ├── RemoteSchoolDataSourceImpl.kt │ │ │ │ ├── RemoteSocketDataSource.kt │ │ │ │ ├── RemoteSocketDataSourceImpl.kt │ │ │ │ ├── RemoteUserDataSource.kt │ │ │ │ └── RemoteUserDataSourceImpl.kt │ │ │ ├── request │ │ │ │ ├── .gitkeep │ │ │ │ ├── exercise │ │ │ │ │ ├── FinishMeasureExerciseRequest.kt │ │ │ │ │ ├── SaveDailyExerciseRequest.kt │ │ │ │ │ ├── SendLocationRecordsRequest.kt │ │ │ │ │ └── StartMeasureExerciseRequest.kt │ │ │ │ ├── notification │ │ │ │ │ ├── OffNotiRequest.kt │ │ │ │ │ └── OnNotiRequest.kt │ │ │ │ └── users │ │ │ │ │ ├── CheckPasswordRequest.kt │ │ │ │ │ ├── CheckPhoneNumberRequest.kt │ │ │ │ │ ├── PatchDailyWalkGoalRequest.kt │ │ │ │ │ ├── PatchUserHealthRequest.kt │ │ │ │ │ ├── SignUpClassRequest.kt │ │ │ │ │ ├── UpdateProfileRequest.kt │ │ │ │ │ ├── UserChangePasswordRequest.kt │ │ │ │ │ ├── UserSignInRequest.kt │ │ │ │ │ ├── UserSignUpRequest.kt │ │ │ │ │ ├── VerifyPhoneNumberPasswordRequest.kt │ │ │ │ │ └── VerifyPhoneNumberSignUpRequest.kt │ │ │ └── response │ │ │ │ ├── badge │ │ │ │ ├── FetchMyBadgesResponse.kt │ │ │ │ ├── FetchNewBadgesResponse.kt │ │ │ │ └── FetchUserBadgesResponse.kt │ │ │ │ ├── challenge │ │ │ │ ├── ChallengeDetailResponse.kt │ │ │ │ ├── ChallengeListResponse.kt │ │ │ │ ├── ChallengeParticipantListResponse.kt │ │ │ │ └── MyChallengeResponse.kt │ │ │ │ ├── exercise │ │ │ │ ├── ExerciseAnalysisResultResponse.kt │ │ │ │ ├── ExerciseIdResponse.kt │ │ │ │ ├── ExerciseRecordListResponse.kt │ │ │ │ └── ExercisingUserListResponse.kt │ │ │ │ ├── image │ │ │ │ └── ImagesResponse.kt │ │ │ │ ├── level │ │ │ │ └── LevelListResponse.kt │ │ │ │ ├── notice │ │ │ │ └── NoticeListResponse.kt │ │ │ │ ├── notification │ │ │ │ ├── NotificationListResponse.kt │ │ │ │ └── WhetherNotificationResponse.kt │ │ │ │ ├── ranks │ │ │ │ ├── FetchMySchoolRankResponse.kt │ │ │ │ ├── OurSchoolUserRankResponse.kt │ │ │ │ ├── inquiryRank │ │ │ │ │ ├── school │ │ │ │ │ │ └── SchoolRankAndSearchResponse.kt │ │ │ │ │ └── user │ │ │ │ │ │ └── UserRankResponse.kt │ │ │ │ └── search │ │ │ │ │ └── user │ │ │ │ │ └── SearchUserResponse.kt │ │ │ │ ├── school │ │ │ │ ├── SchoolDetailResponse.kt │ │ │ │ └── SearchSchoolResponse.kt │ │ │ │ └── users │ │ │ │ ├── FetchAuthInfoResponse.kt │ │ │ │ ├── FetchCaloriesLevelResponse.kt │ │ │ │ ├── FetchDailyGoalResponse.kt │ │ │ │ ├── FetchInfoResponse.kt │ │ │ │ ├── FetchMyPageResponse.kt │ │ │ │ ├── FetchUserHealthResponse.kt │ │ │ │ ├── FetchUserProfileResponse.kt │ │ │ │ ├── FindUserAccountResponse.kt │ │ │ │ ├── UserReissueResponse.kt │ │ │ │ ├── UserSignInResponse.kt │ │ │ │ └── UserSignUpResponse.kt │ │ │ ├── repository │ │ │ ├── BadgeRepositoryImpl.kt │ │ │ ├── ChallengeRepositoryImpl.kt │ │ │ ├── ExerciseRepositoryImpl.kt │ │ │ ├── LevelRepositoryImpl.kt │ │ │ ├── NoticeRepositoryImpl.kt │ │ │ ├── NotificationRepositoryImpl.kt │ │ │ ├── RankRepositoryImpl.kt │ │ │ ├── SchoolRepositoryImpl.kt │ │ │ ├── SocketRepositoryImpl.kt │ │ │ └── UserRepositoryImpl.kt │ │ │ └── util │ │ │ ├── HttpHandler.kt │ │ │ ├── LocalDateTimeParser.kt │ │ │ ├── OfflineCacheUtil.kt │ │ │ └── UtilFunc.kt │ └── res │ │ └── drawable │ │ └── logo_ok.png │ └── test │ └── java │ └── com │ └── semicolon │ └── data │ ├── datasource │ ├── LocalBadgeDataSourceUnitTest.kt │ ├── LocalChallengeDataSourceUnitTest.kt │ ├── LocalUserDataSourceUnitTest.kt │ ├── RemoteBadgeDataSourceUnitTest.kt │ ├── RemoteChallengeDatasourceUnitTest.kt │ ├── RemoteSchoolDataSourceUnitTest.kt │ └── RemoteUserDataSourceUnitTest.kt │ └── repository │ ├── BadgeRepositoryUnitTest.kt │ ├── ChallengeRepositoryUnitTest.kt │ ├── ExerciseRepositoryUnitTest.kt │ ├── SchoolRepositoryUnitTest.kt │ └── UserRepositoryUnitTest.kt ├── domain ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── semicolon │ │ └── domain │ │ ├── entity │ │ ├── badge │ │ │ ├── FetchMyBadgesEntity.kt │ │ │ ├── FetchNewBadgesEntity.kt │ │ │ └── FetchUserBadgesEntity.kt │ │ ├── challenge │ │ │ ├── ChallengeDetailEntity.kt │ │ │ ├── ChallengeEntity.kt │ │ │ ├── ChallengeParticipantEntity.kt │ │ │ └── MyChallengeEntity.kt │ │ ├── exercise │ │ │ ├── DailyExerciseEntity.kt │ │ │ ├── ExerciseAnalysisResultEntity.kt │ │ │ ├── ExerciseEntity.kt │ │ │ ├── ExerciseRecordEntity.kt │ │ │ ├── ExercisingUserEntity.kt │ │ │ └── GoalEntity.kt │ │ ├── level │ │ │ └── LevelEntity.kt │ │ ├── notice │ │ │ └── NoticeEntity.kt │ │ ├── notification │ │ │ ├── NotificationEntity.kt │ │ │ └── NotificationStatusEntity.kt │ │ ├── rank │ │ │ ├── FetchMySchoolRankEntity.kt │ │ │ ├── OurSchoolUserRankEntity.kt │ │ │ ├── SchoolRankAndSearchEntity.kt │ │ │ ├── SearchUserEntity.kt │ │ │ └── UserRankEntity.kt │ │ ├── school │ │ │ ├── SchoolDetailEntity.kt │ │ │ └── SearchSchoolEntity.kt │ │ └── users │ │ │ ├── FetchAuthInfoEntity.kt │ │ │ ├── FetchCaloriesLevelEntity.kt │ │ │ ├── FetchDailyGoalEntity.kt │ │ │ ├── FetchInfoEntity.kt │ │ │ ├── FetchUserHealthEntity.kt │ │ │ ├── FindUserAccountEntity.kt │ │ │ ├── UserMyPageEntity.kt │ │ │ └── UserProfileEntity.kt │ │ ├── enums │ │ ├── ChallengeGoalScope.kt │ │ ├── ChallengeGoalType.kt │ │ ├── ChallengeUserScope.kt │ │ ├── DateType.kt │ │ ├── GoalType.kt │ │ ├── MeasuringState.kt │ │ ├── MoreDateType.kt │ │ ├── NoticeType.kt │ │ ├── NotificationReturnType.kt │ │ ├── NotificationType.kt │ │ ├── RankScope.kt │ │ └── SexType.kt │ │ ├── exception │ │ ├── .gitkeep │ │ ├── Basic.kt │ │ ├── Exercise.kt │ │ ├── File.kt │ │ └── User.kt │ │ ├── param │ │ ├── .gitkeep │ │ ├── exercise │ │ │ ├── FinishMeasureExerciseParam.kt │ │ │ └── StartMeasureExerciseParam.kt │ │ ├── notice │ │ │ └── FetchNoticeListParam.kt │ │ ├── notifications │ │ │ ├── SwitchOffNotificationsParam.kt │ │ │ └── SwitchOnNotificationsParam.kt │ │ ├── rank │ │ │ ├── FetchOurSchoolUserRankParam.kt │ │ │ ├── FetchUserRankParam.kt │ │ │ ├── SearchSchoolParam.kt │ │ │ └── SearchUserParam.kt │ │ └── user │ │ │ ├── CheckPhoneNumberParam.kt │ │ │ ├── FetchSchoolRankAndSearchParam.kt │ │ │ ├── PatchDailyWalkGoalParam.kt │ │ │ ├── PatchUserChangePasswordParam.kt │ │ │ ├── PatchUserHealthParam.kt │ │ │ ├── PostUserSignInParam.kt │ │ │ ├── PostUserSignUpParam.kt │ │ │ ├── SignUpClassParam.kt │ │ │ ├── UpdateProfileParam.kt │ │ │ ├── VerifyPasswordParam.kt │ │ │ └── VerifyPhoneNumberSignUpParam.kt │ │ ├── repository │ │ ├── .gitkeep │ │ ├── BadgeRepository.kt │ │ ├── ChallengeRepository.kt │ │ ├── ExerciseRepository.kt │ │ ├── LevelRepository.kt │ │ ├── NoticeRepository.kt │ │ ├── NotificationRepository.kt │ │ ├── RankRepository.kt │ │ ├── SchoolRepository.kt │ │ ├── SocketRepository.kt │ │ └── UserRepository.kt │ │ └── usecase │ │ ├── UseCase.kt │ │ ├── badge │ │ ├── FetchMyBadgesUseCase.kt │ │ ├── FetchNewBadgesUseCase.kt │ │ ├── FetchUserBadgesUseCase.kt │ │ └── SetBadgeUseCase.kt │ │ ├── challenge │ │ ├── .gitkeep │ │ ├── FetchChallengeDetailUseCase.kt │ │ ├── FetchChallengeParticipantsUseCase.kt │ │ ├── FetchChallengesUseCase.kt │ │ ├── FetchMyChallengesUseCase.kt │ │ └── PostParticipateChallengeUseCase.kt │ │ ├── exercise │ │ ├── .gitkeep │ │ ├── FetchCurrentSpeedUseCase.kt │ │ ├── FetchDailyExerciseRecordUseCase.kt │ │ ├── FetchExerciseAnalysisResultUseCase.kt │ │ ├── FetchExerciseRecordListUseCase.kt │ │ ├── FetchExercisingUserListUseCase.kt │ │ ├── FetchGoalUseCase.kt │ │ ├── FetchMeasuredExerciseRecordUseCase.kt │ │ ├── FetchMeasuredTimeUseCase.kt │ │ ├── FinishMeasureExerciseUseCase.kt │ │ ├── IsMeasuringUseCase.kt │ │ ├── PauseMeasureExerciseUseCase.kt │ │ ├── ResumeMeasureExerciseUseCase.kt │ │ ├── StartMeasureExerciseUseCase.kt │ │ └── StartRecordExerciseUseCase.kt │ │ ├── level │ │ ├── FetchLevelListUseCase.kt │ │ └── PatchMaxLevelUseCase.kt │ │ ├── notice │ │ ├── .gitkeep │ │ └── FetchNoticeListUseCase.kt │ │ ├── notification │ │ ├── FetchNotificationListUseCase.kt │ │ ├── NotificationStatusUseCase.kt │ │ ├── PatchSwitchOffNotificationUseCase.kt │ │ ├── PatchSwitchOnNotificationUseCase.kt │ │ └── ReadNotificationUseCase.kt │ │ ├── rank │ │ ├── FetchMySchoolRankUseCase.kt │ │ ├── FetchOurSchoolUserRankUseCase.kt │ │ ├── FetchSchoolRankAndSearchUseCase.kt │ │ ├── FetchUserRankUseCase.kt │ │ ├── SchoolRankAndSearchUseCase.kt │ │ └── SearchUserUseCase.kt │ │ ├── school │ │ ├── .gitkeep │ │ ├── FetchSchoolDetailUseCase.kt │ │ ├── SearchSchoolUseCase.kt │ │ └── SetSchoolLogoUseCase.kt │ │ ├── socket │ │ ├── CheeringUseCase.kt │ │ ├── ConnectSocketUseCase.kt │ │ ├── DisconnectSocketUseCase.kt │ │ ├── ReceiveCheeringUseCase.kt │ │ └── ReceiveErrorUseCase.kt │ │ ├── teacher │ │ └── .gitkeep │ │ └── user │ │ ├── .gitkeep │ │ ├── AutoLoginUseCase.kt │ │ ├── ChangeIndependenceUseCase.kt │ │ ├── CheckAccountOverlapUseCase.kt │ │ ├── CheckClassCodeUseCase.kt │ │ ├── CheckPhoneNumberUseCase.kt │ │ ├── DeleteAccountUseCase.kt │ │ ├── DeleteClassUseCase.kt │ │ ├── FetchAuthInfoUseCase.kt │ │ ├── FetchCaloriesLevelUseCase.kt │ │ ├── FetchDailyGoalUseCase.kt │ │ ├── FetchInfoUseCase.kt │ │ ├── FetchMypageUseCase.kt │ │ ├── FetchUserHealthUseCase.kt │ │ ├── FetchUserProfileUseCase.kt │ │ ├── FindUserAccountUseCase.kt │ │ ├── LogOutUseCase.kt │ │ ├── PatchDailyWalkGoalUseCase.kt │ │ ├── PatchSchoolUseCase.kt │ │ ├── PatchUserChangePasswordUseCase.kt │ │ ├── PatchUserHealthUseCase.kt │ │ ├── PostUserSignInUseCase.kt │ │ ├── PostUserSignUpUseCase.kt │ │ ├── SignUpClassUseCase.kt │ │ ├── UpdateProfileUseCase.kt │ │ ├── VerifyPasswordUseCase.kt │ │ └── VerifyUserPhoneNumberUseCase.kt │ └── test │ └── java │ └── com │ └── semicolon │ └── domain │ └── usecase │ ├── badge │ ├── FetchMyBadgesUseCaseUnitTest.kt │ ├── FetchNewBadgesUseCaseUnitTest.kt │ ├── FetchUserBadgesUseCaseUnitTest.kt │ └── SetBadgeUseCaseUnitTest.kt │ ├── challenge │ ├── FetchChallengeDetailUseCaseUnitTest.kt │ ├── FetchChallengeParticipantsUseCaseUnitTest.kt │ ├── FetchChallengesUseCaseUnitTest.kt │ ├── FetchMyChallengesUseCaseUnitCase.kt │ └── PostParticipateChallengeUseCaseUnitTest.kt │ ├── exercise │ ├── FetchDailyExerciseRecordUseCaseTest.kt │ ├── FetchExerciseAnalysisResultUseCaseTest.kt │ ├── FetchExerciseRecordListUseCaseTest.kt │ ├── FinishMeasureExerciseUseCaseTest.kt │ ├── IsMeasuringUseCaseTest.kt │ ├── StartMeasureExerciseUseCaseTest.kt │ └── StartRecordExerciseUseCaseTest.kt │ ├── school │ └── SearchSchoolUseCaseUnitTest.kt │ └── user │ ├── AutoLoginUseCaseUnitTest.kt │ ├── FetchCaloriesLevelUseCaseUnitTest.kt │ ├── FetchMyPageUseCaseUnitTest.kt │ ├── FetchUserProfileUseCaseUnitTest.kt │ ├── FindUserAccountUseCaseUnitTest.kt │ ├── PatchDailyWalkGoalUseCaseUnitTest.kt │ ├── PatchSchoolUseCaseUnitTest.kt │ ├── PatchUserChangePasswordUseCaseUnitTest.kt │ ├── PatchUserHealthUseCaseUnitTest.kt │ ├── PostUserSignInUseCaseUnitTest.kt │ ├── PostUserSignUpUseCaseUnitTest.kt │ ├── SignUpClassUseCaseUnitTest.kt │ ├── UpdateProfileUseCaseUnitTest.kt │ └── VerifyUserPhoneNumberUseCaseUnitTest.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── presentation ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── semicolon │ │ └── walkhub │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── semicolon │ │ │ └── walkhub │ │ │ ├── adapter │ │ │ ├── BindingViewHolder.kt │ │ │ ├── RecyclerViewAdapter.kt │ │ │ └── RecyclerViewItem.kt │ │ │ ├── bindingadapter │ │ │ ├── CircularProgressBarAdapter.kt │ │ │ ├── ExerciseBindingAdapter.kt │ │ │ ├── HubBindingAdapter.kt │ │ │ ├── ImageBindingAdapter.kt │ │ │ └── RecyclerViewBindingAdapter.kt │ │ │ ├── customview │ │ │ ├── CircularProgressBar.kt │ │ │ ├── Dropdown.kt │ │ │ └── ToggleSwitch.kt │ │ │ ├── di │ │ │ ├── .gitkeep │ │ │ ├── BackgroundTaskModule.kt │ │ │ ├── LocalDataSourceModule.kt │ │ │ ├── NetWorkModule.kt │ │ │ ├── RemoteDataSourceModule.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── RoomModule.kt │ │ │ ├── StorageModule.kt │ │ │ └── WalkHubApplication.kt │ │ │ ├── extensions │ │ │ ├── GlideModule.kt │ │ │ ├── Lifecycle.kt │ │ │ ├── TedImagePicker.kt │ │ │ ├── UrlConverter.kt │ │ │ └── View.kt │ │ │ ├── fcm │ │ │ └── FCMManager.kt │ │ │ ├── ui │ │ │ ├── HomeActivity.kt │ │ │ ├── MainActivity.kt │ │ │ ├── analysis │ │ │ │ ├── ActivityAnalysis.kt │ │ │ │ ├── ActivityAnalysisActivity.kt │ │ │ │ ├── AppBar.kt │ │ │ │ ├── CaloriesLevelCard.kt │ │ │ │ ├── DebouncedTextInputEditText.kt │ │ │ │ ├── GraphToggleButton.kt │ │ │ │ ├── GraphType.kt │ │ │ │ ├── ProgressBar.kt │ │ │ │ └── WalkGraph.kt │ │ │ ├── base │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── BaseFragment.kt │ │ │ │ ├── ColorResource.kt │ │ │ │ └── Typography.kt │ │ │ ├── challenge │ │ │ │ ├── ChallengeDetailActivity.kt │ │ │ │ └── ChallengeFragment.kt │ │ │ ├── cheering │ │ │ │ └── CheeringItemViewModel.kt │ │ │ ├── home │ │ │ │ ├── HomeFragment.kt │ │ │ │ └── model │ │ │ │ │ ├── HomeData.kt │ │ │ │ │ └── RankData.kt │ │ │ ├── hub │ │ │ │ ├── adapter │ │ │ │ │ ├── HubInfoNoticeRvAdapter.kt │ │ │ │ │ ├── HubSchoolRankRvAdapter.kt │ │ │ │ │ ├── HubSearchSchoolRvAdapter.kt │ │ │ │ │ ├── HubSearchUserRvAdapter.kt │ │ │ │ │ └── HubViewPagerAdapter.kt │ │ │ │ ├── model │ │ │ │ │ ├── HubInfoNoticeRvData.kt │ │ │ │ │ ├── HubSchoolRankData.kt │ │ │ │ │ ├── MySchoolRankData.kt │ │ │ │ │ ├── MySchoolUserRankData.kt │ │ │ │ │ ├── SchoolUserRankData.kt │ │ │ │ │ ├── SearchSchoolData.kt │ │ │ │ │ └── SearchUserData.kt │ │ │ │ └── ui │ │ │ │ │ ├── HubFragment.kt │ │ │ │ │ ├── HubInfoFragment.kt │ │ │ │ │ ├── HubRankFragment.kt │ │ │ │ │ ├── HubSchoolActivity.kt │ │ │ │ │ ├── HubSearchSchoolActivity.kt │ │ │ │ │ └── SignUpClassActivity.kt │ │ │ ├── login │ │ │ │ └── LoginActivity.kt │ │ │ ├── measure │ │ │ │ ├── FinishMeasureActivity.kt │ │ │ │ ├── MeasureHomeActivity.kt │ │ │ │ └── MeasuringActivity.kt │ │ │ ├── notification │ │ │ │ ├── adapter │ │ │ │ │ └── NotificationAdapter.kt │ │ │ │ ├── model │ │ │ │ │ └── NotificationData.kt │ │ │ │ └── ui │ │ │ │ │ └── NotificationActivity.kt │ │ │ ├── profile │ │ │ │ ├── ProfileFragment.kt │ │ │ │ ├── model │ │ │ │ │ └── MyPageData.kt │ │ │ │ └── setting │ │ │ │ │ └── ui │ │ │ │ │ ├── AccountInfoActivity.kt │ │ │ │ │ ├── ChangePwActivity.kt │ │ │ │ │ ├── ModifyHealthInfoActivity.kt │ │ │ │ │ ├── ModifyProfileActivity.kt │ │ │ │ │ ├── NoticeSettingActivity.kt │ │ │ │ │ ├── RealChangePwActivity.kt │ │ │ │ │ ├── SchoolDialog.kt │ │ │ │ │ ├── SettingActivity.kt │ │ │ │ │ ├── SettingSearchSchoolActivity.kt │ │ │ │ │ ├── adapter │ │ │ │ │ └── ThirdSchoolAdapter.kt │ │ │ │ │ └── model │ │ │ │ │ └── ThirdSearchSchoolData.kt │ │ │ ├── register │ │ │ │ ├── ScanHealthInformationActivity.kt │ │ │ │ ├── SearchSchoolActivity.kt │ │ │ │ ├── adapter │ │ │ │ │ └── SearchSchoolAdapter.kt │ │ │ │ ├── model │ │ │ │ │ └── SecondSearchSchoolData.kt │ │ │ │ └── ui │ │ │ │ │ ├── AgreeActivity.kt │ │ │ │ │ ├── MultiLevelCheckBox.kt │ │ │ │ │ ├── PrivacyActivity.kt │ │ │ │ │ ├── Register.kt │ │ │ │ │ └── ServiceInstructionActivity.kt │ │ │ └── splash │ │ │ │ ├── Splash.kt │ │ │ │ └── SplashActivity.kt │ │ │ ├── util │ │ │ ├── .gitkeep │ │ │ ├── EventFlow.kt │ │ │ ├── File.kt │ │ │ ├── HubIntentKey.kt │ │ │ ├── UriParser.kt │ │ │ └── WalkhubExceptionHandler.kt │ │ │ └── viewmodel │ │ │ ├── .gitkeep │ │ │ ├── SearchSchoolViewModel.kt │ │ │ ├── analysis │ │ │ └── ActivityAnalysisViewModel.kt │ │ │ ├── challenge │ │ │ ├── ChallengeDetailViewModel.kt │ │ │ ├── ChallengeViewModel.kt │ │ │ └── model │ │ │ │ ├── ChallengeDetailData.kt │ │ │ │ └── TodayWalkData.kt │ │ │ ├── home │ │ │ └── HomeViewModel.kt │ │ │ ├── hub │ │ │ ├── HubInfoViewModel.kt │ │ │ ├── HubMainViewModel.kt │ │ │ ├── HubSearchSchoolViewModel.kt │ │ │ ├── HubSearchUserViewModel.kt │ │ │ ├── HubUserViewModel.kt │ │ │ └── SignUpClassViewModel.kt │ │ │ ├── login │ │ │ └── LoginViewModel.kt │ │ │ ├── measure │ │ │ ├── FinishMeasureViewModel.kt │ │ │ ├── MeasureHomeViewModel.kt │ │ │ └── MeasureViewModel.kt │ │ │ ├── notification │ │ │ └── NotificationViewModel.kt │ │ │ ├── profile │ │ │ ├── ProfileViewModel.kt │ │ │ └── setting │ │ │ │ ├── AccountInfoViewModel.kt │ │ │ │ ├── ChangePwViewModel.kt │ │ │ │ ├── ModifyHealthInfoViewModel.kt │ │ │ │ ├── ModifyProfileViewModel.kt │ │ │ │ ├── NoticeSettingViewModel.kt │ │ │ │ ├── RealChangePwViewModel.kt │ │ │ │ ├── SettingSearchSchoolViewModel.kt │ │ │ │ └── SettingViewModel.kt │ │ │ ├── register │ │ │ └── RegisterViewModel.kt │ │ │ └── splash │ │ │ └── SplashViewModel.kt │ └── res │ │ ├── color │ │ └── selector_bnv_menu.xml │ │ ├── drawable-hdpi │ │ ├── bg_hub_edit_text.xml │ │ ├── bg_hub_my_school.xml │ │ ├── checkoff.png │ │ ├── checkon.png │ │ ├── delete.png │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ └── ic_nav_profile.png │ │ ├── drawable-ldpi │ │ ├── buttondesign.xml │ │ ├── cardviewdesign.xml │ │ ├── custom_checkbox.xml │ │ ├── edittextdesign.xml │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ ├── ic_nav_profile.png │ │ ├── mainbuttondesign.xml │ │ ├── notificationbutton.xml │ │ ├── photo.png │ │ ├── register_btn.xml │ │ ├── registerbuttondesign.xml │ │ └── servicebutton.xml │ │ ├── drawable-mdpi │ │ ├── ic_hub_search.xml │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ ├── ic_nav_profile.png │ │ └── pricture_back.png │ │ ├── drawable-v24 │ │ ├── bg_primary_button.xml │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xhdpi │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ └── ic_nav_profile.png │ │ ├── drawable-xxhdpi │ │ ├── background_home.jpg │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ ├── ic_nav_profile.png │ │ └── logo_ok.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_nav_challenge.png │ │ ├── ic_nav_home.png │ │ ├── ic_nav_hub.png │ │ └── ic_nav_profile.png │ │ ├── drawable │ │ ├── bg_measure_home.xml │ │ ├── bg_primary_button_off.xml │ │ ├── bg_selector_tab_indicator.xml │ │ ├── bg_sign_up_class_et.xml │ │ ├── camera.png │ │ ├── dialog_back.xml │ │ ├── dot_black.xml │ │ ├── dot_gray.xml │ │ ├── girl_btn.xml │ │ ├── ic_arrow_back_white.xml │ │ ├── ic_back.xml │ │ ├── ic_back_arrow.png │ │ ├── ic_calories.png │ │ ├── ic_challenge.png │ │ ├── ic_clock.png │ │ ├── ic_conquer.png │ │ ├── ic_distance.png │ │ ├── ic_home.png │ │ ├── ic_hub.png │ │ ├── ic_join_background.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_measure_arrow.xml │ │ ├── ic_measuring_finish.xml │ │ ├── ic_measuring_lock.xml │ │ ├── ic_measuring_pause.xml │ │ ├── ic_measuring_un_lock.xml │ │ ├── ic_play_measure.xml │ │ ├── ic_profile.png │ │ ├── ic_rank_first.xml │ │ ├── ic_rank_second.xml │ │ ├── ic_rank_third.xml │ │ ├── ic_setting.png │ │ ├── ic_spinner_down.xml │ │ ├── ic_tab_indicator_default.xml │ │ ├── ic_tab_indicator_selected.xml │ │ ├── img_cheering.png │ │ ├── measuring_progressbar.xml │ │ ├── modify_health_edit_back.xml │ │ ├── modify_view.xml │ │ ├── oval_number.xml │ │ ├── pen.png │ │ ├── profile.png │ │ ├── progress_horizontal.xml │ │ └── tv_register_background.xml │ │ ├── font │ │ ├── noto_sans_kr_black.ttf │ │ ├── noto_sans_kr_bold.ttf │ │ ├── noto_sans_kr_light.ttf │ │ ├── noto_sans_kr_medium.ttf │ │ ├── noto_sans_kr_regular.ttf │ │ └── noto_sans_kr_thin.ttf │ │ ├── layout │ │ ├── activity_account_info.xml │ │ ├── activity_agree.xml │ │ ├── activity_challenge_detail.xml │ │ ├── activity_change_pw.xml │ │ ├── activity_finish_measure.xml │ │ ├── activity_home.xml │ │ ├── activity_hub_school.xml │ │ ├── activity_hub_search_school.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_measure_home.xml │ │ ├── activity_measuring.xml │ │ ├── activity_modify_health_info.xml │ │ ├── activity_modify_profile.xml │ │ ├── activity_notice_setting.xml │ │ ├── activity_notification.xml │ │ ├── activity_privacy.xml │ │ ├── activity_real_change_pw.xml │ │ ├── activity_register.xml │ │ ├── activity_scan_health_information.xml │ │ ├── activity_search_school.xml │ │ ├── activity_serviceinstruction.xml │ │ ├── activity_setting.xml │ │ ├── activity_setting_search_school.xml │ │ ├── activity_sign_up_class.xml │ │ ├── change_class_dialog.xml │ │ ├── example_progress.xml │ │ ├── fragment_challenge.xml │ │ ├── fragment_home.xml │ │ ├── fragment_hub.xml │ │ ├── fragment_hub_info.xml │ │ ├── fragment_hub_rank.xml │ │ ├── fragment_profile.xml │ │ ├── hub_school_rank_view.xml │ │ ├── item_challenge.xml │ │ ├── item_challenge_empty.xml │ │ ├── item_challenge_my.xml │ │ ├── item_challenge_title.xml │ │ ├── item_cheering.xml │ │ ├── item_hub_info_notice.xml │ │ ├── item_hub_main_spinner.xml │ │ ├── item_hub_search_user.xml │ │ ├── item_hub_user_rank.xml │ │ ├── item_measure_home_header.xml │ │ ├── item_measure_home_header_record.xml │ │ ├── item_search_user.xml │ │ ├── notification_item.xml │ │ ├── schoolitem.xml │ │ └── thirdschoolitem.xml │ │ ├── menu │ │ ├── bottom_nav_menu.xml │ │ └── menu_hub_search.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── navigation │ │ └── mobile_navigation.xml │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── array.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── semicolon │ └── walkhub │ └── ExampleUnitTest.kt └── settings.gradle.kts /.github/ISSUE_TEMPLATE/todo.yml: -------------------------------------------------------------------------------- 1 | name: "Todo" 2 | description: "할일이 있으신가요? 📗" 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Describe 7 | description: | 8 | [개요] 할일에 관한 설명을 간단하게 작성해주세요. 9 | placeholder: | 10 | DropDownMenu 제작 11 | 12 | - type: textarea 13 | attributes: 14 | label: Work 15 | description: | 16 | [작업내용] 무슨 작업을 하셨나요? 17 | placeholder: | 18 | [ ] 저거 거시기 했어요 19 | 20 | [ ] 저거 거시기 거시기를 했습니다. 21 | 22 | [ ] 저거 거시기를 끝냈을걸요? 23 | 24 | - type: textarea 25 | attributes: 26 | label: Additional 27 | description: | 28 | [추가사항] 추가로 할말이 있으신가요? 29 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## 개요 2 | > 3 | 4 | ## 작업사항 5 | - 6 | 7 | ## 변경로직 8 | - 9 | 10 | ## UI 11 | 12 | -------------------------------------------------------------------------------- /.github/workflows/Init.yml: -------------------------------------------------------------------------------- 1 | name: Init 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | if: ${{ contains(github.event.head_commit.message, 'Initial commit') }} 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: Get Labelsync from generator repository 16 | run: wget https://static.smoothbear.me/labelsync 17 | 18 | - name: Allow permissions for execute 19 | run: chmod 755 labelsync 20 | 21 | - name: Initialize issue labels 22 | run: ./labelsync 23 | env: 24 | GITHUB_REPOSITORY: ${{ github.event.repository.name }} 25 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ main, develop ] 6 | pull_request: 7 | branches: [ main, develop ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: set up JDK 11 17 | uses: actions/setup-java@v2 18 | with: 19 | java-version: '11' 20 | distribution: 'temurin' 21 | cache: gradle 22 | 23 | - name: Grant execute permission for gradlew 24 | run: chmod +x gradlew 25 | - name: Create google-services.json 26 | run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./presentation/src/google-services.json 27 | - name: Build with Gradle 28 | run: ./gradlew build 29 | - name: Run test 30 | run: ./gradlew test -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | classpath(Dependency.GradlePlugin.android) 9 | classpath(Dependency.GradlePlugin.kotlin) 10 | classpath(Dependency.GradlePlugin.hilt) 11 | classpath(Dependency.GradlePlugin.service) 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | mavenCentral() 19 | } 20 | } 21 | 22 | task("clean", Delete::class) { 23 | delete(rootProject.buildDir) 24 | } -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | } 4 | 5 | repositories { 6 | gradlePluginPortal() 7 | } -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/Project.kt: -------------------------------------------------------------------------------- 1 | import org.gradle.api.JavaVersion 2 | 3 | object Project { 4 | const val compileSdk = 31 5 | const val minSdk = 21 6 | const val targetSdk = 31 7 | val javaVersion = JavaVersion.VERSION_1_8 8 | } -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/consumer-rules.pro -------------------------------------------------------------------------------- /data/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /data/src/androidTest/java/com/semicolon/data/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.semicolon.data.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /data/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/background/task/ExerciseBackgroundTask.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.background.task 2 | 3 | import java.util.concurrent.TimeUnit 4 | 5 | interface ExerciseBackgroundTask { 6 | 7 | fun synchronizeExerciseRecord(interval: Long, unit: TimeUnit) 8 | 9 | fun startRecordLocation() 10 | 11 | fun stopRecordLocation() 12 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/dao/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/java/com/semicolon/data/local/dao/.gitkeep -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/dao/LevelDao.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import com.semicolon.data.local.entity.level.LevelRoomEntity 8 | 9 | @Dao 10 | interface LevelDao { 11 | 12 | @Query("SELECT * FROM level") 13 | suspend fun fetchLevelList(): List 14 | 15 | @Insert(onConflict = OnConflictStrategy.REPLACE) 16 | suspend fun saveLevelList(levelList: List) 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/dao/LocationRecordDao.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Delete 5 | import androidx.room.Insert 6 | import androidx.room.Query 7 | import com.semicolon.data.local.entity.exercise.LocationRecordRoomEntity 8 | 9 | @Dao 10 | interface LocationRecordDao { 11 | 12 | @Query("SELECT * FROM LocationRecordRoomEntity") 13 | fun fetchLocationRecords(): List 14 | 15 | @Insert 16 | fun addLocationRecord(locationRecord: LocationRecordRoomEntity) 17 | 18 | @Insert 19 | fun addLocationRecords(locationRecords: List) 20 | 21 | @Query("DELETE FROM LocationRecordRoomEntity") 22 | fun clearLocationRecords() 23 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/dao/NoticeDao.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import com.semicolon.data.local.entity.notice.NoticeListRoomEntity 8 | 9 | @Dao 10 | interface NoticeDao { 11 | 12 | @Query("SELECT * FROM noticeList") 13 | suspend fun fetchNoticeList(): NoticeListRoomEntity 14 | 15 | @Insert(onConflict = OnConflictStrategy.REPLACE) 16 | suspend fun saveNoticeList(noticeListRoomEntity: NoticeListRoomEntity) 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/dao/SchoolDao.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import com.semicolon.data.local.entity.school.SchoolDetailRoomEntity 8 | 9 | @Dao 10 | interface SchoolDao { 11 | 12 | @Query("SELECT * FROM schoolDetail") 13 | suspend fun fetchSchoolDetail() : SchoolDetailRoomEntity 14 | 15 | @Insert(onConflict = OnConflictStrategy.REPLACE) 16 | suspend fun insertSchoolDetail(schoolDetailRoomEntity: SchoolDetailRoomEntity) 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/database/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/java/com/semicolon/data/local/database/.gitkeep -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/java/com/semicolon/data/local/datasource/.gitkeep -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalBadgeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.badge.FetchMyBadgesEntity 4 | import com.semicolon.domain.entity.badge.FetchNewBadgesEntity 5 | import com.semicolon.domain.entity.badge.FetchUserBadgesEntity 6 | 7 | interface LocalBadgeDataSource { 8 | suspend fun fetchUserBadges(userId: Int): FetchUserBadgesEntity 9 | suspend fun insertUserBadge(userId: Int, fetchUserBadgesEntity: FetchUserBadgesEntity) 10 | 11 | suspend fun fetchMyBadges(): FetchMyBadgesEntity 12 | suspend fun insertMyBadges(fetchMyBadgesEntity: FetchMyBadgesEntity) 13 | 14 | suspend fun fetchNewBadges(): FetchNewBadgesEntity 15 | suspend fun insertNewBadges(fetchNewBadgesEntity: FetchNewBadgesEntity) 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalChallengeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeDetailEntity 4 | import com.semicolon.domain.entity.challenge.ChallengeEntity 5 | import com.semicolon.domain.entity.challenge.ChallengeParticipantEntity 6 | 7 | interface LocalChallengeDataSource { 8 | 9 | suspend fun fetchChallenges(): List 10 | 11 | suspend fun saveChallenges(challenges: List) 12 | 13 | suspend fun fetchChallengeDetail(id: Int): ChallengeDetailEntity 14 | 15 | suspend fun saveChallengeDetail(id: Int, detail: ChallengeDetailEntity) 16 | 17 | suspend fun fetchParticipants(id: Int): List 18 | 19 | suspend fun saveParticipants(id: Int, participants: List) 20 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalLevelDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.level.LevelEntity 4 | 5 | interface LocalLevelDataSource { 6 | 7 | suspend fun fetchLevelList(): List 8 | 9 | suspend fun saveLevelList(remoteLevelList: List) 10 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalLevelDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.data.local.dao.LevelDao 4 | import com.semicolon.data.local.entity.level.toEntity 5 | import com.semicolon.data.local.entity.level.toRoomEntity 6 | import com.semicolon.domain.entity.level.LevelEntity 7 | import javax.inject.Inject 8 | 9 | class LocalLevelDataSourceImpl @Inject constructor( 10 | private val levelDao: LevelDao 11 | ) : LocalLevelDataSource { 12 | 13 | override suspend fun fetchLevelList(): List = 14 | levelDao.fetchLevelList().toEntity() 15 | 16 | override suspend fun saveLevelList(remoteLevelList: List) { 17 | levelDao.saveLevelList(remoteLevelList.toRoomEntity()) 18 | } 19 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalNoticeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.notice.NoticeEntity 4 | 5 | interface LocalNoticeDataSource { 6 | 7 | suspend fun fetchNoticeList(): NoticeEntity 8 | 9 | suspend fun saveNoticeList(list: NoticeEntity) 10 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalNoticeDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.data.local.dao.NoticeDao 4 | import com.semicolon.data.local.entity.notice.toDbEntity 5 | import com.semicolon.data.local.entity.notice.toEntity 6 | import com.semicolon.domain.entity.notice.NoticeEntity 7 | import javax.inject.Inject 8 | 9 | class LocalNoticeDataSourceImpl @Inject constructor( 10 | private val noticeDao: NoticeDao 11 | ): LocalNoticeDataSource { 12 | 13 | override suspend fun fetchNoticeList(): NoticeEntity = 14 | noticeDao.fetchNoticeList().toEntity() 15 | 16 | override suspend fun saveNoticeList(list: NoticeEntity) { 17 | noticeDao.saveNoticeList(list.toDbEntity()) 18 | } 19 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalNotificationDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.notification.NotificationEntity 4 | import com.semicolon.domain.entity.notification.NotificationStatusEntity 5 | 6 | interface LocalNotificationDataSource { 7 | 8 | suspend fun fetchNotificationList(): NotificationEntity 9 | 10 | suspend fun saveNotificationList(list: NotificationEntity) 11 | 12 | suspend fun fetchNotificationStatus(): NotificationStatusEntity 13 | 14 | suspend fun saveNotificationStatus(list: NotificationStatusEntity) 15 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalSchoolDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.domain.entity.school.SchoolDetailEntity 4 | 5 | interface LocalSchoolDataSource { 6 | 7 | suspend fun fetchSchoolDetail(): SchoolDetailEntity 8 | 9 | suspend fun insertSchoolDetail(schoolDetailEntity: SchoolDetailEntity) 10 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/datasource/LocalSchoolDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.datasource 2 | 3 | import com.semicolon.data.local.dao.SchoolDao 4 | import com.semicolon.data.local.entity.school.toDbEntity 5 | import com.semicolon.data.local.entity.school.toEntity 6 | import com.semicolon.domain.entity.school.SchoolDetailEntity 7 | import javax.inject.Inject 8 | 9 | class LocalSchoolDataSourceImpl @Inject constructor( 10 | private val schoolDao: SchoolDao 11 | ) : LocalSchoolDataSource { 12 | 13 | override suspend fun fetchSchoolDetail(): SchoolDetailEntity = 14 | schoolDao.fetchSchoolDetail().toEntity() 15 | 16 | override suspend fun insertSchoolDetail(schoolDetailEntity: SchoolDetailEntity) { 17 | schoolDao.insertSchoolDetail(schoolDetailEntity.toDbEntity()) 18 | } 19 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/java/com/semicolon/data/local/entity/.gitkeep -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/exercise/LocationRecordEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.exercise 2 | 3 | data class LocationRecordEntity( 4 | val latitude: Double, 5 | val longitude: Double 6 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/exercise/LocationRecordRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.exercise 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity 7 | data class LocationRecordRoomEntity( 8 | @PrimaryKey(autoGenerate = true) var id: Int = 0, 9 | val latitude: Double, 10 | val longitude: Double 11 | ) 12 | 13 | fun LocationRecordRoomEntity.toEntity() = 14 | LocationRecordEntity( 15 | latitude = latitude, 16 | longitude = longitude 17 | ) 18 | 19 | fun LocationRecordEntity.toRoomEntity() = 20 | LocationRecordRoomEntity( 21 | latitude = latitude, 22 | longitude = longitude 23 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/exercise/WalkRecordEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.exercise 2 | 3 | data class WalkRecordEntity( 4 | val traveledDistanceAsMeter: Int, 5 | val walkCount: Int, 6 | val burnedKilocalories: Float 7 | ) 8 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/user/FetchAuthInfoRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.user 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import com.semicolon.domain.entity.users.FetchAuthInfoEntity 6 | 7 | @Entity(tableName = "authInfo") 8 | data class FetchAuthInfoRoomEntity( 9 | @PrimaryKey(autoGenerate = true) var id: Int = 0, 10 | val accountId: String, 11 | val phoneNumber: String 12 | ) 13 | 14 | fun FetchAuthInfoRoomEntity.toEntity() = 15 | FetchAuthInfoEntity( 16 | accountId = accountId, 17 | phoneNumber = phoneNumber 18 | ) 19 | 20 | fun FetchAuthInfoEntity.toDbEntity() = 21 | FetchAuthInfoRoomEntity( 22 | accountId = accountId, 23 | phoneNumber = phoneNumber 24 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/user/FetchDailyGoalRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.user 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import com.semicolon.domain.entity.users.FetchDailyGoalEntity 6 | 7 | @Entity(tableName = "dailyGoal") 8 | data class FetchDailyGoalRoomEntity( 9 | @PrimaryKey(autoGenerate = true) var id: Int = 0, 10 | val dailyWalkCountGoal: Int 11 | ) 12 | 13 | fun FetchDailyGoalRoomEntity.toEntity() = 14 | FetchDailyGoalEntity( 15 | dailyWalkCountGoal = dailyWalkCountGoal 16 | ) 17 | 18 | fun FetchDailyGoalEntity.toDbEntity() = 19 | FetchDailyGoalRoomEntity( 20 | dailyWalkCountGoal = dailyWalkCountGoal 21 | ) 22 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/entity/user/FetchUserHealthRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.entity.user 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import com.semicolon.domain.entity.users.FetchUserHealthEntity 6 | 7 | @Entity(tableName = "userHealth") 8 | data class FetchUserHealthRoomEntity( 9 | @PrimaryKey(autoGenerate = true) var id: Int = 0, 10 | val height: Double, 11 | val weight: Double, 12 | val sex: String 13 | ) 14 | 15 | fun FetchUserHealthRoomEntity.toEntity() = 16 | FetchUserHealthEntity( 17 | height = height, 18 | weight = weight, 19 | sex = sex 20 | ) 21 | 22 | fun FetchUserHealthEntity.toDbEntity() = 23 | FetchUserHealthRoomEntity( 24 | height = height, 25 | weight = weight, 26 | sex = sex 27 | ) 28 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/param/PeriodParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.param 2 | 3 | data class PeriodParam( 4 | val startTimeAsSecond: Long, 5 | val endTimeAsSecond: Long 6 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/storage/AuthDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.storage 2 | 3 | import android.content.Context 4 | import android.content.SharedPreferences 5 | import org.threeten.bp.LocalDateTime 6 | 7 | interface AuthDataStorage { 8 | 9 | fun setAccessToken(token: String) 10 | fun fetchAccessToken(): String 11 | fun clearAccessToken() 12 | 13 | fun setRefreshToken(token: String) 14 | fun fetchRefreshToken(): String 15 | fun clearRefreshToken() 16 | 17 | fun setExpiredAt(localDateTime: String) 18 | fun fetchExpiredAt(): LocalDateTime 19 | 20 | fun setDeviceToken(deviceToken: String) 21 | fun fetchDeviceToken(): String 22 | 23 | fun setId(id: String) 24 | fun fetchId(): String 25 | fun clearId() 26 | 27 | fun setPw(pw: String) 28 | fun fetchPw(): String 29 | fun clearPw() 30 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/storage/ExerciseInfoDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.storage 2 | 3 | import com.semicolon.domain.entity.exercise.GoalEntity 4 | import com.semicolon.domain.enums.MeasuringState 5 | 6 | interface ExerciseInfoDataStorage { 7 | 8 | fun setFirstStartTime(timeAsSecond: Long) 9 | 10 | fun fetchFirstStartTime(): Long 11 | 12 | fun setStartTime(timeAsSecond: Long) 13 | 14 | fun fetchStartTime(): Long 15 | 16 | fun setPausedTime(timeAsSecond: Long) 17 | 18 | fun fetchPausedTime(): Long 19 | 20 | fun setExerciseId(id: Int) 21 | 22 | fun fetchExerciseId(): Int 23 | 24 | fun setIsMeasuring(isMeasuring: MeasuringState) 25 | 26 | fun isMeasuring(): MeasuringState 27 | 28 | fun setGoal(goalEntity: GoalEntity) 29 | 30 | fun fetchGoal(): GoalEntity 31 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/storage/FitnessAccumulateDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.storage 2 | 3 | import com.semicolon.data.local.entity.exercise.WalkRecordEntity 4 | 5 | interface FitnessAccumulateDataStorage { 6 | 7 | fun accumulate(walkRecord: WalkRecordEntity) 8 | 9 | fun fetchAccumulatedData(): WalkRecordEntity 10 | 11 | fun clearAccumulatedData() 12 | 13 | fun addPausedTime(timeAsSecond: Long) 14 | 15 | fun fetchPausedTime(): Long 16 | 17 | fun clearPausedTime() 18 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/local/storage/SpeedDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.local.storage 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | 5 | interface SpeedDataStorage { 6 | 7 | fun fetchCurrentSpeed(): Flow 8 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/api/ImagesApi.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.api 2 | 3 | import com.semicolon.data.remote.response.image.ImagesResponse 4 | import okhttp3.MultipartBody 5 | import retrofit2.http.Multipart 6 | import retrofit2.http.POST 7 | import retrofit2.http.Part 8 | 9 | interface ImagesApi { 10 | @Multipart 11 | @POST("/images") 12 | suspend fun postImages( 13 | @Part images: List 14 | ): ImagesResponse 15 | 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/api/LevelApi.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.api 2 | 3 | import com.semicolon.data.remote.response.level.LevelListResponse 4 | import retrofit2.http.GET 5 | import retrofit2.http.PATCH 6 | import retrofit2.http.Path 7 | 8 | interface LevelApi { 9 | 10 | @GET("levels/lists") 11 | suspend fun fetchLevelList(): LevelListResponse 12 | 13 | @PATCH("levels/{level-id}") 14 | suspend fun patchMaxLevel(@Path("level-id") levelId: Int) 15 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/api/NoticesApi.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.api 2 | 3 | import com.semicolon.data.remote.response.notice.NoticeListResponse 4 | import retrofit2.http.GET 5 | import retrofit2.http.Query 6 | 7 | interface NoticesApi { 8 | @GET("notices/list") 9 | suspend fun fetchNoticeList( 10 | @Query("scope") scope: String 11 | ): NoticeListResponse 12 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/api/SchoolApi.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.api 2 | 3 | import com.semicolon.data.remote.response.school.SchoolDetailResponse 4 | import com.semicolon.data.remote.response.school.SearchSchoolResponse 5 | import retrofit2.http.* 6 | 7 | interface SchoolApi { 8 | 9 | @GET("schools/search") 10 | suspend fun searchSchool( 11 | @Query("name") name: String 12 | ): SearchSchoolResponse 13 | 14 | @PATCH("schools/logos") 15 | suspend fun setSchoolLogo( 16 | @Body image_url: String 17 | ) 18 | 19 | @GET("schools/details/{school-id}") 20 | suspend fun fetchSchoolDetail( 21 | @Path("school-id") schoolId: Int 22 | ): SchoolDetailResponse 23 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteBadgeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.response.badge.FetchMyBadgesResponse 4 | import com.semicolon.data.remote.response.badge.FetchNewBadgesResponse 5 | import com.semicolon.data.remote.response.badge.FetchUserBadgesResponse 6 | import com.semicolon.domain.entity.badge.FetchMyBadgesEntity 7 | import com.semicolon.domain.entity.badge.FetchNewBadgesEntity 8 | import com.semicolon.domain.entity.badge.FetchUserBadgesEntity 9 | 10 | interface RemoteBadgeDataSource { 11 | 12 | suspend fun fetchUserBadges(userId: Int): FetchUserBadgesEntity 13 | 14 | suspend fun fetchMyBadges(): FetchMyBadgesEntity 15 | 16 | suspend fun setBadge(badgeId: Int) 17 | 18 | suspend fun fetchNewBadges(): FetchNewBadgesEntity 19 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteChallengeDateSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeDetailEntity 4 | import com.semicolon.domain.entity.challenge.ChallengeEntity 5 | import com.semicolon.domain.entity.challenge.ChallengeParticipantEntity 6 | import com.semicolon.domain.entity.challenge.MyChallengeEntity 7 | 8 | interface RemoteChallengeDateSource { 9 | suspend fun fetchChallenges(): List 10 | 11 | suspend fun fetchChallengeDetail(challengeId: Int): ChallengeDetailEntity 12 | 13 | suspend fun postParticipate(challengeId: Int) 14 | 15 | suspend fun fetchParticipants(challengeId: Int): List 16 | 17 | suspend fun fetchMyChallenges(): List 18 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteImagesDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.response.image.ImagesResponse 4 | import okhttp3.MultipartBody 5 | 6 | interface RemoteImagesDataSource { 7 | 8 | suspend fun postImages(images : List): ImagesResponse 9 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteImagesDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.api.ImagesApi 4 | import com.semicolon.data.remote.response.image.ImagesResponse 5 | import com.semicolon.data.util.HttpHandler 6 | import okhttp3.MultipartBody 7 | import javax.inject.Inject 8 | 9 | class RemoteImagesDataSourceImpl @Inject constructor( 10 | private val imagesApi : ImagesApi 11 | ): RemoteImagesDataSource { 12 | override suspend fun postImages(images: List): ImagesResponse = 13 | HttpHandler() 14 | .httpRequest { imagesApi.postImages(images) } 15 | .sendRequest() 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteLevelDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.domain.entity.level.LevelEntity 4 | 5 | interface RemoteLevelDataSource { 6 | 7 | suspend fun fetchLevelList(): List 8 | 9 | suspend fun patchMaxLevel(levelId: Int) 10 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteLevelDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.api.LevelApi 4 | import com.semicolon.data.remote.response.level.LevelListResponse 5 | import com.semicolon.data.remote.response.level.toEntity 6 | import com.semicolon.data.util.HttpHandler 7 | import com.semicolon.domain.entity.level.LevelEntity 8 | import javax.inject.Inject 9 | 10 | class RemoteLevelDataSourceImpl @Inject constructor( 11 | private val levelApi: LevelApi 12 | ) : RemoteLevelDataSource { 13 | 14 | override suspend fun fetchLevelList(): List = 15 | HttpHandler() 16 | .httpRequest { levelApi.fetchLevelList() } 17 | .sendRequest().toEntity() 18 | 19 | override suspend fun patchMaxLevel(levelId: Int) { 20 | levelApi.patchMaxLevel(levelId) 21 | } 22 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteNoticeDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.response.notice.NoticeListResponse 4 | 5 | interface RemoteNoticeDataSource { 6 | suspend fun fetchNoticeList(scope: String): NoticeListResponse 7 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteNoticeDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.api.NoticesApi 4 | import com.semicolon.data.remote.response.notice.NoticeListResponse 5 | import com.semicolon.data.util.HttpHandler 6 | import javax.inject.Inject 7 | 8 | class RemoteNoticeDataSourceImpl @Inject constructor( 9 | private val noticesApi: NoticesApi 10 | ): RemoteNoticeDataSource { 11 | override suspend fun fetchNoticeList( 12 | scope: String 13 | ): NoticeListResponse = 14 | HttpHandler() 15 | .httpRequest { noticesApi.fetchNoticeList(scope) } 16 | .sendRequest() 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteNotificationDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.request.notification.OffNotiRequest 4 | import com.semicolon.data.remote.request.notification.OnNotiRequest 5 | import com.semicolon.data.remote.response.notification.NotificationListResponse 6 | import com.semicolon.data.remote.response.notification.WhetherNotificationResponse 7 | 8 | interface RemoteNotificationDataSource { 9 | suspend fun fetchNotificationList(): NotificationListResponse 10 | 11 | suspend fun patchNotificationIsRead(data: Int) 12 | 13 | suspend fun switchOnNofications(onNotiRequest: OnNotiRequest) 14 | 15 | suspend fun switchOffNotifications(offNotiRequest: OffNotiRequest) 16 | 17 | suspend fun notificationStatus(): WhetherNotificationResponse 18 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteSchoolDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import com.semicolon.data.remote.response.school.SearchSchoolResponse 4 | import com.semicolon.domain.entity.school.SchoolDetailEntity 5 | import com.semicolon.domain.entity.school.SearchSchoolEntity 6 | 7 | interface RemoteSchoolDataSource { 8 | 9 | suspend fun searchSchool(name: String): SearchSchoolResponse 10 | 11 | suspend fun setSchoolLogo(imageUrl: String) 12 | 13 | suspend fun fetchSchoolDetail(schoolId: Int): SchoolDetailEntity 14 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/datasource/RemoteSocketDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.datasource 2 | 3 | import kotlinx.coroutines.flow.SharedFlow 4 | 5 | interface RemoteSocketDataSource { 6 | 7 | fun sendCheering(userId: Int) 8 | 9 | fun receiveCheering(): SharedFlow 10 | 11 | fun receiveError(): List 12 | 13 | fun disconnect() 14 | 15 | fun connectSocket() 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/java/com/semicolon/data/remote/request/.gitkeep -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/exercise/FinishMeasureExerciseRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.exercise 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class FinishMeasureExerciseRequest( 6 | @SerializedName("walk_count") val walkCount: Int, 7 | @SerializedName("distance") val distanceAsCentimeter: Int, 8 | @SerializedName("calorie") val kilocalorie: Int, 9 | @SerializedName("image_url") val imageUrl: String, 10 | @SerializedName("paused_time") val pausedTime: Long 11 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/exercise/SaveDailyExerciseRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.exercise 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SaveDailyExerciseRequest( 6 | @SerializedName("distance") val distanceAsCentimeter: Int, 7 | @SerializedName("walk_count") val walkCount: Int, 8 | @SerializedName("date") val date: String, 9 | @SerializedName("calorie") val calories: Int, 10 | @SerializedName("exercise_time") val exerciseTime: Double 11 | ) 12 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/exercise/StartMeasureExerciseRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.exercise 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.param.exercise.StartMeasureExerciseParam 5 | 6 | data class StartMeasureExerciseRequest( 7 | @SerializedName("goal") val goal: Int, 8 | @SerializedName("goal_type") val goalType: String 9 | ) 10 | 11 | fun StartMeasureExerciseParam.toRequest() = StartMeasureExerciseRequest( 12 | goal = goal, 13 | goalType = goalType.value 14 | ) 15 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/notification/OffNotiRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.notification 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.enums.NotificationType 5 | 6 | data class OffNotiRequest( 7 | @SerializedName("type") val type: NotificationType, 8 | @SerializedName("user_id_list") val userIdList: List 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/notification/OnNotiRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.notification 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.enums.NotificationType 5 | 6 | data class OnNotiRequest( 7 | @SerializedName("type") val type: NotificationType, 8 | @SerializedName("user_id_list") val userIdList: List 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/CheckPasswordRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class CheckPasswordRequest( 6 | @SerializedName("password") val password: String 7 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/CheckPhoneNumberRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | data class CheckPhoneNumberRequest( 4 | val phone_number: String, 5 | val auth_code: String 6 | ) 7 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/PatchDailyWalkGoalRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class PatchDailyWalkGoalRequest( 6 | @SerializedName("daily_walk_count_goal") val dailyWalkCountGoal: Int 7 | ) 8 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/PatchUserHealthRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class PatchUserHealthRequest( 6 | @SerializedName("height") val height: Double, 7 | @SerializedName("weight") val weight: Int, 8 | @SerializedName("sex") val sex: String 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/SignUpClassRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SignUpClassRequest( 6 | @SerializedName("class_code") val classCode: String, 7 | @SerializedName("number") val number: Int 8 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/UpdateProfileRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateProfileRequest( 6 | @SerializedName("name") val name: String, 7 | @SerializedName("profile_image_url") val profileImageUrl: String, 8 | @SerializedName("school_id") val schoolId: Long, 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/UserChangePasswordRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserChangePasswordRequest( 6 | @SerializedName("password") val password: String, 7 | @SerializedName("new_password") val newPassword: String 8 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/UserSignInRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserSignInRequest( 6 | @SerializedName("account_id") val accountId: String, 7 | @SerializedName("password") val password: String, 8 | @SerializedName("device_token") val deviceToken: String 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/UserSignUpRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.enums.SexType 5 | 6 | data class UserSignUpRequest( 7 | @SerializedName("account_id") val accountId: String, 8 | @SerializedName("password") val password: String, 9 | @SerializedName("name") val name: String, 10 | @SerializedName("phone_number") val phoneNumber: String, 11 | @SerializedName("height") val height: Double, 12 | @SerializedName("weight") val weight: Int, 13 | @SerializedName("sex") val sex: SexType, 14 | @SerializedName("school_id") val schoolId: Int, 15 | @SerializedName("auth_code") val authCode: String, 16 | @SerializedName("device_token") val deviceToken: String 17 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/VerifyPhoneNumberPasswordRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class VerifyPhoneNumberPasswordRequest( 6 | @SerializedName("phone_number") val phoneNumber: String 7 | ) 8 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/request/users/VerifyPhoneNumberSignUpRequest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class VerifyPhoneNumberSignUpRequest( 6 | @SerializedName("phone_number") val phoneNumber: String 7 | ) 8 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/exercise/ExerciseIdResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.exercise 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ExerciseIdResponse( 6 | @SerializedName("exercise_id") val exerciseId: Int 7 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/exercise/ExercisingUserListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.exercise 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.exercise.ExercisingUserEntity 5 | 6 | data class ExercisingUserListResponse( 7 | @SerializedName("user_list") val userList: List 8 | ) { 9 | data class User( 10 | @SerializedName("user_id") val userId: Int, 11 | @SerializedName("name") val name: String, 12 | @SerializedName("profile_image_url") val profileImageUrl: String? 13 | ) 14 | 15 | fun User.toEntity() = 16 | ExercisingUserEntity( 17 | userId = userId, 18 | name = name, 19 | profileImageUrl = profileImageUrl 20 | ) 21 | } 22 | 23 | fun ExercisingUserListResponse.toEntityList() = 24 | this.userList.map { it.toEntity() } -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/image/ImagesResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.image 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ImagesResponse( 6 | @SerializedName("image_url") val imageUrl: List 7 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/ranks/FetchMySchoolRankResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.ranks 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.rank.FetchMySchoolRankEntity 5 | 6 | data class FetchMySchoolRankResponse( 7 | @SerializedName("school_id") val schoolId: Int, 8 | @SerializedName("name") val name: String, 9 | @SerializedName("logo_image_url") val logoImageUrl: String, 10 | @SerializedName("grade") val grade: Int?, 11 | @SerializedName("class_num") val classNum: Int? 12 | ) 13 | 14 | 15 | fun FetchMySchoolRankResponse.toEntity() = 16 | FetchMySchoolRankEntity( 17 | schoolId = schoolId, 18 | name = name, 19 | logoImageUrl = logoImageUrl, 20 | grade = grade, 21 | classNum = classNum 22 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/FetchAuthInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.users.FetchAuthInfoEntity 5 | 6 | data class FetchAuthInfoResponse( 7 | @SerializedName("account_id") val accountId: String, 8 | @SerializedName("phone_number") val phoneNumber: String 9 | ) 10 | 11 | fun FetchAuthInfoResponse.toEntity() = 12 | FetchAuthInfoEntity( 13 | accountId = accountId, 14 | phoneNumber = phoneNumber 15 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/FetchDailyGoalResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.users.FetchDailyGoalEntity 5 | 6 | data class FetchDailyGoalResponse( 7 | @SerializedName("daily_walk_count_goal") val dailyWalkCountGoal: Int 8 | ) 9 | 10 | fun FetchDailyGoalResponse.toEntity() = 11 | FetchDailyGoalEntity( 12 | dailyWalkCountGoal = dailyWalkCountGoal 13 | ) 14 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/FetchInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.users.FetchInfoEntity 5 | 6 | data class FetchInfoResponse( 7 | @SerializedName("name") val name: String, 8 | @SerializedName("profile_image_url") val profileImageUrl: String, 9 | @SerializedName("school_name") val schoolName: String, 10 | @SerializedName("grade") val grade: Int, 11 | @SerializedName("class_num") val classNum: Int 12 | ) 13 | 14 | fun FetchInfoResponse.toEntity() = 15 | FetchInfoEntity( 16 | name = name, 17 | profileImageUrl = profileImageUrl, 18 | schoolName = schoolName, 19 | grade = grade, 20 | classNum = classNum 21 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/FetchUserHealthResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.users.FetchUserHealthEntity 5 | 6 | data class FetchUserHealthResponse( 7 | @SerializedName("height") val height: Double, 8 | @SerializedName("weight") val weight: Double, 9 | @SerializedName("sex") val sex: String 10 | ) 11 | 12 | fun FetchUserHealthResponse.toEntity() = 13 | FetchUserHealthEntity( 14 | height = height, 15 | weight = weight, 16 | sex = sex 17 | ) 18 | -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/FindUserAccountResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.semicolon.domain.entity.users.FindUserAccountEntity 5 | 6 | data class FindUserAccountResponse( 7 | @SerializedName("account_id") val accountId: String 8 | ) 9 | 10 | fun FindUserAccountResponse.toEntity() = 11 | FindUserAccountEntity( 12 | accountId = accountId 13 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/UserReissueResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserReissueResponse( 6 | @SerializedName("access_token") val accessToken: String, 7 | @SerializedName("expired_at") val expiredAt: String 8 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/UserSignInResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserSignInResponse( 6 | @SerializedName("access_token") val accessToken: String, 7 | @SerializedName("expired_at") val expiredAt: String, 8 | @SerializedName("refresh_token") val refreshToken: String, 9 | @SerializedName("authority") val authority: String, 10 | @SerializedName("height") val height: Double, 11 | @SerializedName("weight") val weight: Double, 12 | @SerializedName("sex") val sex: String 13 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/remote/response/users/UserSignUpResponse.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserSignUpResponse( 6 | @SerializedName("access_token") val accessToken: String, 7 | @SerializedName("expired_at") val expiredAt: String, 8 | @SerializedName("refresh_token") val refreshToken: String, 9 | @SerializedName("authority") val authority: String, 10 | @SerializedName("height") val height: Double, 11 | @SerializedName("weight") val weight: Double, 12 | @SerializedName("sex") val sex: String 13 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/util/LocalDateTimeParser.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.util 2 | 3 | import org.threeten.bp.LocalDateTime 4 | 5 | fun String.toLocalDateTime(): LocalDateTime = 6 | LocalDateTime.parse(this) -------------------------------------------------------------------------------- /data/src/main/java/com/semicolon/data/util/UtilFunc.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.data.util 2 | 3 | import okhttp3.MediaType 4 | import okhttp3.MultipartBody 5 | import okhttp3.RequestBody 6 | import java.io.File 7 | 8 | 9 | fun File.toMultipart(): MultipartBody.Part { 10 | val fileBody = RequestBody.create(MediaType.parse("image/jpeg"), this) 11 | return MultipartBody.Part.createFormData("images", this.name, fileBody) 12 | } 13 | 14 | fun List.toMultipartList(): List = 15 | this.map { it.toMultipart() } -------------------------------------------------------------------------------- /data/src/main/res/drawable/logo_ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/data/src/main/res/drawable/logo_ok.png -------------------------------------------------------------------------------- /domain/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/consumer-rules.pro -------------------------------------------------------------------------------- /domain/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /domain/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/badge/FetchMyBadgesEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.badge 2 | 3 | data class FetchMyBadgesEntity( 4 | val badgeList: List 5 | ) { 6 | data class Badge( 7 | val badgeId: Int, 8 | val badgeName: String, 9 | val badgeImageUrl: String, 10 | val mine: Boolean, 11 | val condition: String 12 | ) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/badge/FetchNewBadgesEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.badge 2 | 3 | data class FetchNewBadgesEntity( 4 | val badgeList: List 5 | ) { 6 | data class Badge( 7 | val badgeId: Int, 8 | val badgeImageUrl: String, 9 | val badgeName: String 10 | ) 11 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/badge/FetchUserBadgesEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.badge 2 | 3 | data class FetchUserBadgesEntity( 4 | val badgeList: List 5 | ) { 6 | data class Badge( 7 | val badgeId: Int, 8 | val badgeImageUrl: String, 9 | val badgeName: String 10 | ) 11 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/challenge/ChallengeEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.challenge 2 | 3 | import com.semicolon.domain.enums.ChallengeGoalScope 4 | import com.semicolon.domain.enums.ChallengeGoalType 5 | import org.threeten.bp.LocalDateTime 6 | 7 | data class ChallengeEntity( 8 | val id: Int, 9 | val name: String, 10 | val startAt: LocalDateTime, 11 | val endAt: LocalDateTime, 12 | val imageUrl: String, 13 | val goal: Int, 14 | val goalScope: ChallengeGoalScope, 15 | val goalType: ChallengeGoalType, 16 | val award: String, 17 | val writer: Writer, 18 | val participantCount: Int, 19 | val participantList: List 20 | ) { 21 | 22 | data class Writer( 23 | val userId: Int, 24 | val name: String, 25 | val profileImageUrl: String 26 | ) 27 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/challenge/ChallengeParticipantEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.challenge 2 | 3 | data class ChallengeParticipantEntity( 4 | val id: Int, 5 | val name: String, 6 | val profileImageUrl: String 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/challenge/MyChallengeEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.challenge 2 | 3 | import com.semicolon.domain.enums.ChallengeGoalScope 4 | import com.semicolon.domain.enums.ChallengeGoalType 5 | import org.threeten.bp.LocalDateTime 6 | 7 | data class MyChallengeEntity( 8 | val id: Int, 9 | val name: String, 10 | val startAt: LocalDateTime, 11 | val endAt: LocalDateTime, 12 | val imageUrl: String, 13 | val goal: Int, 14 | val goalScope: ChallengeGoalScope, 15 | val goalType: ChallengeGoalType, 16 | val totalWalkCount: Int, 17 | val writer: Writer 18 | ) { 19 | data class Writer( 20 | val id: Int, 21 | val name: String, 22 | val profileImageUrl: String 23 | ) 24 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/DailyExerciseEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | data class DailyExerciseEntity( 4 | val stepCount: Int, 5 | val exerciseTimeAsMilli: Long, 6 | val traveledDistanceAsMeter: Int, 7 | val burnedKilocalories: Float 8 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/ExerciseAnalysisResultEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | data class ExerciseAnalysisResultEntity( 4 | val levelId: Int, 5 | val walkCountList: List, 6 | val dailyWalkCountGoal: Int, 7 | val walkCount: Int, 8 | val calories: Int, 9 | val distanceAsKiloMeter: Float, 10 | val walkTimeAsMinute: Int 11 | ) 12 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/ExerciseEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | data class ExerciseEntity( 4 | val stepCount: Int, 5 | val traveledDistanceAsMeter: Int, 6 | val burnedKilocalories: Float 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/ExerciseRecordEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | data class ExerciseRecordEntity( 4 | val exerciseId: Int, 5 | val imageUrl: String, 6 | val startAt: String, 7 | val latitude: Double, 8 | val longitude: Double 9 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/ExercisingUserEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | data class ExercisingUserEntity( 4 | val userId: Int, 5 | val name: String, 6 | val profileImageUrl: String? 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/exercise/GoalEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.exercise 2 | 3 | import com.semicolon.domain.enums.GoalType 4 | 5 | data class GoalEntity( 6 | val goal: Int, 7 | val goalType: GoalType 8 | ) 9 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/level/LevelEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.level 2 | 3 | data class LevelEntity( 4 | val levelId: Int, 5 | val foodImageUrl: String, 6 | val foodName: String, 7 | val calories: Int, 8 | val size: String, 9 | val level: Int, 10 | val message: String 11 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/notice/NoticeEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.notice 2 | 3 | import org.threeten.bp.LocalDateTime 4 | 5 | data class NoticeEntity( 6 | val noticeValueEntity: List 7 | ) { 8 | data class NoticeValueEntity( 9 | val id: Int, 10 | val title: String, 11 | val content: String, 12 | val scope: String, 13 | val createdAt: LocalDateTime, 14 | val noticeWriter: NoticeWriterEntity 15 | ) { 16 | data class NoticeWriterEntity( 17 | val id: Int, 18 | val name: String, 19 | val profileUrl: String 20 | ) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/notification/NotificationEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.notification 2 | 3 | import com.semicolon.domain.enums.NotificationReturnType 4 | 5 | data class NotificationEntity( 6 | val notificationValue: List 7 | ) { 8 | data class NotificationValue( 9 | val notificationId: Int, 10 | val title: String, 11 | val content: String, 12 | val type: NotificationReturnType, 13 | val data: String, 14 | val createAt: String, 15 | val isRead: Boolean, 16 | val writer: Writer 17 | ) { 18 | data class Writer( 19 | val writerId: Int, 20 | val writerName: String, 21 | val writerImage: String 22 | ) 23 | } 24 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/notification/NotificationStatusEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.notification 2 | 3 | import com.semicolon.domain.enums.NotificationType 4 | 5 | data class NotificationStatusEntity( 6 | val topicWhetherList: List 7 | ) { 8 | data class TopicWhether( 9 | val isSubscribe: Boolean, 10 | val title: NotificationType, 11 | val topicId: Int 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/rank/FetchMySchoolRankEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.rank 2 | 3 | data class FetchMySchoolRankEntity( 4 | val schoolId: Int, 5 | val name: String, 6 | val logoImageUrl: String, 7 | val grade: Int?, 8 | val classNum: Int? 9 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/rank/OurSchoolUserRankEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.rank 2 | 3 | data class OurSchoolUserRankEntity( 4 | val isJoinedClass: Boolean, 5 | val myRanking: Ranking?, 6 | val rankingList: List 7 | ) { 8 | data class Ranking( 9 | val name: String, 10 | val profileImageUrl: String?, 11 | val ranking: Int, 12 | val userId: Int, 13 | val walkCount: Int, 14 | val isMeasuring: Boolean 15 | ) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/rank/SchoolRankAndSearchEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.rank 2 | 3 | data class SchoolRankAndSearchEntity( 4 | val schoolRankList: List 5 | ) { 6 | data class SchoolRank( 7 | val schoolId: Int, 8 | val schoolName: String, 9 | val ranking: Int, 10 | val logoImageUrl: String?, 11 | val walkCount: Int, 12 | val userCount: Int 13 | ) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/rank/SearchUserEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.rank 2 | 3 | data class SearchUserEntity( 4 | val userList: List 5 | ) { 6 | data class UserInfo( 7 | val classNum: Int, 8 | val grade: Int, 9 | val name: String, 10 | val profileImageUrl: String?, 11 | val ranking: Int, 12 | val userId: Int, 13 | val walkCount: Int 14 | ) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/rank/UserRankEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.rank 2 | 3 | data class UserRankEntity( 4 | val rankList: List 5 | ) { 6 | data class UserRank( 7 | val userId: Int, 8 | val name: String, 9 | val ranking: Int, 10 | val profileImageUrl: String?, 11 | val walkCount: Int 12 | ) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/school/SchoolDetailEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.school 2 | 3 | data class SchoolDetailEntity( 4 | val week: Week, 5 | val month: Month 6 | ) { 7 | data class Week( 8 | val totalWalkCount: Int?, 9 | val date: String?, 10 | val totalUserCount: Int?, 11 | val ranking: Int? 12 | ) 13 | data class Month( 14 | val totalWalkCount: Int?, 15 | val date: String?, 16 | val totalUserCount: Int?, 17 | val ranking: Int? 18 | ) 19 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/school/SearchSchoolEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.school 2 | 3 | data class SearchSchoolEntity( 4 | val schoolList: List 5 | ) { 6 | data class SchoolInfo( 7 | val schoolId: Long, 8 | val logoImageUrl: String, 9 | val schoolName: String 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FetchAuthInfoEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FetchAuthInfoEntity( 4 | val accountId: String, 5 | val phoneNumber: String 6 | ) 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FetchCaloriesLevelEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FetchCaloriesLevelEntity( 4 | val caloriesLevelList: List 5 | ) { 6 | data class CaloriesLevel( 7 | val calorie: Int, 8 | val foodImageUrl: String, 9 | val foodName: String, 10 | val level: Int, 11 | val levelId: Int, 12 | val message: String, 13 | val size: String 14 | ) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FetchDailyGoalEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FetchDailyGoalEntity( 4 | val dailyWalkCountGoal: Int 5 | ) 6 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FetchInfoEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FetchInfoEntity( 4 | val name: String, 5 | val profileImageUrl: String?, 6 | val schoolName: String, 7 | val grade: Int?, 8 | val classNum: Int? 9 | ) 10 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FetchUserHealthEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FetchUserHealthEntity( 4 | val height: Double, 5 | val weight: Double, 6 | val sex: String 7 | ) 8 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/FindUserAccountEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class FindUserAccountEntity( 4 | val accountId: String 5 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/UserMyPageEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class UserMyPageEntity( 4 | val userId: Int, 5 | val name: String, 6 | val profileImageUrl: String?, 7 | val schoolId: Long, 8 | val schoolName: String, 9 | val schoolImageUrl: String, 10 | val grade: Int, 11 | val classNum: Int, 12 | val dailyWalkCountGoal: Int, 13 | val titleBadge: TitleBadge, 14 | val level: Level 15 | ) { 16 | data class TitleBadge( 17 | val badgeId: Int, 18 | val badgeName: String, 19 | val badgeImageUrl: String 20 | ) 21 | 22 | data class Level( 23 | val levelId: Int, 24 | val levelName: String, 25 | val levelImageUrl: String 26 | ) 27 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/entity/users/UserProfileEntity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.entity.users 2 | 3 | data class UserProfileEntity( 4 | val userId: Int, 5 | val name: String, 6 | val profileImageUrl: String, 7 | val schoolName: String, 8 | val schoolImageUrl: String, 9 | val grade: Int, 10 | val classNum: Int, 11 | val dailyWalkCountGoal: Int, 12 | val titleBadge: TitleBadge, 13 | val level: Level 14 | ) { 15 | data class TitleBadge( 16 | val badgeId: Int, 17 | val badgeName: String, 18 | val badgeImageUrl: String 19 | ) 20 | 21 | data class Level( 22 | val levelName: String, 23 | val levelImageUrl: String 24 | ) 25 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/ChallengeGoalScope.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class ChallengeGoalScope { 4 | ALL, 5 | DAY, 6 | ETC 7 | } 8 | 9 | fun String.toGoalScope() = 10 | when(this) { 11 | "ALL" -> ChallengeGoalScope.ALL 12 | "DAY" -> ChallengeGoalScope.DAY 13 | else -> ChallengeGoalScope.ETC 14 | } 15 | 16 | fun ChallengeGoalScope.toScopeString() = 17 | when(this) { 18 | ChallengeGoalScope.ALL -> "ALL" 19 | ChallengeGoalScope.DAY -> "DAY" 20 | ChallengeGoalScope.ETC -> "ETC" 21 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/ChallengeGoalType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class ChallengeGoalType { 4 | WALK, 5 | DISTANCE, 6 | ETC 7 | } 8 | 9 | fun String.toGoalType(): ChallengeGoalType = 10 | when(this) { 11 | "WALK" -> ChallengeGoalType.WALK 12 | "DISTANCE" -> ChallengeGoalType.DISTANCE 13 | else -> ChallengeGoalType.ETC 14 | } 15 | 16 | fun ChallengeGoalType.toScopeString() = 17 | when(this) { 18 | ChallengeGoalType.WALK -> "WALK" 19 | ChallengeGoalType.DISTANCE -> "DISTANCE" 20 | ChallengeGoalType.ETC -> "ETC" 21 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/ChallengeUserScope.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class ChallengeUserScope { 4 | ALL, 5 | SCHOOL, 6 | CLASS, 7 | GRADE, 8 | ETC 9 | } 10 | 11 | fun String?.toUserScope(): ChallengeUserScope = 12 | when(this) { 13 | "ALL" -> ChallengeUserScope.ALL 14 | "SCHOOL" -> ChallengeUserScope.SCHOOL 15 | "CLASS" -> ChallengeUserScope.CLASS 16 | "GRADE" -> ChallengeUserScope.GRADE 17 | else -> ChallengeUserScope.ETC 18 | } 19 | 20 | fun ChallengeUserScope.toScopeString(): String = 21 | when(this) { 22 | ChallengeUserScope.ALL -> "ALL" 23 | ChallengeUserScope.SCHOOL -> "SCHOOL" 24 | ChallengeUserScope.CLASS -> "CLASS" 25 | ChallengeUserScope.GRADE -> "GRADE" 26 | ChallengeUserScope.ETC -> "ETC" 27 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/DateType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class DateType { 4 | WEEK, 5 | MONTH 6 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/GoalType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class GoalType(val value: String) { 4 | DISTANCE("DISTANCE"), 5 | WALK_COUNT("WALK") 6 | } 7 | 8 | fun String.toMeasureGoalType() = 9 | when(this) { 10 | "DISTANCE" -> GoalType.DISTANCE 11 | else -> GoalType.WALK_COUNT 12 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/MeasuringState.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class MeasuringState(val id: Int) { 4 | ONGOING(0), 5 | PAUSED(1), 6 | FINISHED(2) 7 | } 8 | 9 | fun Int.toMeasuringState() = 10 | when (this) { 11 | 0 -> MeasuringState.ONGOING 12 | 1 -> MeasuringState.PAUSED 13 | else -> MeasuringState.FINISHED 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/MoreDateType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class MoreDateType { 4 | DAY, 5 | WEEK, 6 | MONTH 7 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/NoticeType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class NoticeType { 4 | ALL, 5 | SCHOOL 6 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/NotificationReturnType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class NotificationReturnType { 4 | NOTICE, 5 | CHALLENGE, 6 | EXERCISE 7 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/NotificationType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class NotificationType { 4 | CHALLENGE, CHALLENGE_SUCCESS, CHALLENGE_EXPIRATION, NOTICE 5 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/RankScope.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class RankScope { 4 | SCHOOL, 5 | CLASS 6 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/enums/SexType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.enums 2 | 3 | enum class SexType { 4 | MALE, 5 | FEMALE, 6 | X 7 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/exception/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/exception/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/exception/Basic.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.exception 2 | 3 | class BadRequestException : RuntimeException() 4 | 5 | class ConflictException : RuntimeException() 6 | 7 | class ForbiddenException : RuntimeException() 8 | 9 | class NoInternetException : RuntimeException() 10 | 11 | class NotFoundException : RuntimeException() 12 | 13 | class ServerException : RuntimeException() 14 | 15 | class TimeoutException : RuntimeException() 16 | 17 | class UnauthorizedException : RuntimeException() 18 | 19 | class UnknownException : RuntimeException() 20 | 21 | class ImageConverterException : RuntimeException() -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/exception/Exercise.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.exception 2 | 3 | import java.lang.RuntimeException 4 | 5 | class RecordExerciseException : RuntimeException() -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/exception/File.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.exception 2 | 3 | import java.lang.RuntimeException 4 | 5 | class ChangeFileSizeException : RuntimeException() -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/exception/User.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.exception 2 | 3 | import java.io.IOException 4 | 5 | class NeedLoginException : IOException() -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/param/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/exercise/FinishMeasureExerciseParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.exercise 2 | 3 | import java.io.File 4 | 5 | data class FinishMeasureExerciseParam( 6 | val verifyImage: File? 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/exercise/StartMeasureExerciseParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.exercise 2 | 3 | import com.semicolon.domain.enums.GoalType 4 | 5 | data class StartMeasureExerciseParam( 6 | val goal: Int, 7 | val goalType: GoalType 8 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/notice/FetchNoticeListParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.notice 2 | 3 | data class FetchNoticeListParam( 4 | val scope: String 5 | ) 6 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/notifications/SwitchOffNotificationsParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.notifications 2 | 3 | import com.semicolon.domain.enums.NotificationType 4 | 5 | data class SwitchOffNotificationsParam ( 6 | val userId: Int, 7 | val type: NotificationType 8 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/notifications/SwitchOnNotificationsParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.notifications 2 | 3 | import com.semicolon.domain.enums.NotificationType 4 | 5 | data class SwitchOnNotificationsParam ( 6 | val userId: Int, 7 | val type: NotificationType 8 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/rank/FetchOurSchoolUserRankParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.rank 2 | 3 | import com.semicolon.domain.enums.MoreDateType 4 | import com.semicolon.domain.enums.RankScope 5 | 6 | data class FetchOurSchoolUserRankParam( 7 | val scope: RankScope, 8 | val dateType: MoreDateType 9 | ) 10 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/rank/FetchUserRankParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.rank 2 | 3 | import com.semicolon.domain.enums.MoreDateType 4 | 5 | data class FetchUserRankParam( 6 | val schoolId: Int, 7 | val dateType: MoreDateType 8 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/rank/SearchSchoolParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.rank 2 | 3 | import com.semicolon.domain.enums.DateType 4 | 5 | data class SearchSchoolParam ( 6 | val name: String 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/rank/SearchUserParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.rank 2 | 3 | import com.semicolon.domain.enums.MoreDateType 4 | 5 | data class SearchUserParam( 6 | val schoolId: Int, 7 | val name: String, 8 | val moreDateType: MoreDateType 9 | ) 10 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/CheckPhoneNumberParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class CheckPhoneNumberParam( 4 | var phoneNumber: String, 5 | var authCode: String 6 | ) 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/FetchSchoolRankAndSearchParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class FetchSchoolRankAndSearchParam( 4 | val name: String?, 5 | val schoolDateType: String 6 | ) 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/PatchDailyWalkGoalParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class PatchDailyWalkGoalParam( 4 | val dailyWalkCountGoal: Int 5 | ) 6 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/PatchUserChangePasswordParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class PatchUserChangePasswordParam( 4 | val password: String, 5 | val newPassword: String 6 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/PatchUserHealthParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class PatchUserHealthParam( 4 | val height: Double, 5 | val weight: Int, 6 | val sex: String 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/PostUserSignInParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class PostUserSignInParam( 4 | val accountId: String, 5 | val password: String 6 | ) 7 | 8 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/PostUserSignUpParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | import com.semicolon.domain.enums.SexType 4 | 5 | data class PostUserSignUpParam( 6 | var accountId: String, 7 | var password: String, 8 | var name: String, 9 | var phoneNumber: String, 10 | var height: Double, 11 | var weight: Int, 12 | val sex: SexType, 13 | var schoolId: Int, 14 | var authCode: String 15 | ) 16 | 17 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/SignUpClassParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class SignUpClassParam( 4 | val classCode: String, 5 | val number: Int 6 | ) 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/UpdateProfileParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | import java.io.File 4 | 5 | data class UpdateProfileParam( 6 | val name: String, 7 | val profileImage: File?, 8 | val schoolId: Long 9 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/VerifyPasswordParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class VerifyPasswordParam( 4 | val password: String 5 | ) 6 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/param/user/VerifyPhoneNumberSignUpParam.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.param.user 2 | 3 | data class VerifyPhoneNumberSignUpParam( 4 | var phone_number: String 5 | ) 6 | 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/repository/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/BadgeRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import com.semicolon.domain.entity.badge.FetchMyBadgesEntity 4 | import com.semicolon.domain.entity.badge.FetchNewBadgesEntity 5 | import com.semicolon.domain.entity.badge.FetchUserBadgesEntity 6 | import kotlinx.coroutines.flow.Flow 7 | 8 | interface BadgeRepository { 9 | 10 | suspend fun fetchUserBadges(userId: Int): Flow 11 | 12 | suspend fun fetchMyBadges(): Flow 13 | 14 | suspend fun setBadge(badgeId: Int) 15 | 16 | suspend fun fetchNewBadges(): Flow 17 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/ChallengeRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeEntity 4 | import com.semicolon.domain.entity.challenge.ChallengeDetailEntity 5 | import com.semicolon.domain.entity.challenge.ChallengeParticipantEntity 6 | import com.semicolon.domain.entity.challenge.MyChallengeEntity 7 | import kotlinx.coroutines.flow.Flow 8 | 9 | interface ChallengeRepository { 10 | suspend fun fetchChallenges(): Flow> 11 | 12 | suspend fun fetchChallengeDetail(id: Int): Flow 13 | 14 | suspend fun fetchChallengeParticipants(id: Int): Flow> 15 | 16 | suspend fun postParticipateChallenge(id: Int) 17 | 18 | suspend fun fetchMyChallenges(): Flow> 19 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/LevelRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import com.semicolon.domain.entity.level.LevelEntity 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface LevelRepository { 7 | 8 | suspend fun fetchLevelList(): Flow> 9 | 10 | suspend fun patchMaxLevel(levelId: Int) 11 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/NoticeRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import com.semicolon.domain.entity.notice.NoticeEntity 4 | import com.semicolon.domain.enums.NoticeType 5 | import com.semicolon.domain.param.notice.FetchNoticeListParam 6 | import kotlinx.coroutines.flow.Flow 7 | 8 | interface NoticeRepository{ 9 | suspend fun fetchNoticeList(fetchNoticeListParam: FetchNoticeListParam): Flow 10 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/SchoolRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import com.semicolon.domain.entity.school.SchoolDetailEntity 4 | import com.semicolon.domain.entity.school.SearchSchoolEntity 5 | import kotlinx.coroutines.flow.Flow 6 | import java.io.File 7 | 8 | interface SchoolRepository { 9 | 10 | suspend fun setSchoolLogo(profileImage: File) 11 | 12 | suspend fun fetchSchoolDetail(schoolId: Int): Flow 13 | 14 | suspend fun searchSchool(name: String): Flow 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/repository/SocketRepository.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.repository 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | import kotlinx.coroutines.flow.SharedFlow 5 | 6 | interface SocketRepository { 7 | 8 | fun cheering(userId: Int) 9 | 10 | fun receiveCheering(): SharedFlow 11 | 12 | fun receiveError(): Flow> 13 | 14 | fun connectSocket() 15 | 16 | fun disConnectSocket() 17 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/UseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase 2 | 3 | abstract class UseCase { 4 | abstract suspend fun execute(data: I): O 5 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/badge/FetchMyBadgesUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.badge 2 | 3 | import com.semicolon.domain.entity.badge.FetchMyBadgesEntity 4 | import com.semicolon.domain.repository.BadgeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMyBadgesUseCase @Inject constructor( 10 | private val badgeRepository: BadgeRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | badgeRepository.fetchMyBadges() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/badge/FetchNewBadgesUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.badge 2 | 3 | import com.semicolon.domain.entity.badge.FetchNewBadgesEntity 4 | import com.semicolon.domain.repository.BadgeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchNewBadgesUseCase @Inject constructor( 10 | private val badgeRepository: BadgeRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | badgeRepository.fetchNewBadges() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/badge/FetchUserBadgesUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.badge 2 | 3 | import com.semicolon.domain.entity.badge.FetchUserBadgesEntity 4 | import com.semicolon.domain.repository.BadgeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchUserBadgesUseCase @Inject constructor( 10 | private val badgeRepository: BadgeRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Int): Flow = 14 | badgeRepository.fetchUserBadges(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/badge/SetBadgeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.badge 2 | 3 | import com.semicolon.domain.repository.BadgeRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class SetBadgeUseCase @Inject constructor( 8 | private val badgeRepository: BadgeRepository 9 | ): UseCase() { 10 | 11 | override suspend fun execute(data: Int) = 12 | badgeRepository.setBadge(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/challenge/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/FetchChallengeDetailUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeDetailEntity 4 | import com.semicolon.domain.repository.ChallengeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchChallengeDetailUseCase @Inject constructor( 10 | private val challengeRepository: ChallengeRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Int): Flow = 14 | challengeRepository.fetchChallengeDetail(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/FetchChallengeParticipantsUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeParticipantEntity 4 | import com.semicolon.domain.repository.ChallengeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchChallengeParticipantsUseCase @Inject constructor( 10 | private val challengeRepository: ChallengeRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Int): Flow> = 14 | challengeRepository.fetchChallengeParticipants(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/FetchChallengesUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.semicolon.domain.entity.challenge.ChallengeEntity 4 | import com.semicolon.domain.repository.ChallengeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchChallengesUseCase @Inject constructor( 10 | private val challengeRepository: ChallengeRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Unit): Flow> = 14 | challengeRepository.fetchChallenges() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/FetchMyChallengesUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.semicolon.domain.entity.challenge.MyChallengeEntity 4 | import com.semicolon.domain.repository.ChallengeRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMyChallengesUseCase @Inject constructor( 10 | private val challengeRepository: ChallengeRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Unit): Flow> = 14 | challengeRepository.fetchMyChallenges() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/challenge/PostParticipateChallengeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.semicolon.domain.repository.ChallengeRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class PostParticipateChallengeUseCase @Inject constructor( 8 | private val challengeRepository: ChallengeRepository 9 | ): UseCase() { 10 | 11 | override suspend fun execute(data: Int) { 12 | challengeRepository.postParticipateChallenge(data) 13 | } 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/exercise/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchCurrentSpeedUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.repository.ExerciseRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import kotlinx.coroutines.flow.Flow 6 | import javax.inject.Inject 7 | 8 | class FetchCurrentSpeedUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ): UseCase>() { 11 | 12 | override suspend fun execute(data: Unit): Flow = 13 | exerciseRepository.fetchCurrentSpeed() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchDailyExerciseRecordUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.DailyExerciseEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchDailyExerciseRecordUseCase @Inject constructor( 10 | private val exerciseRepository: ExerciseRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | exerciseRepository.fetchDailyExerciseRecord() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchExerciseAnalysisResultUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.ExerciseAnalysisResultEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchExerciseAnalysisResultUseCase @Inject constructor( 10 | private val exerciseRepository: ExerciseRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | exerciseRepository.fetchExerciseAnalysisResult() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchExerciseRecordListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.ExerciseRecordEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchExerciseRecordListUseCase @Inject constructor( 10 | private val exerciseRepository: ExerciseRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Unit): Flow> = 14 | exerciseRepository.fetchExerciseRecordList() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchExercisingUserListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.ExercisingUserEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchExercisingUserListUseCase @Inject constructor( 10 | private val exerciseRepository: ExerciseRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Unit): Flow> = 14 | exerciseRepository.fetchExercisingUserList() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchGoalUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.GoalEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class FetchGoalUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ): UseCase() { 11 | 12 | override suspend fun execute(data: Unit): GoalEntity = 13 | exerciseRepository.fetchGoal() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchMeasuredExerciseRecordUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.entity.exercise.ExerciseEntity 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMeasuredExerciseRecordUseCase @Inject constructor( 10 | private val exerciseRepository: ExerciseRepository 11 | ): UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | exerciseRepository.fetchMeasuredExerciseRecord() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FetchMeasuredTimeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.repository.ExerciseRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import kotlinx.coroutines.flow.Flow 6 | import javax.inject.Inject 7 | 8 | class FetchMeasuredTimeUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ): UseCase>() { 11 | 12 | override suspend fun execute(data: Unit): Flow = 13 | exerciseRepository.fetchMeasuredTime() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/FinishMeasureExerciseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.param.exercise.FinishMeasureExerciseParam 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class FinishMeasureExerciseUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: FinishMeasureExerciseParam) = 13 | exerciseRepository.finishMeasureExercise(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/IsMeasuringUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.enums.MeasuringState 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class IsMeasuringUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: Unit): MeasuringState = 13 | exerciseRepository.isMeasuring() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/PauseMeasureExerciseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.repository.ExerciseRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class PauseMeasureExerciseUseCase @Inject constructor( 8 | private val exerciseRepository: ExerciseRepository 9 | ): UseCase() { 10 | 11 | override suspend fun execute(data: Unit) = 12 | exerciseRepository.pauseMeasureExercise() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/ResumeMeasureExerciseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.repository.ExerciseRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class ResumeMeasureExerciseUseCase @Inject constructor( 8 | private val exerciseRepository: ExerciseRepository 9 | ): UseCase() { 10 | 11 | override suspend fun execute(data: Unit) = 12 | exerciseRepository.resumeMeasureExercise() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/StartMeasureExerciseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.param.exercise.StartMeasureExerciseParam 4 | import com.semicolon.domain.repository.ExerciseRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class StartMeasureExerciseUseCase @Inject constructor( 9 | private val exerciseRepository: ExerciseRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: StartMeasureExerciseParam) = 13 | exerciseRepository.startMeasureExercise(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/exercise/StartRecordExerciseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.semicolon.domain.repository.ExerciseRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class StartRecordExerciseUseCase @Inject constructor( 8 | private val exerciseRepository: ExerciseRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit) = 12 | exerciseRepository.startRecordExercise() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/level/FetchLevelListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.level 2 | 3 | import com.semicolon.domain.entity.level.LevelEntity 4 | import com.semicolon.domain.repository.LevelRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchLevelListUseCase @Inject constructor( 10 | private val levelRepository: LevelRepository 11 | ) : UseCase>>() { 12 | 13 | override suspend fun execute(data: Unit): Flow> = 14 | levelRepository.fetchLevelList() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/level/PatchMaxLevelUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.level 2 | 3 | import com.semicolon.domain.repository.LevelRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class PatchMaxLevelUseCase @Inject constructor( 8 | private val levelRepository: LevelRepository 9 | ): UseCase() { 10 | 11 | override suspend fun execute(data: Int) { 12 | levelRepository.patchMaxLevel(data) 13 | } 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notice/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/notice/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notice/FetchNoticeListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notice 2 | 3 | import com.semicolon.domain.entity.notice.NoticeEntity 4 | import com.semicolon.domain.enums.NoticeType 5 | import com.semicolon.domain.param.notice.FetchNoticeListParam 6 | import com.semicolon.domain.repository.NoticeRepository 7 | import com.semicolon.domain.usecase.UseCase 8 | import kotlinx.coroutines.flow.Flow 9 | import javax.inject.Inject 10 | 11 | 12 | class FetchNoticeListUseCase @Inject constructor( 13 | private val noticeRepository: NoticeRepository 14 | ) : UseCase>() { 15 | 16 | override suspend fun execute(data: FetchNoticeListParam): Flow = 17 | noticeRepository.fetchNoticeList(data) 18 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notification/FetchNotificationListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notification 2 | 3 | import com.semicolon.domain.entity.notification.NotificationEntity 4 | import com.semicolon.domain.repository.NotificationRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchNotificationListUseCase @Inject constructor( 10 | private val notificationRepository: NotificationRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | notificationRepository.fetchNotificationList() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notification/NotificationStatusUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notification 2 | 3 | import com.semicolon.domain.entity.notification.NotificationStatusEntity 4 | import com.semicolon.domain.repository.NotificationRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class NotificationStatusUseCase @Inject constructor( 10 | private val notificationRepository: NotificationRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | notificationRepository.notificationStatus() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notification/PatchSwitchOffNotificationUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notification 2 | 3 | import com.semicolon.domain.enums.NotificationType 4 | import com.semicolon.domain.param.notifications.SwitchOffNotificationsParam 5 | import com.semicolon.domain.repository.NotificationRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import javax.inject.Inject 8 | 9 | class PatchSwitchOffNotificationUseCase @Inject constructor( 10 | private val notificationRepository: NotificationRepository 11 | ) : UseCase() { 12 | override suspend fun execute(data: SwitchOffNotificationsParam): Unit = 13 | notificationRepository.switchOffNotification(data) 14 | 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notification/PatchSwitchOnNotificationUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notification 2 | 3 | import com.semicolon.domain.param.notifications.SwitchOnNotificationsParam 4 | import com.semicolon.domain.repository.NotificationRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class PatchSwitchOnNotificationUseCase @Inject constructor( 9 | private val notificationRepository: NotificationRepository 10 | ) : UseCase() { 11 | override suspend fun execute(data: SwitchOnNotificationsParam): Unit = 12 | notificationRepository.switchOnNotification(data) 13 | 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/notification/ReadNotificationUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.notification 2 | 3 | import com.semicolon.domain.repository.NotificationRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class ReadNotificationUseCase @Inject constructor( 8 | private val notificationRepository: NotificationRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Int): Unit = 12 | notificationRepository.readNotification(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/FetchMySchoolRankUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.FetchMySchoolRankEntity 4 | import com.semicolon.domain.repository.RankRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMySchoolRankUseCase @Inject constructor( 10 | private val rankRepository: RankRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | rankRepository.fetchMySchoolRank() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/FetchOurSchoolUserRankUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.OurSchoolUserRankEntity 4 | import com.semicolon.domain.param.rank.FetchOurSchoolUserRankParam 5 | import com.semicolon.domain.repository.RankRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class FetchOurSchoolUserRankUseCase @Inject constructor( 11 | private val rankRepository: RankRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: FetchOurSchoolUserRankParam): Flow = 15 | rankRepository.fetchOurSchoolUserRank(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/FetchSchoolRankAndSearchUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.SchoolRankAndSearchEntity 4 | import com.semicolon.domain.param.user.FetchSchoolRankAndSearchParam 5 | import com.semicolon.domain.repository.RankRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class FetchSchoolRankAndSearchUseCase @Inject constructor( 11 | private val rankRepository: RankRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: FetchSchoolRankAndSearchParam): Flow = 15 | rankRepository.fetchSchoolRankAndSearch(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/FetchUserRankUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.UserRankEntity 4 | import com.semicolon.domain.param.rank.FetchUserRankParam 5 | import com.semicolon.domain.repository.RankRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class FetchUserRankUseCase @Inject constructor( 11 | private val rankRepository: RankRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: FetchUserRankParam): Flow = 15 | rankRepository.fetchUserRank(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/SchoolRankAndSearchUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.SchoolRankAndSearchEntity 4 | import com.semicolon.domain.param.user.FetchSchoolRankAndSearchParam 5 | import com.semicolon.domain.repository.RankRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class SchoolRankAndSearchUseCase @Inject constructor( 11 | private val rankRepository: RankRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: FetchSchoolRankAndSearchParam): Flow = 15 | rankRepository.fetchSchoolRankAndSearch(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/rank/SearchUserUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.rank 2 | 3 | import com.semicolon.domain.entity.rank.SearchUserEntity 4 | import com.semicolon.domain.param.rank.SearchUserParam 5 | import com.semicolon.domain.repository.RankRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class SearchUserUseCase @Inject constructor( 11 | private val rankRepository: RankRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: SearchUserParam): Flow = 15 | rankRepository.searchUser(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/school/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/school/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/school/FetchSchoolDetailUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.school 2 | 3 | import com.semicolon.domain.entity.school.SchoolDetailEntity 4 | import com.semicolon.domain.entity.school.SearchSchoolEntity 5 | import com.semicolon.domain.repository.SchoolRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class FetchSchoolDetailUseCase @Inject constructor( 11 | private val schoolRepository: SchoolRepository 12 | ) : UseCase>() { 13 | 14 | override suspend fun execute(data: Int): Flow = 15 | schoolRepository.fetchSchoolDetail(data) 16 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/school/SearchSchoolUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.school 2 | 3 | import com.semicolon.domain.entity.school.SearchSchoolEntity 4 | import com.semicolon.domain.repository.SchoolRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class SearchSchoolUseCase @Inject constructor( 10 | private val searchSchoolRepository: SchoolRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: String): Flow = 14 | searchSchoolRepository.searchSchool(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/school/SetSchoolLogoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.school 2 | 3 | import com.semicolon.domain.repository.SchoolRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import java.io.File 6 | import javax.inject.Inject 7 | 8 | class SetSchoolLogoUseCase @Inject constructor( 9 | private val schoolRepository: SchoolRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: File) { 13 | schoolRepository.setSchoolLogo(data) 14 | } 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/socket/CheeringUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.socket 2 | 3 | import com.semicolon.domain.repository.SocketRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class CheeringUseCase @Inject constructor( 8 | private val socketRepository: SocketRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Int) = 12 | socketRepository.cheering(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/socket/ConnectSocketUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.socket 2 | 3 | import com.semicolon.domain.repository.SocketRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class ConnectSocketUseCase @Inject constructor( 8 | private val socketRepository: SocketRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit) = 12 | socketRepository.connectSocket() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/socket/DisconnectSocketUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.socket 2 | 3 | import com.semicolon.domain.repository.SocketRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class DisconnectSocketUseCase @Inject constructor( 8 | private val socketRepository: SocketRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit) = 12 | socketRepository.disConnectSocket() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/socket/ReceiveCheeringUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.socket 2 | 3 | import com.semicolon.domain.repository.SocketRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import kotlinx.coroutines.flow.Flow 6 | import kotlinx.coroutines.flow.SharedFlow 7 | import javax.inject.Inject 8 | 9 | class ReceiveCheeringUseCase @Inject constructor( 10 | private val socketRepository: SocketRepository 11 | ): UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): SharedFlow = 14 | socketRepository.receiveCheering() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/socket/ReceiveErrorUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.socket 2 | 3 | import com.semicolon.domain.repository.SocketRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import kotlinx.coroutines.flow.Flow 6 | import javax.inject.Inject 7 | 8 | class ReceiveErrorUseCase @Inject constructor( 9 | private val socketRepository: SocketRepository 10 | ): UseCase>>(){ 11 | 12 | override suspend fun execute(data: Unit): Flow> = 13 | socketRepository.receiveError() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/teacher/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/teacher/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/domain/src/main/java/com/semicolon/domain/usecase/user/.gitkeep -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/AutoLoginUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import kotlinx.coroutines.flow.Flow 6 | import javax.inject.Inject 7 | 8 | class AutoLoginUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: Unit): Unit = 13 | userRepository.autoLogin() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/ChangeIndependenceUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class ChangeIndependenceUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Int): Unit = 12 | userRepository.changeIndependence(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/CheckAccountOverlapUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class CheckAccountOverlapUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: String): Unit = 12 | userRepository.checkAccountOverlap(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/CheckClassCodeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class CheckClassCodeUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: String): Unit = 12 | userRepository.checkClassCode(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/CheckPhoneNumberUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.CheckPhoneNumberParam 4 | import com.semicolon.domain.param.user.VerifyPhoneNumberSignUpParam 5 | import com.semicolon.domain.repository.UserRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import javax.inject.Inject 8 | 9 | class CheckPhoneNumberUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase() { 12 | 13 | override suspend fun execute(data: CheckPhoneNumberParam) = 14 | userRepository.checkPhoneNumber(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/DeleteAccountUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class DeleteAccountUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit): Unit = 12 | userRepository.deleteAccount() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/DeleteClassUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class DeleteClassUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit): Unit = 12 | userRepository.deleteClass() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchAuthInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FetchAuthInfoEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchAuthInfoUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchAuthInfo() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchCaloriesLevelUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FetchCaloriesLevelEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchCaloriesLevelUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchCaloriesLevel() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchDailyGoalUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FetchDailyGoalEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchDailyGoalUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchDailyGoal() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FetchInfoEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchInfoUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchInfo() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchMypageUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.UserMyPageEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMypageUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchMyPage() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchUserHealthUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FetchUserHealthEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchUserHealthUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchUserHealth() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FetchUserProfileUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.UserProfileEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchUserProfileUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Int): Flow = 14 | userRepository.fetchUserProfile(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/FindUserAccountUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.entity.users.FindUserAccountEntity 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FindUserAccountUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: String): Flow = 14 | userRepository.findUserAccount(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/LogOutUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class LogOutUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Unit): Unit = 12 | userRepository.logout() 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PatchDailyWalkGoalUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.PatchDailyWalkGoalParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class PatchDailyWalkGoalUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: PatchDailyWalkGoalParam) = 13 | userRepository.patchDailyWalkGoal(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PatchSchoolUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.repository.UserRepository 4 | import com.semicolon.domain.usecase.UseCase 5 | import javax.inject.Inject 6 | 7 | class PatchSchoolUseCase @Inject constructor( 8 | private val userRepository: UserRepository 9 | ) : UseCase() { 10 | 11 | override suspend fun execute(data: Int) = 12 | userRepository.patchSchool(data) 13 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PatchUserChangePasswordUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.PatchUserChangePasswordParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class PatchUserChangePasswordUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: PatchUserChangePasswordParam) = 13 | userRepository.patchUserChangePassword(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PatchUserHealthUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.PatchUserHealthParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class PatchUserHealthUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: PatchUserHealthParam) = 13 | userRepository.patchUserHealth(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PostUserSignInUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.PostUserSignInParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class PostUserSignInUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase() { 12 | 13 | override suspend fun execute(data: PostUserSignInParam): Unit = 14 | userRepository.postUserSignIn(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/PostUserSignUpUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.PostUserSignUpParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class PostUserSignUpUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: PostUserSignUpParam) = 13 | userRepository.postUserSignUp(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/SignUpClassUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.SignUpClassParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class SignUpClassUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: SignUpClassParam) = 13 | userRepository.signUpClass(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/UpdateProfileUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.UpdateProfileParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class UpdateProfileUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: UpdateProfileParam) = 13 | userRepository.updateProfile(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/VerifyPasswordUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.VerifyPasswordParam 4 | import com.semicolon.domain.param.user.VerifyPhoneNumberSignUpParam 5 | import com.semicolon.domain.repository.UserRepository 6 | import com.semicolon.domain.usecase.UseCase 7 | import javax.inject.Inject 8 | 9 | class VerifyPasswordUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase() { 12 | 13 | override suspend fun execute(data: VerifyPasswordParam) = 14 | userRepository.verifyPassword(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/semicolon/domain/usecase/user/VerifyUserPhoneNumberUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.semicolon.domain.param.user.VerifyPhoneNumberSignUpParam 4 | import com.semicolon.domain.repository.UserRepository 5 | import com.semicolon.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class VerifyUserPhoneNumberUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: VerifyPhoneNumberSignUpParam) = 13 | userRepository.verifyUserPhoneNumber(data) 14 | } -------------------------------------------------------------------------------- /domain/src/test/java/com/semicolon/domain/usecase/challenge/PostParticipateChallengeUseCaseUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.challenge 2 | 3 | import com.nhaarman.mockitokotlin2.mock 4 | import com.semicolon.domain.repository.ChallengeRepository 5 | import kotlinx.coroutines.runBlocking 6 | import org.junit.Assert.assertEquals 7 | import org.junit.Test 8 | 9 | class PostParticipateChallengeUseCaseUnitTest { 10 | 11 | private val challengeRepository = mock() 12 | 13 | private val postParticipateChallengeUseCase = PostParticipateChallengeUseCase(challengeRepository) 14 | 15 | @Test 16 | fun testPostParticipateChallengeUseCase() { 17 | val challengeId = 12 18 | runBlocking { 19 | val useCaseResult = postParticipateChallengeUseCase.execute(challengeId) 20 | assertEquals(useCaseResult, Unit) 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /domain/src/test/java/com/semicolon/domain/usecase/exercise/StartRecordExerciseUseCaseTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.exercise 2 | 3 | import com.nhaarman.mockitokotlin2.mock 4 | import com.nhaarman.mockitokotlin2.verify 5 | import com.semicolon.domain.repository.ExerciseRepository 6 | import kotlinx.coroutines.runBlocking 7 | import org.junit.Test 8 | 9 | class StartRecordExerciseUseCaseTest { 10 | 11 | private val exerciseRepository = mock() 12 | 13 | private val startRecordExerciseUseCase = 14 | StartRecordExerciseUseCase(exerciseRepository) 15 | 16 | @Test 17 | fun testStartRecordExerciseUseCase() { 18 | runBlocking { 19 | startRecordExerciseUseCase.execute(Unit) 20 | verify(exerciseRepository).startRecordExercise() 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /domain/src/test/java/com/semicolon/domain/usecase/user/AutoLoginUseCaseUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.domain.usecase.user 2 | 3 | import com.nhaarman.mockitokotlin2.mock 4 | import com.nhaarman.mockitokotlin2.times 5 | import com.nhaarman.mockitokotlin2.verify 6 | import com.semicolon.domain.repository.UserRepository 7 | import kotlinx.coroutines.runBlocking 8 | import org.junit.Assert.assertEquals 9 | import org.junit.Test 10 | 11 | class AutoLoginUseCaseUnitTest { 12 | 13 | private val userRepository = mock() 14 | 15 | private val autoLoginUseCase = AutoLoginUseCase(userRepository) 16 | 17 | @Test 18 | fun testAutoLoginUseCase(){ 19 | runBlocking { 20 | val useCaseResult = autoLoginUseCase.execute(Unit) 21 | assertEquals(Unit,useCaseResult) 22 | 23 | verify(userRepository, times(1)).autoLogin() 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Dec 31 09:10:16 KST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /presentation/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /presentation/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /presentation/src/androidTest/java/com/semicolon/walkhub/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.semicolon.walkhub", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/adapter/BindingViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.adapter 2 | 3 | import androidx.databinding.ViewDataBinding 4 | import androidx.lifecycle.LifecycleOwner 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | class BindingViewHolder(val binding: ViewDataBinding): RecyclerView.ViewHolder(binding.root){ 8 | fun setLifeCycleOwner(lifecycleOwner: LifecycleOwner) { 9 | binding.lifecycleOwner = lifecycleOwner 10 | } 11 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/adapter/RecyclerViewItem.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.adapter 2 | 3 | import androidx.annotation.LayoutRes 4 | import androidx.databinding.ViewDataBinding 5 | 6 | data class RecyclerViewItem( 7 | @LayoutRes val itemLayoutId: Int, 8 | val data: Any?, 9 | val variableId: Int 10 | ) { 11 | fun bind(binding: ViewDataBinding) { 12 | binding.setVariable(variableId, data) 13 | } 14 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/bindingadapter/CircularProgressBarAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.bindingadapter 2 | 3 | import androidx.databinding.BindingAdapter 4 | import com.semicolon.walkhub.customview.CircularProgressBar 5 | 6 | @BindingAdapter("android:progress") 7 | fun setProgress(view: CircularProgressBar, progress: Float) { 8 | view.progress = progress 9 | } 10 | 11 | @BindingAdapter("android:max") 12 | fun setProgressMax(view: CircularProgressBar, progressMax: Float) { 13 | view.progressMax = progressMax 14 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/bindingadapter/ExerciseBindingAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.bindingadapter 2 | 3 | import android.widget.TextView 4 | import androidx.databinding.BindingAdapter 5 | 6 | @BindingAdapter("goal_text") 7 | fun TextView.goalText(goal: Int) { 8 | val goalText = "$goal 걸음" 9 | text = goalText 10 | } 11 | 12 | @BindingAdapter("current_text") 13 | fun TextView.currentText(current: Int) { 14 | val currentText = "현재 $current 걸음" 15 | text = currentText 16 | } 17 | 18 | @BindingAdapter("goal_is_distance", "goal_value") 19 | fun TextView.goalDistanceText(isDistance: Boolean, goal: Int) { 20 | val unit = if (isDistance) "km" else "걸음" 21 | val goalText = if (isDistance) goal / 1000 else goal 22 | val goalDistance = "/$goalText $unit" 23 | text = goalDistance 24 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/bindingadapter/ImageBindingAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.bindingadapter 2 | 3 | import android.widget.ImageView 4 | import androidx.databinding.BindingAdapter 5 | import com.bumptech.glide.Glide 6 | 7 | @BindingAdapter("image_url") 8 | fun ImageView.loadImageByImageUrl(imageUrl: String?) { 9 | Glide.with(context) 10 | .load(imageUrl) 11 | .into(this) 12 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/di/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/java/com/semicolon/walkhub/di/.gitkeep -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/di/BackgroundTaskModule.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.di 2 | 3 | import com.semicolon.data.background.task.ExerciseBackgroundTask 4 | import com.semicolon.data.background.task.ExerciseBackgroundTaskImpl 5 | import dagger.Binds 6 | import dagger.Module 7 | import dagger.hilt.InstallIn 8 | import dagger.hilt.components.SingletonComponent 9 | 10 | @Module 11 | @InstallIn(SingletonComponent::class) 12 | abstract class BackgroundTaskModule { 13 | 14 | @Binds 15 | abstract fun provideExerciseBackgroundTask( 16 | exerciseBackgroundTaskImpl: ExerciseBackgroundTaskImpl 17 | ): ExerciseBackgroundTask 18 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/extensions/GlideModule.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.extensions 2 | 3 | import com.bumptech.glide.annotation.GlideModule 4 | import com.bumptech.glide.module.AppGlideModule 5 | 6 | @GlideModule 7 | class GlideModule : AppGlideModule() -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/extensions/Lifecycle.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.extensions 2 | 3 | import androidx.lifecycle.* 4 | import kotlinx.coroutines.CoroutineScope 5 | import kotlinx.coroutines.launch 6 | 7 | fun LifecycleOwner.observe(liveData: LiveData, action: (t: T) -> Unit) { 8 | liveData.observe(this, Observer { it?.let { t -> action(t) } }) 9 | } 10 | 11 | fun LifecycleOwner.repeatOnStarted(block: suspend CoroutineScope.() -> Unit) { 12 | lifecycleScope.launch { 13 | lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED, block) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/analysis/GraphType.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.analysis 2 | 3 | enum class GraphType { 4 | WEEKLY, MONTHLY 5 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/base/ColorResource.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.base 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val gray50 = Color(0xFFFAFAFA) 6 | val gray100 = Color(0xFFF5F5F5) 7 | val gray200 = Color(0xFFEEEEEE) 8 | val gray300 = Color(0xFFE0E0E0) 9 | val gray400 = Color(0xFFBDBDBD) 10 | val gray500 = Color(0xFF9E9E9E) 11 | val gray600 = Color(0xFF757575) 12 | val gray700 = Color(0xFF616161) 13 | val gray800 = Color(0xFF424242) 14 | val gray900 = Color(0x00212121) 15 | val primary = Color(0xFF57B4F1) 16 | val red = Color(0xFFF04D51) 17 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/cheering/CheeringItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.cheering 2 | 3 | abstract class CheeringItemViewModel( 4 | val id: Int, 5 | val userName: String, 6 | val imageUrl: String? 7 | ) { 8 | abstract fun onClick() 9 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/home/model/HomeData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.home.model 2 | 3 | data class HomeData( 4 | val stepCount: Int, 5 | val exerciseTimeAsMilli: Long, 6 | val traveledDistanceAsMeter: Int, 7 | val burnedKilocalories: Float 8 | ) 9 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/home/model/RankData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.home.model 2 | 3 | data class RankData( 4 | val name: String?, 5 | val logoImageUrl: String?, 6 | val walkCount: Int? 7 | ) 8 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/adapter/HubViewPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.adapter 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentActivity 5 | import androidx.viewpager2.adapter.FragmentStateAdapter 6 | import com.semicolon.walkhub.ui.hub.ui.HubInfoFragment 7 | import com.semicolon.walkhub.ui.hub.ui.HubRankFragment 8 | 9 | class HubViewPagerAdapter( 10 | fragmentActivity: FragmentActivity 11 | ) : FragmentStateAdapter(fragmentActivity) { 12 | 13 | private val fragmentList = listOf(HubRankFragment(), HubInfoFragment()) 14 | 15 | override fun getItemCount(): Int { 16 | return fragmentList.size 17 | } 18 | 19 | override fun createFragment(position: Int): Fragment = 20 | fragmentList[position] 21 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/HubInfoNoticeRvData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | import com.semicolon.domain.entity.notice.NoticeEntity 4 | 5 | data class HubInfoNoticeRvData( 6 | val title: String, 7 | val date: String 8 | ) 9 | 10 | fun NoticeEntity.NoticeValueEntity.toRvData() = 11 | HubInfoNoticeRvData( 12 | title = content, 13 | date = createdAt.toString() 14 | ) -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/HubSchoolRankData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | data class HubSchoolRankData( 4 | val schoolList: List 5 | ) { 6 | data class OtherSchool( 7 | val schoolId: Int, 8 | val schoolName: String, 9 | val ranking: Int, 10 | val logoImageUrl: String?, 11 | val walkCount: Int, 12 | val userCount: Int 13 | ) 14 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/MySchoolRankData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | data class MySchoolRankData( 4 | val schoolId: Int, 5 | val name: String?, 6 | val logoImageUrl: String, 7 | val grade: Int?, 8 | val classNum: Int? 9 | ) 10 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/SchoolUserRankData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | import com.semicolon.domain.entity.rank.UserRankEntity 4 | 5 | data class SchoolUserRankData( 6 | val rankList: List 7 | ) { 8 | 9 | data class UserRank( 10 | val userId: Int, 11 | val name: String, 12 | val ranking: Int, 13 | val profileImageUrl: String?, 14 | val walkCount: Int 15 | ) 16 | } 17 | 18 | fun UserRankEntity.UserRank.toData() = 19 | SchoolUserRankData.UserRank( 20 | userId = userId, 21 | name = name, 22 | ranking = ranking, 23 | profileImageUrl = profileImageUrl, 24 | walkCount = walkCount 25 | ) 26 | 27 | fun UserRankEntity.toData() = 28 | SchoolUserRankData( 29 | rankList.map { it.toData() } 30 | ) -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/SearchSchoolData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | data class SearchSchoolData( 4 | val schoolList: List 5 | ) { 6 | data class SchoolInfo( 7 | val schoolId: Int, 8 | val schoolName: String, 9 | val ranking: Int, 10 | val logoImageUrl: String?, 11 | val walkCount: Int 12 | ) 13 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/hub/model/SearchUserData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.hub.model 2 | 3 | data class SearchUserData( 4 | val userList: List 5 | ) { 6 | data class UserInfo( 7 | val profileUrl: String?, 8 | val name: String, 9 | val walkCount: Int, 10 | val rank: Int 11 | ) 12 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/notification/model/NotificationData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.notification.model 2 | 3 | import com.semicolon.domain.enums.NotificationReturnType 4 | 5 | data class NotificationData( 6 | val notificationValue: List? 7 | ) { 8 | data class NotificationValue( 9 | val notificationId: Int, 10 | val title: String, 11 | val content: String, 12 | val type: NotificationReturnType, 13 | val data: String, 14 | val createAt: String, 15 | val isRead: Boolean, 16 | val writer: Writer 17 | ) { 18 | data class Writer( 19 | val writerId: Int, 20 | val writerName: String, 21 | val writerImage: String 22 | ) 23 | } 24 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/profile/model/MyPageData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.profile.model 2 | 3 | data class MyPageData( 4 | val userId: Int, 5 | val name: String, 6 | val profileImageUrl: String?, 7 | val schoolName: String, 8 | val schoolImageUrl: String, 9 | val grade: Int, 10 | val schoolId: Long, 11 | val classNum: Int, 12 | val dailyWalkCountGoal: Int, 13 | val titleBadge: TitleBadge, 14 | val level: Level 15 | ) { 16 | data class TitleBadge( 17 | val badgeId: Int, 18 | val badgeName: String, 19 | val badgeImageUrl: String 20 | ) 21 | 22 | data class Level( 23 | val levelId: Int, 24 | val levelName: String, 25 | val levelImageUrl: String 26 | ) 27 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/profile/setting/ui/model/ThirdSearchSchoolData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.profile.setting.ui.model 2 | 3 | data class ThirdSearchSchoolData( 4 | val schoolList: List 5 | ) { 6 | data class SchoolInfo( 7 | val schoolId: Long, 8 | val logoImageUrl: String, 9 | val schoolName: String 10 | ) 11 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/register/model/SecondSearchSchoolData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.register.model 2 | 3 | data class SecondSearchSchoolData( 4 | val schoolList: List 5 | ) { 6 | data class SchoolInfo( 7 | val schoolId: Long, 8 | val logoImageUrl: String, 9 | val schoolName: String 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/register/ui/PrivacyActivity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.register.ui 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import com.semicolon.walkhub.R 6 | import com.semicolon.walkhub.ui.base.BaseActivity 7 | 8 | class PrivacyActivity : AppCompatActivity() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | setContentView(R.layout.activity_privacy) 12 | } 13 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/register/ui/ServiceInstructionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.register.ui 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import com.semicolon.walkhub.R 6 | 7 | class ServiceInstructionActivity : AppCompatActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | setContentView(R.layout.activity_serviceinstruction) 12 | } 13 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/ui/splash/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.ui.splash 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import dagger.hilt.android.AndroidEntryPoint 7 | 8 | @AndroidEntryPoint 9 | class SplashActivity : ComponentActivity() { 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | setContent { 13 | Splash() 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/util/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/java/com/semicolon/walkhub/util/.gitkeep -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/util/HubIntentKey.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.util 2 | 3 | enum class HubIntentKey(val key: String, val default: Any) { 4 | SCHOOL_ID(key = "school_id", default = 0), 5 | SCHOOL_TYPE(key = "school_type", default = true), 6 | SCHOOL_NAME(key = "school_name", default = "NO DATA"), 7 | SCHOOL_DATE_TYPE(key = "school_date_type", default = "WEEK") 8 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/util/UriParser.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.util 2 | 3 | import android.content.Context 4 | import android.database.Cursor 5 | import android.net.Uri 6 | import android.provider.MediaStore 7 | import androidx.loader.content.CursorLoader 8 | 9 | fun Uri.toRealPath(context: Context): String { 10 | println("aaa $this") 11 | println("aaa $context") 12 | val proj = arrayOf(MediaStore.Images.Media.DATA) 13 | val loader = CursorLoader(context, this, proj, null, null, null) 14 | val cursor: Cursor = loader.loadInBackground()!! 15 | 16 | val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) 17 | cursor.moveToFirst() 18 | 19 | val result = cursor.getString(columnIndex) 20 | 21 | cursor.close() 22 | 23 | return result 24 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/viewmodel/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/java/com/semicolon/walkhub/viewmodel/.gitkeep -------------------------------------------------------------------------------- /presentation/src/main/java/com/semicolon/walkhub/viewmodel/challenge/model/TodayWalkData.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub.viewmodel.challenge.model 2 | 3 | data class TodayWalkData( 4 | val stepCount: Int, 5 | val traveledDistanceAsMeter: Int, 6 | ) -------------------------------------------------------------------------------- /presentation/src/main/res/color/selector_bnv_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/bg_hub_edit_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/bg_hub_my_school.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/checkoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/checkoff.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/checkon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/checkon.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/delete.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-hdpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-hdpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/buttondesign.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/cardviewdesign.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/custom_checkbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/edittextdesign.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-ldpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-ldpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-ldpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-ldpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/mainbuttondesign.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/notificationbutton.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-ldpi/photo.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/register_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/registerbuttondesign.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-ldpi/servicebutton.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/ic_hub_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-mdpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-mdpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-mdpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-mdpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-mdpi/pricture_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-mdpi/pricture_back.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-v24/bg_primary_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xhdpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xhdpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xhdpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xhdpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xhdpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xhdpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xhdpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xhdpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/background_home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/background_home.jpg -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxhdpi/logo_ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxhdpi/logo_ok.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxxhdpi/ic_nav_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxxhdpi/ic_nav_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxxhdpi/ic_nav_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxxhdpi/ic_nav_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxxhdpi/ic_nav_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxxhdpi/ic_nav_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-xxxhdpi/ic_nav_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable-xxxhdpi/ic_nav_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bg_measure_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bg_primary_button_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bg_selector_tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bg_sign_up_class_et.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/camera.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/dialog_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/dot_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/dot_gray.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/girl_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_arrow_back_white.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_back_arrow.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_calories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_calories.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_challenge.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_clock.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_conquer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_conquer.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_distance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_distance.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_home.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_hub.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_join_background.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_measure_arrow.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_measuring_finish.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_measuring_pause.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_play_measure.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/ic_setting.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_spinner_down.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_tab_indicator_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_tab_indicator_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/img_cheering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/img_cheering.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/modify_health_edit_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/modify_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/oval_number.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/pen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/pen.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/drawable/profile.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/progress_horizontal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/tv_register_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_black.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_bold.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_light.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_medium.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_regular.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/font/noto_sans_kr_thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/font/noto_sans_kr_thin.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/layout/item_hub_main_spinner.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /presentation/src/main/res/menu/bottom_nav_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /presentation/src/main/res/menu/menu_hub_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Walkhub/walkhub_android/5070c2c33365f2db6f57975078e1ecd7594f66fa/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /presentation/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 지난주 5 | 지난달 6 | 7 | -------------------------------------------------------------------------------- /presentation/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /presentation/src/test/java/com/semicolon/walkhub/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.semicolon.walkhub 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "Walkhub" 2 | include(":presentation", ":domain", ":data") 3 | --------------------------------------------------------------------------------