diff --git a/app/build.gradle.kts b/app/build.gradle.kts index da109e5a..bde0e9a4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,16 +47,16 @@ val devRoundIcon = "@mipmap/dev_ic_launcher_round" plugins { - alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.compose) + alias(libs.plugins.androidApplication) + alias(libs.plugins.composeCompiler) alias(libs.plugins.ksp) - alias(libs.plugins.jetbrains.kotlin.serialization) - alias(libs.plugins.oss.licenses) + alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.ossLicenses) } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget = JvmTarget.JVM_21 } } @@ -205,6 +205,7 @@ android { dependencies { // In project library / feature modules + implementation(project(":design_system")) implementation(project(":core")) implementation(project(":database")) implementation(project(":password_manager")) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36e185e2..667ba8e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:theme="@style/PasscodesTheme.Default" tools:targetApi="33" > - + .modernMainAppEntriesProvider(navigateTo: (Route) -> Unit) { + entry { + ModernMainScreen(navigateTo) + } + + entry { + ModernSettingsScreen() + } + + entry { + ModernAboutScreen() + } +} + +fun EntryProviderScope.classicalMainAppEntriesProvider(navigateTo: (Route) -> Unit) { + entry { + ClassicalMainScreen(navigateTo = navigateTo) + } + + entry { + ClassicalSettingsScreen() + } + + entry { + ClassicalAboutScreen() + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt index 7691086b..50fe1fda 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt @@ -14,20 +14,8 @@ import androidx.navigation3.ui.NavDisplay import com.jeeldobariya.passcodes.core.datastore.AppSettings import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.navigation.Route -import com.jeeldobariya.passcodes.password_manager.presentation.load_password.ClassicalLoadPasswordScreen -import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.ClassicalPasswordManagerScreen -import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.ModernPasswordManagerScreen -import com.jeeldobariya.passcodes.password_manager.presentation.save_password.ClassicalSavePasswordScreen -import com.jeeldobariya.passcodes.password_manager.presentation.save_password.ModernSavePasswordScreen -import com.jeeldobariya.passcodes.password_manager.presentation.update_password.ClassicalUpdatePasswordScreen -import com.jeeldobariya.passcodes.password_manager.presentation.update_password.ModernUpdatePasswordScreen -import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ClassicalViewPasswordScreen -import com.jeeldobariya.passcodes.presentation.about_screen.ClassicalAboutScreen -import com.jeeldobariya.passcodes.presentation.main_screen.ClassicalMainScreen -import com.jeeldobariya.passcodes.presentation.setting_screen.ClassicalSettingsScreen -import com.jeeldobariya.passcodes.presentation.about_screen.ModernAboutScreen -import com.jeeldobariya.passcodes.presentation.main_screen.ModernMainScreen -import com.jeeldobariya.passcodes.presentation.setting_screen.ModernSettingsScreen +import com.jeeldobariya.passcodes.password_manager.navigation.classicalPasswordManagerEntriesProvider +import com.jeeldobariya.passcodes.password_manager.navigation.modernPasswordManagerEntriesProvider @Composable @@ -42,37 +30,8 @@ private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (R rememberViewModelStoreNavEntryDecorator() ), entryProvider = entryProvider { - entry { - ModernMainScreen(navigateTo) - } - - entry { - ModernSettingsScreen() - } - - entry { - ModernAboutScreen() - } - - entry { - ModernPasswordManagerScreen(navigateTo) - } - - entry { - ModernPasswordManagerScreen(navigateTo) - } - - entry { - ModernSavePasswordScreen() - } - - entry { // Theoretically, Should be treated as `UpdatePassword` Route in Modern Layout... - ModernUpdatePasswordScreen(it.id) - } - - entry { - ModernUpdatePasswordScreen(it.id) - } + modernMainAppEntriesProvider(navigateTo = navigateTo) + modernPasswordManagerEntriesProvider(navigateTo = navigateTo) } ) } @@ -89,37 +48,8 @@ private fun ClassicalNavigationRoot(backStack: NavBackStack, navigateTo: rememberViewModelStoreNavEntryDecorator() ), entryProvider = entryProvider { - entry { - ClassicalMainScreen(navigateTo = navigateTo) - } - - entry { - ClassicalSettingsScreen() - } - - entry { - ClassicalAboutScreen() - } - - entry { - ClassicalPasswordManagerScreen(navigateTo = navigateTo) - } - - entry { - ClassicalLoadPasswordScreen(navigateTo = navigateTo) - } - - entry { - ClassicalSavePasswordScreen() - } - - entry { - ClassicalViewPasswordScreen(passwordId = it.id, navigateTo = navigateTo) - } - - entry { - ClassicalUpdatePasswordScreen(passwordId = it.id) - } + classicalMainAppEntriesProvider(navigateTo = navigateTo) + classicalPasswordManagerEntriesProvider(navigateTo = navigateTo) } ) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt index e6c2a6dc..b8c3a0b2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -60,7 +60,7 @@ class MainActivity : AppCompatActivity() { if (featureFlagsDatastore.data.first().isPreviewLayoutEnabled) { Intent( this@MainActivity, - com.jeeldobariya.passcodes.ui.MainActivity::class.java + com.jeeldobariya.passcodes.MainActivity::class.java ).also { startActivity(it) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt index 89876242..1c6ca6d1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt @@ -38,7 +38,7 @@ import androidx.compose.ui.unit.dp import androidx.core.net.toUri import com.jeeldobariya.passcodes.Constant import com.jeeldobariya.passcodes.R -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme @Composable diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ModernAboutScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ModernAboutScreen.kt index d1609492..cc16162c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ModernAboutScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ModernAboutScreen.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.jeeldobariya.passcodes.R -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme @Composable fun ModernAboutScreen() { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ClassicalMainScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ClassicalMainScreen.kt index e0f1d87d..b40fe0f9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ClassicalMainScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ClassicalMainScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.core.navigation.Route -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme @Composable fun ClassicalMainScreen(navigateTo: (Route) -> Unit) { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ModernMainScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ModernMainScreen.kt index 60c3bbac..24372fb0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ModernMainScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/main_screen/ModernMainScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.core.navigation.Route -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme @Composable diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ClassicalSettingsScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ClassicalSettingsScreen.kt index b95e6fce..119fc812 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ClassicalSettingsScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ClassicalSettingsScreen.kt @@ -2,11 +2,13 @@ package com.jeeldobariya.passcodes.presentation.setting_screen import android.content.Intent import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -42,7 +44,7 @@ import com.jeeldobariya.passcodes.core.datastore.AppSettings import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.FeatureFlagsSettings import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch @@ -56,10 +58,6 @@ fun ClassicalSettingsScreen() { private fun ClassicalSettingsScreenContent() { // TODO: Language & Theme need to be done. - val selectedLanguage = "Under Development" - val languageOptions: List = listOf("English", "Korean") - val onLanguageSelected: (String) -> Unit = { /* TODO */ } - val context = LocalContext.current val scope = rememberCoroutineScope() @@ -74,8 +72,6 @@ private fun ClassicalSettingsScreenContent() { val appDataStore = context.appDatastore val appDatastoreState by appDataStore.data.collectAsState(initial = AppSettings()) - var expanded by remember { mutableStateOf(false) } - Scaffold { padding -> LazyColumn( @@ -97,85 +93,32 @@ private fun ClassicalSettingsScreenContent() { ) } - // Language Card - item { - Card(shape = RoundedCornerShape(16.dp)) { - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - - Text( - modifier = Modifier.padding(4.dp), - text = stringResource(R.string.label_language_setting), - color = MaterialTheme.colorScheme.primary, - style = MaterialTheme.typography.bodyMedium - ) - - ExposedDropdownMenuBox( - expanded = expanded, - onExpandedChange = { expanded = !expanded } + if (!flagDatastoreState.isPreviewFeaturesEnabled) { + item { + Card(shape = RoundedCornerShape(16.dp)) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceEvenly ) { - OutlinedTextField( - value = selectedLanguage, - onValueChange = {}, - readOnly = true, - trailingIcon = { - ExposedDropdownMenuDefaults.TrailingIcon(expanded) - }, - modifier = Modifier.menuAnchor( - ExposedDropdownMenuAnchorType.PrimaryNotEditable, - enabled = true - ) - ) - - ExposedDropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false } - ) { - languageOptions.forEach { lang -> - DropdownMenuItem( - text = { Text(lang) }, - onClick = { - onLanguageSelected(lang) - expanded = false - } - ) - } - } - } - } - } - } - - // Theme Card - item { - Card(shape = RoundedCornerShape(16.dp)) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - - Text( - text = stringResource(R.string.label_theme_setting), - color = MaterialTheme.colorScheme.primary - ) - - Button(onClick = { /* TODO */ }) { + Text(text = "Coming Soon", style = MaterialTheme.typography.titleLarge) Text( - text = stringResource(R.string.toggle_theme_button_text), - style = MaterialTheme.typography.labelMedium + text = "Language & Theme features are currently under development", + style = MaterialTheme.typography.labelSmall, + textAlign = TextAlign.Center ) } } } + } else { + // Language Card + item { + PreviewLanguageFeatures() + } + + previewThemeFeatures() } // Latest Features Switch @@ -271,6 +214,97 @@ private fun ClassicalSettingsScreenContent() { } } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun PreviewLanguageFeatures() { + val selectedLanguage = "Under Development" + val languageOptions: List = listOf("English", "Korean") + val onLanguageSelected: (String) -> Unit = { /* TODO */ } + + var expanded by remember { mutableStateOf(false) } + + Card(shape = RoundedCornerShape(16.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + + Text( + modifier = Modifier.padding(4.dp), + text = stringResource(R.string.label_language_setting), + color = MaterialTheme.colorScheme.primary, + style = MaterialTheme.typography.bodyMedium + ) + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded } + ) { + OutlinedTextField( + value = selectedLanguage, + onValueChange = {}, + readOnly = true, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon(expanded) + }, + modifier = Modifier.menuAnchor( + ExposedDropdownMenuAnchorType.PrimaryNotEditable, + enabled = true + ) + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + languageOptions.forEach { lang -> + DropdownMenuItem( + text = { Text(lang) }, + onClick = { + onLanguageSelected(lang) + expanded = false + } + ) + } + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +private fun LazyListScope.previewThemeFeatures() { + // Theme Card + item { + Card(shape = RoundedCornerShape(16.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + + Text( + text = stringResource(R.string.label_theme_setting), + color = MaterialTheme.colorScheme.primary + ) + + Button(onClick = { /* TODO */ }) { + Text( + text = stringResource(R.string.toggle_theme_button_text), + style = MaterialTheme.typography.labelMedium + ) + } + } + } + } +} + + @Composable private fun SwitchCard( text: String, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ModernSettingsScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ModernSettingsScreen.kt index a651b5f9..61cd3f5f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ModernSettingsScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/setting_screen/ModernSettingsScreen.kt @@ -42,7 +42,7 @@ import com.jeeldobariya.passcodes.core.datastore.AppSettings import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.FeatureFlagsSettings import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch @Composable diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Color.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Color.kt deleted file mode 100644 index 4ed93138..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Color.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.jeeldobariya.passcodes.ui.ui.theme - -import androidx.compose.ui.graphics.Color - -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) - -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Theme.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Theme.kt deleted file mode 100644 index 047c32fc..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Theme.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.jeeldobariya.passcodes.ui.ui.theme - -import android.os.Build -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext - -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 -) - -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ -) - -@Composable -fun PasscodesTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, - content: @Composable () -> Unit -) { - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> DarkColorScheme - else -> LightColorScheme - } - - MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content - ) -} diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index ac29b3a4..3a184b45 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -1,13 +1,13 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - alias(libs.plugins.android.library) + alias(libs.plugins.androidLibrary) alias(libs.plugins.ksp) } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget = JvmTarget.JVM_21 } } diff --git a/build.gradle.kts b/build.gradle.kts index 38f2a5a7..e0de4eee 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,11 +1,13 @@ plugins { - alias(libs.plugins.android.application) apply false - alias(libs.plugins.kotlin.android) apply false - alias(libs.plugins.kotlin.compose) apply false - alias(libs.plugins.jetbrains.kotlin.serialization) apply false + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.androidLibrary) apply false + alias(libs.plugins.composeMultiplatform) apply false + alias(libs.plugins.composeCompiler) apply false + alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.androidKmpLibrary) apply false + alias(libs.plugins.kotlinSerialization) apply false alias(libs.plugins.ksp) apply false - alias(libs.plugins.oss.licenses) apply false - alias(libs.plugins.android.library) apply false + alias(libs.plugins.ossLicenses) apply false } // All projects block is common for setting up common repositories for all subprojects. diff --git a/core/build.gradle.kts b/core/build.gradle.kts index a4a07467..e81002e2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,13 +1,13 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.jetbrains.kotlin.serialization) + alias(libs.plugins.androidLibrary) + alias(libs.plugins.kotlinSerialization) } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget = JvmTarget.JVM_21 } } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index ea4eb49d..053a1d98 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -1,13 +1,13 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - alias(libs.plugins.android.library) + alias(libs.plugins.androidLibrary) alias(libs.plugins.ksp) } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget = JvmTarget.JVM_21 } } diff --git a/design_system/.gitignore b/design_system/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/design_system/.gitignore @@ -0,0 +1 @@ +/build diff --git a/design_system/build.gradle.kts b/design_system/build.gradle.kts new file mode 100644 index 00000000..4a266d94 --- /dev/null +++ b/design_system/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.composeMultiplatform) + alias(libs.plugins.composeCompiler) + alias(libs.plugins.androidKmpLibrary) +} + +kotlin { + androidLibrary { + compileSdk = 36 + minSdk = 26 + namespace = "com.jeeldobariya.passcodes.design_system" + experimentalProperties["android.experimental.kmp.enableAndroidResources"] = true + } + +// listOf( +// iosArm64(), +// iosSimulatorArm64() +// ).forEach { iosTarget -> +// iosTarget.binaries.framework { +// baseName = "ComposeApp" +// isStatic = true +// } +// } +// +// jvm("desktop") + + sourceSets { +// androidMain.dependencies { +// implementation(compose.preview) +// implementation(libs.androidx.activity.compose) +// } + commonMain.dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.components.resources) + implementation(compose.preview) +// implementation(libs.androidx.lifecycle.viewmodelCompose) +// implementation(libs.androidx.lifecycle.runtimeCompose) + } +// commonTest.dependencies { +// implementation(libs.kotlin.test) +// } +// val desktopMain by getting +// desktopMain.dependencies { +// implementation(compose.desktop.currentOs) +// } + } +} diff --git a/design_system/consumer-rules.pro b/design_system/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/design_system/proguard-rules.pro b/design_system/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/design_system/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Color.kt b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Color.kt new file mode 100644 index 00000000..451ebc1c --- /dev/null +++ b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Color.kt @@ -0,0 +1,27 @@ +package com.jeeldobariya.passcodes.design_system.theme + +import androidx.compose.ui.graphics.Color + +// Primary +val primaryLight = Color(0xFF6750A4) +val primaryDark = Color(0xFFD0BCFF) + +// Secondary +val secondaryLight = Color(0xFF625B71) +val secondaryDark = Color(0xFFCCC2DC) + +// Tertiary +val tertiaryLight = Color(0xFF7D5260) +val tertiaryDark = Color(0xFFEFB8C8) + +// Background +val BackgroundLight = Color(0xFFFFFBFE) +val BackgroundDark = Color(0xFF1C1B1F) + +// Surface +val SurfaceLight = Color(0xFFFFFBFE) +val SurfaceDark = Color(0xFF1C1B1F) + +// Error +val ErrorLight = Color(0xFFB3261E) +val ErrorDark = Color(0xFFF2B8B5) diff --git a/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/ColorTheme.kt b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/ColorTheme.kt new file mode 100644 index 00000000..0937a6dd --- /dev/null +++ b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/ColorTheme.kt @@ -0,0 +1,8 @@ +package com.jeeldobariya.passcodes.design_system.theme + +import androidx.compose.material3.ColorScheme + +data class ColorTheme( + val lightColorScheme: ColorScheme, + val darkColorScheme: ColorScheme +) diff --git a/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Theme.kt b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Theme.kt new file mode 100644 index 00000000..1e02e883 --- /dev/null +++ b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Theme.kt @@ -0,0 +1,51 @@ +package com.jeeldobariya.passcodes.design_system.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable + +private val PasscodesColorScheme = ColorTheme( + lightColorScheme = lightColorScheme( + primary = primaryLight, + secondary = secondaryLight, + tertiary = tertiaryLight, + background = BackgroundLight, + surface = SurfaceLight, + error = ErrorLight + ), + darkColorScheme = darkColorScheme( + primary = primaryDark, + secondary = secondaryDark, + tertiary = tertiaryDark, + background = BackgroundDark, + surface = SurfaceDark, + error = ErrorDark + ) +) + +@Composable +fun PasscodesTheme( + colorTheme: ColorTheme = PasscodesColorScheme, + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + // dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { +// dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { +// val context = LocalContext.current +// if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) +// } + + darkTheme -> colorTheme.darkColorScheme + else -> colorTheme.lightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Type.kt b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Type.kt similarity index 94% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Type.kt rename to design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Type.kt index f456b139..107d6074 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ui/theme/Type.kt +++ b/design_system/src/commonMain/kotlin/com/jeeldobariya/passcodes/design_system/theme/Type.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.ui.ui.theme +package com.jeeldobariya.passcodes.design_system.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fabf6b0d..3096c139 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ androidx-test-ext-junit = "1.3.0" coroutines = "1.10.2" lifecycle = "2.10.0" koin = "4.1.1" +composeMultiplatform = "1.10.2" composeBom = "2026.02.01" compose-activity = "1.12.4" compose-viewmodel = "2.10.0" @@ -22,7 +23,7 @@ datastorePreferences = "1.2.0" kotlinSerializationJson = "1.10.0" # Plugin versions -agp = "9.0.1" +agp = "9.1.0" ksp = "2.3.6" kotlin = "2.3.10" oss-license-plugin = "0.10.10" # Also update in settings.gradle.kts @@ -117,10 +118,12 @@ unit-test = ["junit", "truth"] [plugins] -android-application = { id = "com.android.application", version.ref = "agp" } -android-library = { id = "com.android.library", version.ref = "agp" } -kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } -jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +androidApplication = { id = "com.android.application", version.ref = "agp" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" } +composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +androidKmpLibrary = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } +kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } -oss-licenses = { id = "com.google.android.gms.oss-licenses-plugin", version.ref = "oss-license-plugin" } +ossLicenses = { id = "com.google.android.gms.oss-licenses-plugin", version.ref = "oss-license-plugin" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 61285a65..d997cfc6 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6a..dbc3ce4a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index adff685a..0262dcbd 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 3c90e627..acb9cec9 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -1,14 +1,14 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.kotlin.compose) - alias(libs.plugins.jetbrains.kotlin.serialization) + alias(libs.plugins.androidLibrary) + alias(libs.plugins.composeCompiler) + alias(libs.plugins.kotlinSerialization) } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget = JvmTarget.JVM_21 } } @@ -51,6 +51,7 @@ android { } dependencies { + implementation(project(":design_system")) implementation(project(":core")) implementation(project(":database")) diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/navigation/EntriesProvider.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/navigation/EntriesProvider.kt new file mode 100644 index 00000000..a255bfad --- /dev/null +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/navigation/EntriesProvider.kt @@ -0,0 +1,57 @@ +package com.jeeldobariya.passcodes.password_manager.navigation + +import androidx.navigation3.runtime.EntryProviderScope +import androidx.navigation3.runtime.NavKey +import com.jeeldobariya.passcodes.core.navigation.Route +import com.jeeldobariya.passcodes.password_manager.presentation.load_password.ClassicalLoadPasswordScreen +import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.ClassicalPasswordManagerScreen +import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.ModernPasswordManagerScreen +import com.jeeldobariya.passcodes.password_manager.presentation.save_password.ClassicalSavePasswordScreen +import com.jeeldobariya.passcodes.password_manager.presentation.save_password.ModernSavePasswordScreen +import com.jeeldobariya.passcodes.password_manager.presentation.update_password.ClassicalUpdatePasswordScreen +import com.jeeldobariya.passcodes.password_manager.presentation.update_password.ModernUpdatePasswordScreen +import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ClassicalViewPasswordScreen + +fun EntryProviderScope.modernPasswordManagerEntriesProvider(navigateTo: (Route) -> Unit) { + entry { + ModernPasswordManagerScreen(navigateTo) + } + + entry { + ModernPasswordManagerScreen(navigateTo) + } + + entry { + ModernSavePasswordScreen() + } + + entry { // Theoretically, Should be treated as `UpdatePassword` Route in Modern Layout... + ModernUpdatePasswordScreen(it.id) + } + + entry { + ModernUpdatePasswordScreen(it.id) + } +} + +fun EntryProviderScope.classicalPasswordManagerEntriesProvider(navigateTo: (Route) -> Unit) { + entry { + ClassicalPasswordManagerScreen(navigateTo = navigateTo) + } + + entry { + ClassicalLoadPasswordScreen(navigateTo = navigateTo) + } + + entry { + ClassicalSavePasswordScreen() + } + + entry { + ClassicalViewPasswordScreen(passwordId = it.id, navigateTo = navigateTo) + } + + entry { + ClassicalUpdatePasswordScreen(passwordId = it.id) + } +} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/ClassicalLoadPasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/ClassicalLoadPasswordScreen.kt index a0f5d392..99cc3c91 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/ClassicalLoadPasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/ClassicalLoadPasswordScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.jeeldobariya.passcodes.core.navigation.Route +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import org.koin.compose.viewmodel.koinViewModel @@ -91,8 +92,10 @@ private fun ClassicalLoadPasswordScreenContent( @Preview @Composable private fun ClassicalLoadPasswordScreenPreview() { - ClassicalLoadPasswordScreenContent( - state = LoadPasswordState(), - navigateTo = {} - ) + PasscodesTheme { + ClassicalLoadPasswordScreenContent( + state = LoadPasswordState(), + navigateTo = {} + ) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt index 1e8bf5ac..bfe040e7 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.jeeldobariya.passcodes.core.navigation.Route +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -61,5 +62,7 @@ private fun ClassicalPasswordManagerScreenContent( @Preview @Composable private fun ClassicalPasswordManagerScreenPreview() { - ClassicalPasswordManagerScreenContent(navigateTo = {}) + PasscodesTheme { + ClassicalPasswordManagerScreenContent(navigateTo = {}) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ModernPasswordManagerScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ModernPasswordManagerScreen.kt index c580bd8b..46d06c9f 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ModernPasswordManagerScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ModernPasswordManagerScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.jeeldobariya.passcodes.core.navigation.Route +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch import org.koin.compose.viewmodel.koinViewModel @@ -113,8 +114,10 @@ private fun ModernPasswordManagerScreenContent( @Preview @Composable private fun ModernPasswordManagerScreenPreview() { - ModernPasswordManagerScreenContent( - state = PasswordManagerState(), - navigateTo = {} - ) + PasscodesTheme { + ModernPasswordManagerScreenContent( + state = PasswordManagerState(), + navigateTo = {} + ) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ClassicalSavePasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ClassicalSavePasswordScreen.kt index 5e3a2084..251c17fa 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ClassicalSavePasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ClassicalSavePasswordScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch import org.koin.compose.viewmodel.koinViewModel @@ -120,8 +121,10 @@ private fun ClassicalSavePasswordScreenContent( @Preview @Composable private fun ClassicalSavePasswordScreenPreview() { - ClassicalSavePasswordScreenContent( - state = SavePasswordState(), - onAction = {} - ) + PasscodesTheme { + ClassicalSavePasswordScreenContent( + state = SavePasswordState(), + onAction = {} + ) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ModernSavePasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ModernSavePasswordScreen.kt index 99bbc69f..2dd759d6 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ModernSavePasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/ModernSavePasswordScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch import org.koin.compose.viewmodel.koinViewModel @@ -112,5 +113,7 @@ private fun ModernSavePasswordScreenContent( @Preview @Composable private fun ModernSavePasswordScreenPreview() { - ModernSavePasswordScreenContent(state = SavePasswordState(), onAction = {}) + PasscodesTheme { + ModernSavePasswordScreenContent(state = SavePasswordState(), onAction = {}) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ClassicalUpdatePasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ClassicalUpdatePasswordScreen.kt index 99236822..778eba68 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ClassicalUpdatePasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ClassicalUpdatePasswordScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch import org.koin.compose.viewmodel.koinViewModel @@ -117,5 +118,7 @@ private fun ClassicalUpdatePasswordScreenContent( @Preview @Composable private fun ClassicalUpdatePasswordScreenPreview() { - ClassicalUpdatePasswordScreenContent(state = UpdatePasswordState(), onAction = {}) + PasscodesTheme { + ClassicalUpdatePasswordScreenContent(state = UpdatePasswordState(), onAction = {}) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ModernUpdatePasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ModernUpdatePasswordScreen.kt index 91e0030d..a8dfee64 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ModernUpdatePasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/ModernUpdatePasswordScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import kotlinx.coroutines.launch import org.koin.compose.viewmodel.koinViewModel @@ -113,5 +114,7 @@ private fun ModernUpdatePasswordScreenContent( @Preview @Composable private fun ModernUpdatePasswordScreenPreview() { - ModernUpdatePasswordScreenContent(state = UpdatePasswordState(), onAction = {}) + PasscodesTheme { + ModernUpdatePasswordScreenContent(state = UpdatePasswordState(), onAction = {}) + } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt index caf342ef..c128d6a7 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.jeeldobariya.passcodes.core.navigation.Route +import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme import org.koin.compose.viewmodel.koinViewModel @@ -95,10 +96,12 @@ private fun ClassicalViewPasswordScreenContent( @Preview @Composable private fun ClassicalViewPasswordScreenPreview() { - ClassicalViewPasswordScreenContent( - passwordId = 0, - state = ViewPasswordState(), - onAction = {}, - navigateTo = {} - ) + PasscodesTheme { + ClassicalViewPasswordScreenContent( + passwordId = 0, + state = ViewPasswordState(), + onAction = {}, + navigateTo = {} + ) + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 0ac5b0cf..fedcf1af 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,6 +18,7 @@ plugins { // Defines all modules in your project include(":app") +include(":design_system") include(":core") include(":autofill") include(":database")