├── .gitignore ├── .idea ├── .gitignore ├── .name ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── deploymentTargetDropDown.xml ├── gradle.xml ├── jarRepositories.xml ├── kotlinc.xml ├── misc.xml └── vcs.xml ├── README.md ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts ├── build │ ├── classes │ │ └── kotlin │ │ │ └── main │ │ │ ├── Dependency$CircleImageView.class │ │ │ ├── Dependency$Coroutine.class │ │ │ ├── Dependency$DI.class │ │ │ ├── Dependency$FireBase.class │ │ │ ├── Dependency$Glide.class │ │ │ ├── Dependency$GradlePlugin.class │ │ │ ├── Dependency$Lifecycle.class │ │ │ ├── Dependency$LocalStorage.class │ │ │ ├── Dependency$Moshi.class │ │ │ ├── Dependency$Navigation.class │ │ │ ├── Dependency$Network.class │ │ │ ├── Dependency$Permission.class │ │ │ ├── Dependency$Socket.class │ │ │ ├── Dependency$TedImagePicker.class │ │ │ ├── Dependency$Test.class │ │ │ ├── Dependency$ThreeTenAndroidBackport.class │ │ │ ├── Dependency$UI.class │ │ │ ├── Dependency$WorkManager.class │ │ │ ├── Dependency.class │ │ │ ├── META-INF │ │ │ └── buildSrc.kotlin_module │ │ │ ├── Project.class │ │ │ └── Version.class │ ├── kotlin │ │ ├── buildSrcjar-classes.txt │ │ └── compileKotlin │ │ │ ├── build-history.bin │ │ │ ├── caches-jvm │ │ │ ├── inputs │ │ │ │ ├── source-to-output.tab │ │ │ │ ├── source-to-output.tab.keystream │ │ │ │ ├── source-to-output.tab.keystream.len │ │ │ │ ├── source-to-output.tab.len │ │ │ │ ├── source-to-output.tab.values.at │ │ │ │ ├── source-to-output.tab_i │ │ │ │ └── source-to-output.tab_i.len │ │ │ ├── jvm │ │ │ │ └── kotlin │ │ │ │ │ ├── class-attributes.tab │ │ │ │ │ ├── class-attributes.tab.keystream │ │ │ │ │ ├── class-attributes.tab.keystream.len │ │ │ │ │ ├── class-attributes.tab.len │ │ │ │ │ ├── class-attributes.tab.values.at │ │ │ │ │ ├── class-attributes.tab_i │ │ │ │ │ ├── class-attributes.tab_i.len │ │ │ │ │ ├── class-fq-name-to-source.tab │ │ │ │ │ ├── class-fq-name-to-source.tab.keystream │ │ │ │ │ ├── class-fq-name-to-source.tab.keystream.len │ │ │ │ │ ├── class-fq-name-to-source.tab.len │ │ │ │ │ ├── class-fq-name-to-source.tab.values.at │ │ │ │ │ ├── class-fq-name-to-source.tab_i │ │ │ │ │ ├── class-fq-name-to-source.tab_i.len │ │ │ │ │ ├── constants.tab │ │ │ │ │ ├── constants.tab.keystream │ │ │ │ │ ├── constants.tab.keystream.len │ │ │ │ │ ├── constants.tab.len │ │ │ │ │ ├── constants.tab.values.at │ │ │ │ │ ├── constants.tab_i │ │ │ │ │ ├── constants.tab_i.len │ │ │ │ │ ├── internal-name-to-source.tab │ │ │ │ │ ├── internal-name-to-source.tab.keystream │ │ │ │ │ ├── internal-name-to-source.tab.keystream.len │ │ │ │ │ ├── internal-name-to-source.tab.len │ │ │ │ │ ├── internal-name-to-source.tab.values.at │ │ │ │ │ ├── internal-name-to-source.tab_i │ │ │ │ │ ├── internal-name-to-source.tab_i.len │ │ │ │ │ ├── proto.tab │ │ │ │ │ ├── proto.tab.keystream │ │ │ │ │ ├── proto.tab.keystream.len │ │ │ │ │ ├── proto.tab.len │ │ │ │ │ ├── proto.tab.values.at │ │ │ │ │ ├── proto.tab_i │ │ │ │ │ ├── proto.tab_i.len │ │ │ │ │ ├── source-to-classes.tab │ │ │ │ │ ├── source-to-classes.tab.keystream │ │ │ │ │ ├── source-to-classes.tab.keystream.len │ │ │ │ │ ├── source-to-classes.tab.len │ │ │ │ │ ├── source-to-classes.tab.values.at │ │ │ │ │ ├── source-to-classes.tab_i │ │ │ │ │ └── source-to-classes.tab_i.len │ │ │ └── lookups │ │ │ │ ├── counters.tab │ │ │ │ ├── file-to-id.tab │ │ │ │ ├── file-to-id.tab.keystream │ │ │ │ ├── file-to-id.tab.keystream.len │ │ │ │ ├── file-to-id.tab.len │ │ │ │ ├── file-to-id.tab.values.at │ │ │ │ ├── file-to-id.tab_i │ │ │ │ ├── file-to-id.tab_i.len │ │ │ │ ├── id-to-file.tab │ │ │ │ ├── id-to-file.tab.keystream │ │ │ │ ├── id-to-file.tab.keystream.len │ │ │ │ ├── id-to-file.tab.len │ │ │ │ ├── id-to-file.tab.values.at │ │ │ │ ├── id-to-file.tab_i │ │ │ │ ├── id-to-file.tab_i.len │ │ │ │ ├── lookups.tab │ │ │ │ ├── lookups.tab.keystream │ │ │ │ ├── lookups.tab.keystream.len │ │ │ │ ├── lookups.tab.len │ │ │ │ ├── lookups.tab.values.at │ │ │ │ ├── lookups.tab_i │ │ │ │ └── lookups.tab_i.len │ │ │ └── last-build.bin │ ├── libs │ │ └── buildSrc.jar │ ├── pluginUnderTestMetadata │ │ └── plugin-under-test-metadata.properties │ ├── reports │ │ └── plugin-development │ │ │ └── validation-report.txt │ ├── source-roots │ │ └── buildSrc │ │ │ └── source-roots.txt │ └── tmp │ │ └── jar │ │ └── MANIFEST.MF └── src │ └── main │ └── kotlin │ ├── Dependency.kt │ ├── Project.kt │ └── Version.kt ├── data ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── yongjincompany │ └── data │ ├── interceptor │ └── AuthorizationInterceptor.kt │ ├── local │ ├── converter │ │ └── TypeConverter.kt │ ├── dao │ │ ├── CardDao.kt │ │ └── UserDao.kt │ ├── database │ │ └── DSMTCGDataBase.kt │ ├── datasource │ │ ├── LocalCardDataSource.kt │ │ ├── LocalCardDataSourceImpl.kt │ │ ├── LocalUserDataSource.kt │ │ └── LocalUserDataSourceImpl.kt │ ├── entity │ │ ├── card │ │ │ └── FetchMyCardRoomEntity.kt │ │ └── user │ │ │ └── FetchMyInfoRoomEntity.kt │ └── storage │ │ ├── AuthDataStorage.kt │ │ └── AuthDataStorageImpl.kt │ ├── remote │ ├── api │ │ ├── CardApi.kt │ │ ├── ChestApi.kt │ │ ├── ImagesApi.kt │ │ ├── RankApi.kt │ │ ├── RoomApi.kt │ │ └── UserApi.kt │ ├── datasource │ │ ├── RemoteCardDataSource.kt │ │ ├── RemoteCardDataSourceImpl.kt │ │ ├── RemoteChestDataSource.kt │ │ ├── RemoteChestDataSourceImpl.kt │ │ ├── RemoteImagesDataSource.kt │ │ ├── RemoteImagesDataSourceImpl.kt │ │ ├── RemoteRankDataSource.kt │ │ ├── RemoteRankDataSourceImpl.kt │ │ ├── RemoteRoomDataSource.kt │ │ ├── RemoteRoomDataSourceImpl.kt │ │ ├── RemoteSocketDataSource.kt │ │ ├── RemoteSocketDataSourceImpl.kt │ │ ├── RemoteUserDataSource.kt │ │ └── RemoteUserDataSourceImpl.kt │ ├── request │ │ ├── chest │ │ │ ├── GoldChestOpenRequest.kt │ │ │ ├── LegendChestOpenRequest.kt │ │ │ └── SilverChestOpenRequest.kt │ │ └── users │ │ │ ├── ChangePasswordRequest.kt │ │ │ ├── UpdateMyInfoRequest.kt │ │ │ ├── UserRegisterRequest.kt │ │ │ └── UserSignInRequest.kt │ └── response │ │ ├── cards │ │ └── FetchMyCardResponse.kt │ │ ├── chests │ │ ├── FreeChestOpenResponse.kt │ │ ├── FreeChestOpenTimeResponse.kt │ │ ├── GoldChestOpenResponse.kt │ │ ├── LegendChestOpenResponse.kt │ │ ├── SilverChestOpenResponse.kt │ │ ├── SpecialChestOpenResponse.kt │ │ └── SpecialChestOpenTimeResponse.kt │ │ ├── image │ │ └── ImageResponse.kt │ │ ├── ranks │ │ └── FetchRankResponse.kt │ │ ├── rooms │ │ └── FetchRoomResponse.kt │ │ └── users │ │ ├── FetchMyInfoResponse.kt │ │ ├── UserRegisterResponse.kt │ │ └── UserSignInResponse.kt │ ├── repository │ ├── CardRepositoryImpl.kt │ ├── ChestRepositoryImpl.kt │ ├── RankRepositoryImpl.kt │ ├── RoomRepositoryImpl.kt │ └── UserRepositoryImpl.kt │ └── util │ ├── HttpHandler.kt │ ├── LocalDateTimeParser.kt │ ├── OfflineCacheUtil.kt │ └── UtilFunc.kt ├── domain ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── yongjincompany │ └── domain │ ├── entity │ ├── cards │ │ └── FetchMyCardEntity.kt │ ├── chests │ │ ├── FetchFreeChestTimeEntity.kt │ │ ├── FetchSpecialChestTimeEntity.kt │ │ ├── FreeChestOpenEntity.kt │ │ ├── GoldChestOpenEntity.kt │ │ ├── LegendChestOpenEntity.kt │ │ ├── SilverChestOpenEntity.kt │ │ └── SpecialChestOpenEntity.kt │ ├── ranks │ │ └── FetchRankEntity.kt │ ├── rooms │ │ └── FetchRoomEntity.kt │ └── users │ │ └── FetchMyInfoEntity.kt │ ├── exception │ ├── Basic.kt │ ├── File.kt │ └── User.kt │ ├── param │ ├── chest │ │ ├── GoldChestOpenParam.kt │ │ ├── LegendChestOpenParam.kt │ │ └── SilverChestOpenParam.kt │ └── user │ │ ├── PostUserRegisterParam.kt │ │ ├── PostUserSignInParam.kt │ │ ├── UpdateMyInfoParam.kt │ │ └── changePasswordParam.kt │ ├── repository │ ├── CardRepository.kt │ ├── ChestRepository.kt │ ├── RankRepository.kt │ ├── RoomRepository.kt │ └── UserRepository.kt │ └── usecase │ ├── UseCase.kt │ ├── card │ └── FetchMyCardUseCase.kt │ ├── chest │ ├── FetchFreeChestTimeUseCase.kt │ ├── FetchSpecialChestTimeUseCase.kt │ ├── OpenFreeChestUseCase.kt │ ├── OpenGoldChestUseCase.kt │ ├── OpenLegendChestUseCase.kt │ ├── OpenSilverChestUseCase.kt │ └── OpenSpecialChestUseCase.kt │ ├── rank │ └── FetchAllRankUseCase.kt │ ├── room │ └── FetchRoomsUseCase.kt │ └── user │ ├── AutoLoginUseCase.kt │ ├── ChangePasswordUseCase.kt │ ├── DeleteAccountUseCase.kt │ ├── FetchMyInfoUseCase.kt │ ├── LogOutUseCase.kt │ ├── PostUserRegisterUseCase.kt │ ├── PostUserSignInUseCase.kt │ └── UpdateMyInfoUseCase.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 │ │ └── yongjincompany │ │ └── dsmtcg │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ └── com │ │ │ └── yongjincompany │ │ │ └── dsmtcg │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ └── BaseFragment.kt │ │ │ ├── di │ │ │ ├── DSMTCGApplication.kt │ │ │ ├── LocalDataSourceModule.kt │ │ │ ├── NetWorkModule.kt │ │ │ ├── RemoteDataSourceModule.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── RoomModule.kt │ │ │ └── StorageModule.kt │ │ │ ├── extensions │ │ │ ├── Lifecycle.kt │ │ │ └── View.kt │ │ │ ├── ui │ │ │ ├── MainActivity.kt │ │ │ ├── StartActivity.kt │ │ │ ├── TradeFragment.kt │ │ │ ├── chest │ │ │ │ ├── FreeChestActivity.kt │ │ │ │ ├── SpecialChestActivity.kt │ │ │ │ └── adapter │ │ │ │ │ ├── FreeChestCardAdapter.kt │ │ │ │ │ └── SpecialChestCardAdapter.kt │ │ │ ├── home │ │ │ │ ├── HomeFragment.kt │ │ │ │ ├── profile │ │ │ │ │ └── MyPageActivity.kt │ │ │ │ └── setting │ │ │ │ │ ├── InfoActivity.kt │ │ │ │ │ └── SettingActivity.kt │ │ │ ├── login │ │ │ │ └── LoginActivity.kt │ │ │ ├── mycard │ │ │ │ ├── CardDetailActivity.kt │ │ │ │ ├── MyCardFragment.kt │ │ │ │ └── adapter │ │ │ │ │ └── MyCardAdapter.kt │ │ │ ├── rank │ │ │ │ ├── RankActivity.kt │ │ │ │ └── adapter │ │ │ │ │ └── RankAdapter.kt │ │ │ ├── register │ │ │ │ └── RegisterActivity.kt │ │ │ ├── shop │ │ │ │ ├── ShopFragment.kt │ │ │ │ └── cardpack │ │ │ │ │ ├── GoldChestActivity.kt │ │ │ │ │ ├── LegendChestActivity.kt │ │ │ │ │ ├── SilverChestActivity.kt │ │ │ │ │ └── adapter │ │ │ │ │ ├── GoldChestCardAdapter.kt │ │ │ │ │ ├── LegendChestCardAdapter.kt │ │ │ │ │ └── SilverChestCardAdapter.kt │ │ │ └── splash │ │ │ │ ├── Splash.kt │ │ │ │ └── SplashActivity.kt │ │ │ ├── util │ │ │ ├── BindingViewHolder.kt │ │ │ ├── DSMTCGExceptionHandler.kt │ │ │ ├── EventFlow.kt │ │ │ ├── RecyclerViewAdapter.kt │ │ │ └── RecyclerViewItem.kt │ │ │ └── viewmodel │ │ │ ├── chest │ │ │ ├── FreeChestViewModel.kt │ │ │ ├── GoldChestViewModel.kt │ │ │ ├── LegendChestViewModel.kt │ │ │ ├── SilverChestViewModel.kt │ │ │ └── SpecialChestViewModel.kt │ │ │ ├── home │ │ │ └── HomeViewModel.kt │ │ │ ├── login │ │ │ └── LoginViewModel.kt │ │ │ ├── mycard │ │ │ └── MyCardViewModel.kt │ │ │ ├── rank │ │ │ └── RankViewModel.kt │ │ │ ├── register │ │ │ └── RegisterViewModel.kt │ │ │ ├── room │ │ │ └── RoomViewModel.kt │ │ │ ├── setting │ │ │ └── LogOutViewModel.kt │ │ │ └── splash │ │ │ └── SplashViewModel.kt │ └── res │ │ ├── color │ │ └── selector_bnv_menu.xml │ │ ├── drawable-v24 │ │ ├── dsm_logo.png │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── all_back.jpg │ │ ├── arena.png │ │ ├── bamboo.png │ │ ├── bamboo_background.xml │ │ ├── card_background.xml │ │ ├── chest_back.gif │ │ ├── circle_btn.xml │ │ ├── ddong_card.png │ │ ├── editext_back.xml │ │ ├── free_card_pack.png │ │ ├── free_chest.png │ │ ├── gradient_animation.xml │ │ ├── gradient_center.xml │ │ ├── gradient_end.xml │ │ ├── gradient_start.xml │ │ ├── ic_card.xml │ │ ├── ic_exit.png │ │ ├── ic_home.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_round.xml │ │ ├── ic_setting.xml │ │ ├── ic_tournament.png │ │ ├── img.png │ │ ├── jinsung.png │ │ ├── label.png │ │ ├── leagend_card.png │ │ ├── logo.png │ │ ├── logo2.png │ │ ├── logo_round.png │ │ ├── menu_background.xml │ │ ├── my_card_back.xml │ │ ├── next_card_back.xml │ │ ├── person.png │ │ ├── rank_cup.png │ │ ├── register_btn.xml │ │ ├── rose_card.png │ │ ├── shopkeeper.png │ │ ├── special_card_pack.png │ │ ├── special_chest.png │ │ └── trade_background.xml │ │ ├── font │ │ └── nanumsquare_aceb.ttf │ │ ├── layout │ │ ├── activity_card_detail.xml │ │ ├── activity_free_chest.xml │ │ ├── activity_gold_chest.xml │ │ ├── activity_info.xml │ │ ├── activity_legend_chest.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_my_page.xml │ │ ├── activity_rank.xml │ │ ├── activity_register.xml │ │ ├── activity_room.xml │ │ ├── activity_setting.xml │ │ ├── activity_silver_chest.xml │ │ ├── activity_special_chest.xml │ │ ├── activity_start.xml │ │ ├── fragment_home.xml │ │ ├── fragment_my_card.xml │ │ ├── fragment_shop.xml │ │ ├── fragment_trade.xml │ │ ├── item_chest.xml │ │ ├── item_my_card.xml │ │ ├── item_rank.xml │ │ └── item_room.xml │ │ ├── menu │ │ └── bottom_nav_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_main.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_main.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_main.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_main.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_main.png │ │ ├── navigation │ │ └── mobile_navigation.xml │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── yongjincompany │ └── dsmtcg │ └── ExampleUnitTest.kt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | DSMTCG -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DSM-TCG-Android 2 | 3 | ## 상세 설명 4 | 대덕소마고 학생들 ip를 이용하여 제작하는 TCG(TradingCardGame)입니다. 5 | 우리 학교의 숨은 영웅들을 수집하는 재미를 느껴보세요! 6 |
7 | 8 | ![Slide 4_3 - 1](https://user-images.githubusercontent.com/90879448/183261397-4848af0c-96ef-4f93-a338-dd79bed0c0d8.png) 9 | -------------------------------------------------------------------------------- /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 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20") 13 | } 14 | } 15 | 16 | task("clean", Delete::class) { 17 | delete(rootProject.buildDir) 18 | } -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | } 4 | 5 | repositories { 6 | gradlePluginPortal() 7 | } -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$CircleImageView.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$CircleImageView.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Coroutine.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Coroutine.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$DI.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$DI.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$FireBase.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$FireBase.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Glide.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Glide.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$GradlePlugin.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$GradlePlugin.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Lifecycle.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Lifecycle.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$LocalStorage.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$LocalStorage.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Moshi.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Moshi.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Navigation.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Navigation.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Network.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Network.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Permission.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Permission.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Socket.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Socket.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$TedImagePicker.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$TedImagePicker.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$Test.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$Test.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$ThreeTenAndroidBackport.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$ThreeTenAndroidBackport.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$UI.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$UI.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency$WorkManager.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency$WorkManager.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Dependency.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Dependency.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/META-INF/buildSrc.kotlin_module: -------------------------------------------------------------------------------- 1 | "* -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Project.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Project.class -------------------------------------------------------------------------------- /buildSrc/build/classes/kotlin/main/Version.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/classes/kotlin/main/Version.class -------------------------------------------------------------------------------- /buildSrc/build/kotlin/buildSrcjar-classes.txt: -------------------------------------------------------------------------------- 1 | C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$CircleImageView.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Coroutine.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$DI.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$FireBase.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Glide.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$GradlePlugin.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Lifecycle.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$LocalStorage.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Moshi.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Navigation.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Network.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Permission.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Socket.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$TedImagePicker.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$Test.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$ThreeTenAndroidBackport.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$UI.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency$WorkManager.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Dependency.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Project.class;C:\Users\leesin\Desktop\project\DSM-TCG-Android\buildSrc\build\classes\kotlin\main\Version.class -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/build-history.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/build-history.bin -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab.len: -------------------------------------------------------------------------------- 1 | ( -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-attributes.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len: -------------------------------------------------------------------------------- 1 | ( -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt)($PROJECT_DIR$\src\main\kotlin\Version.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len: -------------------------------------------------------------------------------- 1 | ( -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len: -------------------------------------------------------------------------------- 1 | ( -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt)($PROJECT_DIR$\src\main\kotlin\Version.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len: -------------------------------------------------------------------------------- 1 | 0 -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len: -------------------------------------------------------------------------------- 1 | ~ -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab: -------------------------------------------------------------------------------- 1 | 4 2 | 1 -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len: -------------------------------------------------------------------------------- 1 | ~ -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage,+$PROJECT_DIR$\src\main\kotlin\Dependency.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt)($PROJECT_DIR$\src\main\kotlin\Version.kt)($PROJECT_DIR$\src\main\kotlin\Project.kt -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len: -------------------------------------------------------------------------------- 1 | � -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len: -------------------------------------------------------------------------------- 1 | H -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at: -------------------------------------------------------------------------------- 1 | /Header Record For PersistentHashMapValueStorage -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab_i.len -------------------------------------------------------------------------------- /buildSrc/build/kotlin/compileKotlin/last-build.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/kotlin/compileKotlin/last-build.bin -------------------------------------------------------------------------------- /buildSrc/build/libs/buildSrc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/libs/buildSrc.jar -------------------------------------------------------------------------------- /buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties: -------------------------------------------------------------------------------- 1 | implementation-classpath=C\:/Users/leesin/Desktop/project/DSM-TCG-Android/buildSrc/build/classes/java/main;C\:/Users/leesin/Desktop/project/DSM-TCG-Android/buildSrc/build/classes/groovy/main;C\:/Users/leesin/Desktop/project/DSM-TCG-Android/buildSrc/build/classes/kotlin/main;C\:/Users/leesin/Desktop/project/DSM-TCG-Android/buildSrc/build/resources/main 2 | -------------------------------------------------------------------------------- /buildSrc/build/reports/plugin-development/validation-report.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/buildSrc/build/reports/plugin-development/validation-report.txt -------------------------------------------------------------------------------- /buildSrc/build/source-roots/buildSrc/source-roots.txt: -------------------------------------------------------------------------------- 1 | src\main\resources 2 | src\main\java 3 | src\main\groovy 4 | src\main\kotlin 5 | src\test\resources 6 | src\test\java 7 | src\test\groovy 8 | src\test\kotlin 9 | -------------------------------------------------------------------------------- /buildSrc/build/tmp/jar/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /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_11 8 | } -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/Version.kt: -------------------------------------------------------------------------------- 1 | object Version { 2 | const val gradle = "7.0.4" 3 | const val kotlin = "1.6.10" 4 | const val coroutine = "1.6.0" 5 | const val junit = "4.13.2" 6 | const val mockito = "4.2.0" 7 | const val androidJunit = "1.1.3" 8 | const val espresso = "3.4.0" 9 | const val coreKtx = "1.7.0" 10 | const val appcompat = "1.4.0" 11 | const val material = "1.4.0" 12 | const val constraintLayout = "2.1.2" 13 | const val hilt = "2.38.1" 14 | const val retrofit = "2.9.0" 15 | const val okhttp = "3.14.9" 16 | const val room = "2.4.0" 17 | const val lifecycle = "2.4.0" 18 | const val androidKtx = "1.4.0" 19 | const val fragmentKtx = "1.4.0" 20 | const val threeTenAbp = "1.3.1" 21 | const val moshi = "1.12.0" 22 | const val navigation = "2.3.5" 23 | const val workManager = "2.7.1" 24 | const val workManagerHiltExtension = "1.0.0" 25 | const val sharedPreference = "1.1.1" 26 | const val mockitoKotlin = "2.2.0" 27 | const val mockitoInline = "2.21.0" 28 | const val fcm = "20.1.0" 29 | const val service = "4.3.10" 30 | const val message = "23.0.0" 31 | const val tedPermission = "3.3.0" 32 | const val jetpackCompose = "1.1.0" 33 | const val activityCompose = "1.4.0" 34 | const val coilCompose = "1.4.0" 35 | const val hiltCompose = "1.0.0" 36 | const val moshiKotlin = "1.8.0" 37 | const val circleImage = "3.1.0" 38 | const val glide = "4.13.0" 39 | const val pinEntryEditText = "2.0.6" 40 | const val socket = "1.0.0" 41 | const val tedImagePicker = "1.2.7" 42 | } -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | kotlin("android") 4 | kotlin("kapt") 5 | } 6 | 7 | android { 8 | compileSdk = Project.compileSdk 9 | 10 | defaultConfig { 11 | minSdk = Project.minSdk 12 | targetSdk = Project.targetSdk 13 | consumerProguardFiles("consumer-rules.pro") 14 | } 15 | 16 | buildTypes { 17 | getByName("release") { 18 | isMinifyEnabled = false 19 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") 20 | } 21 | } 22 | compileOptions { 23 | sourceCompatibility = Project.javaVersion 24 | targetCompatibility = Project.javaVersion 25 | } 26 | kotlinOptions { 27 | jvmTarget = "11" 28 | } 29 | } 30 | 31 | dependencies { 32 | implementation(project(":domain")) 33 | 34 | implementation(Dependency.Moshi.moshi) 35 | kapt(Dependency.Moshi.moshiCompiler) 36 | 37 | testImplementation(Dependency.Test.junit) 38 | testImplementation(Dependency.Test.mockito) 39 | androidTestImplementation(Dependency.Test.androidJunit) 40 | testImplementation(Dependency.Test.mockitoKotlin) 41 | testImplementation(Dependency.Test.mockitoInline) 42 | testImplementation(Dependency.Test.threeTenAbp) 43 | 44 | implementation(Dependency.Network.retrofit) 45 | implementation(Dependency.Network.gsonConverter) 46 | implementation(Dependency.Network.okhttp) 47 | 48 | implementation(Dependency.LocalStorage.room) 49 | kapt(Dependency.LocalStorage.roomCompiler) 50 | 51 | implementation(Dependency.Coroutine.core) 52 | 53 | implementation(Dependency.DI.inject) 54 | 55 | implementation(Dependency.DI.hiltAndroid) 56 | kapt(Dependency.DI.hiltCompiler) 57 | 58 | implementation(Dependency.ThreeTenAndroidBackport.threeTenAbp) 59 | 60 | implementation(Dependency.WorkManager.ktx) 61 | implementation(Dependency.WorkManager.hiltExtension) 62 | 63 | implementation(Dependency.LocalStorage.sharedPreference) 64 | 65 | implementation(Dependency.FireBase.message) 66 | 67 | implementation(Dependency.Socket.socketIo){ 68 | exclude (group = "org.json", module = "json") 69 | } 70 | } -------------------------------------------------------------------------------- /data/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/converter/TypeConverter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.converter 2 | 3 | import androidx.room.ProvidedTypeConverter 4 | import androidx.room.TypeConverter 5 | import com.squareup.moshi.JsonAdapter 6 | import com.squareup.moshi.Moshi 7 | import com.squareup.moshi.Types 8 | import com.yongjincompany.data.local.entity.card.FetchMyCardRoomEntity 9 | 10 | @ProvidedTypeConverter 11 | class CardListTypeConverter( 12 | private val moshi: Moshi 13 | ) { 14 | 15 | @TypeConverter 16 | fun fromString(value: String): List? { 17 | val listType = Types.newParameterizedType( 18 | List::class.java, 19 | FetchMyCardRoomEntity.Card::class.java 20 | ) 21 | val adapter: JsonAdapter> = 22 | moshi.adapter(listType) 23 | return adapter.fromJson(value) 24 | } 25 | 26 | @TypeConverter 27 | fun fromList(type: List): String { 28 | val listType = Types.newParameterizedType( 29 | List::class.java, 30 | FetchMyCardRoomEntity.Card::class.java 31 | ) 32 | val adapter: JsonAdapter> = 33 | moshi.adapter(listType) 34 | return adapter.toJson(type) 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/dao/CardDao.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.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.yongjincompany.data.local.entity.card.FetchMyCardRoomEntity 8 | 9 | @Dao 10 | interface CardDao { 11 | @Query("SELECT * FROM myCard") 12 | suspend fun fetchMyCard(): FetchMyCardRoomEntity 13 | 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | suspend fun insertMyCard(fetchMyCardRoomEntity: FetchMyCardRoomEntity) 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/dao/UserDao.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.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.yongjincompany.data.local.entity.user.FetchMyInfoRoomEntity 8 | 9 | @Dao 10 | interface UserDao { 11 | @Query("SELECT * FROM myInfo") 12 | suspend fun fetchMyInfo() : FetchMyInfoRoomEntity 13 | 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | suspend fun insertMyInfo(fetchMyInfoRoomEntity: FetchMyInfoRoomEntity) 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/database/DSMTCGDataBase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.database 2 | 3 | import androidx.room.Database 4 | import androidx.room.RoomDatabase 5 | import androidx.room.TypeConverters 6 | import com.yongjincompany.data.local.converter.CardListTypeConverter 7 | import com.yongjincompany.data.local.dao.CardDao 8 | import com.yongjincompany.data.local.dao.UserDao 9 | import com.yongjincompany.data.local.entity.card.FetchMyCardRoomEntity 10 | import com.yongjincompany.data.local.entity.user.FetchMyInfoRoomEntity 11 | 12 | @Database( 13 | entities = [ 14 | FetchMyInfoRoomEntity::class, 15 | FetchMyCardRoomEntity::class 16 | ], version = 1, exportSchema = false 17 | ) 18 | 19 | @TypeConverters( 20 | value = [ 21 | CardListTypeConverter::class 22 | ] 23 | 24 | ) 25 | 26 | abstract class DSMTCGDataBase : RoomDatabase() { 27 | abstract fun userDao(): UserDao 28 | abstract fun cardDao(): CardDao 29 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/datasource/LocalCardDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.datasource 2 | 3 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 4 | 5 | interface LocalCardDataSource { 6 | suspend fun fetchMyCard(): FetchMyCardEntity 7 | suspend fun insertMyCard(fetchMyCardEntity: FetchMyCardEntity) 8 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/datasource/LocalCardDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.datasource 2 | 3 | import com.yongjincompany.data.local.dao.CardDao 4 | import com.yongjincompany.data.local.entity.card.toDbEntity 5 | import com.yongjincompany.data.local.entity.card.toEntity 6 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 7 | import javax.inject.Inject 8 | 9 | class LocalCardDataSourceImpl @Inject constructor( 10 | private val cardDao: CardDao, 11 | ) : LocalCardDataSource { 12 | override suspend fun fetchMyCard(): FetchMyCardEntity = 13 | cardDao.fetchMyCard().toEntity() 14 | 15 | override suspend fun insertMyCard(fetchMyCardEntity: FetchMyCardEntity) { 16 | cardDao.insertMyCard(fetchMyCardEntity.toDbEntity()) 17 | } 18 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/datasource/LocalUserDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.datasource 2 | 3 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 4 | import org.threeten.bp.LocalDateTime 5 | 6 | interface LocalUserDataSource { 7 | suspend fun setAccessToken(token: String) 8 | suspend fun fetchAccessToken(): String 9 | suspend fun clearAccessToken() 10 | 11 | suspend fun setRefreshToken(token: String) 12 | suspend fun fetchRefreshToken(): String 13 | suspend fun clearRefreshToken() 14 | 15 | suspend fun setExpiredAt(localDateTime: String) 16 | suspend fun fetchExpiredAt(): LocalDateTime 17 | 18 | suspend fun setId(id: String) 19 | suspend fun fetchId(): String 20 | suspend fun clearId() 21 | 22 | suspend fun setPw(pw: String) 23 | suspend fun fetchPw(): String 24 | suspend fun clearPw() 25 | 26 | suspend fun fetchMyInfo(): FetchMyInfoEntity 27 | suspend fun insertMyInfo(fetchMyInfoEntity: FetchMyInfoEntity) 28 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/entity/user/FetchMyInfoRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.entity.user 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | import com.yongjincompany.data.local.entity.card.FetchMyCardRoomEntity 7 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 8 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 9 | 10 | @Entity(tableName = "myInfo") 11 | data class FetchMyInfoRoomEntity( 12 | @PrimaryKey val userId: Long, 13 | val name: String, 14 | val profileImageUrl: String, 15 | val rank: Int, 16 | val coin: Int, 17 | @Embedded val cardCount: CardCount 18 | ) { 19 | data class CardCount( 20 | val agradeCardCount: Int, 21 | val bgradeCardCount: Int, 22 | val cgradeCardCount: Int, 23 | val sgradeCardCount: Int, 24 | val dgradeCardCount: Int, 25 | ) 26 | 27 | fun CardCount.toEntity() = 28 | FetchMyInfoEntity.CardCount( 29 | agradeCardCount = agradeCardCount, 30 | bgradeCardCount = bgradeCardCount, 31 | cgradeCardCount = cgradeCardCount, 32 | sgradeCardCount = sgradeCardCount, 33 | dgradeCardCount = dgradeCardCount 34 | ) 35 | } 36 | fun FetchMyInfoEntity.CardCount.toDbEntity() = 37 | FetchMyInfoRoomEntity.CardCount( 38 | agradeCardCount = agradeCardCount, 39 | bgradeCardCount = bgradeCardCount, 40 | cgradeCardCount = cgradeCardCount, 41 | sgradeCardCount = sgradeCardCount, 42 | dgradeCardCount = dgradeCardCount 43 | ) 44 | 45 | fun FetchMyInfoRoomEntity.toEntity() = 46 | FetchMyInfoEntity( 47 | name = name, 48 | profileImageUrl = profileImageUrl, 49 | rank = rank, 50 | coin = coin, 51 | userId = userId, 52 | cardCount = cardCount.toEntity() 53 | ) 54 | 55 | fun FetchMyInfoEntity.toDbEntity() = 56 | rank?.let { 57 | FetchMyInfoRoomEntity( 58 | name = name, 59 | profileImageUrl = profileImageUrl, 60 | rank = rank!!, 61 | coin = coin, 62 | userId = userId, 63 | cardCount = cardCount.toDbEntity() 64 | ) 65 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/local/storage/AuthDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.local.storage 2 | 3 | import org.threeten.bp.LocalDateTime 4 | 5 | interface AuthDataStorage { 6 | fun setAccessToken(token: String) 7 | fun fetchAccessToken(): String 8 | fun clearAccessToken() 9 | 10 | fun setRefreshToken(token: String) 11 | fun fetchRefreshToken(): String 12 | fun clearRefreshToken() 13 | 14 | fun setExpiredAt(localDateTime: String) 15 | fun fetchExpiredAt(): LocalDateTime 16 | 17 | fun setId(id: String) 18 | fun fetchId(): String 19 | fun clearId() 20 | 21 | fun setPw(pw: String) 22 | fun fetchPw(): String 23 | fun clearPw() 24 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/CardApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.response.cards.FetchMyCardResponse 4 | import retrofit2.http.GET 5 | import retrofit2.http.POST 6 | 7 | interface CardApi { 8 | @GET("cards") 9 | suspend fun fetchMyCard( 10 | ): FetchMyCardResponse 11 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/ChestApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.request.chest.GoldChestOpenRequest 4 | import com.yongjincompany.data.remote.request.chest.LegendChestOpenRequest 5 | import com.yongjincompany.data.remote.request.chest.SilverChestOpenRequest 6 | import com.yongjincompany.data.remote.response.chests.* 7 | import retrofit2.http.Body 8 | import retrofit2.http.GET 9 | import retrofit2.http.POST 10 | import retrofit2.http.Query 11 | 12 | interface ChestApi { 13 | @GET("chests/free") 14 | suspend fun getFreeChestTime(): FreeChestOpenTimeResponse 15 | 16 | @GET("chests/special") 17 | suspend fun getSpecialChestTime(): SpecialChestOpenTimeResponse 18 | 19 | @POST("chests/free") 20 | suspend fun openFreeChest(): FreeChestOpenResponse 21 | 22 | @POST("chests/special") 23 | suspend fun openSpecialChest(): SpecialChestOpenResponse 24 | 25 | @POST("chests/silver") 26 | suspend fun openSilverChest( 27 | @Body silverChestOpenRequest : SilverChestOpenRequest 28 | ): SilverChestOpenResponse 29 | 30 | @POST("chests/gold") 31 | suspend fun openGoldChest( 32 | @Body goldChestOpenRequest: GoldChestOpenRequest 33 | ): GoldChestOpenResponse 34 | 35 | @POST("chests/legend") 36 | suspend fun openLegendChest( 37 | @Body legendChestOpenRequest: LegendChestOpenRequest 38 | ): LegendChestOpenResponse 39 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/ImagesApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.response.image.ImageResponse 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 | ): ImageResponse 15 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/RankApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.response.ranks.FetchRankResponse 4 | import retrofit2.http.GET 5 | 6 | interface RankApi { 7 | @GET("ranks") 8 | suspend fun getAllRank(): FetchRankResponse 9 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/RoomApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.response.rooms.FetchRoomResponse 4 | import retrofit2.http.GET 5 | 6 | interface RoomApi { 7 | @GET("rooms") 8 | suspend fun getRooms(): FetchRoomResponse 9 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/api/UserApi.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.api 2 | 3 | import com.yongjincompany.data.remote.request.users.ChangePasswordRequest 4 | import com.yongjincompany.data.remote.request.users.UpdateMyInfoRequest 5 | import com.yongjincompany.data.remote.request.users.UserRegisterRequest 6 | import com.yongjincompany.data.remote.request.users.UserSignInRequest 7 | import com.yongjincompany.data.remote.response.users.FetchMyInfoResponse 8 | import com.yongjincompany.data.remote.response.users.UserRegisterResponse 9 | import com.yongjincompany.data.remote.response.users.UserSignInResponse 10 | import retrofit2.http.* 11 | 12 | interface UserApi { 13 | @POST("users") 14 | suspend fun userRegister( 15 | @Body userSignUpRequest: UserRegisterRequest 16 | ): UserRegisterResponse 17 | 18 | @POST("users/auth") 19 | suspend fun userSignIn( 20 | @Body userSignInRequest: UserSignInRequest 21 | ): UserSignInResponse 22 | 23 | @PATCH("users") 24 | suspend fun updateMyInfo( 25 | @Body updateMyInfoRequest: UpdateMyInfoRequest 26 | ) 27 | 28 | @GET("users") 29 | suspend fun fetchMyInfo( 30 | ): FetchMyInfoResponse 31 | 32 | @PATCH("users/password") 33 | suspend fun changePassword( 34 | @Body changePasswordRequest: ChangePasswordRequest 35 | ) 36 | 37 | /*@DELETE("users") 38 | suspend fun logOut()*/ 39 | 40 | @DELETE("users") 41 | suspend fun deleteAccount() 42 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteCardDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 4 | 5 | interface RemoteCardDataSource { 6 | suspend fun fetchMyCard(): FetchMyCardEntity 7 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteCardDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.api.CardApi 4 | import com.yongjincompany.data.remote.response.cards.FetchMyCardResponse 5 | import com.yongjincompany.data.remote.response.cards.toEntity 6 | import com.yongjincompany.data.util.HttpHandler 7 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 8 | import javax.inject.Inject 9 | 10 | class RemoteCardDataSourceImpl @Inject constructor( 11 | private val cardApi: CardApi, 12 | ) : RemoteCardDataSource { 13 | override suspend fun fetchMyCard(): FetchMyCardEntity = 14 | HttpHandler() 15 | .httpRequest { cardApi.fetchMyCard() } 16 | .sendRequest().toEntity() 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteChestDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.request.chest.GoldChestOpenRequest 4 | import com.yongjincompany.data.remote.request.chest.LegendChestOpenRequest 5 | import com.yongjincompany.data.remote.request.chest.SilverChestOpenRequest 6 | import com.yongjincompany.data.remote.response.chests.FreeChestOpenResponse 7 | import com.yongjincompany.domain.entity.chests.* 8 | import retrofit2.http.Body 9 | 10 | interface RemoteChestDataSource { 11 | suspend fun fetchFreeChestTime(): FetchFreeChestTimeEntity 12 | 13 | suspend fun fetchSpecialChestTime(): FetchSpecialChestTimeEntity 14 | 15 | suspend fun openFreeChest(): FreeChestOpenEntity 16 | 17 | suspend fun openSpecialChest(): SpecialChestOpenEntity 18 | 19 | suspend fun openSilverChest( 20 | silverChestOpenRequest: SilverChestOpenRequest 21 | ): SilverChestOpenEntity 22 | 23 | suspend fun openGoldChest( 24 | goldChestOpenRequest: GoldChestOpenRequest 25 | ): GoldChestOpenEntity 26 | 27 | suspend fun openLegendChest( 28 | legendChestOpenRequest: LegendChestOpenRequest 29 | ): LegendChestOpenEntity 30 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteImagesDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.response.image.ImageResponse 4 | import okhttp3.MultipartBody 5 | 6 | interface RemoteImagesDataSource { 7 | 8 | suspend fun postImages(images : List): ImageResponse 9 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteImagesDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.api.ImagesApi 4 | import com.yongjincompany.data.remote.response.image.ImageResponse 5 | import com.yongjincompany.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): ImageResponse = 13 | HttpHandler() 14 | .httpRequest { imagesApi.postImages(images) } 15 | .sendRequest() 16 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteRankDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 4 | 5 | interface RemoteRankDataSource { 6 | suspend fun fetchAllRank(): FetchRankEntity 7 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteRankDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.api.RankApi 4 | import com.yongjincompany.data.remote.response.ranks.FetchRankResponse 5 | import com.yongjincompany.data.remote.response.ranks.toEntity 6 | import com.yongjincompany.data.util.HttpHandler 7 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 8 | import javax.inject.Inject 9 | 10 | class RemoteRankDataSourceImpl @Inject constructor( 11 | private val rankApi: RankApi, 12 | ) : RemoteRankDataSource { 13 | override suspend fun fetchAllRank(): FetchRankEntity = 14 | HttpHandler() 15 | .httpRequest { rankApi.getAllRank() } 16 | .sendRequest().toEntity() 17 | 18 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteRoomDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 4 | import javax.inject.Inject 5 | 6 | interface RemoteRoomDataSource { 7 | suspend fun fetchRooms(): FetchRoomEntity 8 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteRoomDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.api.RoomApi 4 | import com.yongjincompany.data.remote.response.rooms.FetchRoomResponse 5 | import com.yongjincompany.data.remote.response.rooms.toEntity 6 | import com.yongjincompany.data.util.HttpHandler 7 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 8 | import javax.inject.Inject 9 | 10 | class RemoteRoomDataSourceImpl @Inject constructor( 11 | private val roomApi: RoomApi 12 | ): RemoteRoomDataSource { 13 | override suspend fun fetchRooms(): FetchRoomEntity = 14 | HttpHandler() 15 | .httpRequest { roomApi.getRooms() } 16 | .sendRequest().toEntity() 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteSocketDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import kotlinx.coroutines.flow.SharedFlow 4 | 5 | interface RemoteSocketDataSource { 6 | fun disconnectSocket() 7 | 8 | fun connectSocket() 9 | 10 | fun createRoom(roomName: String) 11 | 12 | fun receiveCreateRoom(): SharedFlow 13 | 14 | fun joinRoom(roomId: Long) 15 | 16 | fun receiveJoinRoom(): SharedFlow 17 | 18 | fun chatting(emoji: String, char: String) 19 | 20 | fun receiveChatting(): SharedFlow 21 | 22 | fun receiveError(): List 23 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteSocketDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import io.socket.client.Socket 4 | import kotlinx.coroutines.flow.SharedFlow 5 | import javax.inject.Inject 6 | 7 | class RemoteSocketDataSourceImpl @Inject constructor( 8 | private val socket: Socket 9 | ) : RemoteSocketDataSource { 10 | override fun disconnectSocket() { 11 | TODO("Not yet implemented") 12 | } 13 | 14 | override fun connectSocket() { 15 | TODO("Not yet implemented") 16 | } 17 | 18 | override fun createRoom(roomName: String) { 19 | TODO("Not yet implemented") 20 | } 21 | 22 | override fun receiveCreateRoom(): SharedFlow { 23 | TODO("Not yet implemented") 24 | } 25 | 26 | override fun joinRoom(roomId: Long) { 27 | TODO("Not yet implemented") 28 | } 29 | 30 | override fun receiveJoinRoom(): SharedFlow { 31 | TODO("Not yet implemented") 32 | } 33 | 34 | override fun chatting(emoji: String, char: String) { 35 | TODO("Not yet implemented") 36 | } 37 | 38 | override fun receiveChatting(): SharedFlow { 39 | TODO("Not yet implemented") 40 | } 41 | 42 | override fun receiveError(): List { 43 | TODO("Not yet implemented") 44 | } 45 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/datasource/RemoteUserDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.datasource 2 | 3 | import com.yongjincompany.data.remote.request.users.ChangePasswordRequest 4 | import com.yongjincompany.data.remote.request.users.UpdateMyInfoRequest 5 | import com.yongjincompany.data.remote.request.users.UserRegisterRequest 6 | import com.yongjincompany.data.remote.request.users.UserSignInRequest 7 | import com.yongjincompany.data.remote.response.users.UserRegisterResponse 8 | import com.yongjincompany.data.remote.response.users.UserSignInResponse 9 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 10 | 11 | interface RemoteUserDataSource { 12 | 13 | suspend fun postUserRegister( 14 | userRegisterRequest: UserRegisterRequest, 15 | ): UserRegisterResponse 16 | 17 | suspend fun postUserSignIn( 18 | userSignInRequest: UserSignInRequest, 19 | ): UserSignInResponse 20 | 21 | suspend fun updateMyInfo( 22 | updateMyInfoRequest: UpdateMyInfoRequest, 23 | ) 24 | 25 | suspend fun fetchMyInfo( 26 | ): FetchMyInfoEntity 27 | 28 | suspend fun changePassword( 29 | changePasswordRequest: ChangePasswordRequest 30 | ) 31 | 32 | //suspend fun logOut() 33 | 34 | suspend fun deleteAccount() 35 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/chest/GoldChestOpenRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.chest 2 | 3 | data class GoldChestOpenRequest( 4 | val price: Int 5 | ) 6 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/chest/LegendChestOpenRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.chest 2 | 3 | data class LegendChestOpenRequest( 4 | val price: Int 5 | ) 6 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/chest/SilverChestOpenRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.chest 2 | 3 | data class SilverChestOpenRequest( 4 | val price: Int 5 | ) 6 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/users/ChangePasswordRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ChangePasswordRequest( 6 | @SerializedName("new_password") val newPassword: String, 7 | @SerializedName("old_password") val oldPassword: String 8 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/users/UpdateMyInfoRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateMyInfoRequest( 6 | @SerializedName("name") val name: String, 7 | @SerializedName("profileUrl") val profileUrl: String, 8 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/users/UserRegisterRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.request.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserRegisterRequest( 6 | @SerializedName("account_id") val accountId: String, 7 | @SerializedName("name") val name: String, 8 | @SerializedName("password") val password: String 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/request/users/UserSignInRequest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.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 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/cards/FetchMyCardResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.cards 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 5 | 6 | data class FetchMyCardResponse( 7 | @SerializedName("card_count") val cardCount: CardCount, 8 | @SerializedName("total_count") val totalCount: Int, 9 | @SerializedName("card_list") val cardList: List, 10 | ) { 11 | data class Card( 12 | @SerializedName("id") val cardId: Int, 13 | @SerializedName("image_url") val cardImageUrl: String, 14 | @SerializedName("count") val count: Int, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("description") val description: String, 17 | @SerializedName("name") val name: String, 18 | ) 19 | 20 | data class CardCount( 21 | @SerializedName("agrade_card_count") val agradeCardCount: Int, 22 | @SerializedName("bgrade_card_count") val bgradeCardCount: Int, 23 | @SerializedName("cgrade_card_count") val cgradeCardCount: Int, 24 | @SerializedName("sgrade_card_count") val sgradeCardCount: Int, 25 | @SerializedName("ssgrade_card_count") val ssgradeCardCount: Int, 26 | ) 27 | 28 | fun Card.toEntity() = 29 | FetchMyCardEntity.Card( 30 | cardId = cardId, 31 | cardImageUrl = cardImageUrl, 32 | count = count, 33 | description = description, 34 | grade = grade, 35 | name = name 36 | ) 37 | 38 | fun CardCount.toEntity() = 39 | FetchMyCardEntity.CardCount( 40 | agradeCardCount = agradeCardCount, 41 | bgradeCardCount = bgradeCardCount, 42 | cgradeCardCount = cgradeCardCount, 43 | sgradeCardCount = sgradeCardCount, 44 | ssgradeCardCount = ssgradeCardCount 45 | ) 46 | } 47 | 48 | fun FetchMyCardResponse.toEntity() = 49 | FetchMyCardEntity( 50 | cardCount = cardCount.toEntity(), 51 | totalCount = totalCount, 52 | cardList = cardList.map { it.toEntity() } 53 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/FreeChestOpenResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.FreeChestOpenEntity 5 | 6 | data class FreeChestOpenResponse( 7 | @SerializedName("card_list") val cardList: List, 8 | @SerializedName("coin") val coin: Int, 9 | @SerializedName("diamond") val diamond: Int, 10 | ) { 11 | data class Card( 12 | @SerializedName("card_image_url") val cardImageUrl: String, 13 | @SerializedName("card_name") val cardName: String, 14 | @SerializedName("description") val description: String, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("id") val id: Int, 17 | ) 18 | 19 | } 20 | 21 | fun FreeChestOpenResponse.toEntity() = 22 | FreeChestOpenEntity( 23 | cardList = cardList.map { it.toEntity() }, 24 | coin = coin, 25 | diamond = diamond 26 | ) 27 | 28 | fun FreeChestOpenResponse.Card.toEntity() = 29 | FreeChestOpenEntity.Card( 30 | cardImageUrl = cardImageUrl, 31 | cardName = cardName, 32 | description = description, 33 | grade = grade, 34 | id = id 35 | ) 36 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/FreeChestOpenTimeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.FetchFreeChestTimeEntity 5 | 6 | data class FreeChestOpenTimeResponse( 7 | @SerializedName("chest_open_date_time") val chestOpenDateTime: String, 8 | @SerializedName("is_opened") val isOpened: Boolean, 9 | ) 10 | 11 | fun FreeChestOpenTimeResponse.toEntity() = 12 | FetchFreeChestTimeEntity( 13 | chestOpenDateTime = chestOpenDateTime, 14 | isOpened = isOpened 15 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/GoldChestOpenResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.GoldChestOpenEntity 5 | 6 | data class GoldChestOpenResponse( 7 | @SerializedName("card_list") val cardList: List, 8 | @SerializedName("coin") val coin: Int, 9 | @SerializedName("diamond") val diamond: Int, 10 | ) { 11 | data class Card( 12 | @SerializedName("card_image_url") val cardImageUrl: String, 13 | @SerializedName("card_name") val cardName: String, 14 | @SerializedName("description") val description: String, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("id") val id: Int, 17 | ) 18 | 19 | } 20 | 21 | fun GoldChestOpenResponse.toEntity() = 22 | GoldChestOpenEntity( 23 | cardList = cardList.map { it.toEntity() }, 24 | coin = coin, 25 | diamond = diamond 26 | ) 27 | 28 | fun GoldChestOpenResponse.Card.toEntity() = 29 | GoldChestOpenEntity.Card( 30 | cardImageUrl = cardImageUrl, 31 | cardName = cardName, 32 | description = description, 33 | grade = grade, 34 | id = id 35 | ) 36 | 37 | 38 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/LegendChestOpenResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.LegendChestOpenEntity 5 | 6 | data class LegendChestOpenResponse( 7 | @SerializedName("card_list") val cardList: List, 8 | @SerializedName("coin") val coin: Int, 9 | @SerializedName("diamond") val diamond: Int, 10 | ) { 11 | data class Card( 12 | @SerializedName("card_image_url") val cardImageUrl: String, 13 | @SerializedName("card_name") val cardName: String, 14 | @SerializedName("description") val description: String, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("id") val id: Int, 17 | ) 18 | 19 | } 20 | 21 | fun LegendChestOpenResponse.toEntity() = 22 | LegendChestOpenEntity( 23 | cardList = cardList.map { it.toEntity() }, 24 | coin = coin, 25 | diamond = diamond 26 | ) 27 | 28 | fun LegendChestOpenResponse.Card.toEntity() = 29 | LegendChestOpenEntity.Card( 30 | cardImageUrl = cardImageUrl, 31 | cardName = cardName, 32 | description = description, 33 | grade = grade, 34 | id = id 35 | ) 36 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/SilverChestOpenResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.SilverChestOpenEntity 5 | 6 | data class SilverChestOpenResponse( 7 | @SerializedName("card_list") val cardList: List, 8 | @SerializedName("coin") val coin: Int, 9 | @SerializedName("diamond") val diamond: Int, 10 | ) { 11 | data class Card( 12 | @SerializedName("card_image_url") val cardImageUrl: String, 13 | @SerializedName("card_name") val cardName: String, 14 | @SerializedName("description") val description: String, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("id") val id: Int, 17 | ) 18 | 19 | } 20 | 21 | fun SilverChestOpenResponse.toEntity() = 22 | SilverChestOpenEntity( 23 | cardList = cardList.map { it.toEntity() }, 24 | coin = coin, 25 | diamond = diamond 26 | ) 27 | 28 | fun SilverChestOpenResponse.Card.toEntity() = 29 | SilverChestOpenEntity.Card( 30 | cardImageUrl = cardImageUrl, 31 | cardName = cardName, 32 | description = description, 33 | grade = grade, 34 | id = id 35 | ) 36 | 37 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/SpecialChestOpenResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.SpecialChestOpenEntity 5 | 6 | data class SpecialChestOpenResponse( 7 | @SerializedName("card_list") val cardList: List, 8 | @SerializedName("coin") val coin: Int, 9 | @SerializedName("diamond") val diamond: Int, 10 | ) { 11 | data class Card( 12 | @SerializedName("card_image_url") val cardImageUrl: String, 13 | @SerializedName("card_name") val cardName: String, 14 | @SerializedName("description") val description: String, 15 | @SerializedName("grade") val grade: String, 16 | @SerializedName("id") val id: Int, 17 | ) 18 | 19 | } 20 | 21 | fun SpecialChestOpenResponse.toEntity() = 22 | SpecialChestOpenEntity( 23 | cardList = cardList.map { it.toEntity() }, 24 | coin = coin, 25 | diamond = diamond 26 | ) 27 | 28 | fun SpecialChestOpenResponse.Card.toEntity() = 29 | SpecialChestOpenEntity.Card( 30 | cardImageUrl = cardImageUrl, 31 | cardName = cardName, 32 | description = description, 33 | grade = grade, 34 | id = id 35 | ) 36 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/chests/SpecialChestOpenTimeResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.chests 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.chests.FetchSpecialChestTimeEntity 5 | 6 | data class SpecialChestOpenTimeResponse( 7 | @SerializedName("chest_open_date_time") val chestOpenDateTime: String, 8 | @SerializedName("is_opened") val isOpened: Boolean, 9 | ) 10 | 11 | fun SpecialChestOpenTimeResponse.toEntity() = 12 | FetchSpecialChestTimeEntity( 13 | chestOpenDateTime = chestOpenDateTime, 14 | isOpened = isOpened 15 | ) 16 | -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/image/ImageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.image 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ImageResponse( 6 | @SerializedName("image_url") val imageUrl: List 7 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/ranks/FetchRankResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.ranks 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 5 | 6 | data class FetchRankResponse( 7 | @SerializedName("rank_list") val rankList: List, 8 | ) { 9 | data class Rank( 10 | @SerializedName("account_id") val accountId: String, 11 | @SerializedName("card_count") val cardCount: CardCount, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("profile_image_url") val profileImageUrl: String, 14 | @SerializedName("ranking") val ranking: Int, 15 | @SerializedName("user_id") val userId: Int, 16 | ) 17 | 18 | data class CardCount( 19 | @SerializedName("agrade_card_count") val agradeCardCount: Int, 20 | @SerializedName("bgrade_card_count") val bgradeCardCount: Int, 21 | @SerializedName("cgrade_card_count") val cgradeCardCount: Int, 22 | @SerializedName("sgrade_card_count") val sgradeCardCount: Int, 23 | @SerializedName("ssgrade_card_count") val ssgradeCardCount: Int, 24 | ) 25 | 26 | fun Rank.toEntity() = 27 | FetchRankEntity.Rank( 28 | accountId = accountId, 29 | cardCount = cardCount.toEntity(), 30 | name = name, 31 | profileImageUrl = profileImageUrl, 32 | ranking = ranking, 33 | userId = userId 34 | ) 35 | 36 | fun CardCount.toEntity() = 37 | FetchRankEntity.CardCount( 38 | agradeCardCount = agradeCardCount, 39 | bgradeCardCount = bgradeCardCount, 40 | cgradeCardCount = cgradeCardCount, 41 | sgradeCardCount = sgradeCardCount, 42 | ssgradeCardCount = ssgradeCardCount 43 | ) 44 | } 45 | 46 | fun FetchRankResponse.toEntity() = 47 | FetchRankEntity( 48 | rankList = rankList.map { it.toEntity() } 49 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/rooms/FetchRoomResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.rooms 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 5 | 6 | data class FetchRoomResponse( 7 | @SerializedName("room_list") val roomList: List 8 | ) { 9 | data class Room( 10 | @SerializedName("room_id") val roomId: Int, 11 | @SerializedName("room_name") val roomName: String, 12 | @SerializedName("profile_image") val profileImage: String, 13 | @SerializedName("username") val userName: String, 14 | ) 15 | 16 | fun Room.toEntity() = 17 | FetchRoomEntity.Room( 18 | roomId = roomId, 19 | roomName = roomName, 20 | profileImage = profileImage, 21 | userName = userName, 22 | ) 23 | } 24 | 25 | fun FetchRoomResponse.toEntity() = 26 | FetchRoomEntity( 27 | roomList = roomList.map { it.toEntity() } 28 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/users/FetchMyInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 5 | 6 | data class FetchMyInfoResponse( 7 | @SerializedName("name") val name: String, 8 | @SerializedName("profile_image_url") val profileImageUrl: String, 9 | @SerializedName("rank") val rank: Int, 10 | @SerializedName("coin") val coin: Int, 11 | @SerializedName("user_id") val userId: Long, 12 | @SerializedName("card_count") val cardCount: CardCount, 13 | ) { 14 | data class CardCount( 15 | @SerializedName("agrade_card_count") val agradeCardCount: Int, 16 | @SerializedName("bgrade_card_count") val bgradeCardCount: Int, 17 | @SerializedName("cgrade_card_count") val cgradeCardCount: Int, 18 | @SerializedName("sgrade_card_count") val sgradeCardCount: Int, 19 | @SerializedName("dgrade_card_count") val dgradeCardCount: Int, 20 | ) 21 | 22 | fun CardCount.toEntity() = 23 | FetchMyInfoEntity.CardCount( 24 | agradeCardCount = agradeCardCount, 25 | bgradeCardCount = bgradeCardCount, 26 | cgradeCardCount = cgradeCardCount, 27 | sgradeCardCount = sgradeCardCount, 28 | dgradeCardCount = dgradeCardCount 29 | ) 30 | } 31 | 32 | fun FetchMyInfoResponse.toEntity() = 33 | FetchMyInfoEntity( 34 | name = name, 35 | profileImageUrl = profileImageUrl, 36 | rank = rank, 37 | coin = coin, 38 | userId = userId, 39 | cardCount = cardCount.toEntity() 40 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/users/UserRegisterResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.remote.response.users 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserRegisterResponse( 6 | @SerializedName("access_token")val accessToken: String, 7 | @SerializedName("expired_at") val expiredAt: String, 8 | @SerializedName("refresh_token") val refreshToken: String 9 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/remote/response/users/UserSignInResponse.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.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 | ) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/repository/CardRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.repository 2 | 3 | import com.yongjincompany.data.local.datasource.LocalCardDataSource 4 | import com.yongjincompany.data.remote.datasource.RemoteCardDataSource 5 | import com.yongjincompany.data.util.OfflineCacheUtil 6 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 7 | import com.yongjincompany.domain.repository.CardRepository 8 | import kotlinx.coroutines.flow.Flow 9 | import javax.inject.Inject 10 | 11 | class CardRepositoryImpl @Inject constructor( 12 | private val remoteCardDataSource: RemoteCardDataSource, 13 | private val localCardDataSource: LocalCardDataSource 14 | ): CardRepository { 15 | override suspend fun fetchMyCard(): Flow = 16 | OfflineCacheUtil() 17 | .remoteData { remoteCardDataSource.fetchMyCard() } 18 | .localData { localCardDataSource.fetchMyCard() } 19 | .doOnNeedRefresh { localCardDataSource.insertMyCard(it) } 20 | .createFlow() 21 | 22 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/repository/RankRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.repository 2 | 3 | import com.yongjincompany.data.remote.datasource.RemoteRankDataSource 4 | import com.yongjincompany.data.util.OfflineCacheUtil 5 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 6 | import com.yongjincompany.domain.repository.RankRepository 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class RankRepositoryImpl @Inject constructor( 11 | private val remoteRankDataSource: RemoteRankDataSource 12 | ): RankRepository { 13 | override suspend fun fetchAllRank(): Flow = 14 | OfflineCacheUtil() 15 | .remoteData { remoteRankDataSource.fetchAllRank() } 16 | .createRemoteFlow() 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/repository/RoomRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.repository 2 | 3 | import com.yongjincompany.data.remote.datasource.RemoteRoomDataSource 4 | import com.yongjincompany.data.util.OfflineCacheUtil 5 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 6 | import com.yongjincompany.domain.repository.RoomRepository 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class RoomRepositoryImpl @Inject constructor( 11 | private val remoteRoomDataSource: RemoteRoomDataSource 12 | ) : RoomRepository { 13 | override suspend fun fetchRooms(): Flow = 14 | OfflineCacheUtil() 15 | .remoteData { remoteRoomDataSource.fetchRooms() } 16 | .createRemoteFlow() 17 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/util/LocalDateTimeParser.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.util 2 | 3 | import org.threeten.bp.LocalDateTime 4 | 5 | fun String.toLocalDateTime(): LocalDateTime = 6 | LocalDateTime.parse(this) -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/util/OfflineCacheUtil.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.util 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | import kotlinx.coroutines.flow.flow 5 | import java.lang.NullPointerException 6 | 7 | class OfflineCacheUtil { 8 | 9 | private lateinit var fetchLocalData: suspend () -> T 10 | private lateinit var fetchRemoteData: suspend () -> T 11 | private var isNeedRefresh: suspend (localData: T, remoteData: T) -> Boolean = 12 | { localData, remoteData -> localData != remoteData } 13 | private lateinit var refreshLocalData: suspend (remoteData: T) -> Unit 14 | 15 | fun localData(fetchLocalData: suspend () -> T): OfflineCacheUtil = 16 | this.apply { this.fetchLocalData = fetchLocalData } 17 | 18 | fun remoteData(fetchRemoteData: suspend () -> T): OfflineCacheUtil = 19 | this.apply { this.fetchRemoteData = fetchRemoteData } 20 | 21 | fun compareData(isNeedRefresh: suspend (localData: T, remoteData: T) -> Boolean): OfflineCacheUtil = 22 | this.apply { this.isNeedRefresh = isNeedRefresh } 23 | 24 | fun doOnNeedRefresh(refreshLocalData: suspend (remoteData: T) -> Unit): OfflineCacheUtil = 25 | this.apply { this.refreshLocalData = refreshLocalData } 26 | 27 | fun createFlow(): Flow = 28 | flow { 29 | try { 30 | val localData = fetchLocalData() 31 | emit(localData) 32 | 33 | val remoteData = fetchRemoteData() 34 | if (isNeedRefresh(localData, remoteData)) { 35 | refreshLocalData(remoteData) 36 | emit(remoteData) 37 | } 38 | } catch (e: NullPointerException) { 39 | val remoteData = fetchRemoteData() 40 | refreshLocalData(remoteData) 41 | emit(remoteData) 42 | } 43 | } 44 | 45 | fun createRemoteFlow(): Flow = 46 | flow { 47 | val remoteData = fetchRemoteData() 48 | emit(remoteData) 49 | } 50 | } -------------------------------------------------------------------------------- /data/src/main/java/com/yongjincompany/data/util/UtilFunc.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.data.util 2 | 3 | import okhttp3.MediaType 4 | import okhttp3.MultipartBody 5 | import okhttp3.RequestBody 6 | import java.io.File 7 | 8 | fun File.toMultipart(): MultipartBody.Part { 9 | val fileBody = RequestBody.create(MediaType.parse("image/jpeg"), this) 10 | return MultipartBody.Part.createFormData("images", this.name, fileBody) 11 | } 12 | 13 | fun List.toMultipartList(): List = 14 | this.map { it.toMultipart() } -------------------------------------------------------------------------------- /domain/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | kotlin("android") 4 | } 5 | 6 | android { 7 | compileSdk = Project.compileSdk 8 | 9 | defaultConfig { 10 | minSdk = Project.minSdk 11 | targetSdk = Project.targetSdk 12 | consumerProguardFiles("consumer-rules.pro") 13 | } 14 | 15 | buildTypes { 16 | getByName("release") { 17 | isMinifyEnabled = false 18 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") 19 | } 20 | } 21 | compileOptions { 22 | sourceCompatibility = Project.javaVersion 23 | targetCompatibility = Project.javaVersion 24 | } 25 | kotlinOptions { 26 | jvmTarget = "11" 27 | } 28 | } 29 | dependencies { 30 | testImplementation(Dependency.Test.junit) 31 | testImplementation(Dependency.Test.mockito) 32 | testImplementation(Dependency.Test.mockitoKotlin) 33 | testImplementation(Dependency.Test.mockitoInline) 34 | 35 | implementation(Dependency.Coroutine.core) 36 | 37 | implementation(Dependency.DI.inject) 38 | 39 | implementation(Dependency.ThreeTenAndroidBackport.threeTenAbp) 40 | } -------------------------------------------------------------------------------- /domain/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/cards/FetchMyCardEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.cards 2 | 3 | data class FetchMyCardEntity( 4 | val cardCount: CardCount, 5 | val totalCount: Int, 6 | val cardList: List, 7 | ) { 8 | data class Card( 9 | val cardId: Int, 10 | val cardImageUrl: String, 11 | val count: Int, 12 | val description: String, 13 | val grade: String, 14 | val name: String, 15 | ) 16 | 17 | data class CardCount( 18 | val agradeCardCount: Int, 19 | val bgradeCardCount: Int, 20 | val cgradeCardCount: Int, 21 | val sgradeCardCount: Int, 22 | val ssgradeCardCount: Int, 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/FetchFreeChestTimeEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class FetchFreeChestTimeEntity( 4 | val chestOpenDateTime: String, 5 | val isOpened: Boolean, 6 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/FetchSpecialChestTimeEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class FetchSpecialChestTimeEntity( 4 | val chestOpenDateTime: String, 5 | val isOpened: Boolean, 6 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/FreeChestOpenEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class FreeChestOpenEntity( 4 | val cardList: List, 5 | val coin: Int, 6 | val diamond: Int, 7 | ) { 8 | data class Card( 9 | val cardImageUrl: String, 10 | val cardName: String, 11 | val description: String, 12 | val grade: String, 13 | val id: Int, 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/GoldChestOpenEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class GoldChestOpenEntity( 4 | val cardList: List, 5 | val coin: Int, 6 | val diamond: Int, 7 | ) { 8 | data class Card( 9 | val cardImageUrl: String, 10 | val cardName: String, 11 | val description: String, 12 | val grade: String, 13 | val id: Int, 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/LegendChestOpenEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class LegendChestOpenEntity( 4 | val cardList: List, 5 | val coin: Int, 6 | val diamond: Int, 7 | ) { 8 | data class Card( 9 | val cardImageUrl: String, 10 | val cardName: String, 11 | val description: String, 12 | val grade: String, 13 | val id: Int, 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/SilverChestOpenEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class SilverChestOpenEntity( 4 | val cardList: List, 5 | val coin: Int, 6 | val diamond: Int, 7 | ) { 8 | data class Card( 9 | val cardImageUrl: String, 10 | val cardName: String, 11 | val description: String, 12 | val grade: String, 13 | val id: Int, 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/chests/SpecialChestOpenEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.chests 2 | 3 | data class SpecialChestOpenEntity( 4 | val cardList: List, 5 | val coin: Int, 6 | val diamond: Int, 7 | ) { 8 | data class Card( 9 | val cardImageUrl: String, 10 | val cardName: String, 11 | val description: String, 12 | val grade: String, 13 | val id: Int, 14 | ) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/ranks/FetchRankEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.ranks 2 | 3 | data class FetchRankEntity( 4 | val rankList: List, 5 | ) { 6 | data class Rank( 7 | val accountId: String, 8 | val cardCount: CardCount, 9 | val name: String, 10 | val profileImageUrl: String, 11 | val ranking: Int, 12 | val userId: Int, 13 | ) 14 | 15 | data class CardCount( 16 | val agradeCardCount: Int, 17 | val bgradeCardCount: Int, 18 | val cgradeCardCount: Int, 19 | val sgradeCardCount: Int, 20 | val ssgradeCardCount: Int, 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/rooms/FetchRoomEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.rooms 2 | 3 | data class FetchRoomEntity( 4 | val roomList: List 5 | ) { 6 | data class Room( 7 | val roomId: Int, 8 | val roomName: String, 9 | val profileImage: String, 10 | val userName: String, 11 | ) 12 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/entity/users/FetchMyInfoEntity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.entity.users 2 | 3 | data class FetchMyInfoEntity( 4 | val name: String, 5 | val profileImageUrl: String, 6 | val rank: Int?, 7 | val coin: Int, 8 | val userId: Long, 9 | val cardCount: CardCount, 10 | ) { 11 | data class CardCount( 12 | val agradeCardCount: Int, 13 | val bgradeCardCount: Int, 14 | val cgradeCardCount: Int, 15 | val sgradeCardCount: Int, 16 | val dgradeCardCount: Int, 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/exception/Basic.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.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() -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/exception/File.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.exception 2 | 3 | import java.lang.RuntimeException 4 | 5 | class ChangeFileSizeException : RuntimeException() -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/exception/User.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.exception 2 | 3 | import java.io.IOException 4 | 5 | class NeedLoginException : IOException() -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/chest/GoldChestOpenParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.chest 2 | 3 | data class GoldChestOpenParam( 4 | val price: Int 5 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/chest/LegendChestOpenParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.chest 2 | 3 | data class LegendChestOpenParam( 4 | val price: Int 5 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/chest/SilverChestOpenParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.chest 2 | 3 | data class SilverChestOpenParam( 4 | val price: Int 5 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/user/PostUserRegisterParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.user 2 | 3 | data class PostUserRegisterParam( 4 | val accountId: String, 5 | val name: String, 6 | val password: String, 7 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/user/PostUserSignInParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.user 2 | 3 | data class PostUserSignInParam( 4 | val accountId: String, 5 | val password: String, 6 | ) -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/user/UpdateMyInfoParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.user 2 | 3 | import java.io.File 4 | 5 | data class UpdateMyInfoParam( 6 | val name: String, 7 | val profileUrl: File?, 8 | ) 9 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/param/user/changePasswordParam.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.param.user 2 | 3 | data class ChangePasswordParam( 4 | val oldPassword: String, 5 | val newPassword: String 6 | ) 7 | -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/repository/CardRepository.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.repository 2 | 3 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface CardRepository { 7 | suspend fun fetchMyCard(): Flow 8 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/repository/ChestRepository.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.repository 2 | 3 | import com.yongjincompany.domain.entity.chests.* 4 | import com.yongjincompany.domain.param.chest.GoldChestOpenParam 5 | import com.yongjincompany.domain.param.chest.LegendChestOpenParam 6 | import com.yongjincompany.domain.param.chest.SilverChestOpenParam 7 | import kotlinx.coroutines.flow.Flow 8 | 9 | interface ChestRepository { 10 | suspend fun fetchFreeChestTime(): Flow 11 | 12 | suspend fun fetchSpecialChestTime(): Flow 13 | 14 | suspend fun openFreeChest(): Flow 15 | 16 | suspend fun openSpecialChest(): Flow 17 | 18 | suspend fun openSilverChest(silverChestOpenParam: SilverChestOpenParam): Flow 19 | 20 | suspend fun openGoldChest(goldChestOpenParam: GoldChestOpenParam): Flow 21 | 22 | suspend fun openLegendChest(legendChestOpenParam: LegendChestOpenParam): Flow 23 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/repository/RankRepository.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.repository 2 | 3 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface RankRepository { 7 | suspend fun fetchAllRank(): Flow 8 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/repository/RoomRepository.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.repository 2 | 3 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface RoomRepository { 7 | suspend fun fetchRooms(): Flow 8 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/repository/UserRepository.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.repository 2 | 3 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 4 | import com.yongjincompany.domain.param.user.ChangePasswordParam 5 | import com.yongjincompany.domain.param.user.PostUserRegisterParam 6 | import com.yongjincompany.domain.param.user.PostUserSignInParam 7 | import com.yongjincompany.domain.param.user.UpdateMyInfoParam 8 | import kotlinx.coroutines.flow.Flow 9 | 10 | interface UserRepository { 11 | suspend fun postUserRegister( 12 | postUserRegisterParam: PostUserRegisterParam, 13 | ) 14 | 15 | suspend fun postUserSignIn( 16 | postUserSignInParam: PostUserSignInParam, 17 | ) 18 | 19 | suspend fun autoLogin() 20 | 21 | suspend fun updateMyInfo( 22 | updateMyInfoParam: UpdateMyInfoParam, 23 | ) 24 | 25 | suspend fun fetchMyInfo(): Flow 26 | 27 | suspend fun changePassword( 28 | changePasswordParam: ChangePasswordParam 29 | ) 30 | 31 | suspend fun logOut() 32 | 33 | suspend fun deleteAccount() 34 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/UseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase 2 | 3 | abstract class UseCase { 4 | abstract suspend fun execute(data: I): O 5 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/card/FetchMyCardUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.card 2 | 3 | import com.yongjincompany.domain.entity.cards.FetchMyCardEntity 4 | import com.yongjincompany.domain.repository.CardRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMyCardUseCase @Inject constructor( 10 | private val cardRepository: CardRepository, 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | cardRepository.fetchMyCard() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/FetchFreeChestTimeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.FetchFreeChestTimeEntity 4 | import com.yongjincompany.domain.repository.ChestRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchFreeChestTimeUseCase @Inject constructor( 10 | private val chestRepository: ChestRepository 11 | ): UseCase>() { 12 | override suspend fun execute(data: Unit): Flow = 13 | chestRepository.fetchFreeChestTime() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/FetchSpecialChestTimeUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.FetchFreeChestTimeEntity 4 | import com.yongjincompany.domain.entity.chests.FetchSpecialChestTimeEntity 5 | import com.yongjincompany.domain.repository.ChestRepository 6 | import com.yongjincompany.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class FetchSpecialChestTimeUseCase @Inject constructor( 11 | private val chestRepository: ChestRepository 12 | ): UseCase>() { 13 | override suspend fun execute(data: Unit): Flow = 14 | chestRepository.fetchSpecialChestTime() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/OpenFreeChestUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.FreeChestOpenEntity 4 | import com.yongjincompany.domain.repository.ChestRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class OpenFreeChestUseCase @Inject constructor( 10 | private val chestRepository: ChestRepository, 11 | ) : UseCase>() { 12 | override suspend fun execute(data: Unit): Flow = 13 | chestRepository.openFreeChest() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/OpenGoldChestUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.GoldChestOpenEntity 4 | import com.yongjincompany.domain.param.chest.GoldChestOpenParam 5 | import com.yongjincompany.domain.repository.ChestRepository 6 | import com.yongjincompany.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class OpenGoldChestUseCase @Inject constructor( 11 | private val chestRepository: ChestRepository 12 | ) : UseCase>() { 13 | override suspend fun execute(data: GoldChestOpenParam): Flow = 14 | chestRepository.openGoldChest(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/OpenLegendChestUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.LegendChestOpenEntity 4 | import com.yongjincompany.domain.param.chest.LegendChestOpenParam 5 | import com.yongjincompany.domain.repository.ChestRepository 6 | import com.yongjincompany.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class OpenLegendChestUseCase @Inject constructor( 11 | private val chestRepository: ChestRepository 12 | ) : UseCase>() { 13 | override suspend fun execute(data: LegendChestOpenParam): Flow = 14 | chestRepository.openLegendChest(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/OpenSilverChestUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.SilverChestOpenEntity 4 | import com.yongjincompany.domain.param.chest.SilverChestOpenParam 5 | import com.yongjincompany.domain.repository.ChestRepository 6 | import com.yongjincompany.domain.usecase.UseCase 7 | import kotlinx.coroutines.flow.Flow 8 | import javax.inject.Inject 9 | 10 | class OpenSilverChestUseCase @Inject constructor( 11 | private val chestRepository: ChestRepository, 12 | ) : UseCase>() { 13 | override suspend fun execute(data: SilverChestOpenParam): Flow = 14 | chestRepository.openSilverChest(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/chest/OpenSpecialChestUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.chest 2 | 3 | import com.yongjincompany.domain.entity.chests.SpecialChestOpenEntity 4 | import com.yongjincompany.domain.repository.ChestRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class OpenSpecialChestUseCase @Inject constructor( 10 | private val chestRepository: ChestRepository, 11 | ) : UseCase>() { 12 | override suspend fun execute(data: Unit): Flow = 13 | chestRepository.openSpecialChest() 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/rank/FetchAllRankUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.rank 2 | 3 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 4 | import com.yongjincompany.domain.repository.RankRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchAllRankUseCase @Inject constructor( 10 | private val rankRepository: RankRepository, 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | rankRepository.fetchAllRank() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/room/FetchRoomsUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.room 2 | 3 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 4 | import com.yongjincompany.domain.repository.RoomRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchRoomsUseCase @Inject constructor( 10 | private val roomRepository: RoomRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | roomRepository.fetchRooms() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/user/AutoLoginUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | 4 | import com.yongjincompany.domain.repository.UserRepository 5 | import com.yongjincompany.domain.usecase.UseCase 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/yongjincompany/domain/usecase/user/ChangePasswordUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | import com.yongjincompany.domain.param.user.ChangePasswordParam 4 | import com.yongjincompany.domain.repository.UserRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class ChangePasswordUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: ChangePasswordParam) = 13 | userRepository.changePassword(data) 14 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/user/DeleteAccountUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | import com.yongjincompany.domain.repository.UserRepository 4 | import com.yongjincompany.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/yongjincompany/domain/usecase/user/FetchMyInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | import com.yongjincompany.domain.entity.users.FetchMyInfoEntity 4 | import com.yongjincompany.domain.repository.UserRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import kotlinx.coroutines.flow.Flow 7 | import javax.inject.Inject 8 | 9 | class FetchMyInfoUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase>() { 12 | 13 | override suspend fun execute(data: Unit): Flow = 14 | userRepository.fetchMyInfo() 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/user/LogOutUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | import com.yongjincompany.domain.repository.UserRepository 4 | import com.yongjincompany.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/yongjincompany/domain/usecase/user/PostUserRegisterUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | 4 | import com.yongjincompany.domain.param.user.PostUserRegisterParam 5 | import com.yongjincompany.domain.repository.UserRepository 6 | import com.yongjincompany.domain.usecase.UseCase 7 | import javax.inject.Inject 8 | 9 | class PostUserRegisterUseCase @Inject constructor( 10 | private val userRepository: UserRepository 11 | ) : UseCase() { 12 | 13 | override suspend fun execute(data: PostUserRegisterParam) = 14 | userRepository.postUserRegister(data) 15 | } -------------------------------------------------------------------------------- /domain/src/main/java/com/yongjincompany/domain/usecase/user/PostUserSignInUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | 4 | import com.yongjincompany.domain.param.user.PostUserSignInParam 5 | import com.yongjincompany.domain.repository.UserRepository 6 | import com.yongjincompany.domain.usecase.UseCase 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/yongjincompany/domain/usecase/user/UpdateMyInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.domain.usecase.user 2 | 3 | import com.yongjincompany.domain.param.user.UpdateMyInfoParam 4 | import com.yongjincompany.domain.repository.UserRepository 5 | import com.yongjincompany.domain.usecase.UseCase 6 | import javax.inject.Inject 7 | 8 | class UpdateMyInfoUseCase @Inject constructor( 9 | private val userRepository: UserRepository 10 | ) : UseCase() { 11 | 12 | override suspend fun execute(data: UpdateMyInfoParam) = 13 | userRepository.updateMyInfo(data) 14 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jul 13 12:16:19 KST 2022 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/yongjincompany/dsmtcg/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg 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.yongjincompany.dsmtcg", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /presentation/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.base 2 | 3 | import android.os.Bundle 4 | import android.widget.Toast 5 | import androidx.annotation.LayoutRes 6 | import androidx.appcompat.app.AppCompatActivity 7 | import androidx.databinding.DataBindingUtil 8 | import androidx.databinding.ViewDataBinding 9 | 10 | abstract class BaseActivity( 11 | @LayoutRes private val layoutId: Int 12 | ) : AppCompatActivity() { 13 | 14 | protected lateinit var binding: B 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | 19 | binding = DataBindingUtil.setContentView(this, layoutId) 20 | binding.lifecycleOwner = this 21 | 22 | initView() 23 | } 24 | 25 | fun showShortToast(msg: String) { 26 | Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 27 | } 28 | 29 | fun showLongToast(msg: String) { 30 | Toast.makeText(this, msg, Toast.LENGTH_LONG).show() 31 | } 32 | 33 | abstract fun initView() 34 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/base/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.base 2 | 3 | 4 | import android.os.Bundle 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.Toast 9 | import androidx.annotation.LayoutRes 10 | import androidx.databinding.DataBindingUtil 11 | import androidx.databinding.ViewDataBinding 12 | import androidx.fragment.app.Fragment 13 | 14 | abstract class BaseFragment( 15 | @LayoutRes private val layoutRes: Int 16 | ) : Fragment() { 17 | protected lateinit var binding: B 18 | 19 | override fun onCreateView( 20 | inflater: LayoutInflater, 21 | container: ViewGroup?, 22 | savedInstanceState: Bundle? 23 | ): View? { 24 | binding = DataBindingUtil.inflate(inflater, layoutRes, container, false) 25 | return binding.root 26 | } 27 | 28 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 29 | super.onViewCreated(view, savedInstanceState) 30 | binding.lifecycleOwner = this 31 | 32 | initView() 33 | } 34 | 35 | abstract fun initView() 36 | 37 | fun showShortToast(msg: String) { 38 | Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() 39 | } 40 | 41 | fun showLongToast(msg: String) { 42 | Toast.makeText(context, msg, Toast.LENGTH_LONG).show() 43 | } 44 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/DSMTCGApplication.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | import android.app.Application 4 | import androidx.work.Configuration 5 | import com.jakewharton.threetenabp.AndroidThreeTen 6 | import com.yongjincompany.dsmtcg.util.DSMTCGExceptionHandler 7 | import dagger.hilt.android.HiltAndroidApp 8 | import javax.inject.Inject 9 | 10 | @HiltAndroidApp 11 | class DSMTCGApplication : Application(), Configuration.Provider { 12 | override fun onCreate() { 13 | super.onCreate() 14 | AndroidThreeTen.init(this) 15 | setCrashHandler() 16 | } 17 | 18 | private fun setCrashHandler() { 19 | val crashlyticsExceptionHandler = Thread.getDefaultUncaughtExceptionHandler() ?: return 20 | Thread.setDefaultUncaughtExceptionHandler( 21 | DSMTCGExceptionHandler( 22 | this, 23 | crashlyticsExceptionHandler 24 | ) 25 | ) 26 | } 27 | 28 | override fun getWorkManagerConfiguration(): Configuration { 29 | TODO("Not yet implemented") 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/LocalDataSourceModule.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | 4 | import com.yongjincompany.data.local.datasource.LocalCardDataSource 5 | import com.yongjincompany.data.local.datasource.LocalCardDataSourceImpl 6 | import com.yongjincompany.data.local.datasource.LocalUserDataSource 7 | import com.yongjincompany.data.local.datasource.LocalUserDataSourceImpl 8 | import dagger.Binds 9 | import dagger.Module 10 | import dagger.Provides 11 | import dagger.hilt.InstallIn 12 | import dagger.hilt.components.SingletonComponent 13 | 14 | @Module 15 | @InstallIn(SingletonComponent::class) 16 | abstract class LocalDataSourceModule { 17 | 18 | @Binds 19 | abstract fun provideLocalUserDataSource( 20 | localUserDataSourceImpl: LocalUserDataSourceImpl 21 | ): LocalUserDataSource 22 | 23 | @Binds 24 | abstract fun provideLocalCardDataSource( 25 | localCardDataSourceImpl: LocalCardDataSourceImpl 26 | ): LocalCardDataSource 27 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/RemoteDataSourceModule.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | import com.yongjincompany.data.remote.datasource.* 4 | import dagger.Binds 5 | import dagger.Module 6 | import dagger.hilt.InstallIn 7 | import dagger.hilt.components.SingletonComponent 8 | 9 | @Module 10 | @InstallIn(SingletonComponent::class) 11 | abstract class RemoteDataSourceModule { 12 | 13 | /*@Singleton 14 | @Binds 15 | abstract fun provideRemoteSocketDataSource( 16 | remoteSocketDataSourceImpl: RemoteSocketDataSourceImpl, 17 | ): RemoteSocketDataSource*/ 18 | 19 | @Binds 20 | abstract fun provideRemoteUserDataSource( 21 | remoteUserDataSourceImpl: RemoteUserDataSourceImpl 22 | ): RemoteUserDataSource 23 | 24 | @Binds 25 | abstract fun provideRemoteImageDataSource( 26 | remoteImagesDataSourceImpl: RemoteImagesDataSourceImpl 27 | ): RemoteImagesDataSource 28 | 29 | @Binds 30 | abstract fun provideRemoteCardDataSource( 31 | remoteCardDataSourceImpl: RemoteCardDataSourceImpl 32 | ): RemoteCardDataSource 33 | 34 | @Binds 35 | abstract fun provideRemoteChestDataSource( 36 | remoteChestDataSourceImpl: RemoteChestDataSourceImpl 37 | ): RemoteChestDataSource 38 | 39 | @Binds 40 | abstract fun provideRemoteRankDataSource( 41 | remoteRankDataSourceImpl: RemoteRankDataSourceImpl 42 | ): RemoteRankDataSource 43 | 44 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/RepositoryModule.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | import com.yongjincompany.data.repository.CardRepositoryImpl 4 | import com.yongjincompany.data.repository.ChestRepositoryImpl 5 | import com.yongjincompany.data.repository.RankRepositoryImpl 6 | import com.yongjincompany.data.repository.UserRepositoryImpl 7 | import com.yongjincompany.domain.repository.CardRepository 8 | import com.yongjincompany.domain.repository.ChestRepository 9 | import com.yongjincompany.domain.repository.RankRepository 10 | import com.yongjincompany.domain.repository.UserRepository 11 | import dagger.Binds 12 | import dagger.Module 13 | import dagger.hilt.InstallIn 14 | import dagger.hilt.components.SingletonComponent 15 | import javax.inject.Singleton 16 | 17 | @Module 18 | @InstallIn(SingletonComponent::class) 19 | abstract class RepositoryModule { 20 | 21 | /*@Singleton 22 | @Binds 23 | abstract fun providesSocketRepository( 24 | socketRepositoryImpl: SocketRepositoryImpl 25 | ): SocketRepository*/ 26 | 27 | @Binds 28 | abstract fun provideUserRepository( 29 | userRepositoryImpl: UserRepositoryImpl, 30 | ): UserRepository 31 | 32 | @Binds 33 | abstract fun provideCardRepository( 34 | cardRepositoryImpl: CardRepositoryImpl, 35 | ): CardRepository 36 | 37 | @Binds 38 | abstract fun provideChestRepository( 39 | chestRepositoryImpl: ChestRepositoryImpl, 40 | ): ChestRepository 41 | 42 | @Binds 43 | abstract fun provideRankRepository( 44 | rankRepositoryImpl: RankRepositoryImpl 45 | ): RankRepository 46 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/RoomModule.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | import android.content.Context 4 | import androidx.room.Room 5 | import com.squareup.moshi.Moshi 6 | import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory 7 | import com.yongjincompany.data.local.converter.CardListTypeConverter 8 | import com.yongjincompany.data.local.dao.CardDao 9 | import com.yongjincompany.data.local.dao.UserDao 10 | import com.yongjincompany.data.local.database.DSMTCGDataBase 11 | import dagger.Module 12 | import dagger.Provides 13 | import dagger.hilt.InstallIn 14 | import dagger.hilt.android.qualifiers.ApplicationContext 15 | import dagger.hilt.components.SingletonComponent 16 | import javax.inject.Singleton 17 | 18 | @Module 19 | @InstallIn(SingletonComponent::class) 20 | object RoomModule { 21 | 22 | @Singleton 23 | @Provides 24 | fun providesMoshi(): Moshi { 25 | return Moshi.Builder() 26 | .add(KotlinJsonAdapterFactory()) 27 | .build() 28 | } 29 | 30 | @Provides 31 | fun provideWalkHubDatabase( 32 | @ApplicationContext context: Context, 33 | moshi: Moshi, 34 | ): DSMTCGDataBase = Room 35 | .databaseBuilder(context, DSMTCGDataBase::class.java, "DSMDataBase") 36 | .addTypeConverter(CardListTypeConverter(moshi)) 37 | .build() 38 | 39 | @Provides 40 | fun provideUserDao( 41 | dsmtcgDataBase: DSMTCGDataBase, 42 | ): UserDao = dsmtcgDataBase.userDao() 43 | 44 | @Provides 45 | fun provideCardDao( 46 | dsmtcgDataBase: DSMTCGDataBase 47 | ): CardDao = dsmtcgDataBase.cardDao() 48 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/di/StorageModule.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.di 2 | 3 | import com.yongjincompany.data.local.storage.* 4 | import dagger.Binds 5 | import dagger.Module 6 | import dagger.hilt.InstallIn 7 | import dagger.hilt.components.SingletonComponent 8 | 9 | @Module 10 | @InstallIn(SingletonComponent::class) 11 | abstract class StorageModule { 12 | 13 | @Binds 14 | abstract fun provideAuthDataStorage( 15 | authDataStorageImpl: AuthDataStorageImpl 16 | ): AuthDataStorage 17 | 18 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/extensions/Lifecycle.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.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/yongjincompany/dsmtcg/extensions/View.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.extensions 2 | 3 | import android.view.View 4 | import android.widget.ImageView 5 | import com.bumptech.glide.Glide 6 | 7 | fun View.isVisible() = this.visibility == View.VISIBLE 8 | 9 | fun View.visible() { 10 | this.visibility = View.VISIBLE 11 | } 12 | 13 | fun View.invisible() { 14 | this.visibility = View.GONE 15 | } 16 | 17 | fun ImageView.loadFromUrl(url: String) = 18 | Glide.with(this.context.applicationContext) 19 | .load(url) 20 | .into(this) 21 | 22 | fun ImageView.loadCircleFromUrl(url: String) = 23 | Glide.with(this.context.applicationContext) 24 | .load(url) 25 | .circleCrop() 26 | .into(this) 27 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui 2 | 3 | import android.os.Bundle 4 | import androidx.navigation.fragment.findNavController 5 | import androidx.navigation.ui.setupWithNavController 6 | import com.google.android.material.bottomnavigation.BottomNavigationView 7 | import com.yongjincompany.dsmtcg.base.BaseActivity 8 | import com.yongjincompany.dsmtcg.R 9 | import com.yongjincompany.dsmtcg.databinding.ActivityMainBinding 10 | import dagger.hilt.android.AndroidEntryPoint 11 | 12 | @AndroidEntryPoint 13 | class MainActivity : BaseActivity( 14 | R.layout.activity_main 15 | ) { 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | 19 | } 20 | 21 | private fun initBottomNav() { 22 | val navController = supportFragmentManager.findFragmentById(R.id.navHostFragmentActivityMain)?.findNavController() 23 | val nav = binding.bottomNav 24 | navController?.let { 25 | nav.setupWithNavController(navController) 26 | } 27 | } 28 | 29 | override fun initView() { 30 | initBottomNav() 31 | } 32 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/StartActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui 2 | 3 | import android.content.Intent 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.os.Bundle 6 | import androidx.databinding.DataBindingUtil 7 | import com.gun0912.tedpermission.provider.TedPermissionProvider.context 8 | import com.yongjincompany.dsmtcg.R 9 | import com.yongjincompany.dsmtcg.databinding.ActivityStartBinding 10 | import com.yongjincompany.dsmtcg.ui.login.LoginActivity 11 | import com.yongjincompany.dsmtcg.ui.register.RegisterActivity 12 | 13 | class StartActivity : AppCompatActivity() { 14 | private lateinit var binding: ActivityStartBinding 15 | 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | binding = DataBindingUtil.setContentView(this, R.layout.activity_start) 20 | 21 | binding.btJoin.setOnClickListener { 22 | val intent = Intent(context, RegisterActivity::class.java) 23 | startActivity(intent) 24 | } 25 | 26 | binding.tvLogin.setOnClickListener { 27 | val intent = Intent(context, LoginActivity::class.java) 28 | startActivity(intent) 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/TradeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui 2 | 3 | import android.os.Bundle 4 | import androidx.fragment.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.yongjincompany.dsmtcg.R 9 | 10 | 11 | class TradeFragment : Fragment() { 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | 15 | } 16 | 17 | override fun onCreateView( 18 | inflater: LayoutInflater, container: ViewGroup?, 19 | savedInstanceState: Bundle?, 20 | ): View? { 21 | return inflater.inflate(R.layout.fragment_trade, container, false) 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/chest/adapter/FreeChestCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.chest.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.FreeChestOpenEntity 7 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 8 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 9 | 10 | class FreeChestCardAdapter( 11 | private val dataList: ArrayList, 12 | ) : RecyclerView.Adapter() { 13 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 14 | return ViewHolder.from(parent) 15 | } 16 | 17 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 18 | 19 | val item = dataList[position] 20 | 21 | holder.itemView.setOnClickListener { 22 | 23 | } 24 | 25 | holder.bind(item) 26 | } 27 | 28 | class ViewHolder private constructor( 29 | val binding: ItemChestBinding, 30 | ) : 31 | RecyclerView.ViewHolder(binding.root) { 32 | 33 | fun bind(item: FreeChestOpenEntity.Card) { 34 | 35 | binding.cardName.text = item.cardName 36 | binding.cardGrade.text = item.grade 37 | item.cardImageUrl.let { binding.ivCard.loadFromUrl(it) } 38 | 39 | binding.executePendingBindings() 40 | } 41 | 42 | companion object { 43 | fun from(parent: ViewGroup): ViewHolder { 44 | val layoutInflater = LayoutInflater.from(parent.context) 45 | val binding = ItemChestBinding.inflate(layoutInflater, parent, false) 46 | return ViewHolder(binding) 47 | } 48 | } 49 | } 50 | 51 | override fun getItemCount() = dataList.size 52 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/chest/adapter/SpecialChestCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.chest.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.SpecialChestOpenEntity 7 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 8 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 9 | 10 | class SpecialChestCardAdapter( 11 | private val dataList: ArrayList, 12 | ) : RecyclerView.Adapter() { 13 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 14 | return ViewHolder.from(parent) 15 | } 16 | 17 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 18 | 19 | val item = dataList[position] 20 | 21 | holder.bind(item) 22 | } 23 | 24 | class ViewHolder private constructor( 25 | val binding: ItemChestBinding, 26 | ) : 27 | RecyclerView.ViewHolder(binding.root) { 28 | 29 | fun bind(item: SpecialChestOpenEntity.Card) { 30 | 31 | binding.cardName.text = item.cardName 32 | binding.cardGrade.text = item.grade 33 | item.cardImageUrl.let { binding.ivCard.loadFromUrl(it) } 34 | 35 | binding.executePendingBindings() 36 | } 37 | 38 | companion object { 39 | fun from(parent: ViewGroup): ViewHolder { 40 | val layoutInflater = LayoutInflater.from(parent.context) 41 | val binding = ItemChestBinding.inflate(layoutInflater, parent, false) 42 | return ViewHolder(binding) 43 | } 44 | } 45 | } 46 | 47 | override fun getItemCount() = dataList.size 48 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/home/setting/InfoActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.home.setting 2 | 3 | import android.os.Bundle 4 | import com.yongjincompany.dsmtcg.R 5 | import com.yongjincompany.dsmtcg.base.BaseActivity 6 | import com.yongjincompany.dsmtcg.databinding.ActivityInfoBinding 7 | 8 | class InfoActivity: BaseActivity( 9 | R.layout.activity_info 10 | ) { 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | 14 | } 15 | override fun initView() { 16 | 17 | } 18 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/home/setting/SettingActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.home.setting 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.activity.viewModels 6 | import com.gun0912.tedpermission.provider.TedPermissionProvider 7 | import com.yongjincompany.dsmtcg.R 8 | import com.yongjincompany.dsmtcg.base.BaseActivity 9 | import com.yongjincompany.dsmtcg.databinding.ActivitySettingBinding 10 | import com.yongjincompany.dsmtcg.extensions.repeatOnStarted 11 | import com.yongjincompany.dsmtcg.ui.StartActivity 12 | import com.yongjincompany.dsmtcg.viewmodel.setting.LogOutViewModel 13 | import dagger.hilt.android.AndroidEntryPoint 14 | 15 | @AndroidEntryPoint 16 | class SettingActivity : BaseActivity( 17 | R.layout.activity_setting 18 | ) { 19 | private val vm: LogOutViewModel by viewModels() 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | 23 | binding.logout.setOnClickListener { 24 | vm.logOut() 25 | } 26 | 27 | repeatOnStarted { 28 | vm.eventFlow.collect { event -> handleEvent(event) } 29 | } 30 | } 31 | 32 | private fun handleEvent(event: LogOutViewModel.Event) = when (event) { 33 | is LogOutViewModel.Event.LogOut -> { 34 | val intent = Intent(TedPermissionProvider.context, StartActivity::class.java) 35 | finishAffinity() 36 | startActivity(intent) 37 | } 38 | 39 | is LogOutViewModel.Event.LogOutFailed -> showShortToast("로그아웃에 실패하셨습니다") 40 | } 41 | 42 | override fun initView() { 43 | binding.ivBack.setOnClickListener { 44 | finish() 45 | } 46 | binding.myInfo.setOnClickListener { 47 | val intent = Intent(this, InfoActivity::class.java) 48 | startActivity(intent) 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/mycard/CardDetailActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.mycard 2 | 3 | import android.os.Bundle 4 | import com.yongjincompany.dsmtcg.R 5 | import com.yongjincompany.dsmtcg.base.BaseActivity 6 | import com.yongjincompany.dsmtcg.databinding.ActivityCardDetailBinding 7 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 8 | 9 | class CardDetailActivity : BaseActivity( 10 | R.layout.activity_card_detail 11 | ) { 12 | private var description: String = "" 13 | private var name: String = "" 14 | private var grade: String = "" 15 | private var cardImage: String = "" 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | 20 | description = intent.getStringExtra("DESCRIPTION").toString() 21 | name = intent.getStringExtra("NAME").toString() 22 | grade = intent.getStringExtra("GRADE").toString() 23 | cardImage = intent.getStringExtra("CARD_IMAGE").toString() 24 | binding.ivCard.loadFromUrl(cardImage) 25 | binding.cardExplain.text = description 26 | binding.cardName2.text = name 27 | binding.cardGrade2.text = grade 28 | 29 | } 30 | 31 | override fun initView() { 32 | 33 | binding.ivExit.setOnClickListener { 34 | finish() 35 | } 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/rank/adapter/RankAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.rank.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.FreeChestOpenEntity 7 | import com.yongjincompany.domain.entity.ranks.FetchRankEntity 8 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 9 | import com.yongjincompany.dsmtcg.databinding.ItemRankBinding 10 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 11 | 12 | class RankAdapter( 13 | private val dataList: ArrayList, 14 | ) : RecyclerView.Adapter() { 15 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 16 | return ViewHolder.from(parent) 17 | } 18 | 19 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 20 | 21 | val item = dataList[position] 22 | 23 | holder.bind(item) 24 | } 25 | 26 | class ViewHolder private constructor( 27 | val binding: ItemRankBinding, 28 | ) : 29 | RecyclerView.ViewHolder(binding.root) { 30 | 31 | fun bind(item: FetchRankEntity.Rank) { 32 | 33 | binding.tvWalkCount.text = item.accountId 34 | binding.tvName.text = item.name 35 | item.profileImageUrl.let { binding.ivProfileImage.loadFromUrl(it) } 36 | 37 | binding.executePendingBindings() 38 | } 39 | 40 | companion object { 41 | fun from(parent: ViewGroup): ViewHolder { 42 | val layoutInflater = LayoutInflater.from(parent.context) 43 | val binding = ItemRankBinding.inflate(layoutInflater, parent, false) 44 | return ViewHolder(binding) 45 | } 46 | } 47 | } 48 | 49 | override fun getItemCount() = dataList.size 50 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/register/RegisterActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.register 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.activity.viewModels 6 | import com.yongjincompany.dsmtcg.R 7 | import com.yongjincompany.dsmtcg.base.BaseActivity 8 | import com.yongjincompany.dsmtcg.databinding.ActivityRegisterBinding 9 | import com.yongjincompany.dsmtcg.extensions.repeatOnStarted 10 | import com.yongjincompany.dsmtcg.ui.MainActivity 11 | import com.yongjincompany.dsmtcg.viewmodel.register.RegisterViewModel 12 | import dagger.hilt.android.AndroidEntryPoint 13 | 14 | @AndroidEntryPoint 15 | class RegisterActivity : BaseActivity( 16 | R.layout.activity_register 17 | ) { 18 | private val vm: RegisterViewModel by viewModels() 19 | 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | 23 | binding.ibBack.setOnClickListener { 24 | finish() 25 | } 26 | 27 | binding.btContinue.setOnClickListener { 28 | val accountId: String = binding.etId.text.toString() 29 | val password: String = binding.etPassword.text.toString() 30 | val name: String = binding.etName.text.toString() 31 | vm.register(accountId, password, name) 32 | } 33 | 34 | repeatOnStarted { 35 | vm.eventFlow.collect { event -> handleEvent(event) } 36 | } 37 | } 38 | 39 | private fun handleEvent(event: RegisterViewModel.Event) = when (event) { 40 | is RegisterViewModel.Event.SuccessRegister -> { 41 | val intent = Intent(this, MainActivity::class.java) 42 | .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) 43 | startActivity(intent) 44 | 45 | showShortToast("회원가입을 성공적으로 완료하였습니다!") 46 | } 47 | 48 | is RegisterViewModel.Event.ErrorMessage -> showShortToast(event.message) 49 | 50 | is RegisterViewModel.Event.BadRequest -> showShortToast("비밀번호에는 특수문자가 포함되어야합니다.") 51 | 52 | is RegisterViewModel.Event.Conflict -> showShortToast("이미 회원가입이 완료된 전화번호입니다.") 53 | 54 | is RegisterViewModel.Event.UnKnown -> showShortToast("알 수 없는 오류가 발생하였습니다.") 55 | } 56 | 57 | override fun initView() { 58 | 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/shop/cardpack/adapter/GoldChestCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.shop.cardpack.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.GoldChestOpenEntity 7 | import com.yongjincompany.domain.entity.chests.SilverChestOpenEntity 8 | import com.yongjincompany.domain.entity.chests.SpecialChestOpenEntity 9 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 10 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 11 | 12 | class GoldChestCardAdapter( 13 | private val dataList: ArrayList, 14 | ) : RecyclerView.Adapter() { 15 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 16 | return ViewHolder.from(parent) 17 | } 18 | 19 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 20 | 21 | val item = dataList[position] 22 | 23 | holder.bind(item) 24 | } 25 | 26 | class ViewHolder private constructor( 27 | val binding: ItemChestBinding, 28 | ) : RecyclerView.ViewHolder(binding.root) { 29 | 30 | fun bind(item: GoldChestOpenEntity.Card) { 31 | 32 | binding.cardName.text = item.cardName 33 | binding.cardGrade.text = item.grade 34 | item.cardImageUrl.let { binding.ivCard.loadFromUrl(it) } 35 | 36 | binding.executePendingBindings() 37 | } 38 | 39 | companion object { 40 | fun from(parent: ViewGroup): ViewHolder { 41 | val layoutInflater = LayoutInflater.from(parent.context) 42 | val binding = ItemChestBinding.inflate(layoutInflater, parent, false) 43 | return ViewHolder(binding) 44 | } 45 | } 46 | } 47 | 48 | override fun getItemCount() = dataList.size 49 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/shop/cardpack/adapter/LegendChestCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.shop.cardpack.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.LegendChestOpenEntity 7 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 8 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 9 | 10 | class LegendChestCardAdapter( 11 | private val dataList: ArrayList, 12 | ) : RecyclerView.Adapter() { 13 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 14 | return ViewHolder.from(parent) 15 | } 16 | 17 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 18 | 19 | val item = dataList[position] 20 | 21 | holder.bind(item) 22 | } 23 | 24 | class ViewHolder private constructor( 25 | val binding: ItemChestBinding, 26 | ) : RecyclerView.ViewHolder(binding.root) { 27 | 28 | fun bind(item: LegendChestOpenEntity.Card) { 29 | 30 | binding.cardName.text = item.cardName 31 | binding.cardGrade.text = item.grade 32 | item.cardImageUrl.let { binding.ivCard.loadFromUrl(it) } 33 | 34 | binding.executePendingBindings() 35 | } 36 | 37 | companion object { 38 | fun from(parent: ViewGroup): ViewHolder { 39 | val layoutInflater = LayoutInflater.from(parent.context) 40 | val binding = ItemChestBinding.inflate(layoutInflater, parent, false) 41 | return ViewHolder(binding) 42 | } 43 | } 44 | } 45 | 46 | override fun getItemCount() = dataList.size 47 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/shop/cardpack/adapter/SilverChestCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.ui.shop.cardpack.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.yongjincompany.domain.entity.chests.SilverChestOpenEntity 7 | import com.yongjincompany.domain.entity.chests.SpecialChestOpenEntity 8 | import com.yongjincompany.dsmtcg.databinding.ItemChestBinding 9 | import com.yongjincompany.dsmtcg.extensions.loadFromUrl 10 | 11 | class SilverChestCardAdapter( 12 | private val dataList: ArrayList, 13 | ) : RecyclerView.Adapter() { 14 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 15 | return ViewHolder.from(parent) 16 | } 17 | 18 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 19 | 20 | val item = dataList[position] 21 | 22 | holder.bind(item) 23 | } 24 | 25 | class ViewHolder private constructor( 26 | val binding: ItemChestBinding, 27 | ) : 28 | RecyclerView.ViewHolder(binding.root) { 29 | 30 | fun bind(item: SilverChestOpenEntity.Card) { 31 | 32 | binding.cardName.text = item.cardName 33 | binding.cardGrade.text = item.grade 34 | item.cardImageUrl.let { binding.ivCard.loadFromUrl(it) } 35 | 36 | binding.executePendingBindings() 37 | } 38 | 39 | companion object { 40 | fun from(parent: ViewGroup): ViewHolder { 41 | val layoutInflater = LayoutInflater.from(parent.context) 42 | val binding = ItemChestBinding.inflate(layoutInflater, parent, false) 43 | return ViewHolder(binding) 44 | } 45 | } 46 | } 47 | 48 | override fun getItemCount() = dataList.size 49 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/ui/splash/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.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/yongjincompany/dsmtcg/util/BindingViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.util 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/yongjincompany/dsmtcg/util/DSMTCGExceptionHandler.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.util 2 | 3 | import android.app.Activity 4 | import android.app.Application 5 | import android.content.Intent 6 | import android.os.Bundle 7 | import android.os.Process 8 | import com.yongjincompany.domain.exception.NeedLoginException 9 | import com.yongjincompany.dsmtcg.ui.StartActivity 10 | import kotlin.system.exitProcess 11 | 12 | class DSMTCGExceptionHandler( 13 | application: Application, 14 | private val crashlyticsExceptionHandler: Thread.UncaughtExceptionHandler 15 | ) : Thread.UncaughtExceptionHandler { 16 | 17 | private var lastActivity: Activity? = null 18 | private var activityCount = 0 19 | 20 | init { 21 | application.registerActivityLifecycleCallbacks( 22 | object : Application.ActivityLifecycleCallbacks { 23 | 24 | override fun onActivityCreated(p0: Activity, p1: Bundle?) { 25 | lastActivity = p0 26 | } 27 | 28 | override fun onActivityStarted(p0: Activity) { 29 | activityCount++ 30 | lastActivity = p0 31 | } 32 | 33 | override fun onActivityStopped(p0: Activity) { 34 | activityCount-- 35 | if (activityCount < 0) lastActivity = null 36 | } 37 | 38 | override fun onActivityResumed(p0: Activity) {} 39 | 40 | override fun onActivityPaused(p0: Activity) {} 41 | 42 | override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {} 43 | 44 | override fun onActivityDestroyed(p0: Activity) {} 45 | } 46 | ) 47 | } 48 | 49 | override fun uncaughtException(p0: Thread, p1: Throwable) { 50 | if (p1 is NeedLoginException) { 51 | lastActivity?.run { 52 | startHomeActivity(this) 53 | } 54 | } 55 | crashlyticsExceptionHandler.uncaughtException(p0, p1) 56 | Process.killProcess(Process.myPid()) 57 | exitProcess(-1) 58 | } 59 | 60 | private fun startHomeActivity(activity: Activity) = activity.run { 61 | val intent = Intent(this, StartActivity::class.java) 62 | .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) 63 | startActivity(intent) 64 | finish() 65 | } 66 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/util/EventFlow.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.util 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | import kotlinx.coroutines.flow.FlowCollector 5 | import kotlinx.coroutines.flow.MutableSharedFlow 6 | import java.util.concurrent.atomic.AtomicBoolean 7 | 8 | interface EventFlow : Flow { 9 | 10 | companion object { 11 | 12 | const val DEFAULT_REPLAY: Int = 3 13 | } 14 | } 15 | 16 | interface MutableEventFlow : EventFlow, FlowCollector 17 | 18 | @Suppress("FunctionName") 19 | fun MutableEventFlow( 20 | replay: Int = EventFlow.DEFAULT_REPLAY 21 | ): MutableEventFlow = EventFlowImpl(replay) 22 | 23 | fun MutableEventFlow.asEventFlow(): EventFlow = ReadOnlyEventFlow(this) 24 | 25 | private class ReadOnlyEventFlow(flow: EventFlow) : EventFlow by flow 26 | 27 | private class EventFlowImpl( 28 | replay: Int 29 | ) : MutableEventFlow { 30 | 31 | private val flow: MutableSharedFlow> = MutableSharedFlow(replay = replay) 32 | 33 | override suspend fun collect(collector: FlowCollector) = flow 34 | .collect { slot -> 35 | if (!slot.markConsumed()) { 36 | collector.emit(slot.value) 37 | } 38 | } 39 | 40 | override suspend fun emit(value: T) { 41 | flow.emit(EventFlowSlot(value)) 42 | } 43 | } 44 | 45 | private class EventFlowSlot(val value: T) { 46 | 47 | private val consumed: AtomicBoolean = AtomicBoolean(false) 48 | 49 | fun markConsumed(): Boolean = consumed.getAndSet(true) 50 | } 51 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/util/RecyclerViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.util 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.databinding.DataBindingUtil 6 | import androidx.databinding.ViewDataBinding 7 | import androidx.recyclerview.widget.RecyclerView 8 | 9 | class RecyclerViewAdapter : RecyclerView.Adapter() { 10 | 11 | private val items = mutableListOf() 12 | override fun onCreateViewHolder(parent: ViewGroup, layoutId: Int): BindingViewHolder { 13 | val inflater = LayoutInflater.from(parent.context) 14 | val binding: ViewDataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false) 15 | return BindingViewHolder(binding) 16 | } 17 | 18 | override fun onBindViewHolder(holder: BindingViewHolder, position: Int) { 19 | items[position].bind(holder.binding) 20 | holder.binding.executePendingBindings() 21 | } 22 | 23 | override fun getItemCount(): Int { 24 | return items.size 25 | } 26 | 27 | override fun getItemViewType(position: Int): Int { 28 | return items[position].itemLayoutId 29 | } 30 | 31 | fun updateData(newItems: List) { 32 | this.items.clear() 33 | this.items.addAll(newItems) 34 | notifyDataSetChanged() 35 | } 36 | 37 | fun addData(newItem: RecyclerViewItem) { 38 | this.items.add(newItem) 39 | notifyDataSetChanged() 40 | } 41 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/util/RecyclerViewItem.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.util 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/yongjincompany/dsmtcg/viewmodel/login/LoginViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.viewmodel.login 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.yongjincompany.domain.exception.BadRequestException 6 | import com.yongjincompany.domain.exception.NoInternetException 7 | import com.yongjincompany.domain.exception.NotFoundException 8 | import com.yongjincompany.domain.exception.UnauthorizedException 9 | import com.yongjincompany.domain.param.user.PostUserSignInParam 10 | import com.yongjincompany.domain.usecase.user.PostUserSignInUseCase 11 | import com.yongjincompany.dsmtcg.util.MutableEventFlow 12 | import com.yongjincompany.dsmtcg.util.asEventFlow 13 | import dagger.hilt.android.lifecycle.HiltViewModel 14 | import kotlinx.coroutines.Dispatchers 15 | import kotlinx.coroutines.launch 16 | import kotlinx.coroutines.withContext 17 | import javax.inject.Inject 18 | 19 | @HiltViewModel 20 | class LoginViewModel @Inject constructor( 21 | private val postUserSignInUseCase: PostUserSignInUseCase 22 | ) : ViewModel() { 23 | 24 | private val _eventFlow = MutableEventFlow() 25 | val eventFlow = _eventFlow.asEventFlow() 26 | 27 | fun postLogin(accountId: String, password: String) { 28 | viewModelScope.launch() { 29 | kotlin.runCatching { 30 | withContext(Dispatchers.Default) { 31 | postUserSignInUseCase.execute(PostUserSignInParam(accountId, password)) 32 | } 33 | }.onSuccess { 34 | event(Event.LoginSuccess) 35 | }.onFailure { 36 | when (it) { 37 | is NoInternetException -> event(Event.NoInternet) 38 | is BadRequestException -> event(Event.BadRequest) 39 | is NotFoundException -> event(Event.WrongAccount) 40 | else -> event(Event.UnknownError) 41 | } 42 | } 43 | } 44 | } 45 | 46 | private fun event(event: Event) { 47 | viewModelScope.launch { 48 | _eventFlow.emit(event) 49 | } 50 | } 51 | 52 | sealed class Event { 53 | object LoginSuccess : Event() 54 | object BadRequest : Event() 55 | object WrongAccount : Event() 56 | object NoInternet : Event() 57 | object UnknownError : Event() 58 | } 59 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/viewmodel/register/RegisterViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.viewmodel.register 2 | 3 | import androidx.compose.compiler.plugins.kotlin.EmptyFunctionMetrics.name 4 | import androidx.lifecycle.ViewModel 5 | import androidx.lifecycle.viewModelScope 6 | import com.yongjincompany.domain.exception.BadRequestException 7 | import com.yongjincompany.domain.exception.ConflictException 8 | import com.yongjincompany.domain.param.user.PostUserRegisterParam 9 | import com.yongjincompany.domain.usecase.user.PostUserRegisterUseCase 10 | import com.yongjincompany.dsmtcg.util.MutableEventFlow 11 | import com.yongjincompany.dsmtcg.util.asEventFlow 12 | import dagger.hilt.android.lifecycle.HiltViewModel 13 | import kotlinx.coroutines.launch 14 | import javax.inject.Inject 15 | 16 | @HiltViewModel 17 | class RegisterViewModel @Inject constructor( 18 | private val postUserRegisterUseCase: PostUserRegisterUseCase, 19 | ) : ViewModel() { 20 | 21 | private val _eventFlow = MutableEventFlow() 22 | val eventFlow = _eventFlow.asEventFlow() 23 | 24 | fun register(accountId: String, password: String, name: String) { 25 | viewModelScope.launch { 26 | kotlin.runCatching { 27 | postUserRegisterUseCase.execute(PostUserRegisterParam( 28 | accountId = accountId, 29 | password = password, 30 | name = name, 31 | )) 32 | }.onSuccess { 33 | event((Event.SuccessRegister(true))) 34 | }.onFailure { 35 | when (it) { 36 | is BadRequestException -> event(Event.BadRequest) 37 | is ConflictException -> event(Event.Conflict) 38 | else -> event(Event.UnKnown) 39 | } 40 | } 41 | } 42 | } 43 | 44 | private fun event(event: Event) { 45 | viewModelScope.launch { 46 | _eventFlow.emit(event) 47 | } 48 | } 49 | 50 | sealed class Event { 51 | data class SuccessRegister(var state: Boolean = false) : Event() 52 | object BadRequest : Event() 53 | object Conflict : Event() 54 | object UnKnown : Event() 55 | data class ErrorMessage(val message: String) : Event() 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/viewmodel/room/RoomViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.viewmodel.room 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.yongjincompany.domain.entity.rooms.FetchRoomEntity 6 | import com.yongjincompany.domain.exception.UnauthorizedException 7 | import com.yongjincompany.domain.usecase.room.FetchRoomsUseCase 8 | import com.yongjincompany.dsmtcg.util.MutableEventFlow 9 | import com.yongjincompany.dsmtcg.util.asEventFlow 10 | import kotlinx.coroutines.launch 11 | import javax.inject.Inject 12 | 13 | class RoomViewModel @Inject constructor( 14 | private val fetchRoomsUseCase: FetchRoomsUseCase 15 | ) : ViewModel() { 16 | private val _eventFlow = MutableEventFlow() 17 | val eventFlow = _eventFlow.asEventFlow() 18 | 19 | fun fetchRoomValue() { 20 | viewModelScope.launch { 21 | kotlin.runCatching { 22 | fetchRoomsUseCase.execute(Unit).collect { 23 | event(RoomViewModel.Event.FetchRoom(it.toData())) 24 | } 25 | }.onFailure { 26 | when (it) { 27 | is UnauthorizedException -> event(RoomViewModel.Event.ErrorMessage("토큰이 만료되었습니다. 다시 로그인해주세요.")) 28 | else -> event(RoomViewModel.Event.ErrorMessage("알 수 없는 에러가 발생했습니다.")) 29 | } 30 | } 31 | } 32 | 33 | } 34 | 35 | private fun FetchRoomEntity.toData() = 36 | FetchRoomEntity( 37 | roomList.map { it.toData() } 38 | ) 39 | 40 | private fun FetchRoomEntity.Room.toData() = 41 | FetchRoomEntity.Room( 42 | roomId = roomId, 43 | roomName = roomName, 44 | profileImage = profileImage, 45 | userName = userName, 46 | ) 47 | 48 | private fun event(event: Event) { 49 | viewModelScope.launch { 50 | _eventFlow.emit(event) 51 | } 52 | } 53 | 54 | sealed class Event { 55 | data class FetchRoom(val fetchRoomEntity: FetchRoomEntity) : Event() 56 | data class ErrorMessage(val message: String) : Event() 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/viewmodel/setting/LogOutViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.viewmodel.setting 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.yongjincompany.domain.exception.UnauthorizedException 6 | import com.yongjincompany.domain.usecase.user.LogOutUseCase 7 | import com.yongjincompany.dsmtcg.util.MutableEventFlow 8 | import com.yongjincompany.dsmtcg.util.asEventFlow 9 | import dagger.hilt.android.lifecycle.HiltViewModel 10 | import kotlinx.coroutines.launch 11 | import javax.inject.Inject 12 | 13 | @HiltViewModel 14 | class LogOutViewModel @Inject constructor( 15 | private val logOutUseCase: LogOutUseCase 16 | ) : ViewModel() { 17 | private val _eventFlow = MutableEventFlow() 18 | val eventFlow = _eventFlow.asEventFlow() 19 | 20 | fun logOut() { 21 | viewModelScope.launch { 22 | kotlin.runCatching { 23 | logOutUseCase.execute(Unit) 24 | }.onSuccess { 25 | event(Event.LogOut) 26 | }.onFailure { 27 | event(Event.LogOutFailed) 28 | } 29 | } 30 | } 31 | 32 | private fun event(event: Event) { 33 | viewModelScope.launch { 34 | _eventFlow.emit(event) 35 | } 36 | } 37 | 38 | sealed class Event { 39 | object LogOut : Event() 40 | object LogOutFailed : Event() 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /presentation/src/main/java/com/yongjincompany/dsmtcg/viewmodel/splash/SplashViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg.viewmodel.splash 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.yongjincompany.domain.usecase.user.AutoLoginUseCase 6 | import com.yongjincompany.dsmtcg.util.MutableEventFlow 7 | import com.yongjincompany.dsmtcg.util.asEventFlow 8 | import dagger.hilt.android.lifecycle.HiltViewModel 9 | import kotlinx.coroutines.launch 10 | import javax.inject.Inject 11 | 12 | @HiltViewModel 13 | class SplashViewModel @Inject constructor( 14 | private val autoLoginUseCase: AutoLoginUseCase 15 | ) : ViewModel() { 16 | 17 | private val _eventFlow = MutableEventFlow() 18 | val eventFlow = _eventFlow.asEventFlow() 19 | 20 | fun autoLogin() = viewModelScope.launch { 21 | kotlin.runCatching { 22 | autoLoginUseCase.execute(Unit) 23 | }.onSuccess { 24 | emitEvent(Event.AutoLoginSuccess) 25 | }.onFailure { 26 | emitEvent(Event.NeedLogin) 27 | } 28 | 29 | } 30 | 31 | private suspend fun emitEvent(event: Event) { 32 | _eventFlow.emit(event) 33 | } 34 | 35 | sealed class Event { 36 | object AutoLoginSuccess : Event() 37 | object NeedLogin : Event() 38 | } 39 | } -------------------------------------------------------------------------------- /presentation/src/main/res/color/selector_bnv_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-v24/dsm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable-v24/dsm_logo.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/all_back.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/all_back.jpg -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/arena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/arena.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bamboo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/bamboo.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/bamboo_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/card_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/chest_back.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/chest_back.gif -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/circle_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ddong_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/ddong_card.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/editext_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/free_card_pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/free_card_pack.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/free_chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/free_chest.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/gradient_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/gradient_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/gradient_end.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/gradient_start.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_card.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/ic_exit.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_home.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_round.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_setting.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/ic_tournament.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/ic_tournament.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/img.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/jinsung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/jinsung.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/label.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/leagend_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/leagend_card.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/logo.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/logo2.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/logo_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/logo_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/menu_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/my_card_back.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/next_card_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/person.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/rank_cup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/rank_cup.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/register_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/rose_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/rose_card.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/shopkeeper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/shopkeeper.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/special_card_pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/special_card_pack.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/special_chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/drawable/special_chest.png -------------------------------------------------------------------------------- /presentation/src/main/res/drawable/trade_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /presentation/src/main/res/font/nanumsquare_aceb.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/font/nanumsquare_aceb.ttf -------------------------------------------------------------------------------- /presentation/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 18 | 19 | 33 | 34 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /presentation/src/main/res/layout/fragment_trade.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /presentation/src/main/res/layout/item_room.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 15 | 16 | 24 | 25 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /presentation/src/main/res/menu/bottom_nav_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | -------------------------------------------------------------------------------- /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.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-hdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-hdpi/ic_main.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-mdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-mdpi/ic_main.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xhdpi/ic_main.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxhdpi/ic_main.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /presentation/src/main/res/mipmap-xxxhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YouGoodBackEnd/DSM-TCG-Android/7d8aef77eed40b6971c75acb5bba0d7a260d443e/presentation/src/main/res/mipmap-xxxhdpi/ic_main.png -------------------------------------------------------------------------------- /presentation/src/main/res/navigation/mobile_navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /presentation/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /presentation/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | #73AAAA 11 | #009999 12 | #424242 13 | #757575 14 | 15 | #00ffffff 16 | #4CAF50 17 | #CDDC39 18 | #FF9800 19 | -------------------------------------------------------------------------------- /presentation/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #E7E7E7 4 | -------------------------------------------------------------------------------- /presentation/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | DSMTCG 3 | -------------------------------------------------------------------------------- /presentation/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /presentation/src/test/java/com/yongjincompany/dsmtcg/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.yongjincompany.dsmtcg 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: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | google() 5 | mavenCentral() 6 | jcenter() // Warning: this repository is going to shut down soon 7 | } 8 | } 9 | rootProject.name = "DSMTCG" 10 | include ':presentation' 11 | include ':data' 12 | include ':domain' 13 | --------------------------------------------------------------------------------