From 0fba09115c64c338779ed19114b597d01af413a3 Mon Sep 17 00:00:00 2001 From: shinhyo Date: Fri, 12 Apr 2024 20:49:23 +0900 Subject: [PATCH] refactor: m3 --- README.md | 51 +++- app/build.gradle.kts | 15 +- app/src/main/AndroidManifest.xml | 17 +- .../shinhyo/brba/{app => }/BrBaApplication.kt | 2 +- .../github/shinhyo/brba/app/MainActivity.kt | 40 --- .../shinhyo/brba/app/ui/main/MainScreen.kt | 85 ------ .../initializer/TimberInitializer.kt | 2 +- app/src/main/res/values-night/themes.xml | 5 + app/src/main/res/values/colors.xml | 1 - app/src/main/res/values/themes.xml | 12 +- .../kotlin/brba.android.feature.gradle.kts | 3 +- .../shinhyo/brba/buildlogic/Extension.kt | 6 +- .../shinhyo/brba/buildlogic/KotlinAndroid.kt | 11 +- core/data/build.gradle.kts | 1 + .../brba/core/data/di/RepositoryModule.kt | 8 + .../repository/CharactersRepositoryImpl.kt | 2 +- .../data/repository/DeviceRepositoryImpl.kt | 40 +++ core/database/build.gradle.kts | 1 - .../core/database/model/CharacterEntity.kt | 2 +- core/{ui => datastore}/.gitignore | 0 core/datastore/build.gradle.kts | 14 + core/datastore/consumer-rules.pro | 0 core/datastore/proguard-rules.pro | 21 ++ core/datastore/src/main/AndroidManifest.xml | 4 + .../brba/core/datastore/DeviceDataSource.kt | 48 +++ .../brba/core/datastore/di/DataStoreModule.kt | 42 +++ .../brba/core/datastore/model/DeviceData.kt | 22 ++ core/designsystem/build.gradle.kts | 14 + .../brba/core/designsystem/theme/Theme.kt | 44 --- .../github/shinhyo/brba/core/theme/Color.kt | 83 ++++++ .../core/{designsystem => }/theme/Shape.kt | 2 +- .../github/shinhyo/brba/core/theme/Theme.kt | 142 +++++++++ .../core/{designsystem => }/theme/Type.kt | 2 +- .../shinhyo/brba/core/ui/BrBaNavigationBar.kt | 66 +++++ .../shinhyo/brba/core/ui/BrbaCharacterCard.kt | 138 +++++++++ .../shinhyo/brba/core/ui/BrbaCharacterRow.kt | 135 +++++++++ .../shinhyo/brba/core/ui/BrbaEmptyScreen.kt | 63 ++++ .../shinhyo/brba/core/ui/BrbaIconFavorite.kt} | 12 +- .../shinhyo/brba/core/ui/BrbaPreference.kt | 132 +++++++++ .../brba/core/ui/BrbaThemeSelectDialog.kt | 138 +++++++++ .../shinhyo/brba/core/ui/BrbaTopAppBar.kt | 76 +++++ .../shinhyo/brba/core/ui/CircularProgress.kt | 8 +- .../main/res/drawable/ic_flask_outline.xml | 0 .../src/main/res/values/colors.xml | 4 + .../src/main/res/values/strings.xml | 1 + .../domain/repository/DeviceRepository.kt | 29 ++ .../domain/usecase/GetCharacterListUseCase.kt | 12 +- .../domain/usecase/GetCharacterUseCase.kt | 2 +- .../shinhyo/brba/core/model/BrbaCharacter.kt | 4 +- .../shinhyo/brba/core/model/BrbaDeviceData.kt | 20 ++ .../shinhyo/brba/core/model/BrbaThemeMode.kt} | 12 +- core/ui/build.gradle.kts | 21 -- feature/{list => bottombar}/.gitignore | 0 feature/bottombar/build.gradle.kts | 15 + .../bottombar}/src/main/AndroidManifest.xml | 0 .../brba/feature/bottombar/BottomBarScreen.kt | 97 ++++++ .../shinhyo/brba/feature/bottombar}/Tab.kt | 9 +- .../navigation/BottomBarNavigation.kt | 14 +- .../res/drawable/ic_account_cowboy_hat.xml | 0 .../src/main/res/drawable/ic_flask_empty.xml | 0 .../src/main/res/drawable/ic_heart.xml | 0 .../main/res/drawable/ic_heart_outline.xml | 0 .../bottombar/src/main/res/values/strings.xml | 2 + .../brba/feature/detail/DetailScreen.kt | 142 +++++---- .../brba/feature/favorate/FavoriteScreen.kt | 236 ++++----------- .../favorate/navigation/FavoriteNavigation.kt | 7 +- .../shinhyo/brba/feature/main/ListScreen.kt | 278 +++++------------- .../brba/feature/main/ListViewModel.kt | 3 +- .../feature/main/navigation/ListNavigation.kt | 7 +- feature/main/build.gradle.kts | 14 + feature/main/src/main/AndroidManifest.xml | 13 +- .../io/github/shinhyo/brba/main}/BrbaApp.kt | 16 +- .../github/shinhyo/brba/main}/BrbaAppState.kt | 28 +- .../github/shinhyo/brba/main/MainActivity.kt | 80 +++++ .../github/shinhyo/brba/main/MainViewModel.kt | 46 +++ feature/setting/.gitignore | 1 + feature/setting/build.gradle.kts | 10 + .../src/main/AndroidManifest.xml | 0 .../brba/feature/main/SettingScreen.kt | 122 ++++++++ .../brba/feature/main/SettingViewModel.kt | 60 ++++ .../main/navigation/SettingNavigation.kt | 45 +++ .../main/res/drawable/theme_light_dark.xml | 1 + .../setting/src/main/res/values/strings.xml | 2 + gradle/libs.versions.toml | 36 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- project.dot.png | Bin 72970 -> 116706 bytes settings.gradle.kts | 5 +- 87 files changed, 2097 insertions(+), 809 deletions(-) rename app/src/main/java/io/github/shinhyo/brba/{app => }/BrBaApplication.kt (95%) delete mode 100644 app/src/main/java/io/github/shinhyo/brba/app/MainActivity.kt delete mode 100644 app/src/main/java/io/github/shinhyo/brba/app/ui/main/MainScreen.kt rename app/src/main/java/io/github/shinhyo/brba/{app => }/initializer/TimberInitializer.kt (95%) create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 core/data/src/main/java/io/github/shinhyo/brba/core/data/repository/DeviceRepositoryImpl.kt rename core/{ui => datastore}/.gitignore (100%) create mode 100644 core/datastore/build.gradle.kts create mode 100644 core/datastore/consumer-rules.pro create mode 100644 core/datastore/proguard-rules.pro create mode 100644 core/datastore/src/main/AndroidManifest.xml create mode 100644 core/datastore/src/main/java/io/github/shinhyo/brba/core/datastore/DeviceDataSource.kt create mode 100644 core/datastore/src/main/java/io/github/shinhyo/brba/core/datastore/di/DataStoreModule.kt create mode 100644 core/datastore/src/main/java/io/github/shinhyo/brba/core/datastore/model/DeviceData.kt delete mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/designsystem/theme/Theme.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/theme/Color.kt rename core/designsystem/src/main/java/io/github/shinhyo/brba/core/{designsystem => }/theme/Shape.kt (94%) create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/theme/Theme.kt rename core/designsystem/src/main/java/io/github/shinhyo/brba/core/{designsystem => }/theme/Type.kt (95%) create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrBaNavigationBar.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaCharacterCard.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaCharacterRow.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaEmptyScreen.kt rename core/{ui/src/main/java/io/github/shinhyo/brba/core/ui/IconFavorite.kt => designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaIconFavorite.kt} (85%) create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaPreference.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaThemeSelectDialog.kt create mode 100644 core/designsystem/src/main/java/io/github/shinhyo/brba/core/ui/BrbaTopAppBar.kt rename core/{ui => designsystem}/src/main/java/io/github/shinhyo/brba/core/ui/CircularProgress.kt (92%) rename {feature/favorite => core/designsystem}/src/main/res/drawable/ic_flask_outline.xml (100%) create mode 100644 core/designsystem/src/main/res/values/colors.xml rename {feature/favorite => core/designsystem}/src/main/res/values/strings.xml (57%) create mode 100644 core/domain/src/main/kotlin/io/github/shinhyo/brba/core/domain/repository/DeviceRepository.kt create mode 100644 core/model/src/main/java/io/github/shinhyo/brba/core/model/BrbaDeviceData.kt rename core/{designsystem/src/main/java/io/github/shinhyo/brba/core/designsystem/theme/Color.kt => model/src/main/java/io/github/shinhyo/brba/core/model/BrbaThemeMode.kt} (74%) delete mode 100644 core/ui/build.gradle.kts rename feature/{list => bottombar}/.gitignore (100%) create mode 100644 feature/bottombar/build.gradle.kts rename {core/ui => feature/bottombar}/src/main/AndroidManifest.xml (100%) create mode 100644 feature/bottombar/src/main/java/io/github/shinhyo/brba/feature/bottombar/BottomBarScreen.kt rename {app/src/main/java/io/github/shinhyo/brba/app/ui/main => feature/bottombar/src/main/java/io/github/shinhyo/brba/feature/bottombar}/Tab.kt (68%) rename app/src/main/java/io/github/shinhyo/brba/app/ui/main/navigation/MainNavigation.kt => feature/bottombar/src/main/java/io/github/shinhyo/brba/feature/bottombar/navigation/BottomBarNavigation.kt (69%) rename {app => feature/bottombar}/src/main/res/drawable/ic_account_cowboy_hat.xml (100%) rename {app => feature/bottombar}/src/main/res/drawable/ic_flask_empty.xml (100%) rename {app => feature/bottombar}/src/main/res/drawable/ic_heart.xml (100%) rename {app => feature/bottombar}/src/main/res/drawable/ic_heart_outline.xml (100%) create mode 100644 feature/bottombar/src/main/res/values/strings.xml rename {app/src/main/java/io/github/shinhyo/brba/app/ui => feature/main/src/main/java/io/github/shinhyo/brba/main}/BrbaApp.kt (75%) rename {app/src/main/java/io/github/shinhyo/brba/app/ui => feature/main/src/main/java/io/github/shinhyo/brba/main}/BrbaAppState.kt (59%) create mode 100644 feature/main/src/main/java/io/github/shinhyo/brba/main/MainActivity.kt create mode 100644 feature/main/src/main/java/io/github/shinhyo/brba/main/MainViewModel.kt create mode 100644 feature/setting/.gitignore create mode 100644 feature/setting/build.gradle.kts rename feature/{list => setting}/src/main/AndroidManifest.xml (100%) create mode 100644 feature/setting/src/main/java/io/github/shinhyo/brba/feature/main/SettingScreen.kt create mode 100644 feature/setting/src/main/java/io/github/shinhyo/brba/feature/main/SettingViewModel.kt create mode 100644 feature/setting/src/main/java/io/github/shinhyo/brba/feature/main/navigation/SettingNavigation.kt create mode 100644 feature/setting/src/main/res/drawable/theme_light_dark.xml create mode 100644 feature/setting/src/main/res/values/strings.xml diff --git a/README.md b/README.md index 000c695..eb1dc0a 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,20 @@ -# Breaking Bad - Jetpack Compose - - - - -[![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/) - -

