From c4b72855693459cedc35b989e65f1161524bc55f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Mar 2026 16:42:40 +0000 Subject: [PATCH 1/6] chore(deps): bump androidx.datastore:datastore-preferences Bumps androidx.datastore:datastore-preferences from 1.2.0 to 1.2.1. --- updated-dependencies: - dependency-name: androidx.datastore:datastore-preferences dependency-version: 1.2.1 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 3096c139..9edd90ca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,7 @@ composeMultiplatform = "1.10.2" composeBom = "2026.02.01" compose-activity = "1.12.4" compose-viewmodel = "2.10.0" -datastorePreferences = "1.2.0" +datastorePreferences = "1.2.1" kotlinSerializationJson = "1.10.0" # Plugin versions From b7cbb4b577f86eec00e68720f2746137e75a7a7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Mar 2026 16:42:50 +0000 Subject: [PATCH 2/6] chore(deps): bump androidx.core:core-ktx from 1.17.0 to 1.18.0 Bumps androidx.core:core-ktx from 1.17.0 to 1.18.0. --- updated-dependencies: - dependency-name: androidx.core:core-ktx dependency-version: 1.18.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 3096c139..f7f3ab2a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # Library versions -coreKtx = "1.17.0" +coreKtx = "1.18.0" material = "1.13.0" nav3Core = "1.0.1" lifecycleViewmodelNav3 = "2.10.0" From 9ca87d3e015a5df18fffaa814f5d78a4d36b6e2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Mar 2026 16:43:01 +0000 Subject: [PATCH 3/6] chore(deps): bump androidx.activity:activity-compose Bumps androidx.activity:activity-compose from 1.12.4 to 1.13.0. --- updated-dependencies: - dependency-name: androidx.activity:activity-compose dependency-version: 1.13.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 3096c139..1e9627dd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ lifecycle = "2.10.0" koin = "4.1.1" composeMultiplatform = "1.10.2" composeBom = "2026.02.01" -compose-activity = "1.12.4" +compose-activity = "1.13.0" compose-viewmodel = "2.10.0" datastorePreferences = "1.2.0" kotlinSerializationJson = "1.10.0" From 1f67641c27ac7b6d81ceb43c7e0e01e50e482821 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 17 Mar 2026 19:42:11 +0530 Subject: [PATCH 4/6] test: write test for database migration v1 to v2. --- database/build.gradle.kts | 7 ++ .../master/migration/Migration_1_2_Test.kt | 82 +++++++++++++++++++ gradle/libs.versions.toml | 3 +- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/migration/Migration_1_2_Test.kt diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 95d4f7da..1f12d5b9 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -24,6 +24,12 @@ android { consumerProguardFiles("consumer-rules.pro") } + sourceSets { + getByName("androidTest") { + assets.srcDir("$projectDir/schemas") + } + } + buildTypes { getByName("release") { isMinifyEnabled = false @@ -51,6 +57,7 @@ android { dependencies { implementation(libs.androidx.core.ktx) + implementation(libs.androidx.junit.ktx) // Data/Persistence (Room Bundle) ksp(libs.room.compiler) diff --git a/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/migration/Migration_1_2_Test.kt b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/migration/Migration_1_2_Test.kt new file mode 100644 index 00000000..a3ddad69 --- /dev/null +++ b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/migration/Migration_1_2_Test.kt @@ -0,0 +1,82 @@ +package com.jeeldobariya.passcodes.database.master.migration + +import androidx.room.testing.MigrationTestHelper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import com.jeeldobariya.passcodes.database.master.MasterDatabase +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class MasterDatabaseMigration1To2Test { + + private val TEST_DB = "migration-1-2-test" + + @get:Rule + val helper = MigrationTestHelper( + InstrumentationRegistry.getInstrumentation(), + MasterDatabase::class.java + ) + + @Test + fun migrate_basicData() { + helper.createDatabase(TEST_DB, 1).apply { + execSQL(""" + INSERT INTO passwords (id, domain, username, password, notes) + VALUES (1, 'example.com', 'user', 'pass', 'note') + """) + close() + } + + val migratedDb = helper.runMigrationsAndValidate( + TEST_DB, 2, true, MIGRATION_1_2 + ) + + val cursor = migratedDb.query("SELECT * FROM passwords") + assertThat(cursor.count).isEqualTo(1) + cursor.close() + } + + @Test + fun migrate_emptyNotes_becomesNull() { + helper.createDatabase(TEST_DB, 1).apply { + execSQL(""" + INSERT INTO passwords (id, domain, username, password, notes) + VALUES (1, 'd', 'u', 'p', '') + """) + close() + } + + val db = helper.runMigrationsAndValidate(TEST_DB, 2, true, MIGRATION_1_2) + + val cursor = db.query("SELECT notes FROM passwords WHERE id = 1") + cursor.moveToFirst() + + assertThat(cursor.isNull(0)).isTrue() + + cursor.close() + } + + @Test + fun migrate_urlGenerated() { + helper.createDatabase(TEST_DB, 1).apply { + execSQL(""" + INSERT INTO passwords (id, domain, username, password, notes) + VALUES (1, 'google.com', 'u', 'p', 'n') + """) + close() + } + + val db = helper.runMigrationsAndValidate(TEST_DB, 2, true, MIGRATION_1_2) + + val cursor = db.query("SELECT url FROM passwords WHERE id = 1") + cursor.moveToFirst() + + assertThat(cursor.getString(0)) + .isEqualTo("https://local.google.com") + + cursor.close() + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1d8507c7..ea7669fe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ kotlinSerializationJson = "1.10.0" agp = "9.1.0" ksp = "2.3.6" kotlin = "2.3.10" -oss-license-plugin = "0.10.10" # Also update in settings.gradle.kts +oss-license-plugin = "0.10.10" # Always update also in settings.gradle.kts @@ -94,6 +94,7 @@ junit = { module = "junit:junit", version.ref = "junit" } truth = { module = "com.google.truth:truth", version.ref = "truth" } androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } androidx-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-junit" } +androidx-junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidx-junit" } From 0ca51e19e36ad28982804431e2f80f4856fc99d0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 17 Mar 2026 20:24:33 +0530 Subject: [PATCH 5/6] chore: type safe module declaration --- app/build.gradle.kts | 10 +++++----- autofill/build.gradle.kts | 2 +- database/build.gradle.kts | 4 ++-- password_manager/build.gradle.kts | 6 +++--- settings.gradle.kts | 2 ++ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bde0e9a4..1154f2b8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -205,11 +205,11 @@ android { dependencies { // In project library / feature modules - implementation(project(":design_system")) - implementation(project(":core")) - implementation(project(":database")) - implementation(project(":password_manager")) - implementation(project(":autofill")) + implementation(projects.designSystem) + implementation(projects.core) + implementation(projects.database) + implementation(projects.passwordManager) + implementation(projects.autofill) // Android Core implementation(libs.appcompat) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 3a184b45..a52bb00a 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -46,7 +46,7 @@ android { } dependencies { - implementation(project(":database")) + implementation(projects.database) implementation(libs.androidx.core.ktx) implementation(libs.appcompat) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 1f12d5b9..c13c7b2d 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -26,7 +26,7 @@ android { sourceSets { getByName("androidTest") { - assets.srcDir("$projectDir/schemas") + assets.directories += "$projectDir/schemas" } } @@ -57,7 +57,6 @@ android { dependencies { implementation(libs.androidx.core.ktx) - implementation(libs.androidx.junit.ktx) // Data/Persistence (Room Bundle) ksp(libs.room.compiler) @@ -71,6 +70,7 @@ dependencies { androidTestImplementation(libs.bundles.unit.test) androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.junit.ktx) androidTestImplementation(libs.androidx.runner) androidTestImplementation(libs.coroutines.test) androidTestImplementation(libs.room.testing) diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index acb9cec9..7e0294df 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -51,9 +51,9 @@ android { } dependencies { - implementation(project(":design_system")) - implementation(project(":core")) - implementation(project(":database")) + implementation(projects.designSystem) + implementation(projects.core) + implementation(projects.database) // Android Core implementation(libs.androidx.core.ktx) diff --git a/settings.gradle.kts b/settings.gradle.kts index fedcf1af..dc3db62a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,6 +16,8 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + // Defines all modules in your project include(":app") include(":design_system") From b3dc407fec12f7e98565d1be92af0fe7b6ffcbb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:57:27 +0000 Subject: [PATCH 6/6] chore(deps): bump androidx.compose:compose-bom Bumps androidx.compose:compose-bom from 2026.02.01 to 2026.03.00. --- updated-dependencies: - dependency-name: androidx.compose:compose-bom dependency-version: 2026.03.00 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 36384032..fbf7b1e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ coroutines = "1.10.2" lifecycle = "2.10.0" koin = "4.1.1" composeMultiplatform = "1.10.2" -composeBom = "2026.02.01" +composeBom = "2026.03.00" compose-activity = "1.13.0" compose-viewmodel = "2.10.0" datastorePreferences = "1.2.1"