Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
dff7df3
chore(deps): bump androidx.activity:activity-compose
dependabot[bot] Feb 1, 2026
f362ba7
chore(deps): bump com.google.devtools.ksp from 2.3.4 to 2.3.5
dependabot[bot] Feb 1, 2026
5267302
chore(deps): bump androidx.activity:activity-compose from 1.12.2 to 1…
JeelDobariya38 Feb 1, 2026
0e8e18b
chore(deps): bump androidx.compose:compose-bom
dependabot[bot] Feb 1, 2026
ff1fe4d
chore(deps): bump com.google.devtools.ksp from 2.3.4 to 2.3.5 (#87)
JeelDobariya38 Feb 1, 2026
921c799
chore(deps): bump gradle-wrapper from 9.3.0 to 9.3.1
dependabot[bot] Feb 1, 2026
622cb88
chore(deps): bump androidx.compose:compose-bom from 2026.01.00 to 202…
JeelDobariya38 Feb 1, 2026
288f808
chore(deps): bump gradle-wrapper from 9.3.0 to 9.3.1 (#85)
JeelDobariya38 Feb 1, 2026
d52504d
chore: refactor app/build.gradle.kts
JeelDobariya38 Feb 4, 2026
7c41ce9
feat: Classical & Modern layout in navigation
JeelDobariya38 Feb 4, 2026
ce3aba8
fix: error
JeelDobariya38 Feb 4, 2026
34b66a5
chore(deps): bump kotlin from 2.3.0 to 2.3.10
dependabot[bot] Feb 8, 2026
a987363
chore(deps): bump com.google.android.gms:play-services-oss-licenses
dependabot[bot] Feb 8, 2026
17dab2b
chore(deps): bump kotlin from 2.3.0 to 2.3.10 (#90)
JeelDobariya38 Feb 9, 2026
83b57cf
chore(deps): bump com.google.android.gms:play-services-oss-licenses f…
JeelDobariya38 Feb 9, 2026
db5b494
chore(refactor/feat): write temp code that make it easy to migrate to…
JeelDobariya38 Feb 9, 2026
d42de74
feat: remake old main screen in compose
JeelDobariya38 Feb 10, 2026
5855907
refactor: navigation
JeelDobariya38 Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
216 changes: 107 additions & 109 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,69 @@
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
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
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


@Composable
fun NavigationRoot() {
val backStack = rememberNavBackStack(Route.Home)
private fun ModernNavigationRoot(backStack: NavBackStack<NavKey>, navigateTo: (Route) -> Unit) {
NavDisplay(
backStack = backStack,
onBack = {
backStack.removeLastOrNull()
},
entryDecorators = mutableListOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
entryProvider = entryProvider {
entry<Route.Home> {
MainScreen(navigateTo)
}

fun navigateTo(route: Route): Unit {
backStack.add(route)
}
entry<Route.Settings> {
SettingsScreen()
}

entry<Route.AboutUs> {
AboutScreen()
}

entry<Route.PasswordManager> {
PasswordManagerScreen(navigateTo)
}

entry<Route.SavePassword> {
SavePasswordScreen()
}

entry<Route.UpdatePassword> {
UpdatePasswordScreen(it.id)
}
}
)
}

@Composable
private fun ClassicNavigationRoot(backStack: NavBackStack<NavKey>, navigateTo: (Route) -> Unit) {
NavDisplay(
backStack = backStack,
onBack = {
Expand All @@ -33,7 +75,7 @@ fun NavigationRoot() {
),
entryProvider = entryProvider {
entry<Route.Home> {
MainScreen(::navigateTo)
ClassicalMainScreen(navigateTo)
}

entry<Route.Settings> {
Expand All @@ -45,7 +87,7 @@ fun NavigationRoot() {
}

entry<Route.PasswordManager> {
PasswordManagerScreen(::navigateTo)
PasswordManagerScreen(navigateTo)
}

entry<Route.SavePassword> {
Expand All @@ -58,3 +100,24 @@ fun NavigationRoot() {
}
)
}

@Composable
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 (flagDatastoreState.isPreviewLayoutEnabled) { ModernNavigationRoot(backStack, ::navigateTo) }
else { ClassicNavigationRoot(backStack, ::navigateTo) }
}
Loading
Loading