- - - +

Breaking Bad - Jetpack Compose

+ +

+ + + + +

+ +

+ + +

## Tech Stack + - [Jetpack](https://developer.android.com/jetpack) - Compose - Define your UI programmatically with composable functions that describe its shape and data dependencies. @@ -24,7 +27,7 @@ - Clean Architecture (nowinandroid) - MVVM pattern - Kotlin Coroutines & Flows -- Material Design3 +- Material Design 3 - Single Activity - StaggeredVerticalGrid - [Gradle Version Catalog](https://docs.gradle.org/7.4/userguide/platforms.html) @@ -32,10 +35,28 @@ - [Coil-Compose](https://coil-kt.github.io/coil/compose) - [Timber](https://github.com/JakeWharton/timber) -## Multi Module ([nowinandroid](https://github.com/android/nowinandroid)) -![](project.dot.png) +## Multi Module +``` +├── app +├── core +│   ├── common +│   ├── data +│   ├── database +│   ├── datastore +│   ├── designsystem +│   ├── domain +│   ├── model +│   └── network +└── feature +    ├── bottombar +    ├── detail +    ├── favorite +    ├── list +    ├── main +    └── setting +``` -### If you think this reposittory is useful, please press the star button at the top. ⭐️ +![](project.dot.png) # License diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 780fe25..f080c2b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,22 +43,9 @@ android { } dependencies { - - implementation(project(":core:data")) - implementation(project(":core:designsystem")) - - implementation(project(":feature:list")) - implementation(project(":feature:favorite")) - implementation(project(":feature:detail")) + implementation(project(":feature:main")) implementation(libs.androidx.startup) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.activity.compose) - - implementation(libs.androidx.navigation.compose) - implementation(libs.androidx.hilt.navigation.compose) - implementation(libs.androidx.compose.material3) - implementation(libs.timber) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 74b1eaf..0820cb5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,34 +5,25 @@ - - - - - - + \ No newline at end of file diff --git a/app/src/main/java/io/github/shinhyo/brba/app/BrBaApplication.kt b/app/src/main/java/io/github/shinhyo/brba/BrBaApplication.kt similarity index 95% rename from app/src/main/java/io/github/shinhyo/brba/app/BrBaApplication.kt rename to app/src/main/java/io/github/shinhyo/brba/BrBaApplication.kt index b98d2af..0fb4b47 100644 --- a/app/src/main/java/io/github/shinhyo/brba/app/BrBaApplication.kt +++ b/app/src/main/java/io/github/shinhyo/brba/BrBaApplication.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.github.shinhyo.brba.app +package io.github.shinhyo.brba import android.app.Application import dagger.hilt.android.HiltAndroidApp diff --git a/app/src/main/java/io/github/shinhyo/brba/app/MainActivity.kt b/app/src/main/java/io/github/shinhyo/brba/app/MainActivity.kt deleted file mode 100644 index c8c755d..0000000 --- a/app/src/main/java/io/github/shinhyo/brba/app/MainActivity.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2021 shinhyo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.github.shinhyo.brba.app - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.WindowCompat -import dagger.hilt.android.AndroidEntryPoint -import io.github.shinhyo.brba.app.ui.BrbaApp -import io.github.shinhyo.brba.core.designsystem.theme.BrBaComposeTheme - -@AndroidEntryPoint -class MainActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - WindowCompat.setDecorFitsSystemWindows(window, false) - - setContent { - BrBaComposeTheme { - BrbaApp() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/io/github/shinhyo/brba/app/ui/main/MainScreen.kt b/app/src/main/java/io/github/shinhyo/brba/app/ui/main/MainScreen.kt deleted file mode 100644 index 19d43f6..0000000 --- a/app/src/main/java/io/github/shinhyo/brba/app/ui/main/MainScreen.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2021 shinhyo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.github.shinhyo.brba.app.ui.main - -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.NavigationBarItemDefaults -import androidx.compose.material3.Scaffold -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import io.github.shinhyo.brba.app.ui.BrbaAppState -import io.github.shinhyo.brba.feature.detail.navigaion.navigateToDetail -import io.github.shinhyo.brba.feature.favorate.navigation.favoriteScreen -import io.github.shinhyo.brba.feature.main.navigation.LIST_ROUTE -import io.github.shinhyo.brba.feature.main.navigation.listScreen - -@Composable -fun MainScreen(appState: BrbaAppState) { - Scaffold( - contentWindowInsets = WindowInsets(0.dp), - bottomBar = { BrBaNavigationBar(appState) } - ) { paddingValues -> - val navController: NavHostController = appState.navController - val navTabController: NavHostController = appState.navTabController - NavHost( - navController = navTabController, - startDestination = LIST_ROUTE, - modifier = Modifier.padding(paddingValues) - ) { - listScreen(navController::navigateToDetail) - favoriteScreen(navController::navigateToDetail) - } - } -} - -@Composable -fun BrBaNavigationBar(appState: BrbaAppState) { - val currentTabRoute = appState.currentTabDestination?.route - NavigationBar( - containerColor = MaterialTheme.colorScheme.background, - modifier = Modifier - .navigationBarsPadding() - ) { - for (tab in Tab.entries) { - NavigationBarItem( - selected = currentTabRoute == tab.route, - onClick = { appState.navigateTopDestination(tab) }, - icon = { - Icon( - painterResource(id = tab.icon), - contentDescription = tab.label - ) - }, - colors = NavigationBarItemDefaults.colors( - indicatorColor = Color.Transparent, - selectedIconColor = MaterialTheme.colorScheme.onPrimary, - unselectedIconColor = Color.LightGray - ) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/io/github/shinhyo/brba/app/initializer/TimberInitializer.kt b/app/src/main/java/io/github/shinhyo/brba/initializer/TimberInitializer.kt similarity index 95% rename from app/src/main/java/io/github/shinhyo/brba/app/initializer/TimberInitializer.kt rename to app/src/main/java/io/github/shinhyo/brba/initializer/TimberInitializer.kt index 9739b60..0b526b0 100644 --- a/app/src/main/java/io/github/shinhyo/brba/app/initializer/TimberInitializer.kt +++ b/app/src/main/java/io/github/shinhyo/brba/initializer/TimberInitializer.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.github.shinhyo.brba.app.initializer +package io.github.shinhyo.brba.initializer import android.content.Context import androidx.startup.Initializer diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..70bc864 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,5 @@ + + + - +