From dff7df305ff72528a24e3302342ffa80209b0f66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 16:49:45 +0000 Subject: [PATCH 01/12] chore(deps): bump androidx.activity:activity-compose Bumps androidx.activity:activity-compose from 1.12.2 to 1.12.3. --- updated-dependencies: - dependency-name: androidx.activity:activity-compose dependency-version: 1.12.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3dc92b52..d577dff7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ coroutines = "1.10.2" lifecycle = "2.10.0" koin = "4.1.1" composeBom = "2026.01.00" -compose-activity = "1.12.2" +compose-activity = "1.12.3" compose-viewmodel = "2.10.0" datastorePreferences = "1.2.0" kotlinSerializationJson = "1.10.0" From f362ba7e094c46d778eb920661fd50755902cac0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 16:49:41 +0000 Subject: [PATCH 02/12] chore(deps): bump com.google.devtools.ksp from 2.3.4 to 2.3.5 Bumps [com.google.devtools.ksp](https://github.com/google/ksp) from 2.3.4 to 2.3.5. - [Release notes](https://github.com/google/ksp/releases) - [Commits](https://github.com/google/ksp/compare/2.3.4...2.3.5) --- updated-dependencies: - dependency-name: com.google.devtools.ksp dependency-version: 2.3.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3dc92b52..b5176735 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ kotlinSerializationJson = "1.10.0" # Plugin versions agp = "9.0.0" -ksp = "2.3.4" +ksp = "2.3.5" kotlin = "2.3.0" oss-license-plugin = "0.10.10" # Also update in settings.gradle.kts From 0e8e18bd6f9999ace9f13ad956e908ae5c77a6ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 16:53:20 +0000 Subject: [PATCH 03/12] chore(deps): bump androidx.compose:compose-bom Bumps androidx.compose:compose-bom from 2026.01.00 to 2026.01.01. --- updated-dependencies: - dependency-name: androidx.compose:compose-bom dependency-version: 2026.01.01 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 585366f8..105f23aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ androidx-test-ext-junit = "1.3.0" coroutines = "1.10.2" lifecycle = "2.10.0" koin = "4.1.1" -composeBom = "2026.01.00" +composeBom = "2026.01.01" compose-activity = "1.12.3" compose-viewmodel = "2.10.0" datastorePreferences = "1.2.0" From 921c7995bf09189560c659e1e3749fe349b1eb97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 16:48:51 +0000 Subject: [PATCH 04/12] chore(deps): bump gradle-wrapper from 9.3.0 to 9.3.1 Bumps gradle-wrapper from 9.3.0 to 9.3.1. --- updated-dependencies: - dependency-name: gradle-wrapper dependency-version: 9.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19a6bdeb..37f78a6a 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.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From d52504d5235c2c22a6dc14a03058d382339b142b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 4 Feb 2026 19:07:27 +0530 Subject: [PATCH 05/12] chore: refactor app/build.gradle.kts --- app/build.gradle.kts | 216 +++++++++++++++++++++---------------------- 1 file changed, 107 insertions(+), 109 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b187d9af..1d9e149d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -62,134 +62,132 @@ kotlin { } android { - (this as ApplicationExtension).apply { - compileSdk = appCompileSdk - namespace = appNamespace + compileSdk = appCompileSdk + namespace = appNamespace - defaultConfig { - applicationId = appNamespace - minSdk = appMinSdk - targetSdk = appTargetSdk - versionCode = appVersionCode + defaultConfig { + applicationId = appNamespace + minSdk = appMinSdk + targetSdk = appTargetSdk + versionCode = appVersionCode - // WARN: Keep it consistent with the res value property in build variants below... - versionName = appVersionName + // WARN: Keep it consistent with the res value property in build variants below... + versionName = appVersionName - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - signingConfigs { - create("release") { - val keystorePropertiesFile = rootProject.file("keystore.properties") - if (keystorePropertiesFile.exists()) { - val keystoreProperties = Properties() - keystoreProperties.load(FileInputStream(keystorePropertiesFile)) - - keyAlias = keystoreProperties.getProperty("keyAlias") - keyPassword = keystoreProperties.getProperty("keyPassword") - storeFile = file(keystoreProperties.getProperty("storeFile")) - storePassword = keystoreProperties.getProperty("storePassword") - } else { - logger.warn("WARNING: keystore.properties not found for release signing config.") - // throw GradleException("keystore.properties not found!") - } - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - create("staging") { - val keystorePropertiesFile = rootProject.file("staging-keystore.properties") - if (keystorePropertiesFile.exists()) { - val keystoreProperties = Properties() - keystoreProperties.load(FileInputStream(keystorePropertiesFile)) - - keyAlias = keystoreProperties.getProperty("stagingKeyAlias") - keyPassword = keystoreProperties.getProperty("stagingKeyPassword") - storeFile = file(keystoreProperties.getProperty("stagingStoreFile")) - storePassword = keystoreProperties.getProperty("stagingStorePassword") - } else { - logger.warn("WARNING: keystore.properties not found for release signing config.") - // throw GradleException("keystore.properties not found!") - } + signingConfigs { + create("release") { + val keystorePropertiesFile = rootProject.file("keystore.properties") + if (keystorePropertiesFile.exists()) { + val keystoreProperties = Properties() + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + storeFile = file(keystoreProperties.getProperty("storeFile")) + storePassword = keystoreProperties.getProperty("storePassword") + } else { + logger.warn("WARNING: keystore.properties not found for release signing config.") + // throw GradleException("keystore.properties not found!") } } - splits { - abi { - isEnable = true - reset() - include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") - isUniversalApk = true + create("staging") { + val keystorePropertiesFile = rootProject.file("staging-keystore.properties") + if (keystorePropertiesFile.exists()) { + val keystoreProperties = Properties() + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + + keyAlias = keystoreProperties.getProperty("stagingKeyAlias") + keyPassword = keystoreProperties.getProperty("stagingKeyPassword") + storeFile = file(keystoreProperties.getProperty("stagingStoreFile")) + storePassword = keystoreProperties.getProperty("stagingStorePassword") + } else { + logger.warn("WARNING: keystore.properties not found for release signing config.") + // throw GradleException("keystore.properties not found!") } } + } - lint { - // baseline = rootProject.file("lint-baseline.xml") // If you use a baseline - lintConfig = rootProject.file("lint.xml") + splits { + abi { + isEnable = true + reset() + include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + isUniversalApk = true } + } - buildTypes { - getByName("release") { - if (rootProject.file("keystore.properties").exists()) { - signingConfig = signingConfigs.getByName("release") - } else { - logger.warn("WARNING: Release build will not be signed as keystore.properties is missing.") - // throw GradleException("Can't Sign Release Build") - } - - isDebuggable = false - isShrinkResources = true - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - - resValue("string", "app_name", appBaseName) - resValue("string", "app_version", appLabel) - - manifestPlaceholders["appIcon"] = mainIcon - manifestPlaceholders["appRoundIcon"] = mainRoundIcon - } + lint { + // baseline = rootProject.file("lint-baseline.xml") // If you use a baseline + lintConfig = rootProject.file("lint.xml") + } - create("staging") { - if (rootProject.file("staging-keystore.properties").exists()) { - signingConfig = signingConfigs.getByName("staging") - } else { - logger.warn("WARNING: Staging build will not be signed as staging-keystore.properties is missing.") - // throw GradleException("Can't Sign Staging Build") - } - - applicationIdSuffix = ".staging" - versionNameSuffix = "-Staging" - - isDebuggable = false - isShrinkResources = true - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - - resValue("string", "app_name", "$appBaseName Staging") - resValue("string", "app_version", appDevLabel) - - manifestPlaceholders["appIcon"] = devIcon - manifestPlaceholders["appRoundIcon"] = devRoundIcon + buildTypes { + getByName("release") { + if (rootProject.file("keystore.properties").exists()) { + signingConfig = signingConfigs.getByName("release") + } else { + logger.warn("WARNING: Release build will not be signed as keystore.properties is missing.") + // throw GradleException("Can't Sign Release Build") } - getByName("debug") { - applicationIdSuffix = ".dev" - versionNameSuffix = "-Dev" + isDebuggable = false + isShrinkResources = true + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) - isDebuggable = true - isShrinkResources = false - isMinifyEnabled = false + resValue("string", "app_name", appBaseName) + resValue("string", "app_version", appLabel) - resValue("string", "app_name", "$appBaseName Debug") - resValue("string", "app_version", appDevLabel) + manifestPlaceholders["appIcon"] = mainIcon + manifestPlaceholders["appRoundIcon"] = mainRoundIcon + } - manifestPlaceholders["appIcon"] = devIcon - manifestPlaceholders["appRoundIcon"] = devRoundIcon + create("staging") { + if (rootProject.file("staging-keystore.properties").exists()) { + signingConfig = signingConfigs.getByName("staging") + } else { + logger.warn("WARNING: Staging build will not be signed as staging-keystore.properties is missing.") + // throw GradleException("Can't Sign Staging Build") } + + applicationIdSuffix = ".staging" + versionNameSuffix = "-Staging" + + isDebuggable = false + isShrinkResources = true + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + + resValue("string", "app_name", "$appBaseName Staging") + resValue("string", "app_version", appDevLabel) + + manifestPlaceholders["appIcon"] = devIcon + manifestPlaceholders["appRoundIcon"] = devRoundIcon + } + + getByName("debug") { + applicationIdSuffix = ".dev" + versionNameSuffix = "-Dev" + + isDebuggable = true + isShrinkResources = false + isMinifyEnabled = false + + resValue("string", "app_name", "$appBaseName Debug") + resValue("string", "app_version", appDevLabel) + + manifestPlaceholders["appIcon"] = devIcon + manifestPlaceholders["appRoundIcon"] = devRoundIcon } } From 7c41ce96c4d1816d1a5baf7f4dfb308b244a711e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 4 Feb 2026 19:21:53 +0530 Subject: [PATCH 06/12] feat: Classical & Modern layout in navigation --- .../passcodes/navigation/NavigationRoot.kt | 62 ++++++++++++++++--- 1 file changed, 55 insertions(+), 7 deletions(-) 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 7bc32ae0..e693e47d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt @@ -2,6 +2,8 @@ package com.jeeldobariya.passcodes.navigation import androidx.compose.runtime.Composable import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator +import androidx.navigation3.runtime.NavBackStack +import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator @@ -14,14 +16,48 @@ import com.jeeldobariya.passcodes.ui.AboutScreen import com.jeeldobariya.passcodes.ui.MainScreen import com.jeeldobariya.passcodes.ui.SettingsScreen + @Composable -fun NavigationRoot() { - val backStack = rememberNavBackStack(Route.Home) +private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (Route) -> Unit) { + NavDisplay( + backStack = backStack, + onBack = { + backStack.removeLastOrNull() + }, + entryDecorators = mutableListOf( + rememberSaveableStateHolderNavEntryDecorator(), + rememberViewModelStoreNavEntryDecorator() + ), + entryProvider = entryProvider { + entry { + MainScreen(navigateTo) + } - fun navigateTo(route: Route): Unit { - backStack.add(route) - } + entry { + SettingsScreen() + } + + entry { + AboutScreen() + } + entry { + PasswordManagerScreen(navigateTo) + } + + entry { + SavePasswordScreen() + } + + entry { + UpdatePasswordScreen(it.id) + } + } + ) +} + +@Composable +private fun ClassicNavigationRoot(backStack: NavBackStack, navigateTo: (Route) -> Unit) { NavDisplay( backStack = backStack, onBack = { @@ -33,7 +69,7 @@ fun NavigationRoot() { ), entryProvider = entryProvider { entry { - MainScreen(::navigateTo) + MainScreen(navigateTo) } entry { @@ -45,7 +81,7 @@ fun NavigationRoot() { } entry { - PasswordManagerScreen(::navigateTo) + PasswordManagerScreen(navigateTo) } entry { @@ -58,3 +94,15 @@ fun NavigationRoot() { } ) } + +@Composable +fun NavigationRoot(modernLayout: Boolean) { + val backStack = rememberNavBackStack(Route.Home) + + fun navigateTo(route: Route): Unit { + backStack.add(route) + } + + if (modernLayout) ModernNavigationRoot(backStack, ::navigateTo) + else ClassicNavigationRoot(backStack, ::navigateTo) +} From ce3aba8934f0105c570192ed9a7c14725d70f791 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 4 Feb 2026 19:23:34 +0530 Subject: [PATCH 07/12] fix: error --- .../main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt index 6890ee6d..4bbebafe 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -13,7 +13,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { PasscodesTheme { - NavigationRoot() + NavigationRoot(modernLayout = true) } } } From 34b66a59847b2e8124856371b479eabe8bb6d611 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:45:57 +0000 Subject: [PATCH 08/12] chore(deps): bump kotlin from 2.3.0 to 2.3.10 Bumps `kotlin` from 2.3.0 to 2.3.10. Updates `org.jetbrains.kotlin.android` from 2.3.0 to 2.3.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.0...v2.3.10) Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.0 to 2.3.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.0...v2.3.10) Updates `org.jetbrains.kotlin.plugin.serialization` from 2.3.0 to 2.3.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.0...v2.3.10) --- updated-dependencies: - dependency-name: org.jetbrains.kotlin.android dependency-version: 2.3.10 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.jetbrains.kotlin.plugin.compose dependency-version: 2.3.10 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.jetbrains.kotlin.plugin.serialization dependency-version: 2.3.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 105f23aa..a9c57ee0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ kotlinSerializationJson = "1.10.0" # Plugin versions agp = "9.0.0" ksp = "2.3.5" -kotlin = "2.3.0" +kotlin = "2.3.10" oss-license-plugin = "0.10.10" # Also update in settings.gradle.kts From a987363ced6ff0976098553a4cd4e45873aa3c22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:46:11 +0000 Subject: [PATCH 09/12] chore(deps): bump com.google.android.gms:play-services-oss-licenses Bumps com.google.android.gms:play-services-oss-licenses from 17.3.0 to 17.4.0. --- updated-dependencies: - dependency-name: com.google.android.gms:play-services-oss-licenses dependency-version: 17.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 105f23aa..40057f11 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ material = "1.13.0" nav3Core = "1.0.0" lifecycleViewmodelNav3 = "2.10.0" okhttp = "5.3.2" -oss-license = "17.3.0" +oss-license = "17.4.0" appcompat = "1.7.1" room = "2.8.4" json = "20251224" From db5b49450f8e0e6b38c83683e1db8ee33e707c97 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 9 Feb 2026 21:43:01 +0530 Subject: [PATCH 10/12] chore(refactor/feat): write temp code that make it easy to migrate to compose --- .../passcodes/navigation/NavigationRoot.kt | 24 +++++++++++++++---- .../jeeldobariya/passcodes/ui/MainActivity.kt | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) 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 e693e47d..aa712d56 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt @@ -1,6 +1,9 @@ package com.jeeldobariya.passcodes.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavKey @@ -8,6 +11,8 @@ import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.ui.NavDisplay +import com.jeeldobariya.passcodes.core.feature_flags.FeatureFlagsSettings +import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.core.navigation.Route import com.jeeldobariya.passcodes.password_manager.ui.PasswordManagerScreen import com.jeeldobariya.passcodes.password_manager.ui.SavePasswordScreen @@ -34,7 +39,7 @@ private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (R } entry { - SettingsScreen() + PasswordManagerScreen(navigateTo) } entry { @@ -42,7 +47,7 @@ private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (R } entry { - PasswordManagerScreen(navigateTo) + SettingsScreen() } entry { @@ -96,13 +101,22 @@ private fun ClassicNavigationRoot(backStack: NavBackStack, navigateTo: ( } @Composable -fun NavigationRoot(modernLayout: Boolean) { +fun NavigationRoot() { val backStack = rememberNavBackStack(Route.Home) + val flagDataStore = LocalContext.current.featureFlagsDatastore + val flagDatastoreState by flagDataStore.data.collectAsState( + FeatureFlagsSettings( + version = 0, + isPreviewFeaturesEnabled = false, + isPreviewLayoutEnabled = false + ) + ) + fun navigateTo(route: Route): Unit { backStack.add(route) } - if (modernLayout) ModernNavigationRoot(backStack, ::navigateTo) - else ClassicNavigationRoot(backStack, ::navigateTo) + if (flagDatastoreState.isPreviewLayoutEnabled) { ModernNavigationRoot(backStack, ::navigateTo) } + else { ClassicNavigationRoot(backStack, ::navigateTo) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt index 4bbebafe..6890ee6d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -13,7 +13,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { PasscodesTheme { - NavigationRoot(modernLayout = true) + NavigationRoot() } } } From d42de749fffb1db1e61f322b7a99a68a06bd0d28 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 10 Feb 2026 20:44:55 +0530 Subject: [PATCH 11/12] feat: remake old main screen in compose --- .../jeeldobariya/passcodes/ui/MainScreen.kt | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainScreen.kt index 0b9933cf..5472fb96 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainScreen.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -111,6 +112,83 @@ fun MainScreen(navigateTo: (Route) -> Unit) { } } +@Composable +fun ClassicalMainScreen(navigateTo: (Route) -> Unit) { + Scaffold { padding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .padding(horizontal = 24.dp, vertical = 64.dp), + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally + ) { + // Top section + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Image( + painter = painterResource(R.drawable.ic_passcodes), + contentDescription = "Passcodes Icon" + ) + + Spacer(Modifier.height(32.dp)) + + Text( + text = stringResource(R.string.app_name), + style = MaterialTheme.typography.displaySmall + ) + + Text( + text = stringResource(R.string.app_version), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + + // Middle actions (primary content) + Card( + modifier = Modifier + .scale(1.25f) + .width(IntrinsicSize.Max), + shape = MaterialTheme.shapes.extraLarge + ) { + Column( + modifier = Modifier.padding(24.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Button( + onClick = { navigateTo(Route.PasswordManager) }, + modifier = Modifier.fillMaxWidth() + ) { + Icon(imageVector = Icons.Default.Lock, contentDescription = "lock") + Spacer(modifier = Modifier.padding(4.dp)) + Text(text = stringResource(R.string.password_manager_button_text), style = MaterialTheme.typography.bodyLarge) + } + + OutlinedButton( + onClick = { navigateTo(Route.Settings) }, + modifier = Modifier.fillMaxWidth() + ) { + Icon(imageVector = Icons.Default.Settings, contentDescription = "settings") + Spacer(modifier = Modifier.padding(4.dp)) + Text(stringResource(R.string.setting_button_text), style = MaterialTheme.typography.bodyLarge) + } + + OutlinedButton( + onClick = { navigateTo(Route.AboutUs) }, + modifier = Modifier.fillMaxWidth() + ) { + Icon(imageVector = Icons.Default.Info, contentDescription = "info") + Spacer(modifier = Modifier.padding(4.dp)) + Text(stringResource(R.string.about_us_button_text), style = MaterialTheme.typography.bodyLarge) + } + } + } + } + } +} + @Preview(showBackground = true) @PreviewLightDark From 585590750adc1841a4c36a81894fbf0fb2f1afff Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 10 Feb 2026 20:45:30 +0530 Subject: [PATCH 12/12] refactor: navigation --- .../jeeldobariya/passcodes/navigation/NavigationRoot.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 aa712d56..7407fc28 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/navigation/NavigationRoot.kt @@ -18,6 +18,7 @@ import com.jeeldobariya.passcodes.password_manager.ui.PasswordManagerScreen import com.jeeldobariya.passcodes.password_manager.ui.SavePasswordScreen import com.jeeldobariya.passcodes.password_manager.ui.UpdatePasswordScreen import com.jeeldobariya.passcodes.ui.AboutScreen +import com.jeeldobariya.passcodes.ui.ClassicalMainScreen import com.jeeldobariya.passcodes.ui.MainScreen import com.jeeldobariya.passcodes.ui.SettingsScreen @@ -39,7 +40,7 @@ private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (R } entry { - PasswordManagerScreen(navigateTo) + SettingsScreen() } entry { @@ -47,7 +48,7 @@ private fun ModernNavigationRoot(backStack: NavBackStack, navigateTo: (R } entry { - SettingsScreen() + PasswordManagerScreen(navigateTo) } entry { @@ -74,7 +75,7 @@ private fun ClassicNavigationRoot(backStack: NavBackStack, navigateTo: ( ), entryProvider = entryProvider { entry { - MainScreen(navigateTo) + ClassicalMainScreen(navigateTo) } entry {