├── .gitignore ├── README.md ├── account ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── codingwithmitch │ └── account │ ├── di │ └── AccountModule.kt │ └── presentation │ └── account │ ├── AccountScreen.kt │ └── AccountViewModel.kt ├── android-library-build.gradle ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── codingwithmitch │ │ └── cleanmultimodule │ │ ├── di │ │ └── AppModule.kt │ │ └── presentation │ │ ├── BaseApplication.kt │ │ ├── MainActivity.kt │ │ ├── navigation │ │ ├── BottomNavItem.kt │ │ ├── Navigation.kt │ │ └── Screen.kt │ │ └── theme │ │ ├── Color.kt │ │ ├── Shape.kt │ │ ├── Theme.kt │ │ └── Type.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-night │ └── themes.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── home ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── codingwithmitch │ └── home │ ├── di │ └── HomeModule.kt │ └── presentation │ └── home │ ├── HomeScreen.kt │ └── HomeViewModel.kt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | *.iml 3 | .idea/* 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | .cxx 9 | local.properties 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This is a playground 2 | I'm playing around with Multi-modules, Compose, Hilt and Navigation Component. -------------------------------------------------------------------------------- /account/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /account/build.gradle.kts: -------------------------------------------------------------------------------- 1 | apply { 2 | from("$rootDir/android-library-build.gradle") 3 | } 4 | 5 | 6 | dependencies { 7 | 8 | } -------------------------------------------------------------------------------- /account/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/account/consumer-rules.pro -------------------------------------------------------------------------------- /account/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 -------------------------------------------------------------------------------- /account/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /account/src/main/java/com/codingwithmitch/account/di/AccountModule.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.account.di 2 | 3 | import dagger.Module 4 | import dagger.Provides 5 | import dagger.hilt.InstallIn 6 | import dagger.hilt.components.SingletonComponent 7 | import javax.inject.Named 8 | import javax.inject.Singleton 9 | 10 | @Module 11 | @InstallIn(SingletonComponent::class) 12 | object AccountModule { 13 | 14 | @Singleton 15 | @Provides 16 | @Named("accountString") 17 | fun provideAccountString(): String{ 18 | return "Account" 19 | } 20 | } -------------------------------------------------------------------------------- /account/src/main/java/com/codingwithmitch/account/presentation/account/AccountScreen.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.account 2 | 3 | import androidx.compose.foundation.layout.Arrangement 4 | import androidx.compose.foundation.layout.Column 5 | import androidx.compose.foundation.layout.fillMaxSize 6 | import androidx.compose.material.Text 7 | import androidx.compose.runtime.Composable 8 | import androidx.compose.ui.Alignment 9 | import androidx.compose.ui.Modifier 10 | 11 | @Composable 12 | fun AccountScreen( 13 | accountString: String, 14 | ){ 15 | Column( 16 | modifier = Modifier.fillMaxSize(), 17 | horizontalAlignment = Alignment.CenterHorizontally, 18 | verticalArrangement = Arrangement.Center 19 | ) { 20 | Text( 21 | accountString, 22 | ) 23 | } 24 | } 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /account/src/main/java/com/codingwithmitch/account/presentation/account/AccountViewModel.kt: -------------------------------------------------------------------------------- 1 | 2 | package com.codingwithmitch.account.presentation.account 3 | 4 | import androidx.lifecycle.ViewModel 5 | import dagger.hilt.android.lifecycle.HiltViewModel 6 | import javax.inject.Inject 7 | import javax.inject.Named 8 | 9 | @HiltViewModel 10 | class AccountViewModel 11 | @Inject 12 | constructor( 13 | @Named("accountString") val value: String, 14 | ): ViewModel(){ 15 | 16 | } -------------------------------------------------------------------------------- /android-library-build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-kapt' 4 | 5 | android { 6 | compileSdkVersion 30 7 | buildToolsVersion "30.0.3" 8 | 9 | defaultConfig { 10 | minSdkVersion 21 11 | targetSdkVersion 30 12 | versionCode 1 13 | versionName "1.0" 14 | 15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | compileOptions { 25 | sourceCompatibility JavaVersion.VERSION_1_8 26 | targetCompatibility JavaVersion.VERSION_1_8 27 | } 28 | kotlinOptions { 29 | jvmTarget = '1.8' 30 | useIR = true 31 | } 32 | buildFeatures { 33 | compose true 34 | } 35 | composeOptions { 36 | def compose = "1.0.0-rc01" 37 | kotlinCompilerExtensionVersion compose 38 | def kotlin = "1.5.10" 39 | kotlinCompilerVersion kotlin 40 | } 41 | } 42 | 43 | dependencies{ 44 | implementation 'androidx.core:core-ktx:1.6.0' 45 | implementation 'androidx.appcompat:appcompat:1.3.0' 46 | implementation 'com.google.android.material:material:1.4.0' 47 | 48 | implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' 49 | def activityCompose = "1.3.0-rc01" 50 | implementation "androidx.activity:activity-compose:$activityCompose" 51 | 52 | def compose = "1.0.0-rc01" 53 | implementation "androidx.compose.ui:ui:$compose" 54 | implementation "androidx.compose.material:material:$compose" 55 | implementation "androidx.compose.ui:ui-tooling:$compose" 56 | 57 | def composeNavigation = "2.4.0-alpha04" 58 | implementation "androidx.navigation:navigation-compose:$composeNavigation" 59 | 60 | def hilt = "2.37" 61 | implementation "com.google.dagger:hilt-android:$hilt" 62 | kapt "com.google.dagger:hilt-compiler:$hilt" 63 | } 64 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("kapt") 5 | id("dagger.hilt.android.plugin") 6 | } 7 | 8 | android { 9 | compileSdk = 30 10 | buildToolsVersion = "30.0.3" 11 | 12 | defaultConfig { 13 | applicationId = "com.codingwithmitch.cleanmultimodule" 14 | minSdk = 21 15 | targetSdk = 30 16 | versionCode = 1 17 | versionName = "1.0" 18 | 19 | } 20 | 21 | buildTypes { 22 | getByName("release") { 23 | isMinifyEnabled = false 24 | } 25 | } 26 | buildFeatures { 27 | compose = true 28 | } 29 | compileOptions { 30 | sourceCompatibility = JavaVersion.VERSION_1_8 31 | targetCompatibility = JavaVersion.VERSION_1_8 32 | } 33 | kotlinOptions { 34 | jvmTarget = "1.8" 35 | useIR = true 36 | } 37 | composeOptions { 38 | val compose = "1.0.0-rc01" 39 | kotlinCompilerExtensionVersion = compose 40 | } 41 | } 42 | 43 | dependencies{ 44 | implementation(project(":home")) 45 | implementation(project(":account")) 46 | 47 | val coreKtx = "1.6.0" 48 | implementation("androidx.core:core-ktx:$coreKtx") 49 | 50 | val appCompat = "1.3.0" 51 | implementation("androidx.appcompat:appcompat:$appCompat") 52 | 53 | val material = "1.4.0" 54 | implementation("com.google.android.material:material:$material") 55 | 56 | val lifecycleRuntime = "2.3.1" 57 | implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleRuntime") 58 | 59 | val lifecycleVmKtx = "2.4.0-alpha02" 60 | implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVmKtx") 61 | 62 | val activityCompose = "1.3.0-rc01" 63 | implementation("androidx.activity:activity-compose:$activityCompose") 64 | 65 | val compose = "1.0.0-rc01" 66 | implementation("androidx.compose.ui:ui:$compose") 67 | implementation("androidx.compose.material:material:$compose") 68 | implementation("androidx.compose.ui:ui-tooling:$compose") 69 | 70 | val composeNavigation = "2.4.0-alpha04" 71 | implementation("androidx.navigation:navigation-compose:$composeNavigation") 72 | 73 | val hilt = "2.37" 74 | implementation("com.google.dagger:hilt-android:$hilt") 75 | kapt("com.google.dagger:hilt-compiler:$hilt") 76 | 77 | val hiltNavigationCompose = "1.0.0-alpha03" 78 | implementation("androidx.hilt:hilt-navigation-compose:$hiltNavigationCompose") 79 | } 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /app/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.kts.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 -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/di/AppModule.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.di 2 | 3 | import dagger.Module 4 | import dagger.Provides 5 | import dagger.hilt.InstallIn 6 | import dagger.hilt.components.SingletonComponent 7 | import javax.inject.Named 8 | import javax.inject.Singleton 9 | 10 | @Module 11 | @InstallIn(SingletonComponent::class) 12 | object AppModule { 13 | 14 | @Singleton 15 | @Provides 16 | @Named("appString") 17 | fun provideAppString(): String{ 18 | return "Application" 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/BaseApplication.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class BaseApplication: Application() { 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation 2 | 3 | import android.os.Bundle 4 | import androidx.activity.compose.setContent 5 | import androidx.appcompat.app.AppCompatActivity 6 | import com.codingwithmitch.cleanmultimodule.presentation.navigation.Navigation 7 | import dagger.hilt.android.AndroidEntryPoint 8 | 9 | @AndroidEntryPoint 10 | class MainActivity : AppCompatActivity() { 11 | 12 | private val TAG: String = "AppDebug" 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContent { 17 | Navigation() 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/navigation/BottomNavItem.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.navigation 2 | 3 | import androidx.annotation.StringRes 4 | import androidx.compose.material.icons.Icons 5 | import androidx.compose.material.icons.filled.AccountBox 6 | import androidx.compose.material.icons.filled.Home 7 | import androidx.compose.ui.graphics.vector.ImageVector 8 | import com.codingwithmitch.cleanmultimodule.R 9 | 10 | sealed class BottomNavItem( 11 | val icon: ImageVector, 12 | @StringRes val contentDescription: Int, 13 | val screen: Screen, 14 | ){ 15 | object Home: BottomNavItem( 16 | Icons.Filled.Home, 17 | R.string.screen_home, 18 | Screen.Home 19 | ) 20 | 21 | object Account: BottomNavItem( 22 | Icons.Filled.AccountBox, 23 | R.string.screen_account, 24 | Screen.Account 25 | ) 26 | } 27 | 28 | 29 | fun Screen.getBottomNavItem(): BottomNavItem{ 30 | return when(this){ 31 | is Screen.Home -> { 32 | BottomNavItem.Home 33 | } 34 | is Screen.Account -> { 35 | BottomNavItem.Account 36 | } 37 | } 38 | } 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/navigation/Navigation.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.navigation 2 | 3 | import androidx.compose.foundation.layout.padding 4 | import androidx.compose.material.* 5 | import androidx.compose.runtime.Composable 6 | import androidx.compose.runtime.getValue 7 | import androidx.compose.runtime.remember 8 | import androidx.compose.ui.Modifier 9 | import androidx.compose.ui.res.stringResource 10 | import androidx.hilt.navigation.compose.hiltViewModel 11 | import androidx.navigation.NavDestination.Companion.hierarchy 12 | import androidx.navigation.NavGraph.Companion.findStartDestination 13 | import androidx.navigation.compose.NavHost 14 | import androidx.navigation.compose.composable 15 | import androidx.navigation.compose.currentBackStackEntryAsState 16 | import androidx.navigation.compose.rememberNavController 17 | import com.codingwithmitch.account.AccountScreen 18 | import com.codingwithmitch.account.presentation.account.AccountViewModel 19 | import com.codingwithmitch.cleanmultimodule.presentation.theme.AppTheme 20 | import com.codingwithmitch.home.presentation.HomeScreen 21 | import com.codingwithmitch.home.presentation.home.HomeViewModel 22 | 23 | @Composable 24 | fun Navigation(){ 25 | AppTheme( 26 | darkTheme = false 27 | ) { 28 | val navController = rememberNavController() 29 | val destinations = remember { listOf(Screen.Home, Screen.Account)} 30 | Scaffold( 31 | bottomBar = { 32 | BottomNavigation { 33 | val navBackStackEntry by navController.currentBackStackEntryAsState() 34 | val currentDestination = navBackStackEntry?.destination 35 | destinations.forEach { screen -> 36 | val bottomNavItem = screen.getBottomNavItem() 37 | BottomNavigationItem( 38 | icon = { 39 | Icon( 40 | bottomNavItem.icon, 41 | contentDescription = stringResource(id = bottomNavItem.contentDescription) 42 | ) 43 | }, 44 | label = { Text(stringResource(screen.resourceId)) }, 45 | selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, 46 | onClick = { 47 | navController.navigate(screen.route) { 48 | // Pop up to the start destination of the graph to 49 | // avoid building up a large stack of destinations 50 | // on the back stack as users select items 51 | popUpTo(navController.graph.findStartDestination().id) { 52 | saveState = true 53 | } 54 | // Avoid multiple copies of the same destination when 55 | // reselecting the same item 56 | launchSingleTop = true 57 | // Restore state when reselecting a previously selected item 58 | restoreState = true 59 | } 60 | } 61 | ) 62 | } 63 | } 64 | } 65 | ) { innerPadding -> 66 | NavHost(navController = navController, startDestination = Screen.Home.route, Modifier.padding(innerPadding)) { 67 | composable(route = Screen.Home.route) { backStackEntry -> 68 | val viewModel: HomeViewModel = hiltViewModel() 69 | HomeScreen(viewModel.value) 70 | } 71 | composable(route = Screen.Account.route) { backStackEntry -> 72 | val viewModel: AccountViewModel = hiltViewModel() 73 | AccountScreen(viewModel.value) 74 | } 75 | } 76 | } 77 | 78 | } 79 | } 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/navigation/Screen.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.navigation 2 | 3 | import androidx.annotation.StringRes 4 | import com.codingwithmitch.cleanmultimodule.R 5 | 6 | sealed class Screen( 7 | val route: String, 8 | @StringRes val resourceId: Int, 9 | ){ 10 | object Home: Screen("home", R.string.screen_home) 11 | 12 | object Account: Screen("account", R.string.screen_account) 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.theme 2 | 3 | import androidx.compose.foundation.isSystemInDarkTheme 4 | import androidx.compose.material.MaterialTheme 5 | import androidx.compose.material.darkColors 6 | import androidx.compose.material.lightColors 7 | import androidx.compose.runtime.Composable 8 | 9 | private val DarkColorPalette = darkColors( 10 | primary = Purple200, 11 | primaryVariant = Purple700, 12 | secondary = Teal200 13 | ) 14 | 15 | private val LightColorPalette = lightColors( 16 | primary = Purple500, 17 | primaryVariant = Purple700, 18 | secondary = Teal200 19 | 20 | /* Other default colors to override 21 | background = Color.White, 22 | surface = Color.White, 23 | onPrimary = Color.White, 24 | onSecondary = Color.Black, 25 | onBackground = Color.Black, 26 | onSurface = Color.Black, 27 | */ 28 | ) 29 | 30 | @Composable 31 | fun AppTheme( 32 | darkTheme: Boolean = isSystemInDarkTheme(), 33 | content: @Composable() () -> Unit 34 | ) { 35 | val colors = if (darkTheme) { 36 | DarkColorPalette 37 | } else { 38 | LightColorPalette 39 | } 40 | 41 | MaterialTheme( 42 | colors = colors, 43 | typography = Typography, 44 | shapes = Shapes, 45 | content = content 46 | ) 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/codingwithmitch/cleanmultimodule/presentation/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.codingwithmitch.cleanmultimodule.presentation.theme 2 | 3 | import androidx.compose.material.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | body1 = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp 15 | ) 16 | /* Other default text styles to override 17 | button = TextStyle( 18 | fontFamily = FontFamily.Default, 19 | fontWeight = FontWeight.W500, 20 | fontSize = 14.sp 21 | ), 22 | caption = TextStyle( 23 | fontFamily = FontFamily.Default, 24 | fontWeight = FontWeight.Normal, 25 | fontSize = 12.sp 26 | ) 27 | */ 28 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/CleanMultiModule/f8ea5bbec178cc669d31cea4523f2d4dc39447ac/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | CleanMultiModule 3 | Home 4 | Account 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |