diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f9a6e71d..9a29d6e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,8 @@ import java.io.FileInputStream import java.util.Properties -import org.gradle.api.GradleException +// import org.gradle.api.GradleException import com.android.build.api.dsl.ApplicationExtension +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.application) @@ -10,6 +11,12 @@ plugins { alias(libs.plugins.oss.licenses) } +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_21 + } +} + android { (this as ApplicationExtension).apply { compileSdk = 36 @@ -20,7 +27,7 @@ android { minSdk = 26 targetSdk = 34 versionCode = 2 - versionName = "v1.1.1-Alpha" + versionName = "v1.1.2-rc.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -86,8 +93,8 @@ android { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") // Use manifestPlaceholders.put() for key-value pairs - manifestPlaceholders.put("appIcon", "@mipmap/ic_launcher") - manifestPlaceholders.put("appLabel", "@string/app_name") + manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher" + manifestPlaceholders["appLabel"] = "@string/app_name" } getByName("debug") { @@ -95,8 +102,8 @@ android { versionNameSuffix = "-Dev" isMinifyEnabled = false - manifestPlaceholders.put("appIcon", "@mipmap/dev_ic_launcher") - manifestPlaceholders.put("appLabel", "Passcodes Dev") + manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher" + manifestPlaceholders["appLabel"] = "Passcodes Dev" } create("staging") { @@ -115,14 +122,14 @@ android { isDebuggable = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - manifestPlaceholders.put("appIcon", "@mipmap/dev_ic_launcher") - manifestPlaceholders.put("appLabel", "Passcodes Staging") + manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher" + manifestPlaceholders["appLabel"] = "Passcodes Staging" } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } buildFeatures { @@ -135,41 +142,43 @@ android { val location = "$projectDir/schemas" arg("room.schemaLocation", location) } - - kotlinOptions { - jvmTarget = "11" - } } dependencies { + // Standard Kotlin Libraries implementation(libs.kotlin.stdlib) + // UI/Google Services implementation(libs.material) implementation(libs.oss.license) implementation(libs.appcompat) - implementation(libs.room.ktx) + // Data/Persistence (Room Bundle) + implementation(libs.bundles.room) ksp(libs.room.compiler) + // Networking/Parsing implementation(libs.okhttp) implementation(libs.json) - implementation(libs.coroutines.core) - implementation(libs.coroutines.android) + // Concurrency (Coroutines Bundle) + implementation(libs.bundles.coroutines) - implementation(libs.lifecycle.runtime) - implementation(libs.lifecycle.viewmodel) + // Android Architecture Components (Lifecycle Bundle) + implementation(libs.bundles.lifecycle) + // Dependency Injection implementation(libs.koin) - implementation(libs.koin.viewmodel) - // test - testImplementation(libs.junit) - testImplementation(libs.truth) + + // --- Testing --- + + // Local Unit Testing (Unit Test Bundle) + testImplementation(libs.bundles.unit.test) + // Android Instrumented Testing (Android Test Bundle) + androidTestImplementation(libs.bundles.android.test) androidTestImplementation(libs.room.testing) - androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.coroutines.test) - androidTestImplementation(libs.truth) + androidTestImplementation(libs.truth) // Keeping truth explicit for androidTest, though it's in both bundles. } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt index 5259e82a..332a9995 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordAction.kt @@ -1,5 +1,5 @@ package com.jeeldobariya.passcodes.ui sealed interface LoadPasswordAction { - data object RefreshPassswordData: LoadPasswordAction + data object RefreshPassword: LoadPasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index 70ee5a51..408e6ede 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -54,7 +54,7 @@ class LoadPasswordActivity : AppCompatActivity() { override fun onResume() { super.onResume() - viewModel.onAction(LoadPasswordAction.RefreshPassswordData) + viewModel.onAction(LoadPasswordAction.RefreshPassword) } // Added all the onclick event listeners diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt index d46aee81..f18b8942 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordState.kt @@ -3,6 +3,6 @@ package com.jeeldobariya.passcodes.ui import com.jeeldobariya.passcodes.database.Password data class LoadPasswordState( - val passwordEntityList: List = emptyList(), + val passwordEntityList: List = emptyList(), val isError: Boolean = false ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt index 5e66a5b2..7d09adaa 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordViewModel.kt @@ -19,7 +19,7 @@ class LoadPasswordViewModel( fun onAction(action: LoadPasswordAction) { when (action) { - LoadPasswordAction.RefreshPassswordData -> { refreshData() } + LoadPasswordAction.RefreshPassword -> { refreshData() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt index 741dd1ec..7c71544f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordAction.kt @@ -1,8 +1,8 @@ package com.jeeldobariya.passcodes.ui sealed interface ViewPasswordAction { - data class LoadPassswordData(val passwordId: Int): ViewPasswordAction - data object RefreshPassswordData: ViewPasswordAction + data class LoadPassword(val passwordId: Int): ViewPasswordAction + data object RefreshPassword: ViewPasswordAction // data object NavigateUpdatePasswordAction: ViewPasswordAction data object DeletePasswordAction: ViewPasswordAction } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 5e786816..7629b2c0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -43,7 +43,7 @@ class ViewPasswordActivity : AppCompatActivity() { return // Exit onCreate if ID is invalid } - viewModel.onAction(ViewPasswordAction.LoadPassswordData(passwordEntityId)) + viewModel.onAction(ViewPasswordAction.LoadPassword(passwordEntityId)) collectLatestLifecycleFlow(viewModel.state) { state -> binding.tvDomain.text = @@ -78,7 +78,7 @@ class ViewPasswordActivity : AppCompatActivity() { override fun onResume() { super.onResume() - viewModel.onAction(ViewPasswordAction.RefreshPassswordData) + viewModel.onAction(ViewPasswordAction.RefreshPassword) } // Added all the onclick event listeners diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt index c0eec635..d27279e2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordViewModel.kt @@ -20,8 +20,8 @@ class ViewPasswordViewModel( fun onAction(action: ViewPasswordAction) { when (action) { - is ViewPasswordAction.LoadPassswordData -> { refreshData(action.passwordId) } - ViewPasswordAction.RefreshPassswordData -> { refreshData(passwordEntityId) } + is ViewPasswordAction.LoadPassword -> { refreshData(action.passwordId) } + ViewPasswordAction.RefreshPassword -> { refreshData(passwordEntityId) } ViewPasswordAction.DeletePasswordAction -> { deletePasswordEntity() } } } diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index e824392f..21e2f66a 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -76,6 +76,7 @@ @@ -106,6 +107,7 @@ @@ -136,6 +138,7 @@ @@ -166,6 +169,7 @@ @@ -199,6 +203,7 @@ android:layout_width="128dp" android:layout_height="128dp" android:layout_marginBottom="8dp" + android:contentDescription="Join Telegram Community" android:src="@drawable/ic_send" app:tint="?attr/colorPrimary" /> + android:textSize="32sp" /> + android:textSize="32sp" /> + android:textSize="12sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_password_manager.xml b/app/src/main/res/layout/activity_password_manager.xml index 569eb7ad..00888c73 100644 --- a/app/src/main/res/layout/activity_password_manager.xml +++ b/app/src/main/res/layout/activity_password_manager.xml @@ -14,7 +14,7 @@ android:paddingBottom="12sp" android:text="@string/textview_passwordmanager_headline" android:textAlignment="center" - android:textSize="32dp" /> + android:textSize="32sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_save_password.xml b/app/src/main/res/layout/activity_save_password.xml index 68dc1977..ccfded5e 100644 --- a/app/src/main/res/layout/activity_save_password.xml +++ b/app/src/main/res/layout/activity_save_password.xml @@ -20,7 +20,7 @@ android:layout_height="wrap_content" android:layout_margin="4dp" android:text="@string/textview_savepassword_headline" - android:textSize="32dp" /> + android:textSize="32sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_update_password.xml b/app/src/main/res/layout/activity_update_password.xml index 7bad6921..9cc95887 100644 --- a/app/src/main/res/layout/activity_update_password.xml +++ b/app/src/main/res/layout/activity_update_password.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_margin="4dp" android:text="@string/textview_updatepassword_headline" - android:textSize="32dp" /> + android:textSize="32sp" /> + android:textSize="16sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_view_password.xml b/app/src/main/res/layout/activity_view_password.xml index acab5923..6bd93500 100644 --- a/app/src/main/res/layout/activity_view_password.xml +++ b/app/src/main/res/layout/activity_view_password.xml @@ -1,13 +1,12 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + tools:context=".ui.ViewPasswordActivity" + android:padding="4sp"> + android:textSize="32sp" /> + android:textSize="12sp" /> + android:textSize="12sp" /> + android:textSize="12sp" /> + android:textSize="12sp" /> + android:textSize="12sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 88a3ab1e..52971db0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ Passcodes - v1.1.1 - Alpha + v1.1.2-rc1 Developed by: Dobariya Jeel diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 211749a1..9d85fa74 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,24 @@ [versions] -kotlin = "1.9.0" -material = "1.12.0" -okhttp = "5.1.0" -oss-license = "17.2.1" -appcompat = "1.7.0" -room = "2.7.2" +kotlin = "2.2.21" +material = "1.13.0" +okhttp = "5.3.0" +oss-license = "17.3.0" +appcompat = "1.7.1" +room = "2.8.3" json = "20250517" junit = "4.13.2" -truth = "1.4.4" -androidx-test-ext-junit = "1.2.1" -espresso-core = "3.6.1" +truth = "1.4.5" +androidx-test-ext-junit = "1.3.0" +espresso-core = "3.7.0" coroutines = "1.10.2" -lifecycle = "2.9.2" +lifecycle = "2.9.4" koin = "4.1.1" # Plugin versions -agp = "8.13.0" -kotlin-plugin = "2.1.21" -ksp = "2.1.21-2.0.2" -oss-license-plugin = "0.10.6" # latest safe version for oss-licenses-plugin +agp = "8.13.1" +kotlin-plugin = "2.2.21" +ksp = "2.3.2" +oss-license-plugin = "0.10.9" # Also update in settings.gradle.kts [libraries] kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } @@ -27,30 +27,48 @@ material = { module = "com.google.android.material:material", version.ref = "mat oss-license = { module = "com.google.android.gms:play-services-oss-licenses", version.ref = "oss-license" } appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +# Room room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } room-testing = { module = "androidx.room:room-testing", version.ref = "room" } +# Networking okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp"} +# Coroutines coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } +# Android Lifecycle lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +# Dependency Injection koin = { module = "io.insert-koin:koin-android", version.ref = "koin" } -koin-viewmodel = { module = "io.insert-koin:koin-android", version.ref = "koin" } # koin-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } json = { module = "org.json:json", version.ref = "json" } +# Testing junit = { module = "junit:junit", version.ref = "junit" } truth = { module = "com.google.truth:truth", version.ref = "truth" } androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-test-ext-junit" } espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso-core" } +[bundles] +# Grouping related Android Architecture Components +room = ["room-ktx", "room-testing"] +lifecycle = ["lifecycle-runtime", "lifecycle-viewmodel"] + +# Grouping coroutines dependencies +coroutines = ["coroutines-core", "coroutines-android"] +coroutines-test = ["coroutines-core", "coroutines-test"] # Core is often needed for testing + +# Grouping general test dependencies +unit-test = ["junit", "truth"] +android-test = ["androidx-test-ext-junit", "espresso-core"] + [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-plugin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da4..2b472161 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ +#Wed Nov 12 11:23:49 IST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 39b506a9..a27eaafc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ pluginManagement { resolutionStrategy { eachPlugin { if (requested.id.id == "com.google.android.gms.oss-licenses-plugin") { - useModule("com.google.android.gms:oss-licenses-plugin:0.10.6") + useModule("com.google.android.gms:oss-licenses-plugin:0.10.9") } } }