├── .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 |
--------------------------------------------------------------------------------
/presentation/src/main/res/menu/menu_hub_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------