From 80aa565d7e413c743a44d29add92238a05336ec8 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 22 Nov 2025 15:12:38 +0530 Subject: [PATCH 001/115] refactor: group state, action and viewmodel in presentation package --- .../kotlin/com/jeeldobariya/passcodes/di/appModule.kt | 8 ++++---- .../jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt | 2 ++ .../jeeldobariya/passcodes/oldui/SavePasswordActivity.kt | 2 ++ .../passcodes/oldui/UpdatePasswordActivity.kt | 2 ++ .../jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt | 2 ++ .../load_password}/LoadPasswordAction.kt | 2 +- .../load_password}/LoadPasswordState.kt | 4 ++-- .../load_password}/LoadPasswordViewModel.kt | 4 ++-- .../save_password}/SavePasswordAction.kt | 2 +- .../save_password}/SavePasswordState.kt | 2 +- .../save_password}/SavePasswordViewModel.kt | 2 +- .../update_password}/UpdatePasswordAction.kt | 2 +- .../update_password}/UpdatePasswordState.kt | 2 +- .../update_password}/UpdatePasswordViewModel.kt | 2 +- .../view_password}/ViewPasswordAction.kt | 2 +- .../view_password}/ViewPasswordState.kt | 2 +- .../view_password}/ViewPasswordViewModel.kt | 2 +- 17 files changed, 26 insertions(+), 18 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/load_password}/LoadPasswordAction.kt (60%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/load_password}/LoadPasswordState.kt (73%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/load_password}/LoadPasswordViewModel.kt (94%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/save_password}/SavePasswordAction.kt (86%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/save_password}/SavePasswordState.kt (74%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/save_password}/SavePasswordViewModel.kt (96%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/update_password}/UpdatePasswordAction.kt (86%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/update_password}/UpdatePasswordState.kt (74%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/update_password}/UpdatePasswordViewModel.kt (97%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/view_password}/ViewPasswordAction.kt (82%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/view_password}/ViewPasswordState.kt (78%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{oldui => presentation/view_password}/ViewPasswordViewModel.kt (96%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 65f10a1c..31108722 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,9 +1,9 @@ package com.jeeldobariya.passcodes.di -import com.jeeldobariya.passcodes.oldui.LoadPasswordViewModel -import com.jeeldobariya.passcodes.oldui.SavePasswordViewModel -import com.jeeldobariya.passcodes.oldui.UpdatePasswordViewModel -import com.jeeldobariya.passcodes.oldui.ViewPasswordViewModel +import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel +import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel +import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel +import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel import com.jeeldobariya.passcodes.utils.Controller import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index e2d48a83..fbf9de75 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -9,6 +9,8 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter +import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordAction +import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt index d5a012f7..f202192f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt @@ -5,6 +5,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding +import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordAction +import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt index 901c3f09..e2cd23c0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt @@ -7,6 +7,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding +import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordAction +import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt index 8d1ae41f..46ffb23d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt @@ -10,6 +10,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding +import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordAction +import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt similarity index 60% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordAction.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt index ff18f46f..064347a6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.load_password sealed interface LoadPasswordAction { data object RefreshPassword: LoadPasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt similarity index 73% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordState.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt index e017cb43..0a90eb8f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt @@ -1,8 +1,8 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.load_password import com.jeeldobariya.passcodes.database.Password data class LoadPasswordState( val passwordEntityList: List = emptyList(), val isError: Boolean = false -) +) \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt similarity index 94% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordViewModel.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt index 28a50813..887ca03e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.load_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -34,4 +34,4 @@ class LoadPasswordViewModel( } } } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt similarity index 86% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordAction.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt index 14634ce5..955e48b0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.save_password sealed interface SavePasswordAction { data class OnChangeDomain(val newDomain: String): SavePasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt similarity index 74% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordState.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt index 8cd30a14..06c941ad 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.save_password data class SavePasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordViewModel.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt index 2fce6577..409030b9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.save_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt similarity index 86% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordAction.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt index 7ef3f60b..3dd1ad41 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.update_password sealed interface UpdatePasswordAction { data class OnChangeDomain(val newDomain: String): UpdatePasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt similarity index 74% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordState.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt index 767dd9af..958040f4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.update_password data class UpdatePasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt similarity index 97% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordViewModel.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index 715a9b45..caf95200 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.update_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordAction.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt similarity index 82% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordAction.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt index e40b9a90..bedcfe84 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordAction.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.view_password sealed interface ViewPasswordAction { data class LoadPassword(val passwordId: Int): ViewPasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt similarity index 78% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordState.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt index 3809af97..370108a6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.view_password data class ViewPasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordViewModel.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index 579365d7..7b3ae971 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.presentation.view_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope From fa1e93165868b29b8b64c13c091860350593d259 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 12:53:57 +0530 Subject: [PATCH 002/115] feat: made old ui defualt ui --- app/src/main/AndroidManifest.xml | 10 +++------- .../com/jeeldobariya/passcodes/oldui/MainActivity.kt | 8 ++++++++ .../com/jeeldobariya/passcodes/ui/MainActivity.kt | 8 ++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc3da90e..2e0db9cd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,20 +15,16 @@ android:supportsRtl="true" android:theme="@style/PasscodesTheme.Default" tools:targetApi="33"> + + android:name=".oldui.MainActivity" + android:exported="true"> - - 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 881afa13..dd5c06ce 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -7,6 +7,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.BuildConfig import com.jeeldobariya.passcodes.databinding.ActivityMainBinding +import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.UpdateChecker import com.jeeldobariya.passcodes.utils.appDatastore import kotlinx.coroutines.Dispatchers @@ -45,6 +46,13 @@ class MainActivity : AppCompatActivity() { permissionsHandle = Permissions(this) if (!permissionsHandle.checkPermission()) permissionsHandle.requestPermission() */ + + runBlocking { + if (featureFlagsDatastore.data.first().isPreviewLayoutEnabled) { + val jetpackComposeActivity = Intent(this@MainActivity, com.jeeldobariya.passcodes.ui.MainActivity::class.java) + startActivity(jetpackComposeActivity) + } + } } /* Comment the code as permission is not need to write into app data dir. 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 07c80f09..2a2872c0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -69,7 +69,7 @@ fun MainScreen(navigateToOldUi: () -> Unit) { Spacer(Modifier.padding(12.dp)) - Text("Jetpack UI Is Under Development", fontSize = 6.sp) + Text("Jetpack UI Is Under Development", fontSize = 11.sp) } } } @@ -78,8 +78,8 @@ fun MainScreen(navigateToOldUi: () -> Unit) { @Composable fun GreetingPreview() { PasscodesTheme { - MainScreen { - Unit - } + MainScreen( + navigateToOldUi = { } + ) } } From 376c4e2eca9ef4b46a2833355e35f0cc603fd2dc Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 13:22:30 +0530 Subject: [PATCH 003/115] refactor: use dependency injection for master database --- .../passcodes/PasscodesApplication.kt | 2 ++ .../passcodes/database/MasterDatabase.kt | 21 ++++++------------- .../jeeldobariya/passcodes/di/appModule.kt | 2 +- .../passcodes/di/databaseModule.kt | 11 ++++++++++ .../oldui/PasswordManagerActivity.kt | 6 +++--- .../passcodes/oldui/SettingsActivity.kt | 7 ++++--- .../passcodes/utils/Controller.kt | 11 +++------- 7 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt index 190dd4f5..a7e09211 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt @@ -2,6 +2,7 @@ package com.jeeldobariya.passcodes import android.app.Application import com.jeeldobariya.passcodes.di.appModule +import com.jeeldobariya.passcodes.di.databaseModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -11,6 +12,7 @@ class PasscodesApplication : Application() { startKoin { androidContext(this@PasscodesApplication) modules(appModule) + modules(databaseModule) } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt index 32515b70..730ebd36 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt @@ -14,21 +14,12 @@ abstract class MasterDatabase : RoomDatabase() { abstract val passwordsDao: PasswordsDao companion object { - @Volatile - private var INSTANCE: MasterDatabase? = null - - fun getDatabase(context: Context): MasterDatabase { - return INSTANCE ?: synchronized(this) { - - val instance = Room.databaseBuilder( - context.applicationContext, - MasterDatabase::class.java, - "master" - ) - .build() - INSTANCE = instance - instance - } + fun createNewDatabase(context: Context): MasterDatabase { + return Room.databaseBuilder( + context = context, + klass = MasterDatabase::class.java, + name = "master" + ).build() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 31108722..5efac092 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -12,7 +12,7 @@ import org.koin.dsl.module val appModule = module { single { - Controller(androidContext()) + Controller(get()) } viewModel { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt new file mode 100644 index 00000000..668960d6 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt @@ -0,0 +1,11 @@ +package com.jeeldobariya.passcodes.di + +import com.jeeldobariya.passcodes.database.MasterDatabase +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val databaseModule = module { + single { + MasterDatabase.createNewDatabase(androidContext()) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 0566e216..6e85d75c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -20,12 +20,14 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import org.koin.android.ext.android.inject class PasswordManagerActivity : AppCompatActivity() { + private val controller: Controller by inject() + private lateinit var binding: ActivityPasswordManagerBinding - private lateinit var controller: Controller private lateinit var exportCsvLauncher: ActivityResultLauncher private var tmpExportCSVData: String? = null @@ -40,8 +42,6 @@ class PasswordManagerActivity : AppCompatActivity() { binding = ActivityPasswordManagerBinding.inflate(layoutInflater) setContentView(binding.root) - controller = Controller(this) // Initialize the controller here - importCsvLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 8ba4be4c..1e2427e6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -18,11 +18,14 @@ import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.koin.android.ext.android.inject +import kotlin.getValue class SettingsActivity : AppCompatActivity() { + private val controller: Controller by inject() + private lateinit var binding: ActivitySettingsBinding - private lateinit var controller: Controller // List of available themes to cycle through private val THEMES = listOf( @@ -47,8 +50,6 @@ class SettingsActivity : AppCompatActivity() { binding.switchLatestFeatures.isChecked = it.isPreviewFeaturesEnabled } - controller = Controller(this) // Initialize the controller here - // Add event onclick listener addOnClickListenerOnButton() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index edb0ab29..5ddca40d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -6,6 +6,7 @@ import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first +import org.koin.compose.koinInject class InvalidInputException(message: String = "Input parameters cannot be blank.") : Exception(message) @@ -20,14 +21,8 @@ class PasswordNotFoundException(message: String = "Password with the given ID wa class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : Exception(message) -class Controller(context: Context) { - private val passwordsDao: PasswordsDao - - init { - // Initialize Room database and get the DAO instance - val db = MasterDatabase.getDatabase(context) - passwordsDao = db.passwordsDao - } +class Controller(database: MasterDatabase) { + private val passwordsDao: PasswordsDao = database.passwordsDao companion object { const val CSV_HEADER = "name,url,username,password,note" From 1af5c840c67500c4cde58b002f3f39cad752e157 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 17:22:25 +0530 Subject: [PATCH 004/115] refactor: create PasswordRepository --- .../data/repository/PasswordRepository.kt | 31 +++++++++++++++++++ .../passcodes/di/databaseModule.kt | 5 +++ .../save_password/SavePasswordViewModel.kt | 5 +-- 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt new file mode 100644 index 00000000..60cf2020 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -0,0 +1,31 @@ +package com.jeeldobariya.passcodes.data.repository + +import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.database.PasswordsDao +import com.jeeldobariya.passcodes.utils.DateTimeUtils +import com.jeeldobariya.passcodes.utils.InvalidInputException + +class PasswordRepository(val passwordsDao: PasswordsDao) { + suspend fun savePasswordEntity( + domain: String, + username: String, + password: String, + notes: String + ): Long { + if (domain.isBlank() || username.isBlank() || password.isBlank()) { + throw InvalidInputException() + } + + val currentTimestamp = DateTimeUtils.getCurrDateTime() + val newPassword = Password( + domain = domain, + username = username, + password = password, + notes = notes, + createdAt = currentTimestamp, + updatedAt = currentTimestamp + ) + + return passwordsDao.insertPassword(newPassword) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt index 668960d6..bfb288f0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.MasterDatabase import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -8,4 +9,8 @@ val databaseModule = module { single { MasterDatabase.createNewDatabase(androidContext()) } + + single { + PasswordRepository(get().passwordsDao) + } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt index 409030b9..e542a51a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt @@ -2,6 +2,7 @@ package com.jeeldobariya.passcodes.presentation.save_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -9,7 +10,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class SavePasswordViewModel( - val controller: Controller + val passwordRepository: PasswordRepository ) : ViewModel() { private val _state = MutableStateFlow(SavePasswordState()) @@ -44,7 +45,7 @@ class SavePasswordViewModel( private fun savePasswordEntity() { viewModelScope.launch { try { - controller.savePasswordEntity( + passwordRepository.savePasswordEntity( _state.value.domain, _state.value.username, _state.value.password, From 0bdf7eeccff8a976cc323ec24fc6d3316e71296e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 17:31:00 +0530 Subject: [PATCH 005/115] refactor: use the password repository in controller --- .../main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt | 2 +- .../kotlin/com/jeeldobariya/passcodes/utils/Controller.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 5efac092..eac1c8f7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -12,7 +12,7 @@ import org.koin.dsl.module val appModule = module { single { - Controller(get()) + Controller(get(), get()) } viewModel { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index 5ddca40d..ea82cf26 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -1,6 +1,7 @@ package com.jeeldobariya.passcodes.utils import android.content.Context +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.MasterDatabase import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao @@ -21,7 +22,7 @@ class PasswordNotFoundException(message: String = "Password with the given ID wa class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : Exception(message) -class Controller(database: MasterDatabase) { +class Controller(database: MasterDatabase, val passwordRepository: PasswordRepository) { private val passwordsDao: PasswordsDao = database.passwordsDao companion object { @@ -200,7 +201,7 @@ class Controller(database: MasterDatabase) { notes = cols[4].trim() ) } else { - savePasswordEntity( + passwordRepository.savePasswordEntity( domain = chosenDomain, username = cols[2].trim(), password = cols[3].trim(), From d4c535a2b9438e35340d094fb2074e27b09cba6a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 17:55:57 +0530 Subject: [PATCH 006/115] refactor: getpasswordbyid() in controller --- .../passcodes/data/repository/PasswordRepository.kt | 6 ++++++ .../main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt | 4 ++-- .../presentation/update_password/UpdatePasswordViewModel.kt | 6 ++++-- .../presentation/view_password/ViewPasswordViewModel.kt | 6 ++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 60cf2020..1682aa6e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -28,4 +28,10 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { return passwordsDao.insertPassword(newPassword) } + + suspend fun getPasswordById(id: Int): Password? { + return passwordsDao.getPasswordById(id) + } + + } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index eac1c8f7..0b136c0b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -16,7 +16,7 @@ val appModule = module { } viewModel { - UpdatePasswordViewModel(get()) + UpdatePasswordViewModel(get(), get()) } viewModel { @@ -28,7 +28,7 @@ val appModule = module { } viewModel { - ViewPasswordViewModel(get()) + ViewPasswordViewModel(get(), get()) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index caf95200..e9fee87d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -2,6 +2,7 @@ package com.jeeldobariya.passcodes.presentation.update_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow @@ -10,7 +11,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class UpdatePasswordViewModel( - val controller: Controller + val controller: Controller, + val passwordRepository: PasswordRepository ) : ViewModel() { var passwordEntityId: Int = -1 @@ -23,7 +25,7 @@ class UpdatePasswordViewModel( viewModelScope.launch { try { - val password: Password = controller.getPasswordById(passwordId) + val password: Password = requireNotNull(passwordRepository.getPasswordById(passwordId)) _state.update { it.copy( diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index 7b3ae971..c9b83427 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -2,6 +2,7 @@ package com.jeeldobariya.passcodes.presentation.view_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DateTimeUtils @@ -11,7 +12,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class ViewPasswordViewModel( - val controller: Controller + val controller: Controller, + val passwordRepository: PasswordRepository ) : ViewModel() { var passwordEntityId: Int = -1 @@ -31,7 +33,7 @@ class ViewPasswordViewModel( viewModelScope.launch { try { - val password: Password = controller.getPasswordById(passwordId) + val password: Password = requireNotNull(passwordRepository.getPasswordById(passwordId)) _state.update { it.copy( From d6502fd30503f3c363e36d12c14637c823a05ae6 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 18:12:37 +0530 Subject: [PATCH 007/115] refactor: updatepasswordfunction() in controller --- .../data/repository/PasswordRepository.kt | 23 +++++++++++++++++++ .../UpdatePasswordViewModel.kt | 2 +- .../passcodes/utils/Controller.kt | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 1682aa6e..2c88d6eb 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -33,5 +33,28 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { return passwordsDao.getPasswordById(id) } + suspend fun updatePassword( + id: Int, + domain: String, + username: String, + password: String, + notes: String + ): Int { + if (domain.isBlank() || username.isBlank() || password.isBlank()) { + throw InvalidInputException() + } + + val existingPassword = requireNotNull(passwordsDao.getPasswordById(id)) + val updatedTimestamp = DateTimeUtils.getCurrDateTime() + val passwordToUpdate = existingPassword.copy( + domain = domain, + username = username, + password = password, + notes = notes, + updatedAt = updatedTimestamp + ) + + return passwordsDao.updatePassword(passwordToUpdate) + } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index e9fee87d..c007fb0b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -70,7 +70,7 @@ class UpdatePasswordViewModel( private fun updatePasswordEntity() { viewModelScope.launch { try { - controller.updatePassword( + passwordRepository.updatePassword( passwordEntityId, _state.value.domain, _state.value.username, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index ea82cf26..a78ac0dd 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -193,7 +193,7 @@ class Controller(database: MasterDatabase, val passwordRepository: PasswordRepos ) if (password != null) { - updatePassword( + passwordRepository.updatePassword( id = password.id, domain = password.domain, username = password.username, From 25694e6bff2d51dbba32def1af6b33014a9728f9 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 18:24:26 +0530 Subject: [PATCH 008/115] refactor: deletepassword() in controller --- .../passcodes/data/repository/PasswordRepository.kt | 4 ++++ .../presentation/view_password/ViewPasswordViewModel.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 2c88d6eb..87a00cef 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -57,4 +57,8 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { return passwordsDao.updatePassword(passwordToUpdate) } + + suspend fun deletePassword(id: Int): Int { + return passwordsDao.deletePasswordById(id) + } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index c9b83427..5bee00b3 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -53,7 +53,7 @@ class ViewPasswordViewModel( private fun deletePasswordEntity() { viewModelScope.launch { try { - controller.deletePassword(passwordEntityId) + passwordRepository.deletePassword(passwordEntityId) } catch (_: Exception) { _state.update { it.copy(isError = true) } } From 5e5a9523c9f69c48c6c4e3bbd95d92286ead0e51 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 18:34:23 +0530 Subject: [PATCH 009/115] refactor: getallpassword() in controller --- .../passcodes/data/repository/PasswordRepository.kt | 6 ++++++ .../presentation/load_password/LoadPasswordViewModel.kt | 5 +++-- .../kotlin/com/jeeldobariya/passcodes/utils/Controller.kt | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 87a00cef..3f196e50 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -4,8 +4,14 @@ import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao import com.jeeldobariya.passcodes.utils.DateTimeUtils import com.jeeldobariya.passcodes.utils.InvalidInputException +import kotlinx.coroutines.flow.Flow class PasswordRepository(val passwordsDao: PasswordsDao) { + + fun getAllPasswords(): Flow> { + return passwordsDao.getAllPasswords() + } + suspend fun savePasswordEntity( domain: String, username: String, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt index 887ca03e..f6fd7f87 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt @@ -2,6 +2,7 @@ package com.jeeldobariya.passcodes.presentation.load_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -11,7 +12,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class LoadPasswordViewModel( - var controller: Controller + var passwordRepository: PasswordRepository ) : ViewModel() { private val _state = MutableStateFlow(LoadPasswordState()) @@ -27,7 +28,7 @@ class LoadPasswordViewModel( viewModelScope.launch { _state.update { LoadPasswordState( - passwordEntityList = controller.getAllPasswords().catch { + passwordEntityList = passwordRepository.getAllPasswords().catch { _state.update { it.copy(isError = true) } }.first() ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index a78ac0dd..9efdff95 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -155,7 +155,7 @@ class Controller(database: MasterDatabase, val passwordRepository: PasswordRepos } suspend fun exportDataToCsvString(): String { - val passwords: List = getAllPasswords().first() + val passwords: List = passwordRepository.getAllPasswords().first() val rows = passwords.joinToString("\n") { password -> "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" From 1b4e7f43884c9f1cb34d00c3a50dccf74f252e49 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 18:38:00 +0530 Subject: [PATCH 010/115] refactor: remove unwanted code from controller --- .../jeeldobariya/passcodes/di/appModule.kt | 4 +- .../UpdatePasswordViewModel.kt | 1 - .../view_password/ViewPasswordViewModel.kt | 1 - .../passcodes/utils/Controller.kt | 132 ------------------ 4 files changed, 2 insertions(+), 136 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 0b136c0b..eac1c8f7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -16,7 +16,7 @@ val appModule = module { } viewModel { - UpdatePasswordViewModel(get(), get()) + UpdatePasswordViewModel(get()) } viewModel { @@ -28,7 +28,7 @@ val appModule = module { } viewModel { - ViewPasswordViewModel(get(), get()) + ViewPasswordViewModel(get()) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index c007fb0b..311833c7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -11,7 +11,6 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class UpdatePasswordViewModel( - val controller: Controller, val passwordRepository: PasswordRepository ) : ViewModel() { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index 5bee00b3..7962cc16 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class ViewPasswordViewModel( - val controller: Controller, val passwordRepository: PasswordRepository ) : ViewModel() { var passwordEntityId: Int = -1 diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index 9efdff95..ed2ba7e1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -1,25 +1,14 @@ package com.jeeldobariya.passcodes.utils -import android.content.Context import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.MasterDatabase import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first -import org.koin.compose.koinInject class InvalidInputException(message: String = "Input parameters cannot be blank.") : Exception(message) -class DatabaseOperationException( - message: String = "A database operation error occurred.", - cause: Throwable? = null -) : Exception(message, cause) - -class PasswordNotFoundException(message: String = "Password with the given ID was not found.") : - Exception(message) - class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : Exception(message) class Controller(database: MasterDatabase, val passwordRepository: PasswordRepository) { @@ -29,127 +18,6 @@ class Controller(database: MasterDatabase, val passwordRepository: PasswordRepos const val CSV_HEADER = "name,url,username,password,note" } - /** - * Saves a new password entity into the database. - * @return The rowId of the newly inserted row. - * @throws InvalidInputException if parameters are blank. - * @throws DatabaseOperationException if a database error occurs. - */ - suspend fun savePasswordEntity( - domain: String, - username: String, - password: String, - notes: String - ): Long { - if (domain.isBlank() || username.isBlank() || password.isBlank()) { - throw InvalidInputException() - } - - val currentTimestamp = DateTimeUtils.getCurrDateTime() - val newPassword = Password( - domain = domain, - username = username, - password = password, - notes = notes, - createdAt = currentTimestamp, - updatedAt = currentTimestamp - ) - - return try { - passwordsDao.insertPassword(newPassword) - } catch (e: Exception) { - e.printStackTrace() - throw DatabaseOperationException("Error saving password.", e) - } - } - - /** - * Retrieves a password entity by its ID. - * @return The Password object if found. - * @throws DatabaseOperationException if a database error occurs. - * @throws PasswordNotFoundException if the password is not found. - */ - suspend fun getPasswordById(id: Int): Password { - return try { - passwordsDao.getPasswordById(id) - ?: throw PasswordNotFoundException("Password with ID $id not found.") - } catch (e: PasswordNotFoundException) { - throw e - } catch (e: Exception) { - e.printStackTrace() - throw DatabaseOperationException("Error retrieving password by ID.", e) - } - } - - /** - * Retrieves a password entity by username and domain. - * @return The Password object if found. - * @throws DatabaseOperationException if a database error occurs. - */ - suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password? { - return try { - passwordsDao.getPasswordByUsernameAndDomain(username, domain) - } catch (e: Exception) { - e.printStackTrace() - throw DatabaseOperationException("Error retrieving password by username and domain.", e) - } - } - - /** - * Retrieves all password entities from the database as a Flow for real-time updates. - * @return A Flow that emits lists of Password objects. - * Room handles the background threading for Flow queries. - */ - fun getAllPasswords(): Flow> { - return passwordsDao.getAllPasswords() - } - - suspend fun updatePassword( - id: Int, - domain: String, - username: String, - password: String, - notes: String - ): Int { - if (domain.isBlank() || username.isBlank() || password.isBlank()) { - throw InvalidInputException() - } - - return try { - val existingPassword = passwordsDao.getPasswordById(id) - ?: throw PasswordNotFoundException("Password with ID $id not found for update.") - - val updatedTimestamp = DateTimeUtils.getCurrDateTime() - val passwordToUpdate = existingPassword.copy( - domain = domain, - username = username, - password = password, - notes = notes, - updatedAt = updatedTimestamp - ) - passwordsDao.updatePassword(passwordToUpdate) - } catch (e: PasswordNotFoundException) { - throw e - } catch (e: Exception) { - e.printStackTrace() - throw DatabaseOperationException("Error updating password.", e) - } - } - - /** - * Deletes a password entity by its ID. - * @return The number of rows deleted (usually 1 if successful, 0 if not found). - * @throws DatabaseOperationException if a database error occurs. - */ - suspend fun deletePassword(id: Int): Int { - return try { - passwordsDao.deletePasswordById(id) - } catch (e: Exception) { - e.printStackTrace() - throw DatabaseOperationException("Error deleting password.", e) - } - } - suspend fun clearAllData() { passwordsDao.clearAllPasswordData() } From 30fc54859ff138760dbb239fa5ab09220e6dd2a6 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 24 Nov 2025 18:44:49 +0530 Subject: [PATCH 011/115] refactor: clearalldata() in controller --- .../passcodes/data/repository/PasswordRepository.kt | 4 ++++ .../com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 6 +++--- .../kotlin/com/jeeldobariya/passcodes/utils/Controller.kt | 4 +--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 3f196e50..528f543c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -67,4 +67,8 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { suspend fun deletePassword(id: Int): Int { return passwordsDao.deletePasswordById(id) } + + suspend fun clearAllData() { + passwordsDao.clearAllPasswordData() + } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 1e2427e6..9443827c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -10,9 +10,9 @@ import androidx.core.os.LocaleListCompat import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.appDatastore import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first @@ -23,7 +23,7 @@ import kotlin.getValue class SettingsActivity : AppCompatActivity() { - private val controller: Controller by inject() + private val passwordRepository: PasswordRepository by inject() private lateinit var binding: ActivitySettingsBinding @@ -127,7 +127,7 @@ class SettingsActivity : AppCompatActivity() { binding.clearAllDataBtn.setOnClickListener { v -> lifecycleScope.launch { - controller.clearAllData() + passwordRepository.clearAllData() } Toast.makeText(this@SettingsActivity, "Delete the user data!!", Toast.LENGTH_SHORT) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index ed2ba7e1..b54d85f5 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -18,9 +18,7 @@ class Controller(database: MasterDatabase, val passwordRepository: PasswordRepos const val CSV_HEADER = "name,url,username,password,note" } - suspend fun clearAllData() { - passwordsDao.clearAllPasswordData() - } + suspend fun exportDataToCsvString(): String { val passwords: List = passwordRepository.getAllPasswords().first() From 31e736628fadba433df21d0d1221d9e0418043a3 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 25 Nov 2025 16:18:22 +0530 Subject: [PATCH 012/115] refactor: import password logic into a usecase --- .../data/repository/PasswordRepository.kt | 4 ++ .../jeeldobariya/passcodes/di/appModule.kt | 5 ++ .../domain/usecases/ImportPasswordUseCase.kt | 57 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 528f543c..ec9bcbd1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -39,6 +39,10 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { return passwordsDao.getPasswordById(id) } + suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password? { + return passwordsDao.getPasswordByUsernameAndDomain(username = username, domain = domain) + } + suspend fun updatePassword( id: Int, domain: String, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index eac1c8f7..57cc79cf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel @@ -15,6 +16,10 @@ val appModule = module { Controller(get(), get()) } + factory { + ImportPasswordUseCase(androidContext(), get()) + } + viewModel { UpdatePasswordViewModel(get()) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt new file mode 100644 index 00000000..c3e71527 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt @@ -0,0 +1,57 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import android.content.Context +import android.net.Uri +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.database.Password + +class ImportPasswordUseCase( + val context: Context, + val passwordRepository: PasswordRepository +) { + private val CSVHEADER = "name,url,username,password,note" + + suspend fun run(csvFileUri: Uri) { + context.contentResolver.openInputStream(csvFileUri)?.bufferedReader().use { reader -> + requireNotNull(reader) + + val header = reader.readLine() + if (header != CSVHEADER) { + throw Exception("The given csv file has incorrect header format. Correct Format is [$CSVHEADER]") + } + + var line: String? = reader.readLine() + while (line != null) { + val cols = line.split(",") + + val chosenDomain: String = if (!cols[0].isBlank()) { + cols[0].trim() + } else cols[1].trim() + + val password: Password? = passwordRepository.getPasswordByUsernameAndDomain( + username = cols[2].trim(), + domain = chosenDomain + ) + + if (password != null) { + passwordRepository.updatePassword( + id = password.id, + domain = password.domain, + username = password.username, + password = cols[3].trim(), + notes = cols[4].trim() + ) + } else { + passwordRepository.savePasswordEntity( + domain = chosenDomain, + username = cols[2].trim(), + password = cols[3].trim(), + notes = cols[4].trim() + ) + } + + line = reader.readLine() + } + } + } +} From 50c867c8756dc360c79b25641284f0a617edecc4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 25 Nov 2025 16:22:06 +0530 Subject: [PATCH 013/115] refactor: use import password usecase --- .../oldui/PasswordManagerActivity.kt | 44 +++---------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 6e85d75c..1c82dad1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -11,6 +11,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding +import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.appDatastore @@ -27,6 +28,8 @@ class PasswordManagerActivity : AppCompatActivity() { private val controller: Controller by inject() + private val importPasswordUseCase: ImportPasswordUseCase by inject() + private lateinit var binding: ActivityPasswordManagerBinding private lateinit var exportCsvLauncher: ActivityResultLauncher @@ -47,43 +50,10 @@ class PasswordManagerActivity : AppCompatActivity() { ) { result -> if (result.resultCode == RESULT_OK) { val uri = result.data?.data - if (uri != null) { - val CSVData: String? = - contentResolver.openInputStream(uri)?.bufferedReader()?.use { - it.readText() - } - - lifecycleScope.launch(Dispatchers.IO) { - if (CSVData != null) { - try { - val result: IntArray = controller.importDataFromCsvString(CSVData) - - withContext(Dispatchers.Main) { - Toast.makeText( - this@PasswordManagerActivity, - getString(R.string.import_success, result[0]), - Toast.LENGTH_LONG - ).show() - - if (result[1] != 0) { - Toast.makeText( - this@PasswordManagerActivity, - getString(R.string.import_failed, result[1]), - Toast.LENGTH_LONG - ).show() - } - } - } catch (e: Exception) { - withContext(Dispatchers.Main) { - Toast.makeText( - this@PasswordManagerActivity, - e.message, - Toast.LENGTH_LONG - ).show() - } - } - } - } + requireNotNull(uri) + + lifecycleScope.launch(Dispatchers.IO) { + importPasswordUseCase.run(uri) } } } From a3be4835b491474a2a33fa131211dc465d9c6c4d Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 26 Nov 2025 12:15:07 +0530 Subject: [PATCH 014/115] refactor: made a export password usecase --- .../jeeldobariya/passcodes/di/appModule.kt | 5 ++++ .../domain/usecases/ExportPasswordUseCase.kt | 30 +++++++++++++++++++ .../domain/usecases/ImportPasswordUseCase.kt | 4 +-- .../oldui/PasswordManagerActivity.kt | 13 ++++---- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 57cc79cf..ba228617 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel @@ -20,6 +21,10 @@ val appModule = module { ImportPasswordUseCase(androidContext(), get()) } + factory { + ExportPasswordUseCase(androidContext(), get()) + } + viewModel { UpdatePasswordViewModel(get()) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt new file mode 100644 index 00000000..4e81a32e --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt @@ -0,0 +1,30 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import android.content.Context +import android.net.Uri +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.database.Password +import kotlinx.coroutines.flow.first + +class ExportPasswordUseCase( + val context: Context, + val passwordRepository: PasswordRepository +) { + private val CSVHEADER = "name,url,username,password,note" + + suspend fun run(exportFileUri: Uri) { + context.contentResolver.openOutputStream(exportFileUri)?.bufferedWriter().use { writer -> + requireNotNull(writer) + + writer.write(CSVHEADER) + + val passwords: List = passwordRepository.getAllPasswords().first() + + passwords.forEach { password -> + val row = "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" + writer.write(row) + writer.newLine() + } + } + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt index c3e71527..c3270ddb 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt @@ -11,8 +11,8 @@ class ImportPasswordUseCase( ) { private val CSVHEADER = "name,url,username,password,note" - suspend fun run(csvFileUri: Uri) { - context.contentResolver.openInputStream(csvFileUri)?.bufferedReader().use { reader -> + suspend fun run(importFileUri: Uri) { + context.contentResolver.openInputStream(importFileUri)?.bufferedReader().use { reader -> requireNotNull(reader) val header = reader.readLine() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 1c82dad1..13c1007a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -11,6 +11,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding +import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.Controller @@ -30,6 +31,8 @@ class PasswordManagerActivity : AppCompatActivity() { private val importPasswordUseCase: ImportPasswordUseCase by inject() + private val exportPasswordUseCase: ExportPasswordUseCase by inject() + private lateinit var binding: ActivityPasswordManagerBinding private lateinit var exportCsvLauncher: ActivityResultLauncher @@ -63,12 +66,10 @@ class PasswordManagerActivity : AppCompatActivity() { ) { result -> if (result.resultCode == RESULT_OK) { val uri = result.data?.data - if (uri != null && !tmpExportCSVData.isNullOrEmpty()) { - contentResolver.openOutputStream(uri)?.use { outputStream -> - outputStream.write(tmpExportCSVData!!.toByteArray()) - } - Toast.makeText(this, getString(R.string.export_success), Toast.LENGTH_SHORT) - .show() + requireNotNull(uri) + + lifecycleScope.launch(Dispatchers.IO) { + exportPasswordUseCase.run(uri) } } } From 310f02896742a38215145cc550a7e317b973131a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 26 Nov 2025 12:40:46 +0530 Subject: [PATCH 015/115] refactor: improve the usecases --- .../jeeldobariya/passcodes/di/appModule.kt | 8 +++---- ...UseCase.kt => ExportPasswordCSVUseCase.kt} | 16 +++++-------- ...UseCase.kt => ImportPasswordCSVUseCase.kt} | 9 ++++--- .../oldui/PasswordManagerActivity.kt | 8 +++---- .../jeeldobariya/passcodes/utils/Constants.kt | 10 ++------ gradle.properties | 24 ++++++++----------- 6 files changed, 30 insertions(+), 45 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/{ExportPasswordUseCase.kt => ExportPasswordCSVUseCase.kt} (52%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/{ImportPasswordUseCase.kt => ImportPasswordCSVUseCase.kt} (89%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index ba228617..04d75d7b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,7 +1,7 @@ package com.jeeldobariya.passcodes.di -import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase +import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel @@ -18,11 +18,11 @@ val appModule = module { } factory { - ImportPasswordUseCase(androidContext(), get()) + ImportPasswordCSVUseCase(androidContext(), get()) } factory { - ExportPasswordUseCase(androidContext(), get()) + ExportPasswordCSVUseCase(androidContext(), get()) } viewModel { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt similarity index 52% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt index 4e81a32e..e3806e8a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt @@ -3,26 +3,22 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.utils.Constant import kotlinx.coroutines.flow.first -class ExportPasswordUseCase( +class ExportPasswordCSVUseCase( val context: Context, val passwordRepository: PasswordRepository ) { - private val CSVHEADER = "name,url,username,password,note" - suspend fun run(exportFileUri: Uri) { context.contentResolver.openOutputStream(exportFileUri)?.bufferedWriter().use { writer -> requireNotNull(writer) - writer.write(CSVHEADER) - - val passwords: List = passwordRepository.getAllPasswords().first() + writer.write(Constant.IMPORT_EXPORT_CSV_HEADER) + writer.newLine() - passwords.forEach { password -> - val row = "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" - writer.write(row) + passwordRepository.getAllPasswords().first().forEach { password -> + writer.write("${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}") writer.newLine() } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt similarity index 89% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt index c3270ddb..fe69217a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt @@ -4,20 +4,19 @@ import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.utils.Constant -class ImportPasswordUseCase( +class ImportPasswordCSVUseCase( val context: Context, val passwordRepository: PasswordRepository ) { - private val CSVHEADER = "name,url,username,password,note" - suspend fun run(importFileUri: Uri) { context.contentResolver.openInputStream(importFileUri)?.bufferedReader().use { reader -> requireNotNull(reader) val header = reader.readLine() - if (header != CSVHEADER) { - throw Exception("The given csv file has incorrect header format. Correct Format is [$CSVHEADER]") + if (header != Constant.IMPORT_EXPORT_CSV_HEADER) { + throw Exception("The given csv file has incorrect header format. Correct Format is [${Constant.IMPORT_EXPORT_CSV_HEADER}]") } var line: String? = reader.readLine() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 13c1007a..ffa422f5 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -11,8 +11,8 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding -import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase +import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.appDatastore @@ -29,9 +29,9 @@ class PasswordManagerActivity : AppCompatActivity() { private val controller: Controller by inject() - private val importPasswordUseCase: ImportPasswordUseCase by inject() + private val importPasswordUseCase: ImportPasswordCSVUseCase by inject() - private val exportPasswordUseCase: ExportPasswordUseCase by inject() + private val exportPasswordUseCase: ExportPasswordCSVUseCase by inject() private lateinit var binding: ActivityPasswordManagerBinding diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt index 24a068b5..685e265f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt @@ -15,12 +15,6 @@ object Constant { const val RELEASE_NOTE_URL = "$DOCS_REPOSITORY_URL/blob/main/user-docs/release-notes.md" const val SECURITY_GUIDE_URL = "$DOCS_REPOSITORY_URL/blob/main/user-docs/security-guidelines.md" - - // Shared Preferences Constants - const val APP_PREFS_NAME = "app_prefs" - const val THEME_KEY = "selected_theme" - - const val FEATURE_FLAGS_PREFS_NAME = "feature_flags_prefs" - const val LATEST_FEATURES_KEY = "latest_features_enabled" + // Other App Constants + const val IMPORT_EXPORT_CSV_HEADER = "name,url,username,password,note" } - diff --git a/gradle.properties b/gradle.properties index b8dde8b0..1e80d57e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,17 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit +## For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html +# # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# # When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX +#Wed Nov 26 12:17:35 IST 2025 android.enableJetifier=true -# gradle.properties (in your project root) +android.useAndroidX=true +org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M" -Dfile.encoding\=UTF-8 org.gradle.warning.mode=all From e5a1e2c23ed408b9211710d73f89b65c62411aa4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 11:55:58 +0530 Subject: [PATCH 016/115] feat: ignore the invalid entity in csv --- .../passcodes/domain/usecases/ImportPasswordCSVUseCase.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt index fe69217a..2cab8581 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt @@ -27,6 +27,14 @@ class ImportPasswordCSVUseCase( cols[0].trim() } else cols[1].trim() + // Skip the entity/row of csv + // If, + // It lacks value for either, [domain, username or password]!! + if (chosenDomain.isBlank() || cols[2].isBlank() || cols[3].isEmpty()) { + line = reader.readLine() + continue + } + val password: Password? = passwordRepository.getPasswordByUsernameAndDomain( username = cols[2].trim(), domain = chosenDomain From ea87c757af273ba42afd4f44d98f5e2217bcc077 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 12:34:40 +0530 Subject: [PATCH 017/115] refactor: remove controller class as not need anymore --- .../jeeldobariya/passcodes/di/appModule.kt | 5 -- .../oldui/PasswordManagerActivity.kt | 15 +--- .../load_password/LoadPasswordViewModel.kt | 1 - .../save_password/SavePasswordViewModel.kt | 1 - .../UpdatePasswordViewModel.kt | 1 - .../view_password/ViewPasswordViewModel.kt | 1 - .../passcodes/utils/Controller.kt | 82 ------------------- 7 files changed, 2 insertions(+), 104 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 04d75d7b..a0bda009 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -6,17 +6,12 @@ import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewMod import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel -import com.jeeldobariya.passcodes.utils.Controller import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel import org.koin.dsl.module val appModule = module { - single { - Controller(get(), get()) - } - factory { ImportPasswordCSVUseCase(androidContext(), get()) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index ffa422f5..f7338604 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -14,21 +14,16 @@ import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.appDatastore import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import org.koin.android.ext.android.inject class PasswordManagerActivity : AppCompatActivity() { - - private val controller: Controller by inject() - private val importPasswordUseCase: ImportPasswordCSVUseCase by inject() private val exportPasswordUseCase: ExportPasswordCSVUseCase by inject() @@ -36,7 +31,6 @@ class PasswordManagerActivity : AppCompatActivity() { private lateinit var binding: ActivityPasswordManagerBinding private lateinit var exportCsvLauncher: ActivityResultLauncher - private var tmpExportCSVData: String? = null private lateinit var importCsvLauncher: ActivityResultLauncher @@ -117,13 +111,8 @@ class PasswordManagerActivity : AppCompatActivity() { Toast.LENGTH_LONG ).show() - lifecycleScope.launch(Dispatchers.IO) { - val csvDataExportBlob = controller.exportDataToCsvString() - - withContext(Dispatchers.Main) { - tmpExportCSVData = csvDataExportBlob - exportCsvFilePicker() - } + lifecycleScope.launch(Dispatchers.Main) { + exportCsvFilePicker() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt index f6fd7f87..33d9c0ea 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt @@ -3,7 +3,6 @@ package com.jeeldobariya.passcodes.presentation.load_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt index e542a51a..9ac2a0e3 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt @@ -3,7 +3,6 @@ package com.jeeldobariya.passcodes.presentation.save_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index 311833c7..e0a088ba 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.Password -import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index 7962cc16..c7e4b464 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.Password -import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DateTimeUtils import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt index b54d85f5..8aab6868 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -1,87 +1,5 @@ package com.jeeldobariya.passcodes.utils -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.MasterDatabase -import com.jeeldobariya.passcodes.database.Password -import com.jeeldobariya.passcodes.database.PasswordsDao -import kotlinx.coroutines.flow.first - class InvalidInputException(message: String = "Input parameters cannot be blank.") : Exception(message) -class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : Exception(message) - -class Controller(database: MasterDatabase, val passwordRepository: PasswordRepository) { - private val passwordsDao: PasswordsDao = database.passwordsDao - - companion object { - const val CSV_HEADER = "name,url,username,password,note" - } - - - - suspend fun exportDataToCsvString(): String { - val passwords: List = passwordRepository.getAllPasswords().first() - - val rows = passwords.joinToString("\n") { password -> - "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" - } - - return CSV_HEADER + "\n" + rows - } - - suspend fun importDataFromCsvString(csvString: String): IntArray { - val lines = csvString.lines().filter { it.isNotBlank() } - - if (lines.isEmpty()) { - throw InvalidImportFormat("Given data seems to be Empty!!") - } - - if (lines[0] != CSV_HEADER) { - throw InvalidImportFormat("Given data is not in valid csv format!! correct format:- ${CSV_HEADER}") - } - - var importedPasswordCount = 0 - var failToImportedPasswordCount = 0 - - lines.drop(1).forEach { line -> - val cols = line.split(",") - - /* NOTE: this need to be done, because our app not allow empty domain. */ - val chosenDomain: String = if (!cols[0].isBlank()) { - cols[0].trim() // used: name - } else cols[1].trim() // used: url - - try { - val password: Password? = passwordsDao.getPasswordByUsernameAndDomain( - username = cols[2].trim(), - domain = chosenDomain - ) - - if (password != null) { - passwordRepository.updatePassword( - id = password.id, - domain = password.domain, - username = password.username, - password = cols[3].trim(), - notes = cols[4].trim() - ) - } else { - passwordRepository.savePasswordEntity( - domain = chosenDomain, - username = cols[2].trim(), - password = cols[3].trim(), - notes = cols[4].trim() - ) - } - - importedPasswordCount++ - } catch (e: InvalidInputException) { - e.printStackTrace() - failToImportedPasswordCount++ - } - } - - return intArrayOf(importedPasswordCount, failToImportedPasswordCount) - } -} From 04e3b04892328b64e3cf3584404c5cdc6ae57def Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 13:23:20 +0530 Subject: [PATCH 018/115] refactor: the password repository a bitgit add . --- .../passcodes/data/repository/PasswordRepository.kt | 9 ++------- .../com/jeeldobariya/passcodes/utils/Controller.kt | 5 ----- 2 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index ec9bcbd1..33d3112c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -3,7 +3,6 @@ package com.jeeldobariya.passcodes.data.repository import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao import com.jeeldobariya.passcodes.utils.DateTimeUtils -import com.jeeldobariya.passcodes.utils.InvalidInputException import kotlinx.coroutines.flow.Flow class PasswordRepository(val passwordsDao: PasswordsDao) { @@ -18,9 +17,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { password: String, notes: String ): Long { - if (domain.isBlank() || username.isBlank() || password.isBlank()) { - throw InvalidInputException() - } + require(domain.isBlank() || username.isBlank() || password.isBlank()) val currentTimestamp = DateTimeUtils.getCurrDateTime() val newPassword = Password( @@ -50,9 +47,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { password: String, notes: String ): Int { - if (domain.isBlank() || username.isBlank() || password.isBlank()) { - throw InvalidInputException() - } + require(domain.isBlank() || username.isBlank() || password.isBlank()) val existingPassword = requireNotNull(passwordsDao.getPasswordById(id)) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt deleted file mode 100644 index 8aab6868..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.jeeldobariya.passcodes.utils - -class InvalidInputException(message: String = "Input parameters cannot be blank.") : - Exception(message) - From 03a75ab42236770fd613bbb8e7eeeb99a6750782 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 13:28:19 +0530 Subject: [PATCH 019/115] refactor: comment permission class as not need currently --- .../kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt index db1e16cc..ba303476 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt @@ -1,5 +1,8 @@ package com.jeeldobariya.passcodes.utils +// comment the below code as permission are not used in app. +// currently, but we might require this later.. +/* import android.Manifest import android.app.Activity import android.content.pm.PackageManager @@ -53,3 +56,4 @@ class Permissions(private val activity: Activity) { grantResults[1] == PackageManager.PERMISSION_GRANTED } } +*/ From f9ddfd4146d9787a791b2c048492d134720e315f Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 13:31:46 +0530 Subject: [PATCH 020/115] refactor: collecting state in xml code --- .../CollectStateWithLifeCycleInXml.kt} | 2 +- .../com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt | 1 - .../com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt | 1 - .../kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 1 - .../com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt | 1 - .../com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{utils/tempmigration.kt => oldui/CollectStateWithLifeCycleInXml.kt} (92%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/tempmigration.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt similarity index 92% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/tempmigration.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt index 284e494b..0e584cf1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/tempmigration.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.oldui import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index fbf9de75..4348786f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -12,7 +12,6 @@ import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore -import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index f7338604..9de70282 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -15,7 +15,6 @@ import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.appDatastore -import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 9443827c..04f41564 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -14,7 +14,6 @@ import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.utils.appDatastore -import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt index e2cd23c0..14534507 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt @@ -10,7 +10,6 @@ import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordAction import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore -import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt index 46ffb23d..24831cbd 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt @@ -13,7 +13,6 @@ import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel import com.jeeldobariya.passcodes.utils.appDatastore -import com.jeeldobariya.passcodes.utils.collectLatestLifecycleFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel From 727caee2ff343d97bd3411f20f2a238e0ab91e57 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Thu, 27 Nov 2025 13:42:43 +0530 Subject: [PATCH 021/115] refactor: improve csv file exporting --- .../passcodes/domain/usecases/ExportPasswordCSVUseCase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt index e3806e8a..601d0480 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt @@ -18,7 +18,7 @@ class ExportPasswordCSVUseCase( writer.newLine() passwordRepository.getAllPasswords().first().forEach { password -> - writer.write("${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}") + writer.write("${password.domain.trim()},https://local.${password.domain.trim()},${password.username.trim()},${password.password.trim()},${password.notes.trim()}") writer.newLine() } } From 6bb20699f2506b958ad1912c7865ddad201bf2e5 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 09:22:23 +0530 Subject: [PATCH 022/115] refactor: made a password modal --- .../passcodes/domain/modals/PasswordModal.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt new file mode 100644 index 00000000..c767d010 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt @@ -0,0 +1,10 @@ +package com.jeeldobariya.passcodes.domain.modals + +data class PasswordModal( + val id: Int, + val domain: String, + val username: String, + val password: String, + val notes: String, + val lastUpdatedAt: String +) From e6935a04186fe8c3cf38bf2fab2540ad87022a5c Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 11:42:32 +0530 Subject: [PATCH 023/115] refactor: use password model everywhere!! --- .../data/repository/PasswordRepository.kt | 62 +++++++++++++++---- .../usecases/ExportPasswordCSVUseCase.kt | 4 +- .../usecases/ImportPasswordCSVUseCase.kt | 4 +- .../passcodes/oldui/LoadPasswordActivity.kt | 3 +- .../passcodes/oldui/SavePasswordActivity.kt | 1 - .../oldui/adapter/PasswordAdapter.kt | 6 +- .../load_password/LoadPasswordState.kt | 6 +- .../load_password/LoadPasswordViewModel.kt | 8 +-- .../UpdatePasswordViewModel.kt | 4 +- .../view_password/ViewPasswordViewModel.kt | 7 +-- 10 files changed, 68 insertions(+), 37 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 33d3112c..97cd2739 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -2,13 +2,24 @@ package com.jeeldobariya.passcodes.data.repository import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.utils.DateTimeUtils -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlin.require class PasswordRepository(val passwordsDao: PasswordsDao) { - fun getAllPasswords(): Flow> { - return passwordsDao.getAllPasswords() + suspend fun getAllPasswords(): List { + return passwordsDao.getAllPasswords().first().map { + PasswordModal( + id = it.id, + domain = it.domain, + username = it.username, + password = it.password, + notes = it.notes, + lastUpdatedAt = "TODO()" + ) + } } suspend fun savePasswordEntity( @@ -16,9 +27,8 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { username: String, password: String, notes: String - ): Long { - require(domain.isBlank() || username.isBlank() || password.isBlank()) - + ): Int { + require(domain.isNotBlank() || username.isNotBlank() || password.isNotBlank()) val currentTimestamp = DateTimeUtils.getCurrDateTime() val newPassword = Password( domain = domain, @@ -29,15 +39,41 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { updatedAt = currentTimestamp ) - return passwordsDao.insertPassword(newPassword) + return passwordsDao.insertPassword(newPassword).toInt() } - suspend fun getPasswordById(id: Int): Password? { - return passwordsDao.getPasswordById(id) + suspend fun getPasswordById(id: Int): PasswordModal? { + val result = passwordsDao.getPasswordById(id) + + return if (result != null) { + PasswordModal( + id = result.id, + domain = result.domain, + username = result.username, + password = result.password, + notes = result.notes, + lastUpdatedAt = "TODO()" + ) + } else { + null + } } - suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password? { - return passwordsDao.getPasswordByUsernameAndDomain(username = username, domain = domain) + suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): PasswordModal? { + val result = passwordsDao.getPasswordByUsernameAndDomain(username = username, domain = domain) + + return if (result != null) { + PasswordModal( + id = result.id, + domain = result.domain, + username = result.username, + password = result.password, + notes = result.notes, + lastUpdatedAt = "TODO()" + ) + } else { + null + } } suspend fun updatePassword( @@ -47,7 +83,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { password: String, notes: String ): Int { - require(domain.isBlank() || username.isBlank() || password.isBlank()) + require(domain.isNotBlank() || username.isNotBlank() || password.isNotBlank()) val existingPassword = requireNotNull(passwordsDao.getPasswordById(id)) @@ -67,7 +103,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { return passwordsDao.deletePasswordById(id) } - suspend fun clearAllData() { + suspend fun clearAllData(): Unit { passwordsDao.clearAllPasswordData() } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt index 601d0480..7426b43a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt @@ -3,8 +3,8 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.utils.Constant -import kotlinx.coroutines.flow.first class ExportPasswordCSVUseCase( val context: Context, @@ -17,7 +17,7 @@ class ExportPasswordCSVUseCase( writer.write(Constant.IMPORT_EXPORT_CSV_HEADER) writer.newLine() - passwordRepository.getAllPasswords().first().forEach { password -> + passwordRepository.getAllPasswords().forEach { password -> writer.write("${password.domain.trim()},https://local.${password.domain.trim()},${password.username.trim()},${password.password.trim()},${password.notes.trim()}") writer.newLine() } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt index 2cab8581..28de15bb 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt @@ -3,7 +3,7 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.utils.Constant class ImportPasswordCSVUseCase( @@ -35,7 +35,7 @@ class ImportPasswordCSVUseCase( continue } - val password: Password? = passwordRepository.getPasswordByUsernameAndDomain( + val password: PasswordModal? = passwordRepository.getPasswordByUsernameAndDomain( username = cols[2].trim(), domain = chosenDomain ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index 4348786f..60c7fc6d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -8,6 +8,7 @@ import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel @@ -66,7 +67,7 @@ class LoadPasswordActivity : AppCompatActivity() { private fun addOnClickListenerOnButton() { binding.passwordList.setOnItemClickListener { _, _, position, _ -> // getItem returns Any, so we cast it to Password - val selectedPassword = passwordAdapter.getItem(position) as Password + val selectedPassword = passwordAdapter.getItem(position) as PasswordModal // Do something with the selectedPassword val intent = Intent(this, ViewPasswordActivity::class.java) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt index f202192f..a5300cc2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt @@ -41,7 +41,6 @@ class SavePasswordActivity : AppCompatActivity() { binding.inputUsername.setHint("") } } - binding.inputPassword.setOnFocusChangeListener { v, hasFocus -> if (hasFocus) { binding.inputPassword.setHint(getString(R.string.placeholder_password_field)) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt index 249fa700..6a5faa7b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt @@ -5,16 +5,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter -import com.jeeldobariya.passcodes.database.Password // Use your Room entity directly import com.jeeldobariya.passcodes.databinding.PasswordListItemBinding +import com.jeeldobariya.passcodes.domain.modals.PasswordModal class PasswordAdapter( private val context: Context, - private var passwordList: List // Use mutable list if you need to update it + private var passwordList: List // Use mutable list if you need to update it ) : BaseAdapter() { // You might want to provide a way to update the list and notify the adapter - fun updateData(newList: List) { + fun updateData(newList: List) { passwordList = newList notifyDataSetChanged() // Notify the ListView that the data has changed } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt index 0a90eb8f..7f1c064b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt @@ -1,8 +1,8 @@ package com.jeeldobariya.passcodes.presentation.load_password -import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.domain.modals.PasswordModal data class LoadPasswordState( - val passwordEntityList: List = emptyList(), + val passwordEntityList: List = emptyList(), val isError: Boolean = false -) \ No newline at end of file +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt index 33d9c0ea..5413e553 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt @@ -5,8 +5,6 @@ import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -27,11 +25,9 @@ class LoadPasswordViewModel( viewModelScope.launch { _state.update { LoadPasswordState( - passwordEntityList = passwordRepository.getAllPasswords().catch { - _state.update { it.copy(isError = true) } - }.first() + passwordEntityList = passwordRepository.getAllPasswords() ) } } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index e0a088ba..c6112770 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -3,7 +3,7 @@ package com.jeeldobariya.passcodes.presentation.update_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update @@ -23,7 +23,7 @@ class UpdatePasswordViewModel( viewModelScope.launch { try { - val password: Password = requireNotNull(passwordRepository.getPasswordById(passwordId)) + val password: PasswordModal = requireNotNull(passwordRepository.getPasswordById(passwordId)) _state.update { it.copy( diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index c7e4b464..ee7d0a04 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -3,8 +3,7 @@ package com.jeeldobariya.passcodes.presentation.view_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.Password -import com.jeeldobariya.passcodes.utils.DateTimeUtils +import com.jeeldobariya.passcodes.domain.modals.PasswordModal import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update @@ -31,7 +30,7 @@ class ViewPasswordViewModel( viewModelScope.launch { try { - val password: Password = requireNotNull(passwordRepository.getPasswordById(passwordId)) + val password: PasswordModal = requireNotNull(passwordRepository.getPasswordById(passwordId)) _state.update { it.copy( @@ -39,7 +38,7 @@ class ViewPasswordViewModel( username = password.username, password = password.password, notes = password.notes, - lastUpdatedAt = DateTimeUtils.getRelativeDays(password.updatedAt.orEmpty()) + lastUpdatedAt = password.lastUpdatedAt ) } } catch (_: Exception) { From 1c5c74155b7446ca35cfd167af2bc46bd11f842e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 12:31:45 +0530 Subject: [PATCH 024/115] refactor: prevent data use in presentation --- .../jeeldobariya/passcodes/di/appModule.kt | 29 +++++++++++++++++-- .../passcodes/domain/modals/PasswordModal.kt | 4 +-- .../domain/usecases/DeletePasswordUseCase.kt | 11 +++++++ .../domain/usecases/EditPasswordUseCase.kt | 18 ++++++++++++ .../usecases/RetrieveAllPasswordUseCase.kt | 12 ++++++++ .../usecases/RetrievePasswordUseCase.kt | 12 ++++++++ .../domain/usecases/StorePasswordUseCase.kt | 17 +++++++++++ .../load_password/LoadPasswordViewModel.kt | 6 ++-- .../save_password/SavePasswordViewModel.kt | 17 ++++++----- .../UpdatePasswordViewModel.kt | 26 ++++++++++------- .../view_password/ViewPasswordViewModel.kt | 10 ++++--- 11 files changed, 132 insertions(+), 30 deletions(-) create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt create mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index a0bda009..0813fa9a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,7 +1,12 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.domain.usecases.DeletePasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.EditPasswordUseCase import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase +import com.jeeldobariya.passcodes.domain.usecases.RetrieveAllPasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.StorePasswordUseCase import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel @@ -20,8 +25,28 @@ val appModule = module { ExportPasswordCSVUseCase(androidContext(), get()) } + factory { + StorePasswordUseCase(get()) + } + + factory { + RetrievePasswordUseCase(get()) + } + + factory { + RetrieveAllPasswordUseCase(get()) + } + + factory { + EditPasswordUseCase(get()) + } + + factory { + DeletePasswordUseCase(get()) + } + viewModel { - UpdatePasswordViewModel(get()) + UpdatePasswordViewModel(get(), get()) } viewModel { @@ -33,7 +58,7 @@ val appModule = module { } viewModel { - ViewPasswordViewModel(get()) + ViewPasswordViewModel(get(), get()) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt index c767d010..930ce4d6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt @@ -1,10 +1,10 @@ package com.jeeldobariya.passcodes.domain.modals data class PasswordModal( - val id: Int, + val id: Int = 0, val domain: String, val username: String, val password: String, val notes: String, - val lastUpdatedAt: String + val lastUpdatedAt: String = "" ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt new file mode 100644 index 00000000..3504636d --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt @@ -0,0 +1,11 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import com.jeeldobariya.passcodes.data.repository.PasswordRepository + +class DeletePasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(id: Int) { + passwordRepository.deletePassword(id = id) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt new file mode 100644 index 00000000..061152f1 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt @@ -0,0 +1,18 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal + +class EditPasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(password: PasswordModal) { + passwordRepository.updatePassword( + id = password.id, + domain = password.domain, + username = password.username, + password = password.password, + notes = password.notes + ) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt new file mode 100644 index 00000000..531f6a50 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt @@ -0,0 +1,12 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal + +class RetrieveAllPasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(): List { + return passwordRepository.getAllPasswords() + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt new file mode 100644 index 00000000..7bef6a0c --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt @@ -0,0 +1,12 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal + +class RetrievePasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(id: Int): PasswordModal? { + return passwordRepository.getPasswordById(id) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt new file mode 100644 index 00000000..66d92d38 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt @@ -0,0 +1,17 @@ +package com.jeeldobariya.passcodes.domain.usecases + +import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal + +class StorePasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(password: PasswordModal) { + passwordRepository.savePasswordEntity( + domain = password.domain, + username = password.username, + password = password.password, + notes = password.notes + ) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt index 5413e553..0eee4600 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt @@ -2,14 +2,14 @@ package com.jeeldobariya.passcodes.presentation.load_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.usecases.RetrieveAllPasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class LoadPasswordViewModel( - var passwordRepository: PasswordRepository + var retrieveAllPasswordUseCase: RetrieveAllPasswordUseCase ) : ViewModel() { private val _state = MutableStateFlow(LoadPasswordState()) @@ -25,7 +25,7 @@ class LoadPasswordViewModel( viewModelScope.launch { _state.update { LoadPasswordState( - passwordEntityList = passwordRepository.getAllPasswords() + passwordEntityList = retrieveAllPasswordUseCase.run() ) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt index 9ac2a0e3..b6d9cc0b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt @@ -2,14 +2,15 @@ package com.jeeldobariya.passcodes.presentation.save_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.domain.usecases.StorePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class SavePasswordViewModel( - val passwordRepository: PasswordRepository + val storePasswordUseCase: StorePasswordUseCase ) : ViewModel() { private val _state = MutableStateFlow(SavePasswordState()) @@ -44,12 +45,12 @@ class SavePasswordViewModel( private fun savePasswordEntity() { viewModelScope.launch { try { - passwordRepository.savePasswordEntity( - _state.value.domain, - _state.value.username, - _state.value.password, - _state.value.notes - ) + storePasswordUseCase.run(password = PasswordModal( + domain = _state.value.domain, + username = _state.value.username, + password = _state.value.password, + notes = _state.value.notes + )) } catch (e: Exception) { _state.update { it.copy(isError = true) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt index c6112770..64cf4da1 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt @@ -2,15 +2,17 @@ package com.jeeldobariya.passcodes.presentation.update_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.domain.usecases.EditPasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class UpdatePasswordViewModel( - val passwordRepository: PasswordRepository + val retrievePasswordUseCase: RetrievePasswordUseCase, + val editPasswordUseCase: EditPasswordUseCase ) : ViewModel() { var passwordEntityId: Int = -1 @@ -23,7 +25,7 @@ class UpdatePasswordViewModel( viewModelScope.launch { try { - val password: PasswordModal = requireNotNull(passwordRepository.getPasswordById(passwordId)) + val password: PasswordModal = requireNotNull(retrievePasswordUseCase.run(passwordId)) _state.update { it.copy( @@ -33,7 +35,7 @@ class UpdatePasswordViewModel( notes = password.notes ) } - } catch (e: Exception) { + } catch (_: Exception) { _state.update { it.copy(isError = false) } } } @@ -68,14 +70,16 @@ class UpdatePasswordViewModel( private fun updatePasswordEntity() { viewModelScope.launch { try { - passwordRepository.updatePassword( - passwordEntityId, - _state.value.domain, - _state.value.username, - _state.value.password, - _state.value.notes + editPasswordUseCase.run( + password = PasswordModal( + id = passwordEntityId, + domain = _state.value.domain, + username = _state.value.username, + password = _state.value.password, + notes = _state.value.notes + ) ) - } catch (e: Exception) { + } catch (_: Exception) { _state.update { it.copy(isError = false) } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt index ee7d0a04..cf39f1d9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt @@ -2,15 +2,17 @@ package com.jeeldobariya.passcodes.presentation.view_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.domain.usecases.DeletePasswordUseCase +import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class ViewPasswordViewModel( - val passwordRepository: PasswordRepository + val retrievePasswordUseCase: RetrievePasswordUseCase, + val deletePasswordUseCase: DeletePasswordUseCase ) : ViewModel() { var passwordEntityId: Int = -1 @@ -30,7 +32,7 @@ class ViewPasswordViewModel( viewModelScope.launch { try { - val password: PasswordModal = requireNotNull(passwordRepository.getPasswordById(passwordId)) + val password: PasswordModal = requireNotNull(retrievePasswordUseCase.run(passwordId)) _state.update { it.copy( @@ -50,7 +52,7 @@ class ViewPasswordViewModel( private fun deletePasswordEntity() { viewModelScope.launch { try { - passwordRepository.deletePassword(passwordEntityId) + deletePasswordUseCase.run(passwordEntityId) } catch (_: Exception) { _state.update { it.copy(isError = true) } } From 653d356ccb9056b9a22f3854d7e1afb7a286e9ca Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 17:14:58 +0530 Subject: [PATCH 025/115] refactor: rename Password to PasswordEntity --- .../passcodes/data/repository/PasswordRepository.kt | 4 ++-- .../passcodes/database/MasterDatabase.kt | 2 +- .../com/jeeldobariya/passcodes/database/Password.kt | 2 +- .../jeeldobariya/passcodes/database/PasswordsDao.kt | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 97cd2739..740f02d4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -1,6 +1,6 @@ package com.jeeldobariya.passcodes.data.repository -import com.jeeldobariya.passcodes.database.Password +import com.jeeldobariya.passcodes.database.PasswordEntity import com.jeeldobariya.passcodes.database.PasswordsDao import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.utils.DateTimeUtils @@ -30,7 +30,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { ): Int { require(domain.isNotBlank() || username.isNotBlank() || password.isNotBlank()) val currentTimestamp = DateTimeUtils.getCurrDateTime() - val newPassword = Password( + val newPassword = PasswordEntity( domain = domain, username = username, password = password, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt index 730ebd36..8ce9baaf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt @@ -6,7 +6,7 @@ import androidx.room.Room import androidx.room.RoomDatabase @Database( - entities = [Password::class], + entities = [PasswordEntity::class], version = 1, exportSchema = true ) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt index 2ca72d31..f2e9438c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt @@ -5,7 +5,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "passwords") -data class Password( +data class PasswordEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, var domain: String, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt index 55b246c7..11b88d7e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt @@ -11,25 +11,25 @@ import kotlinx.coroutines.flow.Flow interface PasswordsDao { @Insert - suspend fun insertPassword(password: Password): Long + suspend fun insertPassword(password: PasswordEntity): Long @Query("SELECT * FROM passwords ORDER BY id DESC") - fun getAllPasswords(): Flow> + fun getAllPasswords(): Flow> @Query("SELECT * FROM passwords WHERE id = :id") - suspend fun getPasswordById(id: Int): Password? + suspend fun getPasswordById(id: Int): PasswordEntity? @Query("SELECT * FROM passwords WHERE username = :username AND domain = :domain") - suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password? + suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): PasswordEntity? @Update - suspend fun updatePassword(password: Password): Int + suspend fun updatePassword(password: PasswordEntity): Int @Query("DELETE FROM passwords WHERE id = :id") suspend fun deletePasswordById(id: Int): Int @Delete - suspend fun deletePassword(password: Password): Int + suspend fun deletePassword(password: PasswordEntity): Int @Query("DELETE FROM passwords") suspend fun clearAllPasswordData(): Int From e55c72746e5eb604ffbeadcceaf32526a7a65c77 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 18:40:14 +0530 Subject: [PATCH 026/115] refactor: the update checking code --- .../jeeldobariya/passcodes/di/appModule.kt | 10 ++++++ .../usecases/CheckForUpdateUseCase.kt} | 32 ++++++++++--------- .../passcodes/oldui/LoadPasswordActivity.kt | 1 - .../passcodes/oldui/MainActivity.kt | 7 ++-- 4 files changed, 32 insertions(+), 18 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{utils/UpdateChecker.kt => domain/usecases/CheckForUpdateUseCase.kt} (65%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 0813fa9a..5edeeb64 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.domain.usecases.DeletePasswordUseCase import com.jeeldobariya.passcodes.domain.usecases.EditPasswordUseCase import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase @@ -11,12 +12,21 @@ import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewMod import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel +import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel import org.koin.dsl.module val appModule = module { + factory { + OkHttpClient() + } + + factory { + CheckForUpdateUseCase(androidContext(), get()) + } + factory { ImportPasswordCSVUseCase(androidContext(), get()) } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/UpdateChecker.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt similarity index 65% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/UpdateChecker.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt index 560becaf..7e766cb0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/UpdateChecker.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt @@ -1,7 +1,9 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.widget.Toast +import com.jeeldobariya.passcodes.utils.Constant +import com.jeeldobariya.passcodes.utils.SemVerUtils import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient @@ -9,12 +11,12 @@ import okhttp3.Request import okhttp3.Response import java.io.IOException -object UpdateChecker { - private val client = OkHttpClient() - - fun checkVersion(context: Context, currentVersion: String) { - val appcontext = context.applicationContext - val currentNormalizeVersion = SemVerUtils.normalize(currentVersion) +class CheckForUpdateUseCase( + val context: Context, + val client: OkHttpClient +) { + suspend fun run(currentVersion: String) { + val currNormalizedVersion = SemVerUtils.normalize(currentVersion) val request = Request.Builder() .url(Constant.GITHUB_RELEASE_API_URL) @@ -26,7 +28,7 @@ object UpdateChecker { } override fun onResponse(call: Call, response: Response) { - val body = response.body?.string() ?: return + val body = response.body.string() val releases = SemVerUtils.parseReleases(body) var userReleaseFound = false @@ -35,12 +37,12 @@ object UpdateChecker { for (release in releases) { if (release.draft) continue // ignore drafts - if (release.tag == currentNormalizeVersion) { + if (release.tag == currNormalizedVersion) { userReleaseFound = true if (release.prerelease) { showToast( - appcontext, - "⚠️ You are using a PRE-RELEASE ($currentNormalizeVersion). Not safe for use! Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" + context, + "⚠️ You are using a PRE-RELEASE ($currNormalizedVersion). Not safe for use! Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" ) } } @@ -55,15 +57,15 @@ object UpdateChecker { } latestStable?.let { - if (SemVerUtils.compare(currentNormalizeVersion, it) < 0) { - showToast(appcontext, "New Update available: $it... Vist our website...") + if (SemVerUtils.compare(currNormalizedVersion, it) < 0) { + showToast(context, "New Update available: $it... Vist our website...") } } if (!userReleaseFound) { showToast( - appcontext, - "⚠️ Version ($currentNormalizeVersion) not found on GitHub releases... Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" + context, + "⚠️ Version ($currNormalizedVersion) not found on GitHub releases... Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" ) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index 60c7fc6d..2d86b320 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -6,7 +6,6 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R -import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter 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 dd5c06ce..3d9a64fc 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -7,13 +7,14 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.BuildConfig import com.jeeldobariya.passcodes.databinding.ActivityMainBinding +import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.UpdateChecker import com.jeeldobariya.passcodes.utils.appDatastore import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.koin.android.ext.android.inject // import com.jeeldobariya.passcodes.utils.Permissions @@ -23,6 +24,8 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private val checkForUpdateUseCase: CheckForUpdateUseCase by inject() + override fun onCreate(savedInstanceState: Bundle?) { runBlocking { setTheme(appDatastore.data.first().theme) @@ -32,7 +35,7 @@ class MainActivity : AppCompatActivity() { setContentView(binding.root) lifecycleScope.launch(Dispatchers.IO) { - UpdateChecker.checkVersion(this@MainActivity, BuildConfig.VERSION_NAME) + checkForUpdateUseCase.run(BuildConfig.VERSION_NAME) } // Add event onclick listener From e57118dcdfbe5ec8b019912b996718b7495a64a4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 22:10:24 +0530 Subject: [PATCH 027/115] refactor: update password utility --- .../domain/usecases/CheckForUpdateUseCase.kt | 2 +- .../{ => domain}/utils/SemVerUtils.kt | 4 +- .../{ => domain}/utils/SemVerUtilsTest.kt | 58 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{ => domain}/utils/SemVerUtils.kt (97%) rename app/src/test/kotlin/com/jeeldobariya/passcodes/{ => domain}/utils/SemVerUtilsTest.kt (61%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt index 7e766cb0..376dcbdf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt @@ -3,7 +3,7 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.widget.Toast import com.jeeldobariya.passcodes.utils.Constant -import com.jeeldobariya.passcodes.utils.SemVerUtils +import com.jeeldobariya.passcodes.domain.utils.SemVerUtils import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtils.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt similarity index 97% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtils.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt index c323dba9..c61a4448 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtils.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.domain.utils import org.json.JSONArray @@ -56,4 +56,4 @@ object SemVerUtils { "v$clean" } } -} +} \ No newline at end of file diff --git a/app/src/test/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtilsTest.kt b/app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt similarity index 61% rename from app/src/test/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtilsTest.kt rename to app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt index 2d20eedf..36c427da 100644 --- a/app/src/test/kotlin/com/jeeldobariya/passcodes/utils/SemVerUtilsTest.kt +++ b/app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt @@ -1,51 +1,51 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.domain.utils +import com.google.common.truth.Truth import org.junit.Test -import com.google.common.truth.Truth.assertThat class SemVerUtilsTest { @Test fun testCompareEqual() { - assertThat(SemVerUtils.compare("1.2.3", "1.2.3")).isEqualTo(0) - assertThat(SemVerUtils.compare("v1.0.0", "v1.0.0")).isEqualTo(0) + Truth.assertThat(SemVerUtils.compare("1.2.3", "1.2.3")).isEqualTo(0) + Truth.assertThat(SemVerUtils.compare("v1.0.0", "v1.0.0")).isEqualTo(0) } @Test fun testCompareGreater() { - assertThat(SemVerUtils.compare("1.2.10", "1.2.2")).isGreaterThan(0) - assertThat(SemVerUtils.compare("v2.0.0", "v1.9.9")).isGreaterThan(0) + Truth.assertThat(SemVerUtils.compare("1.2.10", "1.2.2")).isGreaterThan(0) + Truth.assertThat(SemVerUtils.compare("v2.0.0", "v1.9.9")).isGreaterThan(0) } @Test fun testCompareLess() { - assertThat(SemVerUtils.compare("1.2.2", "v1.2.10")).isLessThan(0) - assertThat(SemVerUtils.compare("v0.9.0", "1.0.0")).isLessThan(0) + Truth.assertThat(SemVerUtils.compare("1.2.2", "v1.2.10")).isLessThan(0) + Truth.assertThat(SemVerUtils.compare("v0.9.0", "1.0.0")).isLessThan(0) } @Test fun testPrefixV() { - assertThat(SemVerUtils.compare("v1.2.10", "v1.2.2")).isGreaterThan(0) - assertThat(SemVerUtils.compare("V2.0.0", "V1.9.9")).isGreaterThan(0) - assertThat(SemVerUtils.compare("1.2.2", "v1.2.10")).isLessThan(0) - assertThat(SemVerUtils.compare("v0.9.0", "1.0.0")).isLessThan(0) + Truth.assertThat(SemVerUtils.compare("v1.2.10", "v1.2.2")).isGreaterThan(0) + Truth.assertThat(SemVerUtils.compare("V2.0.0", "V1.9.9")).isGreaterThan(0) + Truth.assertThat(SemVerUtils.compare("1.2.2", "v1.2.10")).isLessThan(0) + Truth.assertThat(SemVerUtils.compare("v0.9.0", "1.0.0")).isLessThan(0) } @Test fun testNormalize() { - assertThat(SemVerUtils.normalize("v1.2.3-beta")).isEqualTo("v1.2.3") - assertThat(SemVerUtils.normalize("1.0.0-alpha.1+001")).isEqualTo("v1.0.0") - assertThat(SemVerUtils.normalize("V2.3.4-rc1")).isEqualTo("v2.3.4") - assertThat(SemVerUtils.normalize("1.5.0")).isEqualTo("v1.5.0") - assertThat(SemVerUtils.normalize("v2.5.0")).isEqualTo("v2.5.0") - assertThat(SemVerUtils.normalize("v1.0.0-Stable-Dev")).isEqualTo("v1.0.0") + Truth.assertThat(SemVerUtils.normalize("v1.2.3-beta")).isEqualTo("v1.2.3") + Truth.assertThat(SemVerUtils.normalize("1.0.0-alpha.1+001")).isEqualTo("v1.0.0") + Truth.assertThat(SemVerUtils.normalize("V2.3.4-rc1")).isEqualTo("v2.3.4") + Truth.assertThat(SemVerUtils.normalize("1.5.0")).isEqualTo("v1.5.0") + Truth.assertThat(SemVerUtils.normalize("v2.5.0")).isEqualTo("v2.5.0") + Truth.assertThat(SemVerUtils.normalize("v1.0.0-Stable-Dev")).isEqualTo("v1.0.0") // Note: try some invalid / wired stuff just to test - assertThat(SemVerUtils.normalize("v1.0-Stable-Dev")).isEqualTo("v1.0") - assertThat(SemVerUtils.normalize("v1.0------")).isEqualTo("v1.0") - assertThat(SemVerUtils.normalize("v1.0-abc")).isEqualTo("v1.0") - assertThat(SemVerUtils.normalize("v--1.0-abc")).isEqualTo("v") - assertThat(SemVerUtils.normalize("")).isEqualTo("v") + Truth.assertThat(SemVerUtils.normalize("v1.0-Stable-Dev")).isEqualTo("v1.0") + Truth.assertThat(SemVerUtils.normalize("v1.0------")).isEqualTo("v1.0") + Truth.assertThat(SemVerUtils.normalize("v1.0-abc")).isEqualTo("v1.0") + Truth.assertThat(SemVerUtils.normalize("v--1.0-abc")).isEqualTo("v") + Truth.assertThat(SemVerUtils.normalize("")).isEqualTo("v") } @Test @@ -102,10 +102,10 @@ class SemVerUtilsTest { """.trimIndent() val releases = SemVerUtils.parseReleases(json) - - assertThat(releases.size).isEqualTo(2) - assertThat(releases[0].tag).isEqualTo("v1.0.0") - assertThat(releases[0].prerelease).isFalse() - assertThat(releases[1].prerelease).isTrue() + + Truth.assertThat(releases.size).isEqualTo(2) + Truth.assertThat(releases[0].tag).isEqualTo("v1.0.0") + Truth.assertThat(releases[0].prerelease).isFalse() + Truth.assertThat(releases[1].prerelease).isTrue() } -} +} \ No newline at end of file From 858c6c301255871e9d77acd5468a75b06aca06a6 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 22:17:09 +0530 Subject: [PATCH 028/115] refactor: date formatting logic --- .../passcodes/data/repository/PasswordRepository.kt | 6 +++--- .../passcodes/{ => domain}/utils/DateTimeUtils.kt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{ => domain}/utils/DateTimeUtils.kt (97%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 740f02d4..56823e71 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -3,7 +3,7 @@ package com.jeeldobariya.passcodes.data.repository import com.jeeldobariya.passcodes.database.PasswordEntity import com.jeeldobariya.passcodes.database.PasswordsDao import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.utils.DateTimeUtils +import com.jeeldobariya.passcodes.domain.utils.DateTimeUtils import kotlinx.coroutines.flow.first import kotlin.require @@ -17,7 +17,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { username = it.username, password = it.password, notes = it.notes, - lastUpdatedAt = "TODO()" + lastUpdatedAt = DateTimeUtils.getRelativeDays(it.updatedAt.orEmpty()) ) } } @@ -52,7 +52,7 @@ class PasswordRepository(val passwordsDao: PasswordsDao) { username = result.username, password = result.password, notes = result.notes, - lastUpdatedAt = "TODO()" + lastUpdatedAt = DateTimeUtils.getRelativeDays(result.updatedAt.orEmpty()) ) } else { null diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/DateTimeUtils.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt similarity index 97% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/DateTimeUtils.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt index 2619d4aa..36e775ee 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/DateTimeUtils.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.domain.utils import java.text.SimpleDateFormat import java.util.Date @@ -52,4 +52,4 @@ class DateTimeUtils { } } } -} +} \ No newline at end of file From 7683abae96e7fb80010773860cddb30ba0ce45d0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 28 Nov 2025 22:32:11 +0530 Subject: [PATCH 029/115] refactor: move utils to specfic layer it used in --- .../com/jeeldobariya/passcodes/{utils => }/Constants.kt | 2 +- .../passcodes/{utils => data/datastore}/AppSettings.kt | 2 +- .../{utils => data/datastore}/AppSettingsSerializer.kt | 8 ++++---- .../passcodes/domain/usecases/CheckForUpdateUseCase.kt | 2 +- .../passcodes/domain/usecases/ExportPasswordCSVUseCase.kt | 3 +-- .../passcodes/domain/usecases/ImportPasswordCSVUseCase.kt | 2 +- .../com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt | 4 ++-- .../com/jeeldobariya/passcodes/oldui/LicenseActivity.kt | 2 +- .../jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt | 2 +- .../com/jeeldobariya/passcodes/oldui/MainActivity.kt | 2 +- .../passcodes/oldui/PasswordManagerActivity.kt | 2 +- .../jeeldobariya/passcodes/oldui/SavePasswordActivity.kt | 2 +- .../com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 2 +- .../passcodes/oldui/UpdatePasswordActivity.kt | 2 +- .../jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt | 2 +- .../passcodes/{ => presentation}/utils/Permissions.kt | 2 +- 16 files changed, 20 insertions(+), 21 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{utils => }/Constants.kt (95%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{utils => data/datastore}/AppSettings.kt (90%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{utils => data/datastore}/AppSettingsSerializer.kt (87%) rename app/src/main/kotlin/com/jeeldobariya/passcodes/{ => presentation}/utils/Permissions.kt (97%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt similarity index 95% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt index 685e265f..a2cd13f9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes object Constant { const val REPOSITORY_SIGNATURE = "PasscodesApp/Passcodes" diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettings.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt similarity index 90% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettings.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt index ec392d03..0de8f8ac 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettings.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.data.datastore // please refer to `app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt` for Migration Guide. diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettingsSerializer.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt similarity index 87% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettingsSerializer.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt index a8c03f9a..468e13c0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/AppSettingsSerializer.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.data.datastore import androidx.datastore.core.Serializer import kotlinx.serialization.SerializationException @@ -12,7 +12,7 @@ object AppSettingsSerializer: Serializer { override suspend fun readFrom(input: InputStream): AppSettings { return try { - Json.decodeFromString( + Json.Default.decodeFromString( deserializer = AppSettings.serializer(), string = input.readBytes().decodeToString(), ) @@ -27,10 +27,10 @@ object AppSettingsSerializer: Serializer { output: OutputStream ) { output.write( - Json.encodeToString( + Json.Default.encodeToString( serializer = AppSettings.serializer(), value = t ).encodeToByteArray() ) } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt index 376dcbdf..6d3c5b36 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt @@ -2,7 +2,7 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.widget.Toast -import com.jeeldobariya.passcodes.utils.Constant +import com.jeeldobariya.passcodes.Constant import com.jeeldobariya.passcodes.domain.utils.SemVerUtils import okhttp3.Call import okhttp3.Callback diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt index 7426b43a..483bf3b9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt @@ -3,8 +3,7 @@ package com.jeeldobariya.passcodes.domain.usecases import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.utils.Constant +import com.jeeldobariya.passcodes.Constant class ExportPasswordCSVUseCase( val context: Context, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt index 28de15bb..65d6d60d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt @@ -4,7 +4,7 @@ import android.content.Context import android.net.Uri import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.utils.Constant +import com.jeeldobariya.passcodes.Constant class ImportPasswordCSVUseCase( val context: Context, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt index 462ec85f..c0c982df 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt @@ -5,8 +5,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri import com.jeeldobariya.passcodes.databinding.ActivityAboutUsBinding -import com.jeeldobariya.passcodes.utils.Constant -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.Constant +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt index 042c23d4..c2272ba4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt @@ -5,7 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.oss.licenses.OssLicensesMenuActivity import com.jeeldobariya.passcodes.databinding.ActivityLicenseBinding -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import java.io.BufferedReader diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index 2d86b320..ad36e7cc 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -11,7 +11,7 @@ import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel 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 3d9a64fc..6cc83e43 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -9,7 +9,7 @@ import com.jeeldobariya.passcodes.BuildConfig import com.jeeldobariya.passcodes.databinding.ActivityMainBinding import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 9de70282..9dbcd0a0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -14,7 +14,7 @@ import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt index a5300cc2..2d7820cf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt @@ -7,7 +7,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordAction import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 04f41564..99fe7ca4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -13,7 +13,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt index 14534507..f11dd31b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt @@ -9,7 +9,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordAction import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt index 24831cbd..885adbce 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt @@ -12,7 +12,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel -import com.jeeldobariya.passcodes.utils.appDatastore +import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt similarity index 97% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt rename to app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt index ba303476..bd17f939 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Permissions.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.utils +package com.jeeldobariya.passcodes.presentation.utils // comment the below code as permission are not used in app. // currently, but we might require this later.. From 4537f037bda362dbe3a2baeb72e1a292f8a7aa80 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 10:34:13 +0530 Subject: [PATCH 030/115] refactor: add a jetpackcompose as preview layout --- .../passcodes/oldui/SettingsActivity.kt | 18 ++++++++--- .../jeeldobariya/passcodes/ui/MainActivity.kt | 29 +++++++++++++---- app/src/main/res/layout/activity_settings.xml | 31 +++++++++++++++++++ 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 99fe7ca4..18f6b86d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.koin.android.ext.android.inject import kotlin.getValue +import kotlin.system.exitProcess class SettingsActivity : AppCompatActivity() { @@ -47,6 +48,7 @@ class SettingsActivity : AppCompatActivity() { collectLatestLifecycleFlow(featureFlagsDatastore.data) { binding.switchLatestFeatures.isChecked = it.isPreviewFeaturesEnabled + binding.switchLatestLayout.isChecked = it.isPreviewLayoutEnabled } // Add event onclick listener @@ -117,11 +119,17 @@ class SettingsActivity : AppCompatActivity() { it.copy(isPreviewFeaturesEnabled = isChecked) } } - Toast.makeText( - this@SettingsActivity, - getString(R.string.future_feat_clause) + isChecked.toString(), - Toast.LENGTH_SHORT - ).show() + } + + binding.switchLatestLayout.setOnCheckedChangeListener { _, isChecked -> + lifecycleScope.launch { + featureFlagsDatastore.updateData { + it.copy(isPreviewLayoutEnabled = isChecked) + } + + finishAndRemoveTask() + exitProcess(0) + } } binding.clearAllDataBtn.setOnClickListener { v -> 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 2a2872c0..344d4e9f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -1,6 +1,5 @@ package com.jeeldobariya.passcodes.ui -import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -15,12 +14,16 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme +import kotlinx.coroutines.launch +import kotlin.system.exitProcess class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -29,8 +32,12 @@ class MainActivity : ComponentActivity() { setContent { PasscodesTheme { MainScreen { - val loginIntent = Intent(this@MainActivity, com.jeeldobariya.passcodes.oldui.MainActivity::class.java) - startActivity(loginIntent) + featureFlagsDatastore.updateData { + it.copy(isPreviewLayoutEnabled = false) + } + + finishAndRemoveTask() + exitProcess(0) } } } @@ -38,7 +45,9 @@ class MainActivity : ComponentActivity() { } @Composable -fun MainScreen(navigateToOldUi: () -> Unit) { +fun MainScreen(navigateToOldUi: suspend () -> Unit) { + val scope = rememberCoroutineScope() + Surface( color = MaterialTheme.colorScheme.surface, modifier = Modifier.fillMaxSize(), @@ -57,12 +66,20 @@ fun MainScreen(navigateToOldUi: () -> Unit) { Spacer(Modifier.padding(12.dp)) Button( - onClick = navigateToOldUi + onClick = { + scope.launch { + navigateToOldUi() + } + } ) { Text("Back To Old UI", fontSize = 20.sp) } Button( - onClick = navigateToOldUi + onClick = { + scope.launch { + navigateToOldUi() + } + } ) { Text("Continue New UI", fontSize = 20.sp) } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 05eb2d2f..fcaab590 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -119,6 +119,37 @@ + + + + + + + + + + Date: Sat, 29 Nov 2025 10:40:51 +0530 Subject: [PATCH 031/115] refactor: code for change theme --- .../com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 18f6b86d..cf5a3527 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -103,14 +103,9 @@ class SettingsActivity : AppCompatActivity() { appDatastore.updateData { it.copy(theme = newThemeStyle) } - recreate() + finishAndRemoveTask() + exitProcess(0) } - - Toast.makeText( - this@SettingsActivity, - getString(R.string.restart_app_require), - Toast.LENGTH_SHORT - ).show() } binding.switchLatestFeatures.setOnCheckedChangeListener { _, isChecked -> From c663360a19dc3a3e2173fc5a8aff0b44d0b32653 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 10:58:59 +0530 Subject: [PATCH 032/115] refactor: made autofill as preview feature --- app/src/main/res/layout/activity_autofill_settings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/res/layout/activity_autofill_settings.xml b/app/src/main/res/layout/activity_autofill_settings.xml index 1e1fb8db..866a8c91 100644 --- a/app/src/main/res/layout/activity_autofill_settings.xml +++ b/app/src/main/res/layout/activity_autofill_settings.xml @@ -19,6 +19,15 @@ android:text="To use Passcodes as your password manager, you need to enable it as an autofill service in your device settings." android:textAlignment="center" /> + + Date: Sat, 29 Nov 2025 15:05:20 +0530 Subject: [PATCH 033/115] chore(deps): add android library plugin and android core package --- build.gradle.kts | 1 + gradle/libs.versions.toml | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0dc3239c..38f2a5a7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,7 @@ plugins { alias(libs.plugins.jetbrains.kotlin.serialization) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.oss.licenses) apply false + alias(libs.plugins.android.library) apply false } // All projects block is common for setting up common repositories for all subprojects. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4f06ce93..5f094442 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] kotlin = "2.2.21" +coreKtx = "1.17.0" material = "1.13.0" okhttp = "5.3.2" oss-license = "17.3.0" @@ -29,6 +30,7 @@ oss-license-plugin = "0.10.9" # Also update in settings.gradle.kts + [libraries] # Kotlin Std libs kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } @@ -48,6 +50,7 @@ androidx-lifecycle-viewmodel-navigation3 = { group = "androidx.lifecycle", name androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version.ref = "material3AdaptiveNav3" } # Core Dependency +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } oss-license = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "oss-license" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } @@ -90,8 +93,6 @@ androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } - - [bundles] # Jetpack Compose Dependencies compose = ["compose-ui-material", "compose-ui-preview", "compose-activity", "compose-viewmodel"] @@ -122,6 +123,7 @@ android-test = ["androidx-test-ext-junit", "espresso-core"] [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" } From db09c411c056e821620dfac3f3502bc303b0bef4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 16:29:49 +0530 Subject: [PATCH 034/115] chore: edit gradle.properties --- gradle.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1e80d57e..bf8ff218 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,8 +10,9 @@ # This option should only be used with decoupled projects. For more details, visit # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true -#Wed Nov 26 12:17:35 IST 2025 + +# Sat Nov 29 15:36:14 IST 2025 android.enableJetifier=true android.useAndroidX=true -org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M" -Dfile.encoding\=UTF-8 +org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1024M" -Dfile.encoding\=UTF-8 org.gradle.warning.mode=all From 22ae70a7254630d690be4db54b3d380116162e58 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 16:40:43 +0530 Subject: [PATCH 035/115] refactor: create a empty new autofill module --- autofill/.gitignore | 1 + autofill/build.gradle.kts | 50 +++++++++++++++++++ autofill/consumer-rules.pro | 0 autofill/proguard-rules.pro | 21 ++++++++ .../autofill/ExampleInstrumentedTest.kt | 24 +++++++++ autofill/src/main/AndroidManifest.xml | 4 ++ .../passcodes/autofill/ExampleUnitTest.kt | 17 +++++++ settings.gradle.kts | 1 + 8 files changed, 118 insertions(+) create mode 100644 autofill/.gitignore create mode 100644 autofill/build.gradle.kts create mode 100644 autofill/consumer-rules.pro create mode 100644 autofill/proguard-rules.pro create mode 100644 autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt create mode 100644 autofill/src/main/AndroidManifest.xml create mode 100644 autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt diff --git a/autofill/.gitignore b/autofill/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/autofill/.gitignore @@ -0,0 +1 @@ +/build diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts new file mode 100644 index 00000000..b8fbf132 --- /dev/null +++ b/autofill/build.gradle.kts @@ -0,0 +1,50 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } +} + +android { + namespace = "com.jeeldobariya.passcodes.autofill" + compileSdk { + version = release(36) + } + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) +} diff --git a/autofill/consumer-rules.pro b/autofill/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/autofill/proguard-rules.pro b/autofill/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/autofill/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/autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt b/autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..bd286b09 --- /dev/null +++ b/autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.jeeldobariya.passcodes.autofill + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.jeeldobariya.passcodes.autofill.test", appContext.packageName) + } +} diff --git a/autofill/src/main/AndroidManifest.xml b/autofill/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/autofill/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt b/autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt new file mode 100644 index 00000000..fd195d87 --- /dev/null +++ b/autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.jeeldobariya.passcodes.autofill + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index a27eaafc..8fea418c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,6 +15,7 @@ pluginManagement { // Defines all modules in your project include(":app") +include(":autofill") // If you have other modules like ':data', ':domain', etc., list them here: // include(":app", ":data", ":domain", ":feature:home") From 996fb8562b69473870e9a515c8afaa9a5f76dd3b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 16:53:43 +0530 Subject: [PATCH 036/115] refactor: migrate code of autofill to autofill module --- app/build.gradle.kts | 5 ++++- autofill/build.gradle.kts | 6 ++++++ .../passcodes/autofill/ExampleInstrumentedTest.kt | 0 .../passcodes/autofill/AutofillSettingsActivity.kt | 1 - .../passcodes/autofill/PasswordAutofillService.kt | 1 - .../com/jeeldobariya/passcodes/autofill/data/Passcode.kt | 0 .../com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt | 0 .../passcodes/autofill/data/PasscodeDatabase.kt | 0 .../src/main/res/layout/activity_autofill_settings.xml | 0 .../src/main/res/layout/autofill_list_item.xml | 0 {app => autofill}/src/main/res/xml/autofill_service.xml | 0 .../com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt | 0 12 files changed, 10 insertions(+), 3 deletions(-) rename autofill/src/androidTest/{java => kotlin}/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt (100%) rename {app => autofill}/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt (95%) rename {app => autofill}/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt (99%) rename {app => autofill}/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt (100%) rename {app => autofill}/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt (100%) rename {app => autofill}/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt (100%) rename {app => autofill}/src/main/res/layout/activity_autofill_settings.xml (100%) rename {app => autofill}/src/main/res/layout/autofill_list_item.xml (100%) rename {app => autofill}/src/main/res/xml/autofill_service.xml (100%) rename autofill/src/test/{java => kotlin}/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 91cd641c..24c3103b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -153,6 +153,9 @@ android { } dependencies { + // In project library / feature modules + implementation(project(":autofill")) + // Jetpack Compose implementation(libs.bundles.compose) implementation(platform(libs.compose.bom)) @@ -174,7 +177,6 @@ dependencies { // Data/Persistence (Room Bundle) implementation(libs.bundles.room) - debugImplementation(libs.androidx.ui.test.manifest) ksp(libs.room.compiler) // Networking/Parsing @@ -195,6 +197,7 @@ dependencies { // --- Testing --- + debugImplementation(libs.androidx.ui.test.manifest) // Local Unit Testing (Unit Test Bundle) testImplementation(libs.bundles.unit.test) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index b8fbf132..3c4dea5e 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) + alias(libs.plugins.ksp) } kotlin { @@ -44,6 +45,11 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) + + // Data/Persistence (Room Bundle) + implementation(libs.bundles.room) + ksp(libs.room.compiler) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt b/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt similarity index 100% rename from autofill/src/androidTest/java/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt rename to autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt similarity index 95% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt rename to autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt index 3319e917..19a81261 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt +++ b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt @@ -5,7 +5,6 @@ import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import com.google.android.material.button.MaterialButton -import com.jeeldobariya.passcodes.R class AutofillSettingsActivity : AppCompatActivity() { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt similarity index 99% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt rename to autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt index 0f3c8787..7814c25f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt +++ b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt @@ -10,7 +10,6 @@ import android.service.autofill.SaveCallback import android.service.autofill.SaveRequest import android.view.autofill.AutofillValue import android.widget.RemoteViews -import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.autofill.data.Passcode import com.jeeldobariya.passcodes.autofill.data.PasscodeDatabase import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt rename to autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt rename to autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt rename to autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt diff --git a/app/src/main/res/layout/activity_autofill_settings.xml b/autofill/src/main/res/layout/activity_autofill_settings.xml similarity index 100% rename from app/src/main/res/layout/activity_autofill_settings.xml rename to autofill/src/main/res/layout/activity_autofill_settings.xml diff --git a/app/src/main/res/layout/autofill_list_item.xml b/autofill/src/main/res/layout/autofill_list_item.xml similarity index 100% rename from app/src/main/res/layout/autofill_list_item.xml rename to autofill/src/main/res/layout/autofill_list_item.xml diff --git a/app/src/main/res/xml/autofill_service.xml b/autofill/src/main/res/xml/autofill_service.xml similarity index 100% rename from app/src/main/res/xml/autofill_service.xml rename to autofill/src/main/res/xml/autofill_service.xml diff --git a/autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt b/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt similarity index 100% rename from autofill/src/test/java/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt rename to autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt From ba3e59a9c54d18537625edc004f023829b89c0df Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 17:36:24 +0530 Subject: [PATCH 037/115] refactor: add button on setting screen to access autofill settings --- .../passcodes/oldui/SettingsActivity.kt | 7 +++++ app/src/main/res/layout/activity_settings.xml | 26 +++++++++++++++++++ .../res/layout/activity_autofill_settings.xml | 1 - 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index cf5a3527..c44c6928 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.oldui +import android.content.Intent import android.os.Bundle import android.view.View import android.widget.AdapterView @@ -10,6 +11,7 @@ import androidx.core.os.LocaleListCompat import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore @@ -127,6 +129,11 @@ class SettingsActivity : AppCompatActivity() { } } + binding.autofillSettingCardBtn.setOnClickListener { v -> + val autofillSettingsIntent = Intent(this, AutofillSettingsActivity::class.java) + startActivity(autofillSettingsIntent) + } + binding.clearAllDataBtn.setOnClickListener { v -> lifecycleScope.launch { passwordRepository.clearAllData() diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index fcaab590..1a529cf0 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -150,6 +150,32 @@ + + + + + + + + From c23cdd0c905b80ba5347d7396499b3fb5cefbfe4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 21:54:46 +0530 Subject: [PATCH 038/115] refactor: move autofill android manifest into its module --- app/src/main/AndroidManifest.xml | 15 --------------- autofill/src/main/AndroidManifest.xml | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e0db9cd..4d195810 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,7 +33,6 @@ - - - - - - - - - \ No newline at end of file diff --git a/autofill/src/main/AndroidManifest.xml b/autofill/src/main/AndroidManifest.xml index 8bdb7e14..96041010 100644 --- a/autofill/src/main/AndroidManifest.xml +++ b/autofill/src/main/AndroidManifest.xml @@ -1,4 +1,21 @@ + + + + + + + + + + + From 6adc2083c5e188ee076e020947a0eb9d8dba3d67 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 22:04:05 +0530 Subject: [PATCH 039/115] refactor: add a feature flag for autofill service --- .../com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index c44c6928..f51e9bf2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -12,15 +12,14 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity +import com.jeeldobariya.passcodes.data.datastore.appDatastore import com.jeeldobariya.passcodes.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.koin.android.ext.android.inject -import kotlin.getValue import kotlin.system.exitProcess class SettingsActivity : AppCompatActivity() { @@ -51,6 +50,9 @@ class SettingsActivity : AppCompatActivity() { collectLatestLifecycleFlow(featureFlagsDatastore.data) { binding.switchLatestFeatures.isChecked = it.isPreviewFeaturesEnabled binding.switchLatestLayout.isChecked = it.isPreviewLayoutEnabled + + binding.autofillSettingCardBtn.visibility = + if (it.isPreviewFeaturesEnabled) View.VISIBLE else View.GONE } // Add event onclick listener From 7503b5af75a41f60a8ee897a779c05e3600a9c2b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 22:07:00 +0530 Subject: [PATCH 040/115] refactor: use string to uri extention function --- .../passcodes/autofill/AutofillSettingsActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt index 19a81261..9fd66f0c 100644 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt +++ b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/AutofillSettingsActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity +import androidx.core.net.toUri import com.google.android.material.button.MaterialButton class AutofillSettingsActivity : AppCompatActivity() { @@ -15,7 +16,7 @@ class AutofillSettingsActivity : AppCompatActivity() { val enableAutofillButton = findViewById(R.id.enable_autofill_button) enableAutofillButton.setOnClickListener { val intent = Intent(Settings.ACTION_REQUEST_SET_AUTOFILL_SERVICE) - intent.data = android.net.Uri.parse("package:$packageName") + intent.data = "package:$packageName".toUri() startActivity(intent) } } From 95f4126741de53a27400b12e58571d61c1ea1f5e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 22:11:13 +0530 Subject: [PATCH 041/115] feat: improve designing of setting screen --- .../com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 4 ++-- app/src/main/res/layout/activity_settings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index f51e9bf2..164dcb2d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -51,7 +51,7 @@ class SettingsActivity : AppCompatActivity() { binding.switchLatestFeatures.isChecked = it.isPreviewFeaturesEnabled binding.switchLatestLayout.isChecked = it.isPreviewLayoutEnabled - binding.autofillSettingCardBtn.visibility = + binding.autofillSettingCard.visibility = if (it.isPreviewFeaturesEnabled) View.VISIBLE else View.GONE } @@ -131,7 +131,7 @@ class SettingsActivity : AppCompatActivity() { } } - binding.autofillSettingCardBtn.setOnClickListener { v -> + binding.autofillSettingBtn.setOnClickListener { v -> val autofillSettingsIntent = Intent(this, AutofillSettingsActivity::class.java) startActivity(autofillSettingsIntent) } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 1a529cf0..c54a3a37 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -165,7 +165,7 @@ android:padding="16dp"> Date: Sat, 29 Nov 2025 22:35:03 +0530 Subject: [PATCH 042/115] refactor: made a new empty database module --- app/build.gradle.kts | 1 + database/.gitignore | 1 + database/build.gradle.kts | 56 +++++++++++++++++++ database/consumer-rules.pro | 0 database/proguard-rules.pro | 21 +++++++ .../database/ExampleInstrumentedTest.kt | 24 ++++++++ database/src/main/AndroidManifest.xml | 4 ++ .../passcodes/database/ExampleUnitTest.kt | 17 ++++++ settings.gradle.kts | 1 + 9 files changed, 125 insertions(+) create mode 100644 database/.gitignore create mode 100644 database/build.gradle.kts create mode 100644 database/consumer-rules.pro create mode 100644 database/proguard-rules.pro create mode 100644 database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt create mode 100644 database/src/main/AndroidManifest.xml create mode 100644 database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 24c3103b..d4f92b2d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -155,6 +155,7 @@ android { dependencies { // In project library / feature modules implementation(project(":autofill")) + implementation(project(":database")) // Jetpack Compose implementation(libs.bundles.compose) diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +/build diff --git a/database/build.gradle.kts b/database/build.gradle.kts new file mode 100644 index 00000000..bbafc992 --- /dev/null +++ b/database/build.gradle.kts @@ -0,0 +1,56 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.ksp) +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } +} + +android { + namespace = "com.jeeldobariya.passcodes.database" + compileSdk { + version = release(36) + } + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.appcompat) + implementation(libs.material) + + // Data/Persistence (Room Bundle) + implementation(libs.bundles.room) + ksp(libs.room.compiler) + + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) +} diff --git a/database/consumer-rules.pro b/database/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/database/proguard-rules.pro b/database/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/database/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/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..1383548b --- /dev/null +++ b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.jeeldobariya.passcodes.database + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.jeeldobariya.passcodes.database.test", appContext.packageName) + } +} diff --git a/database/src/main/AndroidManifest.xml b/database/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/database/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt b/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt new file mode 100644 index 00000000..1ab343a9 --- /dev/null +++ b/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.jeeldobariya.passcodes.database + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 8fea418c..3c084381 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,6 +16,7 @@ pluginManagement { // Defines all modules in your project include(":app") include(":autofill") +include(":database") // If you have other modules like ':data', ':domain', etc., list them here: // include(":app", ":data", ":domain", ":feature:home") From e60b3aa439a69caf9e8b51203893f5d13cfbddd0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 22:47:00 +0530 Subject: [PATCH 043/115] refactor: migrate database code to its module --- app/build.gradle.kts | 5 -- database/build.gradle.kts | 5 ++ .../1.json | 67 +++++++++++++++++++ .../passcodes/database/MasterDatabase.kt | 0 .../passcodes/database/Password.kt | 0 .../passcodes/database/PasswordsDao.kt | 0 6 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json rename {app => database}/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt (100%) rename {app => database}/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt (100%) rename {app => database}/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d4f92b2d..330a09dc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -145,11 +145,6 @@ android { buildConfig = true compose = true } - - ksp { - val location = "$projectDir/schemas" - arg("room.schemaLocation", location) - } } dependencies { diff --git a/database/build.gradle.kts b/database/build.gradle.kts index bbafc992..654b37e7 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -39,6 +39,11 @@ android { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } + + ksp { + val location = "$projectDir/schemas" + arg("room.schemaLocation", location) + } } dependencies { diff --git a/database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json b/database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json new file mode 100644 index 00000000..0292e42d --- /dev/null +++ b/database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json @@ -0,0 +1,67 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "14ca55af836200a4982f037d2dc57317", + "entities": [ + { + "tableName": "passwords", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `username` TEXT NOT NULL, `password` TEXT NOT NULL, `notes` TEXT NOT NULL, `created_at` TEXT DEFAULT CURRENT_TIMESTAMP, `updated_at` TEXT DEFAULT CURRENT_TIMESTAMP)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "username", + "columnName": "username", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "notes", + "columnName": "notes", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "TEXT", + "defaultValue": "CURRENT_TIMESTAMP" + }, + { + "fieldPath": "updatedAt", + "columnName": "updated_at", + "affinity": "TEXT", + "defaultValue": "CURRENT_TIMESTAMP" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + } + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14ca55af836200a4982f037d2dc57317')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt similarity index 100% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt From ce1e3f4af39abee16b6ad9e221bf7698e3611b4b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 22:57:14 +0530 Subject: [PATCH 044/115] refactor: database module package structure --- .../jeeldobariya/passcodes/database/PasswordDatabaseTest.kt | 2 ++ .../passcodes/data/repository/PasswordRepository.kt | 4 ++-- .../kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt | 2 +- .../passcodes/database/{ => master}/MasterDatabase.kt | 2 +- .../jeeldobariya/passcodes/database/{ => master}/Password.kt | 2 +- .../passcodes/database/{ => master}/PasswordsDao.kt | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) rename database/src/main/kotlin/com/jeeldobariya/passcodes/database/{ => master}/MasterDatabase.kt (92%) rename database/src/main/kotlin/com/jeeldobariya/passcodes/database/{ => master}/Password.kt (91%) rename database/src/main/kotlin/com/jeeldobariya/passcodes/database/{ => master}/PasswordsDao.kt (95%) diff --git a/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt b/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt index 94403a9a..1cd206d5 100644 --- a/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt +++ b/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt @@ -5,6 +5,8 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.jeeldobariya.passcodes.database.master.MasterDatabase +import com.jeeldobariya.passcodes.database.master.PasswordsDao import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.After diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt index 56823e71..496bbf89 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt @@ -1,7 +1,7 @@ package com.jeeldobariya.passcodes.data.repository -import com.jeeldobariya.passcodes.database.PasswordEntity -import com.jeeldobariya.passcodes.database.PasswordsDao +import com.jeeldobariya.passcodes.database.master.PasswordEntity +import com.jeeldobariya.passcodes.database.master.PasswordsDao import com.jeeldobariya.passcodes.domain.modals.PasswordModal import com.jeeldobariya.passcodes.domain.utils.DateTimeUtils import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt index bfb288f0..0cf1de6b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt @@ -1,7 +1,7 @@ package com.jeeldobariya.passcodes.di import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.database.MasterDatabase +import com.jeeldobariya.passcodes.database.master.MasterDatabase import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabase.kt similarity index 92% rename from database/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabase.kt index 8ce9baaf..56215c60 100644 --- a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/MasterDatabase.kt +++ b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabase.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.database +package com.jeeldobariya.passcodes.database.master import android.content.Context import androidx.room.Database diff --git a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/Password.kt similarity index 91% rename from database/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/Password.kt index f2e9438c..153b11bf 100644 --- a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/Password.kt +++ b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/Password.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.database +package com.jeeldobariya.passcodes.database.master import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/PasswordsDao.kt similarity index 95% rename from database/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/PasswordsDao.kt index 11b88d7e..feb4fb8c 100644 --- a/database/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt +++ b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/master/PasswordsDao.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.database +package com.jeeldobariya.passcodes.database.master import androidx.room.Dao import androidx.room.Delete From 475bd657fa9d56e420006f673666a5ef5cec549a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 29 Nov 2025 23:00:31 +0530 Subject: [PATCH 045/115] chore(deps): remove unwanted dependency from database mmodule --- database/build.gradle.kts | 2 -- .../1.json | 0 2 files changed, 2 deletions(-) rename database/schemas/{com.jeeldobariya.passcodes.database.MasterDatabase => com.jeeldobariya.passcodes.database.master.MasterDatabase}/1.json (100%) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 654b37e7..3f3bf60d 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -48,8 +48,6 @@ android { dependencies { implementation(libs.androidx.core.ktx) - implementation(libs.appcompat) - implementation(libs.material) // Data/Persistence (Room Bundle) implementation(libs.bundles.room) diff --git a/database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json b/database/schemas/com.jeeldobariya.passcodes.database.master.MasterDatabase/1.json similarity index 100% rename from database/schemas/com.jeeldobariya.passcodes.database.MasterDatabase/1.json rename to database/schemas/com.jeeldobariya.passcodes.database.master.MasterDatabase/1.json From c95ff72040ff63afcadf22ddc54a0be57cbc4bba Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 30 Nov 2025 20:53:24 +0530 Subject: [PATCH 046/115] refactor: migrate the test from app to database module --- database/build.gradle.kts | 3 ++ .../database/ExampleInstrumentedTest.kt | 24 ----------- .../master/MasterDatabasePasswordsDaoTest.kt | 40 +++++++++---------- 3 files changed, 21 insertions(+), 46 deletions(-) delete mode 100644 database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt rename app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt => database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt (76%) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 3f3bf60d..7e344abd 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -56,4 +56,7 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) + androidTestImplementation(libs.room.testing) + androidTestImplementation(libs.truth) + androidTestImplementation(libs.bundles.coroutines.test) } diff --git a/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt deleted file mode 100644 index 1383548b..00000000 --- a/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.jeeldobariya.passcodes.database - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.jeeldobariya.passcodes.database.test", appContext.packageName) - } -} diff --git a/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt similarity index 76% rename from app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt rename to database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt index 1cd206d5..8dcbfcad 100644 --- a/app/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/PasswordDatabaseTest.kt +++ b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt @@ -1,12 +1,10 @@ -package com.jeeldobariya.passcodes.database +package com.jeeldobariya.passcodes.database.master import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat -import com.jeeldobariya.passcodes.database.master.MasterDatabase -import com.jeeldobariya.passcodes.database.master.PasswordsDao import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.After @@ -17,49 +15,47 @@ import java.io.IOException /** * Instrumented test for the Room database, specifically testing the PasswordsDao. - * This test runs on an Android device/emulator. */ -@RunWith(AndroidJUnit4::class) // Specifies the JUnit runner for Android instrumented tests -class PasswordDatabaseTest { +@RunWith(AndroidJUnit4::class) +class MasterDatabasePasswordsDaoTest { private lateinit var passwordsDao: PasswordsDao private lateinit var db: MasterDatabase - // This function runs before each test method @Before fun createDb() { val context = ApplicationProvider.getApplicationContext() + // Build an in-memory database for testing. // In-memory database ensures that tests are isolated and don't // interfere with the actual app database or other tests. db = Room.inMemoryDatabaseBuilder( context, MasterDatabase::class.java - ).allowMainThreadQueries() // Allow queries on the main thread for simplicity in tests + ) + .allowMainThreadQueries() // Allow queries on the main thread for simplicity in tests .build() - passwordsDao = db.passwordsDao // Get the DAO instance + + passwordsDao = db.passwordsDao } - // This function runs after each test method @After @Throws(IOException::class) // Indicates that this method might throw an IOException fun closeDb() { - db.close() // Close the database after each test to free resources + db.close() } @Test fun insertAndGetAllPasswords_shouldReturnCorrectPasswords() = runTest { // Test: Insert multiple passwords and then retrieve all to verify - val password1 = Password(domain = "example.com", username = "user1", password = "pass1", notes = "notes1") - val password2 = Password(domain = "test.org", username = "user2", password = "pass2", notes = "notes2") + val password1 = PasswordEntity(domain = "example.com", username = "user1", password = "pass1", notes = "notes1") + val password2 = PasswordEntity(domain = "test.org", username = "user2", password = "pass2", notes = "notes2") - passwordsDao.insertPassword(password1) // Insert the first password - passwordsDao.insertPassword(password2) // Insert the second password + passwordsDao.insertPassword(password1) + passwordsDao.insertPassword(password2) - // Collect the first emitted list from the Flow val allPasswords = passwordsDao.getAllPasswords().first() - // Assertions using Google Truth assertThat(allPasswords).hasSize(2) // Check if two passwords were retrieved assertThat(allPasswords[0].domain).isEqualTo("test.org") // Assuming DESC order by ID assertThat(allPasswords[1].domain).isEqualTo("example.com") @@ -71,7 +67,7 @@ class PasswordDatabaseTest { @Test fun insertAndGetPasswordById_shouldReturnCorrectPassword() = runTest { // Test: Insert a password and retrieve it by its auto-generated ID - val originalPassword = Password(domain = "domain.com", username = "user", password = "pass", notes = "some notes") + val originalPassword = PasswordEntity(domain = "domain.com", username = "user", password = "pass", notes = "some notes") val insertedId = passwordsDao.insertPassword(originalPassword) // Insert and get the generated ID // Retrieve the password using the inserted ID @@ -91,8 +87,8 @@ class PasswordDatabaseTest { // Test: Insert a password and retrieve it by username and domain val targetUsername = "specific_user" val targetDomain = "specific_domain.net" - val passwordToFind = Password(domain = targetDomain, username = targetUsername, password = "pwd", notes = "find me") - val otherPassword = Password(domain = "other.net", username = "other", password = "xyz", notes = "not me") + val passwordToFind = PasswordEntity(domain = targetDomain, username = targetUsername, password = "pwd", notes = "find me") + val otherPassword = PasswordEntity(domain = "other.net", username = "other", password = "xyz", notes = "not me") passwordsDao.insertPassword(otherPassword) passwordsDao.insertPassword(passwordToFind) @@ -109,7 +105,7 @@ class PasswordDatabaseTest { @Test fun updatePassword_shouldUpdateCorrectly() = runTest { // Test: Insert a password, update it, and verify the changes - val originalPassword = Password(domain = "old.com", username = "old_user", password = "old_pass", notes = "old_notes") + val originalPassword = PasswordEntity(domain = "old.com", username = "old_user", password = "old_pass", notes = "old_notes") val insertedId = passwordsDao.insertPassword(originalPassword) // Create an updated password object (Room updates by primary key) @@ -137,7 +133,7 @@ class PasswordDatabaseTest { @Test fun deletePasswordById_shouldDeleteCorrectly() = runTest { // Test: Insert a password, delete it by ID, and verify its absence - val passwordToDelete = Password(domain = "delete.me", username = "trash", password = "123", notes = "delete this") + val passwordToDelete = PasswordEntity(domain = "delete.me", username = "trash", password = "123", notes = "delete this") val insertedId = passwordsDao.insertPassword(passwordToDelete) // Delete the password by its ID From 4b1e858c24935da850ff7c0411870ae4671fbde4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 1 Dec 2025 11:23:54 +0530 Subject: [PATCH 047/115] refactor: make a new password manager module --- app/build.gradle.kts | 1 + password_manager/.gitignore | 1 + password_manager/build.gradle.kts | 50 +++++++++++++++++++ password_manager/consumer-rules.pro | 0 password_manager/proguard-rules.pro | 21 ++++++++ .../ExampleInstrumentedTest.kt | 24 +++++++++ password_manager/src/main/AndroidManifest.xml | 4 ++ .../password_manager/ExampleUnitTest.kt | 17 +++++++ settings.gradle.kts | 1 + 9 files changed, 119 insertions(+) create mode 100644 password_manager/.gitignore create mode 100644 password_manager/build.gradle.kts create mode 100644 password_manager/consumer-rules.pro create mode 100644 password_manager/proguard-rules.pro create mode 100644 password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt create mode 100644 password_manager/src/main/AndroidManifest.xml create mode 100644 password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 330a09dc..0a870a60 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -151,6 +151,7 @@ dependencies { // In project library / feature modules implementation(project(":autofill")) implementation(project(":database")) + implementation(project(":password_manager")) // Jetpack Compose implementation(libs.bundles.compose) diff --git a/password_manager/.gitignore b/password_manager/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/password_manager/.gitignore @@ -0,0 +1 @@ +/build diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts new file mode 100644 index 00000000..33de8d5d --- /dev/null +++ b/password_manager/build.gradle.kts @@ -0,0 +1,50 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } +} + +android { + namespace = "com.jeeldobariya.passcodes.password_manager" + compileSdk { + version = release(36) + } + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) +} diff --git a/password_manager/consumer-rules.pro b/password_manager/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/password_manager/proguard-rules.pro b/password_manager/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/password_manager/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/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt b/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..99df833b --- /dev/null +++ b/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.jeeldobariya.passcodes.password_manager + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.jeeldobariya.passcodes.password_manager.test", appContext.packageName) + } +} diff --git a/password_manager/src/main/AndroidManifest.xml b/password_manager/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/password_manager/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt b/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt new file mode 100644 index 00000000..f9e98652 --- /dev/null +++ b/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.jeeldobariya.passcodes.password_manager + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 3c084381..12d17a47 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,6 +17,7 @@ pluginManagement { include(":app") include(":autofill") include(":database") +include(":password_manager") // If you have other modules like ':data', ':domain', etc., list them here: // include(":app", ":data", ":domain", ":feature:home") From e8b9d3dc2030999e6c419e5d0fe4c92914a046a1 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 09:56:53 +0530 Subject: [PATCH 048/115] refactor: move password manager code into it module, except ui code --- .../com/jeeldobariya/passcodes/Constants.kt | 3 --- .../jeeldobariya/passcodes/di/appModule.kt | 22 +++++++++---------- .../passcodes/di/databaseModule.kt | 2 +- .../usecases/RetrieveAllPasswordUseCase.kt | 12 ---------- .../usecases/RetrievePasswordUseCase.kt | 12 ---------- .../passcodes/oldui/LoadPasswordActivity.kt | 6 ++--- .../oldui/PasswordManagerActivity.kt | 4 ++-- .../passcodes/oldui/SavePasswordActivity.kt | 4 ++-- .../passcodes/oldui/SettingsActivity.kt | 2 +- .../passcodes/oldui/UpdatePasswordActivity.kt | 4 ++-- .../passcodes/oldui/ViewPasswordActivity.kt | 4 ++-- .../oldui/adapter/PasswordAdapter.kt | 2 +- .../load_password/LoadPasswordState.kt | 8 ------- password_manager/build.gradle.kts | 9 ++++++++ .../data/repository/PasswordRepository.kt | 6 ++--- .../domain/modals/PasswordModal.kt | 2 +- .../domain/usecases/DeletePasswordUseCase.kt | 4 ++-- .../domain/usecases/EditPasswordUseCase.kt | 6 ++--- .../usecases/ExportPasswordCSVUseCase.kt | 11 +++++----- .../usecases/ImportPasswordCSVUseCase.kt | 12 +++++----- .../usecases/RetrieveAllPasswordUseCase.kt | 12 ++++++++++ .../usecases/RetrievePasswordUseCase.kt | 12 ++++++++++ .../domain/usecases/StorePasswordUseCase.kt | 6 ++--- .../domain/utils/Constants.kt | 3 +++ .../domain/utils/DateTimeUtils.kt | 4 ++-- .../load_password/LoadPasswordAction.kt | 2 +- .../load_password/LoadPasswordState.kt | 8 +++++++ .../load_password/LoadPasswordViewModel.kt | 4 ++-- .../save_password/SavePasswordAction.kt | 2 +- .../save_password/SavePasswordState.kt | 2 +- .../save_password/SavePasswordViewModel.kt | 6 ++--- .../update_password/UpdatePasswordAction.kt | 2 +- .../update_password/UpdatePasswordState.kt | 2 +- .../UpdatePasswordViewModel.kt | 8 +++---- .../presentation/utils/Permissions.kt | 2 +- .../view_password/ViewPasswordAction.kt | 2 +- .../view_password/ViewPasswordState.kt | 2 +- .../view_password/ViewPasswordViewModel.kt | 8 +++---- 38 files changed, 116 insertions(+), 106 deletions(-) delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/data/repository/PasswordRepository.kt (93%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/modals/PasswordModal.kt (73%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/usecases/DeletePasswordUseCase.kt (52%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/usecases/EditPasswordUseCase.kt (61%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/usecases/ExportPasswordCSVUseCase.kt (63%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/usecases/ImportPasswordCSVUseCase.kt (82%) create mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt create mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/usecases/StorePasswordUseCase.kt (60%) create mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/Constants.kt rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/domain/utils/DateTimeUtils.kt (96%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/load_password/LoadPasswordAction.kt (54%) create mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordState.kt rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/load_password/LoadPasswordViewModel.kt (83%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/save_password/SavePasswordAction.kt (83%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/save_password/SavePasswordState.kt (70%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/save_password/SavePasswordViewModel.kt (88%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/update_password/UpdatePasswordAction.kt (83%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/update_password/UpdatePasswordState.kt (69%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/update_password/UpdatePasswordViewModel.kt (89%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/utils/Permissions.kt (96%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/view_password/ViewPasswordAction.kt (78%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/view_password/ViewPasswordState.kt (73%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/presentation/view_password/ViewPasswordViewModel.kt (84%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt index a2cd13f9..48fb07b3 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/Constants.kt @@ -14,7 +14,4 @@ object Constant { const val REPORT_BUG_URL = "$REPOSITORY_URL/issues/new?template=bug-report.md" const val RELEASE_NOTE_URL = "$DOCS_REPOSITORY_URL/blob/main/user-docs/release-notes.md" const val SECURITY_GUIDE_URL = "$DOCS_REPOSITORY_URL/blob/main/user-docs/security-guidelines.md" - - // Other App Constants - const val IMPORT_EXPORT_CSV_HEADER = "name,url,username,password,note" } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 5edeeb64..6b107dfa 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,17 +1,17 @@ package com.jeeldobariya.passcodes.di import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase -import com.jeeldobariya.passcodes.domain.usecases.DeletePasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.EditPasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase -import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase -import com.jeeldobariya.passcodes.domain.usecases.RetrieveAllPasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.StorePasswordUseCase -import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel -import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel -import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel -import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel +import com.jeeldobariya.passcodes.password_manager.domain.usecases.DeletePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.EditPasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.ImportPasswordCSVUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.RetrieveAllPasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.RetrievePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.StorePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt index 0cf1de6b..e5d69116 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt @@ -1,6 +1,6 @@ package com.jeeldobariya.passcodes.di -import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.master.MasterDatabase import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt deleted file mode 100644 index 531f6a50..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrieveAllPasswordUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.jeeldobariya.passcodes.domain.usecases - -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal - -class RetrieveAllPasswordUseCase( - val passwordRepository: PasswordRepository -) { - suspend fun run(): List { - return passwordRepository.getAllPasswords() - } -} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt deleted file mode 100644 index 7bef6a0c..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/RetrievePasswordUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.jeeldobariya.passcodes.domain.usecases - -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal - -class RetrievePasswordUseCase( - val passwordRepository: PasswordRepository -) { - suspend fun run(id: Int): PasswordModal? { - return passwordRepository.getPasswordById(id) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index ad36e7cc..3bf13113 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -7,10 +7,10 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding -import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter -import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordAction -import com.jeeldobariya.passcodes.presentation.load_password.LoadPasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordAction +import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index 9dbcd0a0..e227d90f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -11,8 +11,8 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding -import com.jeeldobariya.passcodes.domain.usecases.ExportPasswordCSVUseCase -import com.jeeldobariya.passcodes.domain.usecases.ImportPasswordCSVUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.ImportPasswordCSVUseCase import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt index 2d7820cf..53ee3e52 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt @@ -5,8 +5,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding -import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordAction -import com.jeeldobariya.passcodes.presentation.save_password.SavePasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordAction +import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 164dcb2d..dff53a1c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -13,7 +13,7 @@ import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity import com.jeeldobariya.passcodes.data.datastore.appDatastore -import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt index f11dd31b..6342cedc 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt @@ -7,8 +7,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding -import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordAction -import com.jeeldobariya.passcodes.presentation.update_password.UpdatePasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordAction +import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt index 885adbce..4ccfbf13 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt @@ -10,8 +10,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding -import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordAction -import com.jeeldobariya.passcodes.presentation.view_password.ViewPasswordViewModel +import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordAction +import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt index 6a5faa7b..f2b126c5 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt @@ -6,7 +6,7 @@ import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import com.jeeldobariya.passcodes.databinding.PasswordListItemBinding -import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class PasswordAdapter( private val context: Context, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt deleted file mode 100644 index 7f1c064b..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordState.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.jeeldobariya.passcodes.presentation.load_password - -import com.jeeldobariya.passcodes.domain.modals.PasswordModal - -data class LoadPasswordState( - val passwordEntityList: List = emptyList(), - val isError: Boolean = false -) diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 33de8d5d..6e8f4e40 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -41,9 +41,18 @@ android { } dependencies { + implementation(project(":database")) + implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) + + // Concurrency (Coroutines Bundle) + implementation(libs.bundles.coroutines) + + // Android Architecture Components (Lifecycle Bundle) + implementation(libs.bundles.lifecycle) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt similarity index 93% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt index 496bbf89..78a8163f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/repository/PasswordRepository.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt @@ -1,9 +1,9 @@ -package com.jeeldobariya.passcodes.data.repository +package com.jeeldobariya.passcodes.password_manager.data.repository import com.jeeldobariya.passcodes.database.master.PasswordEntity import com.jeeldobariya.passcodes.database.master.PasswordsDao -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.domain.utils.DateTimeUtils +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.utils.DateTimeUtils import kotlinx.coroutines.flow.first import kotlin.require diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/modals/PasswordModal.kt similarity index 73% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/modals/PasswordModal.kt index 930ce4d6..f7a8ad0c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/modals/PasswordModal.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/modals/PasswordModal.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.domain.modals +package com.jeeldobariya.passcodes.password_manager.domain.modals data class PasswordModal( val id: Int = 0, diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt similarity index 52% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt index 3504636d..7a240b1a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/DeletePasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt @@ -1,6 +1,6 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.password_manager.domain.usecases -import com.jeeldobariya.passcodes.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository class DeletePasswordUseCase( val passwordRepository: PasswordRepository diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt similarity index 61% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt index 061152f1..8be4b0bf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/EditPasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt @@ -1,7 +1,7 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.password_manager.domain.usecases -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class EditPasswordUseCase( val passwordRepository: PasswordRepository diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt similarity index 63% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt index 483bf3b9..51c451e0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ExportPasswordCSVUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt @@ -1,9 +1,10 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.password_manager.domain.usecases import android.content.Context import android.net.Uri -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.Constant +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.utils.IMPORT_EXPORT_CSV_HEADER class ExportPasswordCSVUseCase( val context: Context, @@ -13,10 +14,10 @@ class ExportPasswordCSVUseCase( context.contentResolver.openOutputStream(exportFileUri)?.bufferedWriter().use { writer -> requireNotNull(writer) - writer.write(Constant.IMPORT_EXPORT_CSV_HEADER) + writer.write(IMPORT_EXPORT_CSV_HEADER) writer.newLine() - passwordRepository.getAllPasswords().forEach { password -> + passwordRepository.getAllPasswords().forEach { password: PasswordModal -> writer.write("${password.domain.trim()},https://local.${password.domain.trim()},${password.username.trim()},${password.password.trim()},${password.notes.trim()}") writer.newLine() } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt similarity index 82% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt index 65d6d60d..6ce3f855 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/ImportPasswordCSVUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt @@ -1,10 +1,10 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.password_manager.domain.usecases import android.content.Context import android.net.Uri -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.Constant +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.utils.IMPORT_EXPORT_CSV_HEADER class ImportPasswordCSVUseCase( val context: Context, @@ -15,8 +15,8 @@ class ImportPasswordCSVUseCase( requireNotNull(reader) val header = reader.readLine() - if (header != Constant.IMPORT_EXPORT_CSV_HEADER) { - throw Exception("The given csv file has incorrect header format. Correct Format is [${Constant.IMPORT_EXPORT_CSV_HEADER}]") + if (header != IMPORT_EXPORT_CSV_HEADER) { + throw Exception("The given csv file has incorrect header format. Correct Format is [$IMPORT_EXPORT_CSV_HEADER]") } var line: String? = reader.readLine() diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt new file mode 100644 index 00000000..4498f558 --- /dev/null +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt @@ -0,0 +1,12 @@ +package com.jeeldobariya.passcodes.password_manager.domain.usecases + +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal + +class RetrieveAllPasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(): List { + return passwordRepository.getAllPasswords() + } +} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt new file mode 100644 index 00000000..ffecad80 --- /dev/null +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt @@ -0,0 +1,12 @@ +package com.jeeldobariya.passcodes.password_manager.domain.usecases + +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal + +class RetrievePasswordUseCase( + val passwordRepository: PasswordRepository +) { + suspend fun run(id: Int): PasswordModal? { + return passwordRepository.getPasswordById(id) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt similarity index 60% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt index 66d92d38..8a3f8c6b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/StorePasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt @@ -1,7 +1,7 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.password_manager.domain.usecases -import com.jeeldobariya.passcodes.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class StorePasswordUseCase( val passwordRepository: PasswordRepository diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/Constants.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/Constants.kt new file mode 100644 index 00000000..1515964b --- /dev/null +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/Constants.kt @@ -0,0 +1,3 @@ +package com.jeeldobariya.passcodes.password_manager.domain.utils + +const val IMPORT_EXPORT_CSV_HEADER = "name,url,username,password,note" diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/DateTimeUtils.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/DateTimeUtils.kt index 36e775ee..ea5a802b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/DateTimeUtils.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/utils/DateTimeUtils.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.domain.utils +package com.jeeldobariya.passcodes.password_manager.domain.utils import java.text.SimpleDateFormat import java.util.Date @@ -52,4 +52,4 @@ class DateTimeUtils { } } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordAction.kt similarity index 54% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordAction.kt index 064347a6..e7b8dcd7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordAction.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.load_password +package com.jeeldobariya.passcodes.password_manager.presentation.load_password sealed interface LoadPasswordAction { data object RefreshPassword: LoadPasswordAction diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordState.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordState.kt new file mode 100644 index 00000000..25cce909 --- /dev/null +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordState.kt @@ -0,0 +1,8 @@ +package com.jeeldobariya.passcodes.password_manager.presentation.load_password + +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal + +data class LoadPasswordState( + val passwordEntityList: List = emptyList(), + val isError: Boolean = false +) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt similarity index 83% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt index 0eee4600..fc79cfd9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/load_password/LoadPasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt @@ -1,8 +1,8 @@ -package com.jeeldobariya.passcodes.presentation.load_password +package com.jeeldobariya.passcodes.password_manager.presentation.load_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.domain.usecases.RetrieveAllPasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.RetrieveAllPasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordAction.kt similarity index 83% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordAction.kt index 955e48b0..6242131c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordAction.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.save_password +package com.jeeldobariya.passcodes.password_manager.presentation.save_password sealed interface SavePasswordAction { data class OnChangeDomain(val newDomain: String): SavePasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordState.kt similarity index 70% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordState.kt index 06c941ad..b5f4098c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordState.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.save_password +package com.jeeldobariya.passcodes.password_manager.presentation.save_password data class SavePasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt similarity index 88% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt index b6d9cc0b..3e7f8f16 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/save_password/SavePasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt @@ -1,9 +1,9 @@ -package com.jeeldobariya.passcodes.presentation.save_password +package com.jeeldobariya.passcodes.password_manager.presentation.save_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.domain.usecases.StorePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.usecases.StorePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordAction.kt similarity index 83% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordAction.kt index 3dd1ad41..aa167dff 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordAction.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.update_password +package com.jeeldobariya.passcodes.password_manager.presentation.update_password sealed interface UpdatePasswordAction { data class OnChangeDomain(val newDomain: String): UpdatePasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordState.kt similarity index 69% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordState.kt index 958040f4..0b446eac 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordState.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.update_password +package com.jeeldobariya.passcodes.password_manager.presentation.update_password data class UpdatePasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt similarity index 89% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt index 64cf4da1..14f1fa58 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/update_password/UpdatePasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt @@ -1,10 +1,10 @@ -package com.jeeldobariya.passcodes.presentation.update_password +package com.jeeldobariya.passcodes.password_manager.presentation.update_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.domain.usecases.EditPasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.usecases.EditPasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.RetrievePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt index bd17f939..00638a09 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/utils/Permissions.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.utils +package com.jeeldobariya.passcodes.password_manager.presentation.utils // comment the below code as permission are not used in app. // currently, but we might require this later.. diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordAction.kt similarity index 78% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordAction.kt index bedcfe84..fcc172ad 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordAction.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordAction.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.view_password +package com.jeeldobariya.passcodes.password_manager.presentation.view_password sealed interface ViewPasswordAction { data class LoadPassword(val passwordId: Int): ViewPasswordAction diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordState.kt similarity index 73% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordState.kt index 370108a6..c9301d2f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordState.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordState.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.presentation.view_password +package com.jeeldobariya.passcodes.password_manager.presentation.view_password data class ViewPasswordState( val domain: String = "", diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt similarity index 84% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt index cf39f1d9..48a19f83 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/view_password/ViewPasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt @@ -1,10 +1,10 @@ -package com.jeeldobariya.passcodes.presentation.view_password +package com.jeeldobariya.passcodes.password_manager.presentation.view_password import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.jeeldobariya.passcodes.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.domain.usecases.DeletePasswordUseCase -import com.jeeldobariya.passcodes.domain.usecases.RetrievePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal +import com.jeeldobariya.passcodes.password_manager.domain.usecases.DeletePasswordUseCase +import com.jeeldobariya.passcodes.password_manager.domain.usecases.RetrievePasswordUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update From 7f8dc2909ced0a9ccd4a4831146721b4dcd7c7af Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 10:29:05 +0530 Subject: [PATCH 049/115] refactor: made a code module for code that general to all module --- core/.gitignore | 1 + core/build.gradle.kts | 50 +++++++++++++++++++ core/consumer-rules.pro | 0 core/proguard-rules.pro | 21 ++++++++ .../passcodes/core/ExampleInstrumentedTest.kt | 24 +++++++++ core/src/main/AndroidManifest.xml | 4 ++ .../passcodes/core/ExampleUnitTest.kt | 17 +++++++ 7 files changed, 117 insertions(+) create mode 100644 core/.gitignore create mode 100644 core/build.gradle.kts create mode 100644 core/consumer-rules.pro create mode 100644 core/proguard-rules.pro create mode 100644 core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt create mode 100644 core/src/main/AndroidManifest.xml create mode 100644 core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 00000000..9a94a83c --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,50 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } +} + +android { + namespace = "com.jeeldobariya.passcodes.core" + compileSdk { + version = release(36) + } + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) +} diff --git a/core/consumer-rules.pro b/core/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/core/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/core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt b/core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..2c8446ef --- /dev/null +++ b/core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.jeeldobariya.passcodes.core + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.jeeldobariya.passcodes.core.test", appContext.packageName) + } +} diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/core/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt b/core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt new file mode 100644 index 00000000..df7d463c --- /dev/null +++ b/core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.jeeldobariya.passcodes.core + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} From 5f6c56751980f602803aa1a1b87eb9d2d4ea9582 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 11:32:40 +0530 Subject: [PATCH 050/115] refactor: move the core code in core module it is not a standalone idempotent commit... mean it changes that might depend in future commit --- app/build.gradle.kts | 1 + .../passcodes/oldui/AboutUsActivity.kt | 2 +- .../passcodes/oldui/LicenseActivity.kt | 2 +- .../passcodes/oldui/LoadPasswordActivity.kt | 7 ++-- .../passcodes/oldui/MainActivity.kt | 4 +-- .../oldui/PasswordManagerActivity.kt | 7 ++-- .../passcodes/oldui/SavePasswordActivity.kt | 4 +-- .../passcodes/oldui/SettingsActivity.kt | 7 ++-- .../passcodes/oldui/UpdatePasswordActivity.kt | 5 +-- .../passcodes/oldui/ViewPasswordActivity.kt | 5 +-- .../jeeldobariya/passcodes/ui/MainActivity.kt | 2 +- core/build.gradle.kts | 33 +++++++++++++++++++ .../core}/CollectStateWithLifeCycleInXml.kt | 2 +- .../passcodes/core}/datastore/AppSettings.kt | 8 +++-- .../core}/datastore/AppSettingsSerializer.kt | 8 ++--- .../feature_flags}/FeatureFlagsSettings.kt | 2 +- .../FeatureFlagsSettingsSerializer.kt | 2 +- .../src/main/res/values-de/strings.xml | 0 .../src/main/res/values-es/strings.xml | 0 .../src/main/res/values-hi/strings.xml | 0 .../src/main/res/values-in/strings.xml | 0 .../src/main/res/values-ja/strings.xml | 0 .../src/main/res/values-ko/strings.xml | 0 .../src/main/res/values-kr/strings.xml | 0 .../src/main/res/values-night/themes.xml | 0 .../src/main/res/values-vi/strings.xml | 0 .../src/main/res/values-zh/strings.xml | 0 {app => core}/src/main/res/values/arrays.xml | 0 {app => core}/src/main/res/values/colors.xml | 0 {app => core}/src/main/res/values/strings.xml | 0 {app => core}/src/main/res/values/themes.xml | 0 password_manager/build.gradle.kts | 1 + settings.gradle.kts | 1 + 33 files changed, 73 insertions(+), 30 deletions(-) rename {app/src/main/kotlin/com/jeeldobariya/passcodes/oldui => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/CollectStateWithLifeCycleInXml.kt (92%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes/data => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/datastore/AppSettings.kt (78%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes/data => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/datastore/AppSettingsSerializer.kt (87%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes/flags => core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags}/FeatureFlagsSettings.kt (98%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes/flags => core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags}/FeatureFlagsSettingsSerializer.kt (95%) rename {app => core}/src/main/res/values-de/strings.xml (100%) rename {app => core}/src/main/res/values-es/strings.xml (100%) rename {app => core}/src/main/res/values-hi/strings.xml (100%) rename {app => core}/src/main/res/values-in/strings.xml (100%) rename {app => core}/src/main/res/values-ja/strings.xml (100%) rename {app => core}/src/main/res/values-ko/strings.xml (100%) rename {app => core}/src/main/res/values-kr/strings.xml (100%) rename {app => core}/src/main/res/values-night/themes.xml (100%) rename {app => core}/src/main/res/values-vi/strings.xml (100%) rename {app => core}/src/main/res/values-zh/strings.xml (100%) rename {app => core}/src/main/res/values/arrays.xml (100%) rename {app => core}/src/main/res/values/colors.xml (100%) rename {app => core}/src/main/res/values/strings.xml (100%) rename {app => core}/src/main/res/values/themes.xml (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0a870a60..8fd94e0c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -149,6 +149,7 @@ android { dependencies { // In project library / feature modules + implementation(project(":core")) implementation(project(":autofill")) implementation(project(":database")) implementation(project(":password_manager")) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt index c0c982df..5abcded6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt @@ -6,7 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri import com.jeeldobariya.passcodes.databinding.ActivityAboutUsBinding import com.jeeldobariya.passcodes.Constant -import com.jeeldobariya.passcodes.data.datastore.appDatastore +import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt index c2272ba4..05960001 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt @@ -5,7 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.oss.licenses.OssLicensesMenuActivity import com.jeeldobariya.passcodes.databinding.ActivityLicenseBinding -import com.jeeldobariya.passcodes.data.datastore.appDatastore +import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import java.io.BufferedReader diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt index 3bf13113..8e6d4290 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt @@ -5,13 +5,14 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordViewModel -import com.jeeldobariya.passcodes.data.datastore.appDatastore +import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel @@ -24,7 +25,7 @@ class LoadPasswordActivity : AppCompatActivity() { private lateinit var passwordAdapter: PasswordAdapter override fun onCreate(savedInstanceState: Bundle?) { - runBlocking { + runBlocking { setTheme(appDatastore.data.first().theme) } super.onCreate(savedInstanceState) 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 6cc83e43..61c9ed6f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -6,10 +6,10 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.BuildConfig +import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.databinding.ActivityMainBinding import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase -import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt index e227d90f..a717fd50 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt @@ -9,12 +9,13 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.ImportPasswordCSVUseCase -import com.jeeldobariya.passcodes.flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt index 53ee3e52..760b7764 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt @@ -3,11 +3,11 @@ package com.jeeldobariya.passcodes.oldui import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordViewModel -import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index dff53a1c..2d0ba641 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -10,12 +10,13 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity -import com.jeeldobariya.passcodes.data.datastore.appDatastore +import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding -import com.jeeldobariya.passcodes.flags.featureFlagsDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt index 6342cedc..2dd9f100 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt @@ -5,11 +5,12 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel -import com.jeeldobariya.passcodes.data.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt index 4ccfbf13..9033ec7f 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt @@ -8,11 +8,12 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel -import com.jeeldobariya.passcodes.data.datastore.appDatastore +import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel 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 344d4e9f..a85f2be6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.jeeldobariya.passcodes.flags.featureFlagsDatastore +import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme import kotlinx.coroutines.launch import kotlin.system.exitProcess diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9a94a83c..8eb8dcb2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.serialization) } kotlin { @@ -44,6 +45,38 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) + + // Standard Kotlin Libraries + implementation(libs.kotlin.stdlib) + + // UI/Google Services + implementation(libs.material) + implementation(libs.oss.license) + implementation(libs.appcompat) + + // Networking/Parsing + implementation(libs.okhttp) + implementation(libs.json) + + // Concurrency (Coroutines Bundle) + implementation(libs.bundles.coroutines) + + // Android Architecture Components (Lifecycle Bundle) + implementation(libs.bundles.lifecycle) + + // Dependency Injection + implementation(libs.bundles.koin) + + // Datastore Preferences + implementation(libs.bundles.datastore.preferences) + + + // --- Testing --- + debugImplementation(libs.androidx.ui.test.manifest) + + // Local Unit Testing (Unit Test Bundle) + testImplementation(libs.bundles.unit.test) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt similarity index 92% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt index 0e584cf1..8404b1b5 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/CollectStateWithLifeCycleInXml.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.core import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt similarity index 78% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt index 0de8f8ac..d749c106 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettings.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt @@ -1,10 +1,10 @@ -package com.jeeldobariya.passcodes.data.datastore +package com.jeeldobariya.passcodes.core.datastore // please refer to `app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt` for Migration Guide. import android.content.Context import androidx.datastore.dataStore -import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.core.R import kotlinx.serialization.Serializable val Context.appDatastore by dataStore(fileName = "app-settings.json", serializer = AppSettingsSerializer) @@ -12,4 +12,6 @@ val Context.appDatastore by dataStore(fileName = "app-settings.json", serializer @Serializable data class AppSettings( val theme: Int = R.style.PasscodesTheme_Default, -) +) { + companion object +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt similarity index 87% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt index 468e13c0..a1ab7f3a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/data/datastore/AppSettingsSerializer.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.data.datastore +package com.jeeldobariya.passcodes.core.datastore import androidx.datastore.core.Serializer import kotlinx.serialization.SerializationException @@ -12,7 +12,7 @@ object AppSettingsSerializer: Serializer { override suspend fun readFrom(input: InputStream): AppSettings { return try { - Json.Default.decodeFromString( + Json.decodeFromString( deserializer = AppSettings.serializer(), string = input.readBytes().decodeToString(), ) @@ -27,10 +27,10 @@ object AppSettingsSerializer: Serializer { output: OutputStream ) { output.write( - Json.Default.encodeToString( + Json.encodeToString( serializer = AppSettings.serializer(), value = t ).encodeToByteArray() ) } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettings.kt similarity index 98% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettings.kt index 28a6cea4..4cef76a7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettings.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.flags +package com.jeeldobariya.passcodes.core.feature_flags // This file contains a solution as commented code... ignore it.. if you don't entertain it. diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettingsSerializer.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt similarity index 95% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettingsSerializer.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt index 187978c1..67d192d9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettingsSerializer.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.flags +package com.jeeldobariya.passcodes.core.feature_flags import androidx.datastore.core.Serializer import kotlinx.serialization.SerializationException diff --git a/app/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml similarity index 100% rename from app/src/main/res/values-de/strings.xml rename to core/src/main/res/values-de/strings.xml diff --git a/app/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml similarity index 100% rename from app/src/main/res/values-es/strings.xml rename to core/src/main/res/values-es/strings.xml diff --git a/app/src/main/res/values-hi/strings.xml b/core/src/main/res/values-hi/strings.xml similarity index 100% rename from app/src/main/res/values-hi/strings.xml rename to core/src/main/res/values-hi/strings.xml diff --git a/app/src/main/res/values-in/strings.xml b/core/src/main/res/values-in/strings.xml similarity index 100% rename from app/src/main/res/values-in/strings.xml rename to core/src/main/res/values-in/strings.xml diff --git a/app/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml similarity index 100% rename from app/src/main/res/values-ja/strings.xml rename to core/src/main/res/values-ja/strings.xml diff --git a/app/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml similarity index 100% rename from app/src/main/res/values-ko/strings.xml rename to core/src/main/res/values-ko/strings.xml diff --git a/app/src/main/res/values-kr/strings.xml b/core/src/main/res/values-kr/strings.xml similarity index 100% rename from app/src/main/res/values-kr/strings.xml rename to core/src/main/res/values-kr/strings.xml diff --git a/app/src/main/res/values-night/themes.xml b/core/src/main/res/values-night/themes.xml similarity index 100% rename from app/src/main/res/values-night/themes.xml rename to core/src/main/res/values-night/themes.xml diff --git a/app/src/main/res/values-vi/strings.xml b/core/src/main/res/values-vi/strings.xml similarity index 100% rename from app/src/main/res/values-vi/strings.xml rename to core/src/main/res/values-vi/strings.xml diff --git a/app/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml similarity index 100% rename from app/src/main/res/values-zh/strings.xml rename to core/src/main/res/values-zh/strings.xml diff --git a/app/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml similarity index 100% rename from app/src/main/res/values/arrays.xml rename to core/src/main/res/values/arrays.xml diff --git a/app/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to core/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to core/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/themes.xml b/core/src/main/res/values/themes.xml similarity index 100% rename from app/src/main/res/values/themes.xml rename to core/src/main/res/values/themes.xml diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 6e8f4e40..536d2738 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -41,6 +41,7 @@ android { } dependencies { + implementation(project(":core")) implementation(project(":database")) implementation(libs.androidx.core.ktx) diff --git a/settings.gradle.kts b/settings.gradle.kts index 12d17a47..8851398f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,6 +15,7 @@ pluginManagement { // Defines all modules in your project include(":app") +include(":core") include(":autofill") include(":database") include(":password_manager") From 19d193a1cba97c5b1acef6389d84ebdc8c5515af Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 12:16:23 +0530 Subject: [PATCH 051/115] refactor: move ui to password manager module it is not a idempotent... mean changes in this commit can depend on future commit --- app/src/main/AndroidManifest.xml | 10 +++--- .../passcodes/oldui/MainActivity.kt | 1 + .../passcodes/core/ExampleInstrumentedTest.kt | 0 .../passcodes/core/ExampleUnitTest.kt | 0 password_manager/build.gradle.kts | 31 +++++++++++++++++++ .../oldui/LoadPasswordActivity.kt | 6 ++-- .../oldui/PasswordManagerActivity.kt | 4 +-- .../oldui/SavePasswordActivity.kt | 4 +-- .../oldui/UpdatePasswordActivity.kt | 4 +-- .../oldui/ViewPasswordActivity.kt | 4 +-- .../oldui/adapter/PasswordAdapter.kt | 4 +-- .../res/layout/activity_load_password.xml | 0 .../res/layout/activity_password_manager.xml | 0 .../res/layout/activity_save_password.xml | 0 .../res/layout/activity_update_password.xml | 0 .../res/layout/activity_view_password.xml | 0 .../main/res/layout/password_list_item.xml | 0 17 files changed, 50 insertions(+), 18 deletions(-) rename core/src/androidTest/{java => kotlin}/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt (100%) rename core/src/test/{java => kotlin}/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt (100%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/LoadPasswordActivity.kt (92%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/PasswordManagerActivity.kt (96%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/SavePasswordActivity.kt (94%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/UpdatePasswordActivity.kt (96%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/ViewPasswordActivity.kt (97%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager}/oldui/adapter/PasswordAdapter.kt (93%) rename {app => password_manager}/src/main/res/layout/activity_load_password.xml (100%) rename {app => password_manager}/src/main/res/layout/activity_password_manager.xml (100%) rename {app => password_manager}/src/main/res/layout/activity_save_password.xml (100%) rename {app => password_manager}/src/main/res/layout/activity_update_password.xml (100%) rename {app => password_manager}/src/main/res/layout/activity_view_password.xml (100%) rename {app => password_manager}/src/main/res/layout/password_list_item.xml (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4d195810..84688b77 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,11 +25,11 @@ - - - - - + + + + + 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 61c9ed6f..1c09493a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -10,6 +10,7 @@ import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.databinding.ActivityMainBinding import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase +import com.jeeldobariya.passcodes.password_manager.oldui.PasswordManagerActivity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch diff --git a/core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt b/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt similarity index 100% rename from core/src/androidTest/java/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt rename to core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt diff --git a/core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt similarity index 100% rename from core/src/test/java/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt rename to core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 536d2738..faebbce4 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -38,6 +38,10 @@ android { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } + + buildFeatures { + viewBinding = true + } } dependencies { @@ -48,12 +52,39 @@ dependencies { implementation(libs.appcompat) implementation(libs.material) + // Jetpack Compose + implementation(libs.bundles.compose) + implementation(platform(libs.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.bundles.compose.debug) + + // Navigation 3 + implementation(libs.bundles.navigation3) + + // Standard Kotlin Libraries + implementation(libs.kotlin.stdlib) + + implementation(libs.oss.license) + implementation(libs.appcompat) + + // Networking/Parsing + implementation(libs.okhttp) + implementation(libs.json) + // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) // Android Architecture Components (Lifecycle Bundle) implementation(libs.bundles.lifecycle) + // Dependency Injection + implementation(libs.bundles.koin) + + // Datastore Preferences + implementation(libs.bundles.datastore.preferences) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt similarity index 92% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt index 8e6d4290..a69a9116 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LoadPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.password_manager.oldui import android.content.Intent import android.os.Bundle @@ -7,9 +7,9 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow -import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding +import com.jeeldobariya.passcodes.password_manager.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal -import com.jeeldobariya.passcodes.oldui.adapter.PasswordAdapter +import com.jeeldobariya.passcodes.password_manager.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordViewModel import com.jeeldobariya.passcodes.core.datastore.appDatastore diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt index a717fd50..bce2c5da 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/PasswordManagerActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.password_manager.oldui import android.content.Intent import android.os.Bundle @@ -13,7 +13,7 @@ import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding +import com.jeeldobariya.passcodes.password_manager.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.ImportPasswordCSVUseCase import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt similarity index 94% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt index 760b7764..0e84912d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SavePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt @@ -1,11 +1,11 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.password_manager.oldui import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.datastore.appDatastore -import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding +import com.jeeldobariya.passcodes.password_manager.databinding.ActivitySavePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordViewModel import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt index 2dd9f100..e62a5a8e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/UpdatePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.password_manager.oldui import android.app.AlertDialog import android.os.Bundle @@ -8,7 +8,7 @@ import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore -import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding +import com.jeeldobariya.passcodes.password_manager.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel import kotlinx.coroutines.flow.first diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt similarity index 97% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt index 9033ec7f..ad0d874e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/ViewPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.oldui +package com.jeeldobariya.passcodes.password_manager.oldui import android.app.AlertDialog import android.content.ClipData @@ -10,7 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow -import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding +import com.jeeldobariya.passcodes.password_manager.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel import com.jeeldobariya.passcodes.core.datastore.appDatastore diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/adapter/PasswordAdapter.kt similarity index 93% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/adapter/PasswordAdapter.kt index f2b126c5..349b7114 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/adapter/PasswordAdapter.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/adapter/PasswordAdapter.kt @@ -1,11 +1,11 @@ -package com.jeeldobariya.passcodes.oldui.adapter +package com.jeeldobariya.passcodes.password_manager.oldui.adapter import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter -import com.jeeldobariya.passcodes.databinding.PasswordListItemBinding +import com.jeeldobariya.passcodes.password_manager.databinding.PasswordListItemBinding import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class PasswordAdapter( diff --git a/app/src/main/res/layout/activity_load_password.xml b/password_manager/src/main/res/layout/activity_load_password.xml similarity index 100% rename from app/src/main/res/layout/activity_load_password.xml rename to password_manager/src/main/res/layout/activity_load_password.xml diff --git a/app/src/main/res/layout/activity_password_manager.xml b/password_manager/src/main/res/layout/activity_password_manager.xml similarity index 100% rename from app/src/main/res/layout/activity_password_manager.xml rename to password_manager/src/main/res/layout/activity_password_manager.xml diff --git a/app/src/main/res/layout/activity_save_password.xml b/password_manager/src/main/res/layout/activity_save_password.xml similarity index 100% rename from app/src/main/res/layout/activity_save_password.xml rename to password_manager/src/main/res/layout/activity_save_password.xml diff --git a/app/src/main/res/layout/activity_update_password.xml b/password_manager/src/main/res/layout/activity_update_password.xml similarity index 100% rename from app/src/main/res/layout/activity_update_password.xml rename to password_manager/src/main/res/layout/activity_update_password.xml diff --git a/app/src/main/res/layout/activity_view_password.xml b/password_manager/src/main/res/layout/activity_view_password.xml similarity index 100% rename from app/src/main/res/layout/activity_view_password.xml rename to password_manager/src/main/res/layout/activity_view_password.xml diff --git a/app/src/main/res/layout/password_list_item.xml b/password_manager/src/main/res/layout/password_list_item.xml similarity index 100% rename from app/src/main/res/layout/password_list_item.xml rename to password_manager/src/main/res/layout/password_list_item.xml From 839958d5aa7e18702bb2b3d3902571b48279fc4c Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 14:19:31 +0530 Subject: [PATCH 052/115] refactor: split the androidmanifest to different module --- app/src/main/AndroidManifest.xml | 5 ----- password_manager/src/main/AndroidManifest.xml | 8 +++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84688b77..69a8529a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,11 +25,6 @@ - - - - - diff --git a/password_manager/src/main/AndroidManifest.xml b/password_manager/src/main/AndroidManifest.xml index 8bdb7e14..3cc343a6 100644 --- a/password_manager/src/main/AndroidManifest.xml +++ b/password_manager/src/main/AndroidManifest.xml @@ -1,4 +1,10 @@ - + + + + + + + From 95ef074584aab0732e0557641344fcbb6f38058a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 14:25:43 +0530 Subject: [PATCH 053/115] refactor: common utils pacakage structure --- .../kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt | 2 +- .../core/{ => utils}/CollectStateWithLifeCycleInXml.kt | 2 +- .../com/jeeldobariya/passcodes/core}/utils/Permissions.kt | 2 +- .../passcodes/password_manager/oldui/LoadPasswordActivity.kt | 2 +- .../passcodes/password_manager/oldui/PasswordManagerActivity.kt | 2 +- .../passcodes/password_manager/oldui/UpdatePasswordActivity.kt | 2 +- .../passcodes/password_manager/oldui/ViewPasswordActivity.kt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename core/src/main/kotlin/com/jeeldobariya/passcodes/core/{ => utils}/CollectStateWithLifeCycleInXml.kt (91%) rename {password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/utils/Permissions.kt (96%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index 2d0ba641..a70e242a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -12,7 +12,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity -import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/CollectStateWithLifeCycleInXml.kt similarity index 91% rename from core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/CollectStateWithLifeCycleInXml.kt index 8404b1b5..9b41d82c 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/CollectStateWithLifeCycleInXml.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/CollectStateWithLifeCycleInXml.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.core +package com.jeeldobariya.passcodes.core.utils import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/Permissions.kt similarity index 96% rename from password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/Permissions.kt index 00638a09..d73f22df 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/utils/Permissions.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/utils/Permissions.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.password_manager.presentation.utils +package com.jeeldobariya.passcodes.core.utils // comment the below code as permission are not used in app. // currently, but we might require this later.. diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt index a69a9116..73bdda8a 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt @@ -6,7 +6,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal import com.jeeldobariya.passcodes.password_manager.oldui.adapter.PasswordAdapter diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt index bce2c5da..46f26572 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt @@ -10,7 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.password_manager.databinding.ActivityPasswordManagerBinding diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt index e62a5a8e..a4015963 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt @@ -6,7 +6,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.password_manager.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordAction diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt index ad0d874e..402ca556 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt @@ -9,7 +9,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel From 1befdd944384b727bc265b4d0ccd15516d18b297 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 2 Dec 2025 14:52:39 +0530 Subject: [PATCH 054/115] lint: update lint settings --- lint.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lint.xml b/lint.xml index f6db615e..ebfa360c 100644 --- a/lint.xml +++ b/lint.xml @@ -1,8 +1,3 @@ - - - - - From d7d0b5af605db8b8a165a3f704942a802b7ba7c5 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 09:47:22 +0530 Subject: [PATCH 055/115] chore: remove name in autofill module's android manifest to prevent consistency issue in future --- autofill/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/autofill/src/main/AndroidManifest.xml b/autofill/src/main/AndroidManifest.xml index 96041010..6b530eaf 100644 --- a/autofill/src/main/AndroidManifest.xml +++ b/autofill/src/main/AndroidManifest.xml @@ -7,7 +7,6 @@ From df23f7d022fdc4ce631b49f1bafe630929e1ff08 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:13:21 +0530 Subject: [PATCH 056/115] chore: fix lint issues in autofill module & extracted string in resource --- .../passcodes/autofill/ExampleInstrumentedTest.kt | 6 ++---- .../passcodes/autofill/PasswordAutofillService.kt | 2 +- .../src/main/res/layout/activity_autofill_settings.xml | 8 ++++---- autofill/src/main/res/values/strings.xml | 8 ++++++++ .../jeeldobariya/passcodes/autofill/ExampleUnitTest.kt | 3 +-- 5 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 autofill/src/main/res/values/strings.xml diff --git a/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt b/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt index bd286b09..841808fb 100644 --- a/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt +++ b/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.jeeldobariya.passcodes.autofill -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt index 7814c25f..b0b21bfb 100644 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt +++ b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt @@ -90,7 +90,7 @@ class PasswordAutofillService : AutofillService() { } callback.onSuccess() } else { - callback.onFailure("Could not save credentials.") + callback.onFailure(getString(R.string.could_not_save_credentials)) } } diff --git a/autofill/src/main/res/layout/activity_autofill_settings.xml b/autofill/src/main/res/layout/activity_autofill_settings.xml index 39ae641d..7c0d9a5a 100644 --- a/autofill/src/main/res/layout/activity_autofill_settings.xml +++ b/autofill/src/main/res/layout/activity_autofill_settings.xml @@ -9,14 +9,14 @@ + android:text="@string/open_settings" /> \ No newline at end of file diff --git a/autofill/src/main/res/values/strings.xml b/autofill/src/main/res/values/strings.xml new file mode 100644 index 00000000..dae15923 --- /dev/null +++ b/autofill/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + + Enable Passcodes Autofill + To use Passcodes as your password manager, you need to enable it as an autofill service in your device settings. + Open Settings + Passcodes Autofill is preview feature and shouldn\'t be use in production!! + Could not save credentials. + diff --git a/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt b/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt index fd195d87..41a28f39 100644 --- a/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt +++ b/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.jeeldobariya.passcodes.autofill +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * From e4ab04e3aaba296ac4d21e0abc2f6fbb2a0d4038 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:20:41 +0530 Subject: [PATCH 057/115] style: add empty line at end of file --- autofill/src/main/res/layout/activity_autofill_settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autofill/src/main/res/layout/activity_autofill_settings.xml b/autofill/src/main/res/layout/activity_autofill_settings.xml index 7c0d9a5a..4fbbbabd 100644 --- a/autofill/src/main/res/layout/activity_autofill_settings.xml +++ b/autofill/src/main/res/layout/activity_autofill_settings.xml @@ -34,4 +34,4 @@ android:layout_marginTop="24dp" android:text="@string/open_settings" /> - \ No newline at end of file + From 839813c3fddda4c26880042efc63029cb3bba2c1 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:22:09 +0530 Subject: [PATCH 058/115] chore(deps): remove espresso test dependency as it was not used --- autofill/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 3c4dea5e..cbca7a61 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -52,5 +52,4 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.espresso.core) } From 53ce365b93986c9a4d41422dda5b1b34f9b7efcd Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:30:14 +0530 Subject: [PATCH 059/115] chore: address lint issues --- database/src/main/AndroidManifest.xml | 2 +- .../com/jeeldobariya/passcodes/database/ExampleUnitTest.kt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/database/src/main/AndroidManifest.xml b/database/src/main/AndroidManifest.xml index 8bdb7e14..e1000761 100644 --- a/database/src/main/AndroidManifest.xml +++ b/database/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + diff --git a/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt b/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt index 1ab343a9..8c1bcd13 100644 --- a/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt +++ b/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.jeeldobariya.passcodes.database +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * From eaa9d360757c2e2b966365d1fc433d72e7fa97c0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:35:50 +0530 Subject: [PATCH 060/115] chore: remove espresso as dependency as it was useless --- database/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 7e344abd..c2de2713 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -55,7 +55,6 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.room.testing) androidTestImplementation(libs.truth) androidTestImplementation(libs.bundles.coroutines.test) From 8ac41ae97284d5c2e34e3fecdadf45d697d6a33b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:39:14 +0530 Subject: [PATCH 061/115] chore: optimize imports in password_manager module using android studio --- .../passcodes/password_manager/ExampleInstrumentedTest.kt | 6 ++---- .../password_manager/data/repository/PasswordRepository.kt | 1 - .../password_manager/oldui/LoadPasswordActivity.kt | 2 +- .../password_manager/oldui/PasswordManagerActivity.kt | 2 +- .../password_manager/oldui/UpdatePasswordActivity.kt | 2 +- .../password_manager/oldui/ViewPasswordActivity.kt | 2 +- .../passcodes/password_manager/ExampleUnitTest.kt | 3 +-- 7 files changed, 7 insertions(+), 11 deletions(-) diff --git a/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt b/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt index 99df833b..844ab225 100644 --- a/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt +++ b/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.jeeldobariya.passcodes.password_manager -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt index 78a8163f..bfc231e7 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/data/repository/PasswordRepository.kt @@ -5,7 +5,6 @@ import com.jeeldobariya.passcodes.database.master.PasswordsDao import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal import com.jeeldobariya.passcodes.password_manager.domain.utils.DateTimeUtils import kotlinx.coroutines.flow.first -import kotlin.require class PasswordRepository(val passwordsDao: PasswordsDao) { diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt index 73bdda8a..5e125c6b 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt @@ -6,13 +6,13 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal import com.jeeldobariya.passcodes.password_manager.oldui.adapter.PasswordAdapter import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.load_password.LoadPasswordViewModel -import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt index 46f26572..a24ccb65 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt @@ -10,9 +10,9 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.ImportPasswordCSVUseCase diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt index a4015963..d7ba3055 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt @@ -6,8 +6,8 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R -import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityUpdatePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt index 402ca556..e6c92dcf 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt @@ -9,11 +9,11 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordAction import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel -import com.jeeldobariya.passcodes.core.datastore.appDatastore import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt b/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt index f9e98652..551cdd39 100644 --- a/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt +++ b/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.jeeldobariya.passcodes.password_manager +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * From 837dd7c4f652d5f33292c48e8025b205d70eb0a5 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:44:42 +0530 Subject: [PATCH 062/115] chore: address lint issues in core module --- .../jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt | 6 ++---- core/src/main/AndroidManifest.xml | 2 +- .../jeeldobariya/passcodes/core/datastore/AppSettings.kt | 6 ++---- .../com/jeeldobariya/passcodes/core/ExampleUnitTest.kt | 3 +-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt b/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt index 2c8446ef..dabf756a 100644 --- a/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt +++ b/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.jeeldobariya.passcodes.core -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index 8bdb7e14..e1000761 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt index d749c106..022b779e 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt @@ -1,6 +1,6 @@ package com.jeeldobariya.passcodes.core.datastore -// please refer to `app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagsSettings.kt` for Migration Guide. +// please refer to `core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettings.kt` for Migration Guide. import android.content.Context import androidx.datastore.dataStore @@ -12,6 +12,4 @@ val Context.appDatastore by dataStore(fileName = "app-settings.json", serializer @Serializable data class AppSettings( val theme: Int = R.style.PasscodesTheme_Default, -) { - companion object -} +) diff --git a/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt index df7d463c..32302353 100644 --- a/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt +++ b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.jeeldobariya.passcodes.core +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * From 5772bc9569392509b4e1d5ec857a323fe5db20b9 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 10:50:17 +0530 Subject: [PATCH 063/115] chore(deps): remove unwanted dependency --- core/build.gradle.kts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 8eb8dcb2..c535565f 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -49,35 +49,15 @@ dependencies { // Standard Kotlin Libraries implementation(libs.kotlin.stdlib) - // UI/Google Services - implementation(libs.material) - implementation(libs.oss.license) - implementation(libs.appcompat) - - // Networking/Parsing - implementation(libs.okhttp) - implementation(libs.json) - // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) // Android Architecture Components (Lifecycle Bundle) implementation(libs.bundles.lifecycle) - // Dependency Injection - implementation(libs.bundles.koin) - // Datastore Preferences implementation(libs.bundles.datastore.preferences) - - // --- Testing --- - debugImplementation(libs.androidx.ui.test.manifest) - - // Local Unit Testing (Unit Test Bundle) - testImplementation(libs.bundles.unit.test) - testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.espresso.core) } From 708bb75aac6b1141ff166adca0b2686cd916295d Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 11:37:02 +0530 Subject: [PATCH 064/115] refactor: move string resource releated to password_manager into its module --- .../src/main/res/values-de/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-es/strings.xml | 45 ++++++++++++++++++ .../src/main/res/values-hi/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-in/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-ja/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-ko/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-kr/strings.xml | 45 ++++++++++++++++++ .../src/main/res/values-vi/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values-zh/strings.xml | 46 +++++++++++++++++++ .../src/main/res/values/strings.xml | 45 ++++++++++++++++++ 10 files changed, 457 insertions(+) create mode 100644 password_manager/src/main/res/values-de/strings.xml create mode 100644 password_manager/src/main/res/values-es/strings.xml create mode 100644 password_manager/src/main/res/values-hi/strings.xml create mode 100644 password_manager/src/main/res/values-in/strings.xml create mode 100644 password_manager/src/main/res/values-ja/strings.xml create mode 100644 password_manager/src/main/res/values-ko/strings.xml create mode 100644 password_manager/src/main/res/values-kr/strings.xml create mode 100644 password_manager/src/main/res/values-vi/strings.xml create mode 100644 password_manager/src/main/res/values-zh/strings.xml create mode 100644 password_manager/src/main/res/values/strings.xml diff --git a/password_manager/src/main/res/values-de/strings.xml b/password_manager/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..5cbfee63 --- /dev/null +++ b/password_manager/src/main/res/values-de/strings.xml @@ -0,0 +1,46 @@ + + + + Domain + Name der zugehörigen Webseite oder Domain + Benutzername + Passwort + Notizen + z. B. Google, Instagram, WhatsApp usw. + z. B. Liam15, Noha, Olivia, Ava_25 usw. + z. B. 12345, abc123xyz, qwerty usw. + Speichern + Laden + Aktualisieren + Löschen + Importieren + Exportieren + + + Passwort-Manager + Passwort laden + Passwort speichern + Passwort anzeigen + Passwort aktualisieren + + + ID: + Domain: + Benutzername: + Passwort: + Notizen: + Aktualisiert am: + + + Etwas ist schiefgelaufen + Aktion abgebrochen + Fehler: Ungültige ID!! + + + Passwort aktualisieren? + Passwort löschen? + Dieser Vorgang kann nicht rückgängig gemacht werden. + Bestätigen + Abbrechen + + diff --git a/password_manager/src/main/res/values-es/strings.xml b/password_manager/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..ce7caa89 --- /dev/null +++ b/password_manager/src/main/res/values-es/strings.xml @@ -0,0 +1,45 @@ + + + + Dominio + Nombre del sitio web o dominio + Usuario + Contraseña + Notas + Ej: Google, Instagram, WhatsApp, etc. + Ej: Liam15, Noha, Olivia, Ava_25, etc. + Ej: 12345, abc123xyz, qwerty, etc. + Guardar Contraseña + Cargar Contraseña + Actualizar Contraseña + Eliminar Contraseña + Importar Contraseña + Exportar Contraseña + + + Gestor de Contraseñas + Cargar Contraseña + Guardar Contraseña + Ver Contraseña + Actualizar Contraseña + + + ID: + Dominio: + Usuario: + Contraseña: + Notas: + Actualizado el: + + + Algo salió mal. + Acción descartada. + Algo salió mal: ¡ID inválido! + + + ¿Actualizar contraseña? + ¿Eliminar contraseña? + Esta acción no se puede deshacer. + Confirmar + Cancelar + diff --git a/password_manager/src/main/res/values-hi/strings.xml b/password_manager/src/main/res/values-hi/strings.xml new file mode 100644 index 00000000..27bacc33 --- /dev/null +++ b/password_manager/src/main/res/values-hi/strings.xml @@ -0,0 +1,46 @@ + + + + डोमेन + वेबसाइट या डोमेन का नाम + यूज़रनेम + पासवर्ड + नोट्स + जैसे Google, Instagram, WhatsApp वगैरह + जैसे Liam15, Noha, Olivia, Ava_25 वगैरह + जैसे 12345, abc123xyz, qwerty वगैरह + पासवर्ड सेव करें + पासवर्ड लोड करें + पासवर्ड अपडेट करें + पासवर्ड हटाएं + पासवर्ड इंपोर्ट करें + पासवर्ड एक्सपोर्ट करें + + + पासवर्ड मैनेजर + पासवर्ड लोड करें + पासवर्ड सेव करें + पासवर्ड देखें + पासवर्ड अपडेट करें + + + आईडी: + डोमेन: + यूज़रनेम: + पासवर्ड: + नोट्स: + अपडेट किया गया: + + + कुछ गलत हो गया। + कार्रवाई रद्द की गई। + कुछ गलत हुआ: ID सही नहीं है!! + + + पासवर्ड अपडेट करें? + पासवर्ड हटाएं? + यह काम वापस नहीं लिया जा सकता। + पक्का करें + रद्द करें + + diff --git a/password_manager/src/main/res/values-in/strings.xml b/password_manager/src/main/res/values-in/strings.xml new file mode 100644 index 00000000..da31a9dc --- /dev/null +++ b/password_manager/src/main/res/values-in/strings.xml @@ -0,0 +1,46 @@ + + + + Domain + Nama situs web atau domain yang digunakan + Nama pengguna + Kata sandi + Catatan + cth. Google, Instagram, WhatsApp, dll. + cth. Liam15, Noha, Olivia, Ava_25, dll. + cth. 12345, abc123xyz, qwerty, dll. + Simpan Kata Sandi + Muat Kata Sandi + Perbarui Kata Sandi + Hapus Kata Sandi + Impor Kata Sandi + Ekspor Kata Sandi + + + Pengelola Kata Sandi + Muat Kata Sandi + Simpan Kata Sandi + Lihat Kata Sandi + Perbarui Kata Sandi + + + ID: + Domain: + Nama Pengguna: + Kata Sandi: + Catatan: + Diperbarui: + + + Terjadi kesalahan. + Aksi dibatalkan. + Terjadi kesalahan: ID tidak valid!! + + + Perbarui kata sandi? + Hapus kata sandi? + Tindakan ini tidak dapat dibatalkan. + Konfirmasi + Batal + + diff --git a/password_manager/src/main/res/values-ja/strings.xml b/password_manager/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..2b109c42 --- /dev/null +++ b/password_manager/src/main/res/values-ja/strings.xml @@ -0,0 +1,46 @@ + + + + ドメイン + 関連するウェブサイトやドメインの名前 + ユーザー名 + パスワード + メモ + 例:Google、Instagram、WhatsApp など + 例:Liam15、Noha、Olivia、Ava_25 など + 例:12345、abc123xyz、qwerty など + 保存 + 読み込み + 更新 + 削除 + インポート + エクスポート + + + パスワードマネージャー + パスワード読み込み + パスワード保存 + パスワードを見る + パスワード更新 + + + ID: + ドメイン: + ユーザー名: + パスワード: + メモ: + 更新日: + + + 問題が発生しました + 操作がキャンセルされました + エラー:無効なIDです!! + + + パスワードを更新しますか? + パスワードを削除しますか? + この操作は元に戻せません。 + 確認 + キャンセル + + diff --git a/password_manager/src/main/res/values-ko/strings.xml b/password_manager/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000..37f1abc1 --- /dev/null +++ b/password_manager/src/main/res/values-ko/strings.xml @@ -0,0 +1,46 @@ + + + + 도메인 + 사이트 또는 도메인 이름 + 사용자 이름 + 비밀번호 + 메모 + 예: Google, Instagram, WhatsApp 등 + 예: Liam15, Noha, Olivia, Ava_25 등 + 예: 12345, abc123xyz, qwerty 등 + 비밀번호 저장 + 비밀번호 불러오기 + 비밀번호 수정 + 비밀번호 삭제 + 비밀번호 가져오기 + 비밀번호 내보내기 + + + 비밀번호 관리자 + 비밀번호 불러오기 + 비밀번호 저장 + 비밀번호 보기 + 비밀번호 수정 + + + ID: + 도메인: + 사용자 이름: + 비밀번호: + 메모: + 수정일: + + + 문제가 발생했습니다. + 작업이 취소되었습니다. + 문제 발생: 잘못된 ID입니다!! + + + 비밀번호를 수정할까요? + 비밀번호를 삭제할까요? + 이 작업은 되돌릴 수 없습니다. + 확인 + 취소 + + diff --git a/password_manager/src/main/res/values-kr/strings.xml b/password_manager/src/main/res/values-kr/strings.xml new file mode 100644 index 00000000..3e6df3c5 --- /dev/null +++ b/password_manager/src/main/res/values-kr/strings.xml @@ -0,0 +1,45 @@ + + + + Domain + Website name ttoneun domain + I-yongja + Bimilbeonho + Bijul + 예: Google, Instagram, WhatsApp + 예: Liam15, Noha, Ava_25 + 예: 12345, abc123xyz + Jeojang + Buteowagi + Gengsin + Sakje + Import + Export + + + Bimilbeonho Gwanli + Bimilbeonho Buteowagi + Bimilbeonho Jeojang + Bimilbeonho Bogi + Bimilbeonho Gengsin + + + ID: + Domain: + I-yongja: + Bimilbeonho: + Bijul: + Gengsin ilja: + + + Mueonga jalmosdoeeossseubnida. + Haengdong jeohwa + Jalmosdoe-eossseubnida: ID Mubeon! + + + Gengsin haneun geos-eulo hal-kka? + Jeongmal sangjehal-kka? + I haengdong-eun dora gal su eobs-seubnida. + Hwagin + Jeohwa + diff --git a/password_manager/src/main/res/values-vi/strings.xml b/password_manager/src/main/res/values-vi/strings.xml new file mode 100644 index 00000000..0eaeb7ed --- /dev/null +++ b/password_manager/src/main/res/values-vi/strings.xml @@ -0,0 +1,46 @@ + + + + Tên miền + Tên trang web hoặc tên miền liên quan + Tên người dùng + Mật khẩu + Ghi chú + vd: Google, Instagram, WhatsApp, v.v. + vd: Liam15, Noha, Olivia, Ava_25, v.v. + vd: 12345, abc123xyz, qwerty, v.v. + Lưu mật khẩu + Tải mật khẩu + Cập nhật mật khẩu + Xóa mật khẩu + Nhập mật khẩu + Xuất mật khẩu + + + Quản lý Mật khẩu + Tải Mật khẩu + Lưu Mật khẩu + Xem Mật khẩu + Cập nhật Mật khẩu + + + ID: + Tên miền: + Tên người dùng: + Mật khẩu: + Ghi chú: + Cập nhật lúc: + + + Đã xảy ra lỗi. + Đã hủy hành động. + Lỗi: ID không hợp lệ!! + + + Cập nhật mật khẩu? + Xóa mật khẩu? + Hành động này không thể hoàn tác. + Xác nhận + Hủy + + diff --git a/password_manager/src/main/res/values-zh/strings.xml b/password_manager/src/main/res/values-zh/strings.xml new file mode 100644 index 00000000..6b619288 --- /dev/null +++ b/password_manager/src/main/res/values-zh/strings.xml @@ -0,0 +1,46 @@ + + + + 域名 + 对应的网站或域名 + 用户名 + 密码 + 备注 + 例如:Google、Instagram、WhatsApp 等 + 例如:Liam15、Noha、Olivia、Ava_25 等 + 例如:12345、abc123xyz、qwerty 等 + 保存密码 + 加载密码 + 更新密码 + 删除密码 + 导入密码 + 导出密码 + + + 密码管理器 + 加载密码 + 保存密码 + 查看密码 + 更新密码 + + + ID: + 域名: + 用户名: + 密码: + 备注: + 更新时间: + + + 发生错误。 + 操作已取消。 + 错误:无效的 ID!! + + + 要更新密码吗? + 要删除密码吗? + 此操作无法撤销。 + 确认 + 取消 + + diff --git a/password_manager/src/main/res/values/strings.xml b/password_manager/src/main/res/values/strings.xml new file mode 100644 index 00000000..5c33f22e --- /dev/null +++ b/password_manager/src/main/res/values/strings.xml @@ -0,0 +1,45 @@ + + + Domain + The name of the website or domain associated + Username + Password + Notes + e.g. Google, Instagram, WhatsApp, etc. + e.g. Liam15, Noha, Olivia, Ava_25, etc. + e.g. 12345, abc123xyz, qwerty, etc. + Save Password + Load Password + Update Password + Delete Password + Import G-Password + Export G-Password + + + Password Manager + Load Password + Save Password + View Password + Update Password + + + ID: + Domain: + Username: + Password: + Notes: + Last Updated: + + + + Something went wrong. + Action discarded. + Something Went Wrong: Invalid ID!! + + + Update password? + Delete password? + This action cannot be undone. + Confirm + Discard + From f69cfaf57f37234663caf04ba0dc711912a2e36b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 20:46:09 +0530 Subject: [PATCH 065/115] refactor: string resource in app module --- app/src/main/res/layout/activity_settings.xml | 4 +- .../src/main/res/values-de/strings.xml | 36 -------------- .../src/main/res/values-es/strings.xml | 36 -------------- .../src/main/res/values-hi/strings.xml | 36 -------------- .../src/main/res/values-in/strings.xml | 36 -------------- .../src/main/res/values-ja/strings.xml | 36 -------------- .../src/main/res/values-ko/strings.xml | 36 -------------- .../src/main/res/values-kr/strings.xml | 36 -------------- .../src/main/res/values-vi/strings.xml | 36 -------------- .../src/main/res/values-zh/strings.xml | 36 -------------- {core => app}/src/main/res/values/strings.xml | 49 +------------------ .../src/main/res/values/strings.xml | 5 ++ 12 files changed, 9 insertions(+), 373 deletions(-) rename {core => app}/src/main/res/values-de/strings.xml (50%) rename {core => app}/src/main/res/values-es/strings.xml (51%) rename {core => app}/src/main/res/values-hi/strings.xml (52%) rename {core => app}/src/main/res/values-in/strings.xml (50%) rename {core => app}/src/main/res/values-ja/strings.xml (51%) rename {core => app}/src/main/res/values-ko/strings.xml (50%) rename {core => app}/src/main/res/values-kr/strings.xml (51%) rename {core => app}/src/main/res/values-vi/strings.xml (51%) rename {core => app}/src/main/res/values-zh/strings.xml (50%) rename {core => app}/src/main/res/values/strings.xml (50%) diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index c54a3a37..cbf73cad 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -135,7 +135,7 @@ Diese App befindet sich noch in der Entwicklung und ist nur für Lern- und Testzwecke gedacht. Sie ist möglicherweise nicht sicher für sensible Daten. Bitte lies die Sicherheitshinweise. - Domain - Name der zugehörigen Webseite oder Domain - Benutzername - Passwort - Notizen - z. B. Google, Instagram, WhatsApp usw. - z. B. Liam15, Noha, Olivia, Ava_25 usw. - z. B. 12345, abc123xyz, qwerty usw. Passwort-Manager - Speichern - Laden - Aktualisieren - Löschen - Importieren - Exportieren Sicherheitsprüfung Einstellungen Design wechseln @@ -43,26 +29,12 @@ Änderungsprotokoll - Passwort-Manager - Passwort laden - Passwort speichern - Passwort anzeigen - Passwort aktualisieren Einstellungen Über uns - ID: - Domain: - Benutzername: - Passwort: - Notizen: - Erstellt am: - Aktualisiert am: - Zugriff erlaubt - Zugriff verweigert App muss neu gestartet werden. @@ -71,17 +43,9 @@ Bitte zuerst das Formular ausfüllen. Fehler: Bitte versuche es erneut. Erfolg: - Erfolgreich aktualisiert - Erfolgreich gelöscht Etwas ist schiefgelaufen - Aktion abgebrochen Fehler: Ungültige ID!! - Passwort aktualisieren? - Passwort löschen? - Dieser Vorgang kann nicht rückgängig gemacht werden. - Bestätigen - Abbrechen diff --git a/core/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml similarity index 51% rename from core/src/main/res/values-es/strings.xml rename to app/src/main/res/values-es/strings.xml index f9dc64eb..f0efcb80 100644 --- a/core/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -14,21 +14,7 @@ Esta app está en desarrollo activo y es solo para fines educativos y experimentales. Puede que no sea segura para guardar información sensible. Consulta las directrices de seguridad para más detalles. - Dominio - Nombre del sitio web o dominio - Usuario - Contraseña - Notas - Ej: Google, Instagram, WhatsApp, etc. - Ej: Liam15, Noha, Olivia, Ava_25, etc. - Ej: 12345, abc123xyz, qwerty, etc. Gestor de Contraseñas - Guardar Contraseña - Cargar Contraseña - Actualizar Contraseña - Eliminar Contraseña - Importar Contraseña - Exportar Contraseña Revisar Seguridad Ajustes Cambiar Tema @@ -42,26 +28,12 @@ Ver Cambios - Gestor de Contraseñas - Cargar Contraseña - Guardar Contraseña - Ver Contraseña - Actualizar Contraseña Ajustes Sobre Nosotros - ID: - Dominio: - Usuario: - Contraseña: - Notas: - Creado el: - Actualizado el: - Permiso concedido - Permiso denegado Es necesario reiniciar la app. @@ -70,16 +42,8 @@ Aviso: Por favor, completa el formulario primero. Falló: Intenta de nuevo. Éxito: - Actualizado correctamente. - Eliminado correctamente. Algo salió mal. - Acción descartada. Algo salió mal: ¡ID inválido! - ¿Actualizar contraseña? - ¿Eliminar contraseña? - Esta acción no se puede deshacer. - Confirmar - Cancelar diff --git a/core/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml similarity index 52% rename from core/src/main/res/values-hi/strings.xml rename to app/src/main/res/values-hi/strings.xml index 919aadc8..c36e803d 100644 --- a/core/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -15,21 +15,7 @@ यह ऐप अभी डेवलपमेंट में है और सिर्फ एजुकेशनल और एक्सपेरिमेंटल यूज़ के लिए है। जरूरी डेटा स्टोर करने के लिए यह सिक्योर नहीं हो सकता। कृपया सिक्योरिटी गाइडलाइंस देखें। - डोमेन - वेबसाइट या डोमेन का नाम - यूज़रनेम - पासवर्ड - नोट्स - जैसे Google, Instagram, WhatsApp वगैरह - जैसे Liam15, Noha, Olivia, Ava_25 वगैरह - जैसे 12345, abc123xyz, qwerty वगैरह पासवर्ड मैनेजर - पासवर्ड सेव करें - पासवर्ड लोड करें - पासवर्ड अपडेट करें - पासवर्ड हटाएं - पासवर्ड इंपोर्ट करें - पासवर्ड एक्सपोर्ट करें सिक्योरिटी चेक सेटिंग्स थीम बदलें @@ -43,26 +29,12 @@ चेंजलॉग देखें - पासवर्ड मैनेजर - पासवर्ड लोड करें - पासवर्ड सेव करें - पासवर्ड देखें - पासवर्ड अपडेट करें सेटिंग्स हमारे बारे में - आईडी: - डोमेन: - यूज़रनेम: - पासवर्ड: - नोट्स: - बनाया गया: - अपडेट किया गया: - परमिशन मिल गई - परमिशन नहीं मिली ऐप को फिर से शुरू करना जरूरी है। @@ -71,17 +43,9 @@ चेतावनी: पहले फॉर्म भरें। फेल हुआ: फिर से कोशिश करें। सफलता: - सफलतापूर्वक अपडेट हुआ। - सफलतापूर्वक हटाया गया। कुछ गलत हो गया। - कार्रवाई रद्द की गई। कुछ गलत हुआ: ID सही नहीं है!! - पासवर्ड अपडेट करें? - पासवर्ड हटाएं? - यह काम वापस नहीं लिया जा सकता। - पक्का करें - रद्द करें diff --git a/core/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml similarity index 50% rename from core/src/main/res/values-in/strings.xml rename to app/src/main/res/values-in/strings.xml index 5bae11d9..74a72780 100644 --- a/core/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -15,21 +15,7 @@ Aplikasi ini masih dalam tahap pengembangan aktif dan ditujukan untuk pembelajaran dan eksperimen. Mungkin belum aman untuk menyimpan informasi penting. Silakan baca panduan keamanan untuk info lebih lanjut. - Domain - Nama situs web atau domain yang digunakan - Nama pengguna - Kata sandi - Catatan - cth. Google, Instagram, WhatsApp, dll. - cth. Liam15, Noha, Olivia, Ava_25, dll. - cth. 12345, abc123xyz, qwerty, dll. Pengelola Kata Sandi - Simpan Kata Sandi - Muat Kata Sandi - Perbarui Kata Sandi - Hapus Kata Sandi - Impor Kata Sandi - Ekspor Kata Sandi Cek Keamanan Pengaturan Ganti Tema @@ -43,26 +29,12 @@ Lihat Changelog - Pengelola Kata Sandi - Muat Kata Sandi - Simpan Kata Sandi - Lihat Kata Sandi - Perbarui Kata Sandi Pengaturan Tentang Kami - ID: - Domain: - Nama Pengguna: - Kata Sandi: - Catatan: - Dibuat: - Diperbarui: - Izin diberikan - Izin ditolak Aplikasi perlu dimulai ulang. @@ -71,17 +43,9 @@ Peringatan: Harap isi formulir dulu. Gagal: Coba lagi nanti. Berhasil: - Berhasil diperbarui. - Berhasil dihapus. Terjadi kesalahan. - Aksi dibatalkan. Terjadi kesalahan: ID tidak valid!! - Perbarui kata sandi? - Hapus kata sandi? - Tindakan ini tidak dapat dibatalkan. - Konfirmasi - Batal diff --git a/core/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml similarity index 51% rename from core/src/main/res/values-ja/strings.xml rename to app/src/main/res/values-ja/strings.xml index c4644abe..b5a34be8 100644 --- a/core/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -15,21 +15,7 @@ このアプリは開発中で、教育・実験目的のみでの使用を想定しています。機密情報の保存には安全でない可能性があります。セキュリティガイドラインをご確認ください。 - ドメイン - 関連するウェブサイトやドメインの名前 - ユーザー名 - パスワード - メモ - 例:Google、Instagram、WhatsApp など - 例:Liam15、Noha、Olivia、Ava_25 など - 例:12345、abc123xyz、qwerty など パスワードマネージャー - 保存 - 読み込み - 更新 - 削除 - インポート - エクスポート セキュリティチェック 設定 テーマ切替 @@ -43,26 +29,12 @@ 更新履歴 - パスワードマネージャー - パスワード読み込み - パスワード保存 - パスワードを見る - パスワード更新 設定 アプリについて - ID: - ドメイン: - ユーザー名: - パスワード: - メモ: - 作成日: - 更新日: - 許可されました - 許可されませんでした アプリを再起動する必要があります。 @@ -71,17 +43,9 @@ 警告:フォームを入力してください 失敗しました:もう一度お試しください 成功: - 更新に成功しました - 削除に成功しました 問題が発生しました - 操作がキャンセルされました エラー:無効なIDです!! - パスワードを更新しますか? - パスワードを削除しますか? - この操作は元に戻せません。 - 確認 - キャンセル diff --git a/core/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml similarity index 50% rename from core/src/main/res/values-ko/strings.xml rename to app/src/main/res/values-ko/strings.xml index e0932b44..ea3e221f 100644 --- a/core/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -15,21 +15,7 @@ 이 앱은 현재 개발 중이며 교육 및 실험용으로만 사용해야 합니다. 중요한 정보를 저장하기엔 아직 안전하지 않을 수 있습니다. 보안 가이드를 꼭 참고해주세요. - 도메인 - 사이트 또는 도메인 이름 - 사용자 이름 - 비밀번호 - 메모 - 예: Google, Instagram, WhatsApp 등 - 예: Liam15, Noha, Olivia, Ava_25 등 - 예: 12345, abc123xyz, qwerty 등 비밀번호 관리자 - 비밀번호 저장 - 비밀번호 불러오기 - 비밀번호 수정 - 비밀번호 삭제 - 비밀번호 가져오기 - 비밀번호 내보내기 보안 확인 설정 테마 전환 @@ -43,26 +29,12 @@ 변경 기록 - 비밀번호 관리자 - 비밀번호 불러오기 - 비밀번호 저장 - 비밀번호 보기 - 비밀번호 수정 설정 앱 정보 - ID: - 도메인: - 사용자 이름: - 비밀번호: - 메모: - 생성일: - 수정일: - 권한 허용됨 - 권한 거부됨 앱을 다시 시작해야 해요. @@ -71,17 +43,9 @@ 주의: 먼저 양식을 작성해주세요. 실패: 다시 시도해주세요. 성공: - 성공적으로 수정되었습니다. - 성공적으로 삭제되었습니다. 문제가 발생했습니다. - 작업이 취소되었습니다. 문제 발생: 잘못된 ID입니다!! - 비밀번호를 수정할까요? - 비밀번호를 삭제할까요? - 이 작업은 되돌릴 수 없습니다. - 확인 - 취소 diff --git a/core/src/main/res/values-kr/strings.xml b/app/src/main/res/values-kr/strings.xml similarity index 51% rename from core/src/main/res/values-kr/strings.xml rename to app/src/main/res/values-kr/strings.xml index 60d12bb7..f36da017 100644 --- a/core/src/main/res/values-kr/strings.xml +++ b/app/src/main/res/values-kr/strings.xml @@ -14,21 +14,7 @@ I app-eun jigeum gaebal jung-imnida. hakseup mit silheom mokjeok-euro ssie juseyo. hwaldongjeog-in seculi anjeon-eun bojangdoeji anhassseubnida. - Domain - Website name ttoneun domain - I-yongja - Bimilbeonho - Bijul - 예: Google, Instagram, WhatsApp - 예: Liam15, Noha, Ava_25 - 예: 12345, abc123xyz Bimilbeonho Gwanli - Jeojang - Buteowagi - Gengsin - Sakje - Import - Export Anjeon Seolmyeong Seoljeong Tema Byeongyeong @@ -42,26 +28,12 @@ Byeon-gye Nolog Bogi - Bimilbeonho Gwanli - Bimilbeonho Buteowagi - Bimilbeonho Jeojang - Bimilbeonho Bogi - Bimilbeonho Gengsin Seoljeong Ulineun Nuguinga - ID: - Domain: - I-yongja: - Bimilbeonho: - Bijul: - Sangseong ilja: - Gengsin ilja: - Heung-in doem - Geohwa doem Aeb-eul dasi sijakhaeya haeyo. @@ -70,16 +42,8 @@ Gyeong-go: Munsuhyeong-eul da chaeujuseyo. Silpae: Dasi sihae juseyo. Seong-gong: - Seong-gongjeog-eulo gengsin! - Jeong sangjeongdoe-eossseubnida. Mueonga jalmosdoeeossseubnida. - Haengdong jeohwa Jalmosdoe-eossseubnida: ID Mubeon! - Gengsin haneun geos-eulo hal-kka? - Jeongmal sangjehal-kka? - I haengdong-eun dora gal su eobs-seubnida. - Hwagin - Jeohwa diff --git a/core/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml similarity index 51% rename from core/src/main/res/values-vi/strings.xml rename to app/src/main/res/values-vi/strings.xml index 7f9ba695..f3e54739 100644 --- a/core/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -15,21 +15,7 @@ Ứng dụng này đang được phát triển và chỉ dùng cho mục đích học tập hoặc thử nghiệm. Có thể chưa đủ an toàn để lưu thông tin nhạy cảm. Vui lòng xem hướng dẫn bảo mật để biết thêm chi tiết. - Tên miền - Tên trang web hoặc tên miền liên quan - Tên người dùng - Mật khẩu - Ghi chú - vd: Google, Instagram, WhatsApp, v.v. - vd: Liam15, Noha, Olivia, Ava_25, v.v. - vd: 12345, abc123xyz, qwerty, v.v. Quản lý Mật khẩu - Lưu mật khẩu - Tải mật khẩu - Cập nhật mật khẩu - Xóa mật khẩu - Nhập mật khẩu - Xuất mật khẩu Kiểm tra bảo mật Cài đặt Chuyển giao diện @@ -43,26 +29,12 @@ Xem lịch sử thay đổi - Quản lý Mật khẩu - Tải Mật khẩu - Lưu Mật khẩu - Xem Mật khẩu - Cập nhật Mật khẩu Cài đặt Giới thiệu - ID: - Tên miền: - Tên người dùng: - Mật khẩu: - Ghi chú: - Tạo lúc: - Cập nhật lúc: - Đã cấp quyền - Từ chối quyền Cần khởi động lại ứng dụng. @@ -71,17 +43,9 @@ Vui lòng điền vào biểu mẫu trước. Thất bại: Vui lòng thử lại. Thành công: - Cập nhật thành công. - Xóa thành công. Đã xảy ra lỗi. - Đã hủy hành động. Lỗi: ID không hợp lệ!! - Cập nhật mật khẩu? - Xóa mật khẩu? - Hành động này không thể hoàn tác. - Xác nhận - Hủy diff --git a/core/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml similarity index 50% rename from core/src/main/res/values-zh/strings.xml rename to app/src/main/res/values-zh/strings.xml index 7cc92a7e..44e67ee7 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -15,21 +15,7 @@ 该应用正在积极开发中,仅用于学习和实验目的。暂不建议用于存储敏感信息。请查看安全指南了解详情。 - 域名 - 对应的网站或域名 - 用户名 - 密码 - 备注 - 例如:Google、Instagram、WhatsApp 等 - 例如:Liam15、Noha、Olivia、Ava_25 等 - 例如:12345、abc123xyz、qwerty 等 密码管理器 - 保存密码 - 加载密码 - 更新密码 - 删除密码 - 导入密码 - 导出密码 安全检查 设置 切换主题 @@ -43,26 +29,12 @@ 查看更新记录 - 密码管理器 - 加载密码 - 保存密码 - 查看密码 - 更新密码 设置 关于我们 - ID: - 域名: - 用户名: - 密码: - 备注: - 创建时间: - 更新时间: - 已授予权限 - 权限被拒绝 需要重新启动应用。 @@ -71,17 +43,9 @@ 请先填写表单。 失败:请重试。 成功: - 更新成功。 - 删除成功。 发生错误。 - 操作已取消。 错误:无效的 ID!! - 要更新密码吗? - 要删除密码吗? - 此操作无法撤销。 - 确认 - 取消 diff --git a/core/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml similarity index 50% rename from core/src/main/res/values/strings.xml rename to app/src/main/res/values/strings.xml index fd9d9e28..27fbdd43 100644 --- a/core/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,23 +16,7 @@ This app is currently under active development and is intended for educational and experimental purposes. It may not be secure for storing sensitive authentication information. Please review the security guidelines for more details. - Domain - The name of the website or domain associated - Username - Password - Notes - Copied Successfully - e.g. Google, Instagram, WhatsApp, etc. - e.g. Liam15, Noha, Olivia, Ava_25, etc. - e.g. 12345, abc123xyz, qwerty, etc. Password Manager - Copy Password - Save Password - Load Password - Update Password - Delete Password - Import G-Password - Export G-Password Clear Data Check Security Settings @@ -41,6 +25,8 @@ Contributor: Themes: Preview Features: + Preview Layout: + Autofill Settings About Us @@ -52,27 +38,9 @@ Passcodes Telegram Community - Password Manager - Load Password - Save Password - View Password - Update Password Settings About Us - - ID: - Domain: - Username: - Password: - Notes: - Created At: - Last Updated: - - - Permission granted - Permission denied - Restart App Require. This feature is currently under development. @@ -81,22 +49,9 @@ Warning: Please fill out the form first. Failed: Please try again. Success: - Updated successfully. - Deleted successfully. Something went wrong. - Action discarded. Something Went Wrong: Invalid ID!! - Imported %1$d passwords - Failed to import %1$d passwords - Passwords exported - Copy to Clipboard? - Update password? - Delete password? - This action cannot be undone. - Copying sensitive data like passwords to clipboard is not so good for security!!! - Confirm - Discard Passcodes Logo diff --git a/password_manager/src/main/res/values/strings.xml b/password_manager/src/main/res/values/strings.xml index 5c33f22e..0a883b8b 100644 --- a/password_manager/src/main/res/values/strings.xml +++ b/password_manager/src/main/res/values/strings.xml @@ -8,6 +8,7 @@ e.g. Google, Instagram, WhatsApp, etc. e.g. Liam15, Noha, Olivia, Ava_25, etc. e.g. 12345, abc123xyz, qwerty, etc. + Copy Password Save Password Load Password Update Password @@ -32,13 +33,17 @@ + Copied Successfully + This is preview feature.. Might have Bugs... Something went wrong. Action discarded. Something Went Wrong: Invalid ID!! + Copy to Clipboard? Update password? Delete password? + Copying sensitive data like passwords to clipboard is not so good for security!!! This action cannot be undone. Confirm Discard From e74f948f0567ebd5cd779fcaa48763b225a69b13 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 6 Dec 2025 21:00:39 +0530 Subject: [PATCH 066/115] fix: build issue with the string resources --- .../passcodes/password_manager/oldui/LoadPasswordActivity.kt | 2 +- .../passcodes/password_manager/oldui/PasswordManagerActivity.kt | 2 +- .../passcodes/password_manager/oldui/SavePasswordActivity.kt | 2 +- .../passcodes/password_manager/oldui/UpdatePasswordActivity.kt | 2 +- .../passcodes/password_manager/oldui/ViewPasswordActivity.kt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt index 5e125c6b..ed5c252e 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.password_manager.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityLoadPasswordBinding diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt index a24ccb65..5c6edf6f 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt @@ -9,7 +9,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope -import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.password_manager.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt index 0e84912d..e16e301a 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/SavePasswordActivity.kt @@ -3,7 +3,7 @@ package com.jeeldobariya.passcodes.password_manager.oldui import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.password_manager.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.password_manager.databinding.ActivitySavePasswordBinding import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordAction diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt index d7ba3055..d20b235b 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/UpdatePasswordActivity.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.password_manager.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityUpdatePasswordBinding diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt index e6c92dcf..4e79ef56 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/ViewPasswordActivity.kt @@ -8,7 +8,7 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat -import com.jeeldobariya.passcodes.core.R +import com.jeeldobariya.passcodes.password_manager.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.password_manager.databinding.ActivityViewPasswordBinding From df1818d6a56604e385dcf37b1a42c23c55167da7 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 7 Dec 2025 11:39:57 +0530 Subject: [PATCH 067/115] chore(deps): remove the unwanted dependency in password_manager module --- password_manager/build.gradle.kts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index faebbce4..12addfb9 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(project(":core")) implementation(project(":database")) + // Android Core implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) @@ -60,19 +61,6 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.bundles.compose.debug) - // Navigation 3 - implementation(libs.bundles.navigation3) - - // Standard Kotlin Libraries - implementation(libs.kotlin.stdlib) - - implementation(libs.oss.license) - implementation(libs.appcompat) - - // Networking/Parsing - implementation(libs.okhttp) - implementation(libs.json) - // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) @@ -85,7 +73,7 @@ dependencies { // Datastore Preferences implementation(libs.bundles.datastore.preferences) + // Testing testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.espresso.core) } From c6e2482260a870939d2bd2da8f68ca36c7d4b13e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 7 Dec 2025 19:22:52 +0530 Subject: [PATCH 068/115] chore(deps): refactor dependency in app module & and move split dependency injection code --- app/build.gradle.kts | 30 ++++--------------- .../passcodes/PasscodesApplication.kt | 2 +- .../jeeldobariya/passcodes/di/appModule.kt | 6 ++++ database/build.gradle.kts | 3 ++ .../passcodes/database}/di/databaseModule.kt | 5 ++-- 5 files changed, 17 insertions(+), 29 deletions(-) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => database/src/main/kotlin/com/jeeldobariya/passcodes/database}/di/databaseModule.kt (59%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8fd94e0c..4468ff0e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,7 +8,6 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) - alias(libs.plugins.jetbrains.kotlin.serialization) alias(libs.plugins.ksp) alias(libs.plugins.oss.licenses) } @@ -154,6 +153,10 @@ dependencies { implementation(project(":database")) implementation(project(":password_manager")) + // Android Core + implementation(libs.appcompat) + implementation(libs.material) + // Jetpack Compose implementation(libs.bundles.compose) implementation(platform(libs.compose.bom)) @@ -162,20 +165,8 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.bundles.compose.debug) - // Navigation 3 - implementation(libs.bundles.navigation3) - - // Standard Kotlin Libraries - implementation(libs.kotlin.stdlib) - - // UI/Google Services - implementation(libs.material) + // Google Play License Services implementation(libs.oss.license) - implementation(libs.appcompat) - - // Data/Persistence (Room Bundle) - implementation(libs.bundles.room) - ksp(libs.room.compiler) // Networking/Parsing implementation(libs.okhttp) @@ -193,17 +184,6 @@ dependencies { // Datastore Preferences implementation(libs.bundles.datastore.preferences) - - // --- Testing --- - debugImplementation(libs.androidx.ui.test.manifest) - // Local Unit Testing (Unit Test Bundle) testImplementation(libs.bundles.unit.test) - - // Android Instrumented Testing (Android Test Bundle) - androidTestImplementation(platform(libs.compose.bom)) - androidTestImplementation(libs.bundles.android.test) - androidTestImplementation(libs.room.testing) - androidTestImplementation(libs.bundles.coroutines.test) - androidTestImplementation(libs.truth) // Keeping truth explicit for androidTest, though it's in both bundles. } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt index a7e09211..c912a83c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt @@ -2,7 +2,7 @@ package com.jeeldobariya.passcodes import android.app.Application import com.jeeldobariya.passcodes.di.appModule -import com.jeeldobariya.passcodes.di.databaseModule +import com.jeeldobariya.passcodes.database.di.databaseModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 6b107dfa..25c1fd8e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,6 +1,8 @@ package com.jeeldobariya.passcodes.di +import com.jeeldobariya.passcodes.database.master.MasterDatabase import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.password_manager.domain.usecases.DeletePasswordUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.EditPasswordUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.ExportPasswordCSVUseCase @@ -19,6 +21,10 @@ import org.koin.dsl.module val appModule = module { + single { + PasswordRepository(get()) + } + factory { OkHttpClient() } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index c2de2713..0bae2738 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -53,6 +53,9 @@ dependencies { implementation(libs.bundles.room) ksp(libs.room.compiler) + // Dependency Injection + implementation(libs.bundles.koin) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.room.testing) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/di/databaseModule.kt similarity index 59% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt rename to database/src/main/kotlin/com/jeeldobariya/passcodes/database/di/databaseModule.kt index e5d69116..38b2005c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/databaseModule.kt +++ b/database/src/main/kotlin/com/jeeldobariya/passcodes/database/di/databaseModule.kt @@ -1,6 +1,5 @@ -package com.jeeldobariya.passcodes.di +package com.jeeldobariya.passcodes.database.di -import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.database.master.MasterDatabase import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -11,6 +10,6 @@ val databaseModule = module { } single { - PasswordRepository(get().passwordsDao) + get().passwordsDao } } From 47a6ff5bc4fce6afc0a5189f10f1a6448624a6ce Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 17:23:30 +0530 Subject: [PATCH 069/115] fix: the build error related to buildvariants, when running './gradlew build' --- autofill/build.gradle.kts | 17 ++++++++++++----- core/build.gradle.kts | 16 +++++++++++----- database/build.gradle.kts | 16 +++++++++++----- password_manager/build.gradle.kts | 16 +++++++++++----- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index cbca7a61..da5c04b9 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -26,12 +26,19 @@ android { } buildTypes { - release { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + create("staging") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + getByName("debug") { + isShrinkResources = false isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c535565f..2c7b2cb3 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -26,12 +26,18 @@ android { } buildTypes { - release { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + create("staging") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + getByName("debug") { isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) } } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 0bae2738..e49a44b3 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -26,12 +26,18 @@ android { } buildTypes { - release { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + create("staging") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + getByName("debug") { isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) } } diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 12addfb9..9189c01e 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -25,12 +25,18 @@ android { } buildTypes { - release { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + create("staging") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + + getByName("debug") { isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) } } From 76ce210ad8cf5ec56f02194a7e8a1d9766ab0e15 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 17:29:32 +0530 Subject: [PATCH 070/115] chore: remove unwanted tests source sets --- .../autofill/ExampleInstrumentedTest.kt | 22 ------------------- .../passcodes/autofill/ExampleUnitTest.kt | 16 -------------- .../passcodes/core/ExampleInstrumentedTest.kt | 22 ------------------- .../passcodes/core/ExampleUnitTest.kt | 16 -------------- .../passcodes/database/ExampleUnitTest.kt | 16 -------------- .../ExampleInstrumentedTest.kt | 22 ------------------- .../password_manager/ExampleUnitTest.kt | 16 -------------- 7 files changed, 130 deletions(-) delete mode 100644 autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt delete mode 100644 autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt delete mode 100644 core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt delete mode 100644 core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt delete mode 100644 database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt delete mode 100644 password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt delete mode 100644 password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt diff --git a/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt b/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt deleted file mode 100644 index 841808fb..00000000 --- a/autofill/src/androidTest/kotlin/com/jeeldobariya/passcodes/autofill/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.jeeldobariya.passcodes.autofill - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.jeeldobariya.passcodes.autofill.test", appContext.packageName) - } -} diff --git a/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt b/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt deleted file mode 100644 index 41a28f39..00000000 --- a/autofill/src/test/kotlin/com/jeeldobariya/passcodes/autofill/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.jeeldobariya.passcodes.autofill - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt b/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt deleted file mode 100644 index dabf756a..00000000 --- a/core/src/androidTest/kotlin/com/jeeldobariya/passcodes/core/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.jeeldobariya.passcodes.core - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.jeeldobariya.passcodes.core.test", appContext.packageName) - } -} diff --git a/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt deleted file mode 100644 index 32302353..00000000 --- a/core/src/test/kotlin/com/jeeldobariya/passcodes/core/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.jeeldobariya.passcodes.core - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt b/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt deleted file mode 100644 index 8c1bcd13..00000000 --- a/database/src/test/kotlin/com/jeeldobariya/passcodes/database/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.jeeldobariya.passcodes.database - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt b/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt deleted file mode 100644 index 844ab225..00000000 --- a/password_manager/src/androidTest/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.jeeldobariya.passcodes.password_manager.test", appContext.packageName) - } -} diff --git a/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt b/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt deleted file mode 100644 index 551cdd39..00000000 --- a/password_manager/src/test/kotlin/com/jeeldobariya/passcodes/password_manager/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} From b36f4d214cb0f1c1700eb1843dca82dca3431dc5 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 18:20:33 +0530 Subject: [PATCH 071/115] chore(deps): disable minifing of library module code to prevent build errors --- autofill/build.gradle.kts | 6 ++---- core/build.gradle.kts | 6 ++---- database/build.gradle.kts | 6 ++---- password_manager/build.gradle.kts | 6 ++---- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index da5c04b9..68d7ae2d 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -27,13 +27,11 @@ android { buildTypes { getByName("release") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } create("staging") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } getByName("debug") { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 2c7b2cb3..663ef300 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -27,13 +27,11 @@ android { buildTypes { getByName("release") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } create("staging") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } getByName("debug") { diff --git a/database/build.gradle.kts b/database/build.gradle.kts index e49a44b3..a12fca47 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -27,13 +27,11 @@ android { buildTypes { getByName("release") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } create("staging") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } getByName("debug") { diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 9189c01e..bd518f05 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -26,13 +26,11 @@ android { buildTypes { getByName("release") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } create("staging") { - isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isMinifyEnabled = false } getByName("debug") { From 78a57e9e15e9b2554ab5f6227785718c16d4772e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 18:28:40 +0530 Subject: [PATCH 072/115] chore(deps): fix androidx.compose.ui:ui-test-junit4 module not found in :app --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4468ff0e..30177c1d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -162,7 +162,6 @@ dependencies { implementation(platform(libs.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) - androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.bundles.compose.debug) // Google Play License Services @@ -186,4 +185,5 @@ dependencies { // Local Unit Testing (Unit Test Bundle) testImplementation(libs.bundles.unit.test) + androidTestImplementation(libs.bundles.android.test) } From e8a6c079011dea034237b25ac37df06163db001b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 18:41:40 +0530 Subject: [PATCH 073/115] refactor: move check for updates code to core module --- app/build.gradle.kts | 4 ---- .../passcodes/PasscodesApplication.kt | 2 ++ .../com/jeeldobariya/passcodes/di/appModule.kt | 11 ----------- .../jeeldobariya/passcodes/oldui/MainActivity.kt | 6 ++++-- core/build.gradle.kts | 10 ++++++++-- .../jeeldobariya/passcodes/core/di/coreModule.kt | 12 ++++++++++++ .../domain/usecases/CheckForUpdateUseCase.kt | 16 ++++++++-------- .../passcodes/core}/domain/utils/SemVerUtils.kt | 2 +- .../core}/domain/utils/SemVerUtilsTest.kt | 2 +- 9 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt rename {app/src/main/kotlin/com/jeeldobariya/passcodes => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/domain/usecases/CheckForUpdateUseCase.kt (84%) rename {app/src/main/kotlin/com/jeeldobariya/passcodes => core/src/main/kotlin/com/jeeldobariya/passcodes/core}/domain/utils/SemVerUtils.kt (96%) rename {app/src/test/kotlin/com/jeeldobariya/passcodes => core/src/test/kotlin/com/jeeldobariya/passcodes/core}/domain/utils/SemVerUtilsTest.kt (98%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 30177c1d..b90ca5f0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -167,10 +167,6 @@ dependencies { // Google Play License Services implementation(libs.oss.license) - // Networking/Parsing - implementation(libs.okhttp) - implementation(libs.json) - // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt index c912a83c..3f8bc4d0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt @@ -1,6 +1,7 @@ package com.jeeldobariya.passcodes import android.app.Application +import com.jeeldobariya.passcodes.core.di.coreModule import com.jeeldobariya.passcodes.di.appModule import com.jeeldobariya.passcodes.database.di.databaseModule import org.koin.android.ext.koin.androidContext @@ -12,6 +13,7 @@ class PasscodesApplication : Application() { startKoin { androidContext(this@PasscodesApplication) modules(appModule) + modules(coreModule) modules(databaseModule) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt index 25c1fd8e..d5b5e2c3 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt @@ -1,7 +1,5 @@ package com.jeeldobariya.passcodes.di -import com.jeeldobariya.passcodes.database.master.MasterDatabase -import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.password_manager.domain.usecases.DeletePasswordUseCase import com.jeeldobariya.passcodes.password_manager.domain.usecases.EditPasswordUseCase @@ -14,7 +12,6 @@ import com.jeeldobariya.passcodes.password_manager.presentation.load_password.Lo import com.jeeldobariya.passcodes.password_manager.presentation.save_password.SavePasswordViewModel import com.jeeldobariya.passcodes.password_manager.presentation.update_password.UpdatePasswordViewModel import com.jeeldobariya.passcodes.password_manager.presentation.view_password.ViewPasswordViewModel -import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel import org.koin.dsl.module @@ -25,14 +22,6 @@ val appModule = module { PasswordRepository(get()) } - factory { - OkHttpClient() - } - - factory { - CheckForUpdateUseCase(androidContext(), get()) - } - factory { ImportPasswordCSVUseCase(androidContext(), get()) } 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 1c09493a..e932ff00 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -6,10 +6,11 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.BuildConfig +import com.jeeldobariya.passcodes.Constant import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.databinding.ActivityMainBinding -import com.jeeldobariya.passcodes.domain.usecases.CheckForUpdateUseCase +import com.jeeldobariya.passcodes.core.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.password_manager.oldui.PasswordManagerActivity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first @@ -36,7 +37,8 @@ class MainActivity : AppCompatActivity() { setContentView(binding.root) lifecycleScope.launch(Dispatchers.IO) { - checkForUpdateUseCase.run(BuildConfig.VERSION_NAME) + checkForUpdateUseCase.run(BuildConfig.VERSION_NAME, Constant.GITHUB_RELEASE_API_URL, + Constant.TELEGRAM_COMMUNITY_URL) } // Add event onclick listener diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 663ef300..b6a8d796 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -53,15 +53,21 @@ dependencies { // Standard Kotlin Libraries implementation(libs.kotlin.stdlib) + // Networking/Parsing + implementation(libs.okhttp) + implementation(libs.json) + // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) // Android Architecture Components (Lifecycle Bundle) implementation(libs.bundles.lifecycle) + // Dependency Injection + implementation(libs.bundles.koin) + // Datastore Preferences implementation(libs.bundles.datastore.preferences) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.test.ext.junit) + testImplementation(libs.bundles.unit.test) } diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt new file mode 100644 index 00000000..19fb2ccc --- /dev/null +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt @@ -0,0 +1,12 @@ +package com.jeeldobariya.passcodes.core.di + +import com.jeeldobariya.passcodes.core.domain.usecases.CheckForUpdateUseCase +import okhttp3.OkHttpClient +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val coreModule = module { + factory { + CheckForUpdateUseCase(androidContext(), OkHttpClient()) + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt similarity index 84% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt index 6d3c5b36..868792a4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/usecases/CheckForUpdateUseCase.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt @@ -1,9 +1,9 @@ -package com.jeeldobariya.passcodes.domain.usecases +package com.jeeldobariya.passcodes.core.domain.usecases import android.content.Context +import android.os.Handler import android.widget.Toast -import com.jeeldobariya.passcodes.Constant -import com.jeeldobariya.passcodes.domain.utils.SemVerUtils +import com.jeeldobariya.passcodes.core.domain.utils.SemVerUtils import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient @@ -15,11 +15,11 @@ class CheckForUpdateUseCase( val context: Context, val client: OkHttpClient ) { - suspend fun run(currentVersion: String) { + suspend fun run(currentVersion: String, githubReleaseApiUrl: String, telegramCommunityUrl: String) { val currNormalizedVersion = SemVerUtils.normalize(currentVersion) val request = Request.Builder() - .url(Constant.GITHUB_RELEASE_API_URL) + .url(githubReleaseApiUrl) .build() client.newCall(request).enqueue(object : Callback { @@ -42,7 +42,7 @@ class CheckForUpdateUseCase( if (release.prerelease) { showToast( context, - "⚠️ You are using a PRE-RELEASE ($currNormalizedVersion). Not safe for use! Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" + "⚠️ You are using a PRE-RELEASE ($currNormalizedVersion). Not safe for use! Join telegram community ($telegramCommunityUrl)" ) } } @@ -65,7 +65,7 @@ class CheckForUpdateUseCase( if (!userReleaseFound) { showToast( context, - "⚠️ Version ($currNormalizedVersion) not found on GitHub releases... Join telegram community (${Constant.TELEGRAM_COMMUNITY_URL})" + "⚠️ Version ($currNormalizedVersion) not found on GitHub releases... Join telegram community ($telegramCommunityUrl)" ) } } @@ -73,7 +73,7 @@ class CheckForUpdateUseCase( } private fun showToast(context: Context, message: String) { - android.os.Handler(context.mainLooper).post { + Handler(context.mainLooper).post { Toast.makeText(context, message, Toast.LENGTH_LONG).show() } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtils.kt similarity index 96% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt rename to core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtils.kt index c61a4448..feeab4bf 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtils.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtils.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.domain.utils +package com.jeeldobariya.passcodes.core.domain.utils import org.json.JSONArray diff --git a/app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtilsTest.kt similarity index 98% rename from app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt rename to core/src/test/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtilsTest.kt index 36c427da..6e23e0c4 100644 --- a/app/src/test/kotlin/com/jeeldobariya/passcodes/domain/utils/SemVerUtilsTest.kt +++ b/core/src/test/kotlin/com/jeeldobariya/passcodes/core/domain/utils/SemVerUtilsTest.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.domain.utils +package com.jeeldobariya.passcodes.core.domain.utils import com.google.common.truth.Truth import org.junit.Test From 712b0b619eeec0dfec465024a998ea094e248746 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 8 Dec 2025 19:06:07 +0530 Subject: [PATCH 074/115] refactor: move dependency injection code related to password manager module into it --- .../kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt | 4 ++-- .../passcodes/password_manager/di/passwordManagerModule.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt => password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/passwordManagerModule.kt (95%) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt index 3f8bc4d0..7a005d9e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt @@ -2,7 +2,7 @@ package com.jeeldobariya.passcodes import android.app.Application import com.jeeldobariya.passcodes.core.di.coreModule -import com.jeeldobariya.passcodes.di.appModule +import com.jeeldobariya.passcodes.password_manager.di.passwordManagerModule import com.jeeldobariya.passcodes.database.di.databaseModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -12,8 +12,8 @@ class PasscodesApplication : Application() { super.onCreate() startKoin { androidContext(this@PasscodesApplication) - modules(appModule) modules(coreModule) + modules(passwordManagerModule) modules(databaseModule) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/passwordManagerModule.kt similarity index 95% rename from app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt rename to password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/passwordManagerModule.kt index d5b5e2c3..9116c8f9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/di/appModule.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/passwordManagerModule.kt @@ -1,4 +1,4 @@ -package com.jeeldobariya.passcodes.di +package com.jeeldobariya.passcodes.password_manager.di import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import com.jeeldobariya.passcodes.password_manager.domain.usecases.DeletePasswordUseCase @@ -16,7 +16,7 @@ import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.viewModel import org.koin.dsl.module -val appModule = module { +val passwordManagerModule = module { single { PasswordRepository(get()) From a99f1ecff9212eff8e76cbb5a82a4709e1d545c1 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 11:28:34 +0530 Subject: [PATCH 075/115] ci: fix issue https://github.com/PasscodesApp/Passcodes/pull/53/checks?check_run_id=57514014091 --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ea606a64..ad7a9833 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,7 @@ updates: directory: "/" # Location of package manifests schedule: day: "sunday" + interval: "weekly" target-branch: "jeel-dev" assignees: - "JeelDobariya38" From 6c6af3f47902077e9f131d65eef0767a252c4f06 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 17:36:32 +0530 Subject: [PATCH 076/115] refactor: improve usecase in core module --- .../com/jeeldobariya/passcodes/oldui/MainActivity.kt | 7 +++++-- .../com/jeeldobariya/passcodes/core/di/coreModule.kt | 8 +++++++- .../core/domain/usecases/CheckForUpdateUseCase.kt | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) 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 e932ff00..6ca8b32a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -37,8 +37,11 @@ class MainActivity : AppCompatActivity() { setContentView(binding.root) lifecycleScope.launch(Dispatchers.IO) { - checkForUpdateUseCase.run(BuildConfig.VERSION_NAME, Constant.GITHUB_RELEASE_API_URL, - Constant.TELEGRAM_COMMUNITY_URL) + checkForUpdateUseCase( + currentVersion = BuildConfig.VERSION_NAME, + githubReleaseApiUrl = Constant.GITHUB_RELEASE_API_URL, + telegramCommunityUrl = Constant.TELEGRAM_COMMUNITY_URL + ) } // Add event onclick listener diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt index 19fb2ccc..e344dcdf 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/di/coreModule.kt @@ -6,7 +6,13 @@ import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val coreModule = module { + + //TODO: It must be turn to single.. If in future it is required by multiple things and not just `CheckForUpdateUseCase()`. + factory { + OkHttpClient() + } + factory { - CheckForUpdateUseCase(androidContext(), OkHttpClient()) + CheckForUpdateUseCase(androidContext(), get()) } } diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt index 868792a4..72e1d1ce 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt @@ -15,7 +15,7 @@ class CheckForUpdateUseCase( val context: Context, val client: OkHttpClient ) { - suspend fun run(currentVersion: String, githubReleaseApiUrl: String, telegramCommunityUrl: String) { + suspend operator fun invoke(currentVersion: String, githubReleaseApiUrl: String, telegramCommunityUrl: String) { val currNormalizedVersion = SemVerUtils.normalize(currentVersion) val request = Request.Builder() From 8367b65fb60c089f2bad7335aa991ee56ea2b51b Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 17:45:49 +0530 Subject: [PATCH 077/115] refactor: improve usecases execution call in password manager module --- .../core/domain/usecases/CheckForUpdateUseCase.kt | 6 +++++- .../domain/usecases/DeletePasswordUseCase.kt | 2 +- .../domain/usecases/EditPasswordUseCase.kt | 2 +- .../domain/usecases/ExportPasswordCSVUseCase.kt | 2 +- .../domain/usecases/ImportPasswordCSVUseCase.kt | 2 +- .../domain/usecases/RetrieveAllPasswordUseCase.kt | 2 +- .../domain/usecases/RetrievePasswordUseCase.kt | 4 ++-- .../domain/usecases/StorePasswordUseCase.kt | 2 +- .../oldui/PasswordManagerActivity.kt | 4 ++-- .../load_password/LoadPasswordViewModel.kt | 2 +- .../save_password/SavePasswordViewModel.kt | 14 ++++++++------ .../update_password/UpdatePasswordViewModel.kt | 6 +++--- .../view_password/ViewPasswordViewModel.kt | 4 ++-- 13 files changed, 29 insertions(+), 23 deletions(-) diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt index 72e1d1ce..76e45402 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt @@ -15,7 +15,11 @@ class CheckForUpdateUseCase( val context: Context, val client: OkHttpClient ) { - suspend operator fun invoke(currentVersion: String, githubReleaseApiUrl: String, telegramCommunityUrl: String) { + suspend operator fun invoke( + currentVersion: String, + githubReleaseApiUrl: String, + telegramCommunityUrl: String + ) { val currNormalizedVersion = SemVerUtils.normalize(currentVersion) val request = Request.Builder() diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt index 7a240b1a..331caf24 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/DeletePasswordUseCase.kt @@ -5,7 +5,7 @@ import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepos class DeletePasswordUseCase( val passwordRepository: PasswordRepository ) { - suspend fun run(id: Int) { + suspend operator fun invoke(id: Int) { passwordRepository.deletePassword(id = id) } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt index 8be4b0bf..9f37f0f7 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/EditPasswordUseCase.kt @@ -6,7 +6,7 @@ import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class EditPasswordUseCase( val passwordRepository: PasswordRepository ) { - suspend fun run(password: PasswordModal) { + suspend operator fun invoke(password: PasswordModal) { passwordRepository.updatePassword( id = password.id, domain = password.domain, diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt index 51c451e0..f0390a5f 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt @@ -10,7 +10,7 @@ class ExportPasswordCSVUseCase( val context: Context, val passwordRepository: PasswordRepository ) { - suspend fun run(exportFileUri: Uri) { + suspend operator fun invoke(exportFileUri: Uri) { context.contentResolver.openOutputStream(exportFileUri)?.bufferedWriter().use { writer -> requireNotNull(writer) diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt index 6ce3f855..67377de5 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt @@ -10,7 +10,7 @@ class ImportPasswordCSVUseCase( val context: Context, val passwordRepository: PasswordRepository ) { - suspend fun run(importFileUri: Uri) { + suspend operator fun invoke(importFileUri: Uri) { context.contentResolver.openInputStream(importFileUri)?.bufferedReader().use { reader -> requireNotNull(reader) diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt index 4498f558..05abc56a 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrieveAllPasswordUseCase.kt @@ -6,7 +6,7 @@ import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class RetrieveAllPasswordUseCase( val passwordRepository: PasswordRepository ) { - suspend fun run(): List { + suspend operator fun invoke(): List { return passwordRepository.getAllPasswords() } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt index ffecad80..4b07f692 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/RetrievePasswordUseCase.kt @@ -6,7 +6,7 @@ import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class RetrievePasswordUseCase( val passwordRepository: PasswordRepository ) { - suspend fun run(id: Int): PasswordModal? { + suspend operator fun invoke(id: Int): PasswordModal? { return passwordRepository.getPasswordById(id) } -} \ No newline at end of file +} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt index 8a3f8c6b..5a25a6fa 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/StorePasswordUseCase.kt @@ -6,7 +6,7 @@ import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal class StorePasswordUseCase( val passwordRepository: PasswordRepository ) { - suspend fun run(password: PasswordModal) { + suspend operator fun invoke(password: PasswordModal) { passwordRepository.savePasswordEntity( domain = password.domain, username = password.username, diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt index 5c6edf6f..3c22dfc8 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt @@ -50,7 +50,7 @@ class PasswordManagerActivity : AppCompatActivity() { requireNotNull(uri) lifecycleScope.launch(Dispatchers.IO) { - importPasswordUseCase.run(uri) + importPasswordUseCase(uri) } } } @@ -63,7 +63,7 @@ class PasswordManagerActivity : AppCompatActivity() { requireNotNull(uri) lifecycleScope.launch(Dispatchers.IO) { - exportPasswordUseCase.run(uri) + exportPasswordUseCase(uri) } } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt index fc79cfd9..ff54ad1f 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/load_password/LoadPasswordViewModel.kt @@ -25,7 +25,7 @@ class LoadPasswordViewModel( viewModelScope.launch { _state.update { LoadPasswordState( - passwordEntityList = retrieveAllPasswordUseCase.run() + passwordEntityList = retrieveAllPasswordUseCase() ) } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt index 3e7f8f16..10565283 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/save_password/SavePasswordViewModel.kt @@ -45,12 +45,14 @@ class SavePasswordViewModel( private fun savePasswordEntity() { viewModelScope.launch { try { - storePasswordUseCase.run(password = PasswordModal( - domain = _state.value.domain, - username = _state.value.username, - password = _state.value.password, - notes = _state.value.notes - )) + storePasswordUseCase( + PasswordModal( + domain = _state.value.domain, + username = _state.value.username, + password = _state.value.password, + notes = _state.value.notes + ) + ) } catch (e: Exception) { _state.update { it.copy(isError = true) } } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt index 14f1fa58..b988f779 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/update_password/UpdatePasswordViewModel.kt @@ -25,7 +25,7 @@ class UpdatePasswordViewModel( viewModelScope.launch { try { - val password: PasswordModal = requireNotNull(retrievePasswordUseCase.run(passwordId)) + val password: PasswordModal = requireNotNull(retrievePasswordUseCase(passwordId)) _state.update { it.copy( @@ -70,8 +70,8 @@ class UpdatePasswordViewModel( private fun updatePasswordEntity() { viewModelScope.launch { try { - editPasswordUseCase.run( - password = PasswordModal( + editPasswordUseCase( + PasswordModal( id = passwordEntityId, domain = _state.value.domain, username = _state.value.username, diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt index 48a19f83..8920edec 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ViewPasswordViewModel.kt @@ -32,7 +32,7 @@ class ViewPasswordViewModel( viewModelScope.launch { try { - val password: PasswordModal = requireNotNull(retrievePasswordUseCase.run(passwordId)) + val password: PasswordModal = requireNotNull(retrievePasswordUseCase(passwordId)) _state.update { it.copy( @@ -52,7 +52,7 @@ class ViewPasswordViewModel( private fun deletePasswordEntity() { viewModelScope.launch { try { - deletePasswordUseCase.run(passwordEntityId) + deletePasswordUseCase(passwordEntityId) } catch (_: Exception) { _state.update { it.copy(isError = true) } } From 9763af198748ef1f738abab203252300b09f5617 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 18:15:03 +0530 Subject: [PATCH 078/115] chore: improve README --- README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b6b8de81..f3220ef2 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,6 @@ A android app that take down the headache of remembering passwords. It is open s ## Screen Shots
- View Here @@ -46,24 +45,24 @@ Note: high version can still run, but are not guaranteed offically. ## Features -- [x] Intuitive UI. +- [ ] Intuitive UI. - [ ] Update Checkers & Manager. - [x] Password Management. (Current Priority) - [ ] Secure File. (Least Priority, Because it include permission. Which, I am as developer not familar with 😂) - Could be Image. (JPG. PNG ....) - - Could be Vidoe. + - Could be Video. - Could any Binary File. (more like won't be a text file) - [ ] Other Secret Info Management. - Could be note. (txt file) - Could be any info that can encode as key & value. -```json -{ - "key": "SECRET API KEY", - "content": "qwerty-let-say", - "createdat": "...", - "updatedat": "..." -} -``` + ```json + { + "key": "SECRET API KEY", + "content": "qwerty-let-say", + "created-at": "...", + "updated-at": "..." + } + ``` - [ ] NON Secret Info Store. - [ ] Encryption and Decryption. - [ ] Backup Manager. @@ -82,7 +81,7 @@ Note: high version can still run, but are not guaranteed offically. 3. Install the apk and you are ready to use the app. -It was most shortest and sweetest description (I have ever crafted), For more detailed description, Vist the file [installing.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/installing.md) in `PasscodesApp/Passcodes-Docs`. +It was most shortest and sweetest description (I have ever crafted), For more detailed description, See the file [installing.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/installing.md) in `PasscodesApp/Passcodes-Docs`. ## Building The App @@ -92,7 +91,7 @@ It was most shortest and sweetest description (I have ever crafted), For more de 3. Follow the general step and build the app. -4. For code documention and support docs, check the `docs/` folder in our repository. +4. For code documentation and support docs, check the `docs/` folder in our repository. It was general, intuitive, short and sweet description, For more detailed description, Vist the file [building.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/dev-docs/building.md) in `PasscodesApp/Passcodes-Docs`. @@ -111,9 +110,9 @@ You can checkout support docs, provided in [PasscodesApp/Passcodes-Docs](https:/ > Currently the project (more or less also me) is not ready for (code) contributions. > This project is currently limited by my expertise & I am beginner. Meaning I don;t want others code in my codebase, that I don't understand, I am learning android and will surely learn basic off by start of 2026.. then i will allow the contibution to this repo... But as of now i don't admire code contribution. As I am beginner in android and might have difficuly understand code that not written by me... > -> There are still other ways to contribute to project.. like by testing app, by contributing to documenation or more or less just by spreading the word around.. about the app. but, code contribution is limited from my side.... & I hope you can understand... +> There are still other ways to contribute to project.. like by testing app, by contributing to documentation or more or less just by spreading the word around.. about the app. but, code contribution is limited from my side.... & I hope you can understand... > -> For more, infomation on what kind of contribtuion we approve or allow, please open a issue in our repo. that way you avoid wasteing your time... +> For more, information on what kind of contribution we approve or allow, please open a issue in our repo. that way you avoid wasting your time... > > [Read More](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/open-contributing-timeline.md) From 3d89658844e940c1c1fd78ef98842598a60e8ea3 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 18:35:41 +0530 Subject: [PATCH 079/115] chore(deps): remove unwanted dependency from autofill module --- autofill/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 68d7ae2d..422a0f72 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -52,9 +52,6 @@ dependencies { implementation(libs.material) // Data/Persistence (Room Bundle) - implementation(libs.bundles.room) ksp(libs.room.compiler) - - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.test.ext.junit) + implementation(libs.room.ktx) } From 7409798a30e252d5d9de1326815e6e20e5e8b449 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 18:44:19 +0530 Subject: [PATCH 080/115] chore(deps): remove unwanted dependency from database module --- database/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index a12fca47..adc2c01e 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -54,15 +54,15 @@ dependencies { implementation(libs.androidx.core.ktx) // Data/Persistence (Room Bundle) - implementation(libs.bundles.room) ksp(libs.room.compiler) + implementation(libs.room.ktx) // Dependency Injection - implementation(libs.bundles.koin) + implementation(libs.koin) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.bundles.coroutines.test) androidTestImplementation(libs.room.testing) androidTestImplementation(libs.truth) - androidTestImplementation(libs.bundles.coroutines.test) } From b5439fa3fdb1413bd43bd5ea3e5e8486913b2a4d Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 19:08:02 +0530 Subject: [PATCH 081/115] chore(deps): remove unwanted dependency from core module --- core/build.gradle.kts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b6a8d796..3ecbe149 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -47,27 +47,24 @@ android { dependencies { implementation(libs.androidx.core.ktx) - implementation(libs.appcompat) - implementation(libs.material) - - // Standard Kotlin Libraries - implementation(libs.kotlin.stdlib) // Networking/Parsing implementation(libs.okhttp) implementation(libs.json) // Concurrency (Coroutines Bundle) - implementation(libs.bundles.coroutines) + implementation(libs.coroutines.core) // Android Architecture Components (Lifecycle Bundle) - implementation(libs.bundles.lifecycle) + implementation(libs.lifecycle.runtime) // Dependency Injection - implementation(libs.bundles.koin) + implementation(libs.koin) // Datastore Preferences - implementation(libs.bundles.datastore.preferences) + implementation(libs.androidx.datastore.preferences) + implementation(libs.kotlinx.serialization.json) - testImplementation(libs.bundles.unit.test) + testImplementation(libs.junit) + testImplementation(libs.truth) } From a32ddc61dedab076d2d096d8993030fe20d3156a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 19:15:01 +0530 Subject: [PATCH 082/115] chore(deps): remove unwanted depedency from password manager module --- password_manager/build.gradle.kts | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index bd518f05..70198049 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -58,26 +58,20 @@ dependencies { implementation(libs.material) // Jetpack Compose - implementation(libs.bundles.compose) implementation(platform(libs.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.bundles.compose.debug) // Concurrency (Coroutines Bundle) - implementation(libs.bundles.coroutines) + implementation(libs.coroutines.core) + implementation(libs.coroutines.android) // Android Architecture Components (Lifecycle Bundle) - implementation(libs.bundles.lifecycle) + implementation(libs.lifecycle.runtime) + implementation(libs.lifecycle.viewmodel) // Dependency Injection - implementation(libs.bundles.koin) + implementation(libs.koin) + implementation(libs.koin.compose) // Datastore Preferences - implementation(libs.bundles.datastore.preferences) - - // Testing - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.test.ext.junit) + implementation(libs.androidx.datastore.preferences) } From cb8d644c216c6445a4a6c975ca0b9d00731f1555 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 20:07:43 +0530 Subject: [PATCH 083/115] chore(deps): keep coroutines a bundle as they go hand in hand --- core/build.gradle.kts | 2 +- database/build.gradle.kts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3ecbe149..a0a7a559 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -53,7 +53,7 @@ dependencies { implementation(libs.json) // Concurrency (Coroutines Bundle) - implementation(libs.coroutines.core) + implementation(libs.bundles.coroutines) // Android Architecture Components (Lifecycle Bundle) implementation(libs.lifecycle.runtime) diff --git a/database/build.gradle.kts b/database/build.gradle.kts index adc2c01e..14fc579c 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -57,12 +57,15 @@ dependencies { ksp(libs.room.compiler) implementation(libs.room.ktx) + // Concurrency (Coroutines Bundle) + implementation(libs.bundles.coroutines) + // Dependency Injection implementation(libs.koin) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) - androidTestImplementation(libs.bundles.coroutines.test) + androidTestImplementation(libs.coroutines.test) androidTestImplementation(libs.room.testing) androidTestImplementation(libs.truth) } From 6c23967f176df3841758fdd1fe1bdbdfb33efa84 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 20:12:31 +0530 Subject: [PATCH 084/115] chore(deps): remove unwanted dependency from app module --- app/build.gradle.kts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b90ca5f0..aa793e34 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -149,19 +149,18 @@ android { dependencies { // In project library / feature modules implementation(project(":core")) - implementation(project(":autofill")) implementation(project(":database")) implementation(project(":password_manager")) + implementation(project(":autofill")) // Android Core implementation(libs.appcompat) implementation(libs.material) // Jetpack Compose + val composeBom = platform(libs.compose.bom) + implementation(composeBom) implementation(libs.bundles.compose) - implementation(platform(libs.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) debugImplementation(libs.bundles.compose.debug) // Google Play License Services @@ -170,16 +169,10 @@ dependencies { // Concurrency (Coroutines Bundle) implementation(libs.bundles.coroutines) - // Android Architecture Components (Lifecycle Bundle) - implementation(libs.bundles.lifecycle) - // Dependency Injection - implementation(libs.bundles.koin) + implementation(libs.koin) + implementation(libs.koin.compose) // Datastore Preferences - implementation(libs.bundles.datastore.preferences) - - // Local Unit Testing (Unit Test Bundle) - testImplementation(libs.bundles.unit.test) - androidTestImplementation(libs.bundles.android.test) + implementation(libs.androidx.datastore.preferences) } From 443d9c3085999395bda990cd3b64e5486639a2a6 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 20:26:51 +0530 Subject: [PATCH 085/115] chore: trim unwanted dependency in libs.versions.toml --- core/build.gradle.kts | 3 +-- database/build.gradle.kts | 3 +-- gradle/libs.versions.toml | 45 ++++++++++----------------------------- 3 files changed, 13 insertions(+), 38 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index a0a7a559..f84d895e 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -65,6 +65,5 @@ dependencies { implementation(libs.androidx.datastore.preferences) implementation(libs.kotlinx.serialization.json) - testImplementation(libs.junit) - testImplementation(libs.truth) + testImplementation(libs.bundles.unit.test) } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 14fc579c..9a652422 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -63,9 +63,8 @@ dependencies { // Dependency Injection implementation(libs.koin) - testImplementation(libs.junit) + androidTestImplementation(libs.bundles.unit.test) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.coroutines.test) androidTestImplementation(libs.room.testing) - androidTestImplementation(libs.truth) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 211a60a5..b18b30d1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,4 @@ [versions] -kotlin = "2.2.21" coreKtx = "1.17.0" material = "1.13.0" okhttp = "5.3.2" @@ -10,31 +9,27 @@ json = "20250517" junit = "4.13.2" truth = "1.4.5" androidx-test-ext-junit = "1.3.0" -espresso-core = "3.7.0" coroutines = "1.10.2" lifecycle = "2.10.0" koin = "4.1.1" composeBom = "2025.12.00" compose-activity = "1.12.1" compose-viewmodel = "2.10.0" -nav3Core = "1.0.0" -lifecycleViewmodelNav3 = "2.10.0" -material3AdaptiveNav3 = "1.3.0-alpha05" datastorePreferences = "1.2.0" kotlinSerializationJson = "1.9.0" # Plugin versions agp = "8.13.1" ksp = "2.3.3" +kotlin = "2.2.21" oss-license-plugin = "0.10.9" # Also update in settings.gradle.kts -[libraries] -# Kotlin Std libs -kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } + +[libraries] # Jetpack Compose compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } compose-ui-material = { group = "androidx.compose.material3", name = "material3" } @@ -43,12 +38,6 @@ compose-ui-tooling-debug = { group = "androidx.compose.ui", name = "ui-tooling" compose-activity = { group = "androidx.activity", name= "activity-compose", version.ref = "compose-activity" } compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "compose-viewmodel" } -# Navigation 3 -androidx-navigation3-runtime = { group = "androidx.navigation3", name = "navigation3-runtime", version.ref = "nav3Core" } -androidx-navigation3-ui = { group = "androidx.navigation3", name = "navigation3-ui", version.ref = "nav3Core" } -androidx-lifecycle-viewmodel-navigation3 = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" } -androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version.ref = "material3AdaptiveNav3" } - # Core Dependency androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } @@ -87,37 +76,25 @@ json = { group = "org.json", name = "json", version.ref = "json" } junit = { group = "junit", name = "junit", version.ref = "junit" } truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } -espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } -androidx-ui = { group = "androidx.compose.ui", name = "ui" } -androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } + + + + + [bundles] # Jetpack Compose Dependencies compose = ["compose-ui-material", "compose-ui-preview", "compose-activity", "compose-viewmodel"] compose-debug = ["compose-ui-tooling-debug"] -# Navigation 3 Dependencies -navigation3 = ["androidx-navigation3-runtime", "androidx-navigation3-ui", "androidx-lifecycle-viewmodel-navigation3", "androidx-material3-adaptive-navigation3"] - -# Android Architecture Releated Components -room = ["room-ktx", "room-testing"] -lifecycle = ["lifecycle-runtime", "lifecycle-viewmodel"] - -# DataStore Preference -datastore-preferences = ["androidx-datastore-preferences", "kotlinx-serialization-json"] - # Coroutines Dependencies coroutines = ["coroutines-core", "coroutines-android"] -coroutines-test = ["coroutines-core", "coroutines-test"] - -# Dependency Injection Dependencies -koin = ["koin", "koin-compose"] # General Test Dependencies unit-test = ["junit", "truth"] -android-test = ["androidx-test-ext-junit", "espresso-core"] + + + From d16b258f11a4535c702566c0c4f4f2b6689ce0c4 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 20:41:16 +0530 Subject: [PATCH 086/115] chore: improve libs.version.toml --- gradle/libs.versions.toml | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b18b30d1..75fe8ed0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,51 +31,51 @@ oss-license-plugin = "0.10.9" # Also update in settings.gradle.kts [libraries] # Jetpack Compose -compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -compose-ui-material = { group = "androidx.compose.material3", name = "material3" } -compose-ui-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -compose-ui-tooling-debug = { group = "androidx.compose.ui", name = "ui-tooling" } -compose-activity = { group = "androidx.activity", name= "activity-compose", version.ref = "compose-activity" } -compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "compose-viewmodel" } +compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" } +compose-ui-material = { module = "androidx.compose.material3:material3" } +compose-ui-preview = { module = "androidx.compose.ui:ui-tooling-preview" } +compose-ui-tooling-debug = { module = "androidx.compose.ui:ui-tooling" } +compose-activity = { module = "androidx.activity:activity-compose", version.ref = "compose-activity" } +compose-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "compose-viewmodel" } # Core Dependency -androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } -oss-license = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "oss-license" } -appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" } +material = { module = "com.google.android.material:material", version.ref = "material" } +oss-license = { module = "com.google.android.gms:play-services-oss-licenses", version.ref = "oss-license" } +appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } # DataStore Preference -androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastorePreferences" } -kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinSerializationJson" } +androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinSerializationJson" } # Room -room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } -room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } -room-testing = { group = "androidx.room", name = "room-testing", version.ref = "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 = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp"} +okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp"} # Coroutines -coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "coroutines" } -coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } -coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "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 = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } -lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "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 = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } -koin-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" } +koin = { module = "io.insert-koin:koin-android", version.ref = "koin" } +koin-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } # Json -json = { group = "org.json", name = "json", version.ref = "json" } +json = { module = "org.json:json", version.ref = "json" } # Testing -junit = { group = "junit", name = "junit", version.ref = "junit" } -truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } -androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } +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" } From 94775a39c5d74c9ba614eb4f4247ee6b1ef3cae9 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 20:55:28 +0530 Subject: [PATCH 087/115] chore(deps): centerlize the value for compile sdk in libs.versions.toml --- app/build.gradle.kts | 6 +++--- autofill/build.gradle.kts | 4 ++-- core/build.gradle.kts | 4 ++-- database/build.gradle.kts | 4 ++-- gradle/libs.versions.toml | 6 ++++++ password_manager/build.gradle.kts | 4 ++-- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aa793e34..f41917d0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,13 +20,13 @@ kotlin { android { (this as ApplicationExtension).apply { - compileSdk = 36 + compileSdk = libs.versions.androidCompileSdk.get().toInt() namespace = "com.jeeldobariya.passcodes" defaultConfig { applicationId = "com.jeeldobariya.passcodes" - minSdk = 26 - targetSdk = 34 + minSdk = libs.versions.androidMinSdk.get().toInt() + targetSdk = libs.versions.androidTargetSdk.get().toInt() versionCode = 2 versionName = "v1.1.2-rc.2" diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 422a0f72..01645979 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.autofill" compileSdk { - version = release(36) + version = release(libs.versions.androidCompileSdk.get().toInt()) } defaultConfig { - minSdk = 26 + minSdk = libs.versions.androidMinSdk.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/core/build.gradle.kts b/core/build.gradle.kts index f84d895e..c24900b0 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.core" compileSdk { - version = release(36) + version = release(libs.versions.androidCompileSdk.get().toInt()) } defaultConfig { - minSdk = 26 + minSdk = libs.versions.androidMinSdk.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 9a652422..e296782b 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.database" compileSdk { - version = release(36) + version = release(libs.versions.androidCompileSdk.get().toInt()) } defaultConfig { - minSdk = 26 + minSdk = libs.versions.androidMinSdk.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 75fe8ed0..04773167 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,10 @@ [versions] +# Main versions +androidMinSdk = "26" +androidTargetSdk = "34" +androidCompileSdk = "36" + +# Library versions coreKtx = "1.17.0" material = "1.13.0" okhttp = "5.3.2" diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index 70198049..f88a3083 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -14,11 +14,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.password_manager" compileSdk { - version = release(36) + version = release(libs.versions.androidCompileSdk.get().toInt()) } defaultConfig { - minSdk = 26 + minSdk = libs.versions.androidMinSdk.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") From c77215defde03f233db975aa2e8b4ca271117514 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 21:53:31 +0530 Subject: [PATCH 088/115] fix: build error about matrail components in xml --- core/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c24900b0..78dba7b8 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -47,6 +47,7 @@ android { dependencies { implementation(libs.androidx.core.ktx) + implementation(libs.material) // Networking/Parsing implementation(libs.okhttp) From 1a471901b9d2824f6ee8dcd4fd606cc9e44dea07 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 22:35:38 +0530 Subject: [PATCH 089/115] chore(deps): made the release staging and debug build different It easy for any developer or user, to tell just by, looking at app icon or main activity that the app is build in what config and when --- app/build.gradle.kts | 39 ++++++++++++++++++----------- app/src/main/AndroidManifest.xml | 4 +-- app/src/main/res/values/strings.xml | 4 +-- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f41917d0..e9b3c605 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -95,21 +95,12 @@ android { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + resValue("string", "app_name", "Passcodes") + resValue("string", "app_version", "v1.1.2 - Beta") + // Use manifestPlaceholders.put() for key-value pairs manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher" - manifestPlaceholders["appLabel"] = "@string/app_name" - } - - getByName("debug") { - applicationIdSuffix = ".dev" - versionNameSuffix = "-Dev" - - isDebuggable = true - isShrinkResources = false - isMinifyEnabled = false - - manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher" - manifestPlaceholders["appLabel"] = "Passcodes-Dev" + manifestPlaceholders["appRoundIcon"] = "@mipmap/ic_launcher_round" } create("staging") { @@ -128,8 +119,28 @@ android { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + resValue("string", "app_name", "Passcodes Staging") + resValue("string", "app_version", "v1.1.2 - staging") + + // Use manifestPlaceholders.put() for key-value pairs + manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher" + manifestPlaceholders["appRoundIcon"] = "@mipmap/dev_ic_launcher_round" + } + + getByName("debug") { + applicationIdSuffix = ".dev" + versionNameSuffix = "-Dev" + + isDebuggable = true + isShrinkResources = false + isMinifyEnabled = false + + resValue("string", "app_name", "Passcodes Debug") + resValue("string", "app_version", "v1.1.2 - debug") + + // Use manifestPlaceholders.put() for key-value pairs manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher" - manifestPlaceholders["appLabel"] = "Passcodes-Staging" + manifestPlaceholders["appRoundIcon"] = "@mipmap/dev_ic_launcher_round" } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69a8529a..a618b668 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,10 +8,10 @@ android:name=".PasscodesApplication" android:allowBackup="true" android:icon="${appIcon}" - android:label="${appLabel}" + android:label="@string/app_name" android:localeConfig="@xml/locales_config" android:requestLegacyExternalStorage="true" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="${appRoundIcon}" android:supportsRtl="true" android:theme="@style/PasscodesTheme.Default" tools:targetApi="33"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 27fbdd43..b72e7ed2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Passcodes - v1.1.2-rc2 + Passcodes Latest + v0.0.0 - Latest Developed by: Dobariya Jeel From 3d2ec056a148401647eead751a2a2afdf3f89b87 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 9 Dec 2025 22:49:13 +0530 Subject: [PATCH 090/115] chore: remove android sdk version from libs.versions.toml it was giving wired lint errors in android studio --- app/build.gradle.kts | 6 +++--- autofill/build.gradle.kts | 4 ++-- core/build.gradle.kts | 4 ++-- database/build.gradle.kts | 4 ++-- gradle/libs.versions.toml | 5 ----- password_manager/build.gradle.kts | 4 ++-- 6 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e9b3c605..c5ab456f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,13 +20,13 @@ kotlin { android { (this as ApplicationExtension).apply { - compileSdk = libs.versions.androidCompileSdk.get().toInt() + compileSdk = 36 namespace = "com.jeeldobariya.passcodes" defaultConfig { applicationId = "com.jeeldobariya.passcodes" - minSdk = libs.versions.androidMinSdk.get().toInt() - targetSdk = libs.versions.androidTargetSdk.get().toInt() + minSdk = 26 + targetSdk = 34 versionCode = 2 versionName = "v1.1.2-rc.2" diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 01645979..422a0f72 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.autofill" compileSdk { - version = release(libs.versions.androidCompileSdk.get().toInt()) + version = release(36) } defaultConfig { - minSdk = libs.versions.androidMinSdk.get().toInt() + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 78dba7b8..6b94fb57 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.core" compileSdk { - version = release(libs.versions.androidCompileSdk.get().toInt()) + version = release(36) } defaultConfig { - minSdk = libs.versions.androidMinSdk.get().toInt() + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/database/build.gradle.kts b/database/build.gradle.kts index e296782b..9a652422 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -15,11 +15,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.database" compileSdk { - version = release(libs.versions.androidCompileSdk.get().toInt()) + version = release(36) } defaultConfig { - minSdk = libs.versions.androidMinSdk.get().toInt() + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 04773167..fac42263 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,4 @@ [versions] -# Main versions -androidMinSdk = "26" -androidTargetSdk = "34" -androidCompileSdk = "36" - # Library versions coreKtx = "1.17.0" material = "1.13.0" diff --git a/password_manager/build.gradle.kts b/password_manager/build.gradle.kts index f88a3083..70198049 100644 --- a/password_manager/build.gradle.kts +++ b/password_manager/build.gradle.kts @@ -14,11 +14,11 @@ kotlin { android { namespace = "com.jeeldobariya.passcodes.password_manager" compileSdk { - version = release(libs.versions.androidCompileSdk.get().toInt()) + version = release(36) } defaultConfig { - minSdk = libs.versions.androidMinSdk.get().toInt() + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") From f817215d2d24db27113a1f44c1eddc1e45816d2a Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 10 Dec 2025 16:39:52 +0530 Subject: [PATCH 091/115] chore: ensure the module structure for future --- autofill/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 422a0f72..a6e9909f 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -47,6 +47,8 @@ android { } dependencies { + // implementation(project(":password_manager")) + implementation(libs.androidx.core.ktx) implementation(libs.appcompat) implementation(libs.material) From 7d477a9fe5f29df938eb3edc7ca33970354a8095 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 10 Dec 2025 16:57:39 +0530 Subject: [PATCH 092/115] style: fix some lint errors --- .../passcodes/database/master/MasterDatabasePasswordsDaoTest.kt | 2 +- .../passcodes/password_manager/oldui/LoadPasswordActivity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt index 8dcbfcad..096caf14 100644 --- a/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt +++ b/database/src/androidTest/kotlin/com/jeeldobariya/passcodes/database/master/MasterDatabasePasswordsDaoTest.kt @@ -59,7 +59,7 @@ class MasterDatabasePasswordsDaoTest { assertThat(allPasswords).hasSize(2) // Check if two passwords were retrieved assertThat(allPasswords[0].domain).isEqualTo("test.org") // Assuming DESC order by ID assertThat(allPasswords[1].domain).isEqualTo("example.com") - assertThat(allPasswords).containsExactly(password2.copy(id = 2), password1.copy(id = 1)).inOrder(); + assertThat(allPasswords).containsExactly(password2.copy(id = 2), password1.copy(id = 1)).inOrder() // Note: The 'id' is auto-generated by Room, so we need to create copies with the expected IDs for comparison. // The order depends on your @Query("SELECT * FROM passwords ORDER BY id DESC") } diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt index ed5c252e..e337295b 100644 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt +++ b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/LoadPasswordActivity.kt @@ -25,7 +25,7 @@ class LoadPasswordActivity : AppCompatActivity() { private lateinit var passwordAdapter: PasswordAdapter override fun onCreate(savedInstanceState: Bundle?) { - runBlocking { + runBlocking { setTheme(appDatastore.data.first().theme) } super.onCreate(savedInstanceState) From 284f57fa4bb702279b55d56f44ccace7139d9046 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 10 Dec 2025 16:59:22 +0530 Subject: [PATCH 093/115] style: run formatter of android studio on entire project --- .../feedback---question---help-wanted.md | 3 +- .github/pull_request_template.md | 12 +- .github/workflows/codeql.yml | 2 +- README.md | 71 ++++-- app/build.gradle.kts | 14 +- .../passcodes/PasscodesApplication.kt | 2 +- .../passcodes/oldui/AboutUsActivity.kt | 2 +- .../passcodes/oldui/LicenseActivity.kt | 2 +- .../passcodes/oldui/MainActivity.kt | 7 +- .../passcodes/oldui/SettingsActivity.kt | 6 +- .../jeeldobariya/passcodes/ui/MainActivity.kt | 2 +- app/src/main/res/layout/activity_about_us.xml | 95 ++++---- app/src/main/res/layout/activity_license.xml | 7 +- app/src/main/res/layout/activity_main.xml | 12 +- app/src/main/res/layout/activity_settings.xml | 79 ++++--- .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 +- app/src/main/res/xml/locales_config.xml | 18 +- .../res/layout/activity_autofill_settings.xml | 4 +- .../src/main/res/xml/autofill_service.xml | 3 +- changelog.md | 79 ++++--- .../passcodes/core/datastore/AppSettings.kt | 5 +- .../core/datastore/AppSettingsSerializer.kt | 2 +- .../FeatureFlagsSettingsSerializer.kt | 2 +- core/src/main/res/values-night/themes.xml | 21 +- core/src/main/res/values/themes.xml | 28 ++- .../master/MasterDatabasePasswordsDaoTest.kt | 58 ++++- docs/release-notes.md | 55 +++-- docs/security-guide.md | 32 ++- gradle.properties | 1 - gradle/libs.versions.toml | 2 +- password_manager/src/main/AndroidManifest.xml | 1 + .../data/repository/PasswordRepository.kt | 5 +- .../oldui/LoadPasswordActivity.kt | 2 +- .../oldui/PasswordManagerActivity.kt | 2 +- .../oldui/SavePasswordActivity.kt | 2 +- .../oldui/UpdatePasswordActivity.kt | 2 +- .../oldui/ViewPasswordActivity.kt | 2 +- .../load_password/LoadPasswordAction.kt | 2 +- .../load_password/LoadPasswordViewModel.kt | 4 +- .../save_password/SavePasswordAction.kt | 10 +- .../save_password/SavePasswordViewModel.kt | 24 +- .../update_password/UpdatePasswordAction.kt | 10 +- .../UpdatePasswordViewModel.kt | 24 +- .../view_password/ViewPasswordAction.kt | 7 +- .../view_password/ViewPasswordViewModel.kt | 14 +- .../res/layout/activity_load_password.xml | 38 ++-- .../res/layout/activity_password_manager.xml | 86 +++---- .../res/layout/activity_save_password.xml | 206 ++++++++--------- .../res/layout/activity_update_password.xml | 213 +++++++++--------- .../res/layout/activity_view_password.xml | 174 +++++++------- .../main/res/layout/password_list_item.xml | 4 +- 52 files changed, 835 insertions(+), 635 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md b/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md index 5186aa09..b57eec62 100644 --- a/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md +++ b/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md @@ -21,7 +21,8 @@ describe in short paragraph, what you are write or what question or concern you ## Thoughts -describe your thought and feedback related to app. if you have question then delete this section and fill the question section... +describe your thought and feedback related to app. if you have question then delete this section and +fill the question section... ## Question diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7e64e384..489f7b61 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,16 +4,16 @@ - summary 2. - ... -> Summary here, should be in one line (write consise so that reviewer without take look at code, can say/determine what changed).. -> summary above should provide structure overview that one can read and understand what changed. +> Summary here, should be in one line (write consise so that reviewer without take look at code, can +> say/determine what changed).. +> summary above should provide structure overview that one can read and understand what changed. > summary should not be a detail guide, just short description. -> you can provide further infomation in notes section or it would be expictily ask in pr comments at time of review if need..) - +> you can provide further infomation in notes section or it would be expictily ask in pr comments at +> time of review if need..) # Breaking Changes -- [Write about any breaking changes, like architecture changes or database changes etc.. If none, remove the section compeletly]. - +- [Write about any breaking changes, like architecture changes or database changes etc.. If none, remove the section compeletly]. ## Notes diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 052bbde5..6fe2208c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,7 @@ on: - 'docs/**' release: - types: [created, published] + types: [ created, published ] jobs: analyze: diff --git a/README.md b/README.md index f3220ef2..481f3ddf 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,28 @@ > [!WARNING] > It is just a open source project. An is current under active development. -> Please, consider using it for fun, and not for real password managment. (untill, we offically release a stable release) +> Please, consider using it for fun, and not for real password managment. (untill, we offically +> release a stable release)
- + passcodes play store banner - + ![Static Badge](https://img.shields.io/badge/Release-Prototype-blue) [![Android CI/CD](https://github.com/PasscodesApp/Passcodes/actions/workflows/build-apks.yml/badge.svg)](https://github.com/PasscodesApp/Passcodes/actions/workflows/build-apks.yml) ![Visitor Counter (@hehuapei/visitor-badge)](https://visitor-badge.laobi.icu/badge?page_id=JeelDobariya38.Passcodes&format=true)
-A android app that take down the headache of remembering passwords. It is open source solutions that help you in keeping your passwords safe and secure, in your own local storage without ever needing to push them to cloud. +A android app that take down the headache of remembering passwords. It is open source solutions that +help you in keeping your passwords safe and secure, in your own local storage without ever needing +to push them to cloud. > What we think of passcodes? -> Password management is one such thing that is as simple as remember a password yet, it very important topic in term of security. So, we as developer of passcodes think to streamline and securing the process as much as possible. [Read more](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/project-overview.md) +> Password management is one such thing that is as simple as remember a password yet, it very +> important topic in term of security. So, we as developer of passcodes think to streamline and +> securing the process as much as +> possible. [Read more](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/project-overview.md) ## Website @@ -48,7 +54,8 @@ Note: high version can still run, but are not guaranteed offically. - [ ] Intuitive UI. - [ ] Update Checkers & Manager. - [x] Password Management. (Current Priority) -- [ ] Secure File. (Least Priority, Because it include permission. Which, I am as developer not familar with 😂) +- [ ] Secure File. (Least Priority, Because it include permission. Which, I am as developer not + familar with 😂) - Could be Image. (JPG. PNG ....) - Could be Video. - Could any Binary File. (more like won't be a text file) @@ -75,13 +82,18 @@ Note: high version can still run, but are not guaranteed offically. ## Installation Steps -1. Go to our [github repository release page](https://github.com/PasscodesApp/Passcodes/releases/latest). +1. Go to + our [github repository release page](https://github.com/PasscodesApp/Passcodes/releases/latest). -2. Download the apk for your phone. If Don't know the architecture of phone then download apk file that has universal in its name. +2. Download the apk for your phone. If Don't know the architecture of phone then download apk file + that has universal in its name. 3. Install the apk and you are ready to use the app. -It was most shortest and sweetest description (I have ever crafted), For more detailed description, See the file [installing.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/installing.md) in `PasscodesApp/Passcodes-Docs`. +It was most shortest and sweetest description (I have ever crafted), For more detailed description, +See the +file [installing.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/installing.md) +in `PasscodesApp/Passcodes-Docs`. ## Building The App @@ -93,37 +105,56 @@ It was most shortest and sweetest description (I have ever crafted), For more de 4. For code documentation and support docs, check the `docs/` folder in our repository. -It was general, intuitive, short and sweet description, For more detailed description, Vist the file [building.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/dev-docs/building.md) in `PasscodesApp/Passcodes-Docs`. +It was general, intuitive, short and sweet description, For more detailed description, Vist the +file [building.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/dev-docs/building.md) in +`PasscodesApp/Passcodes-Docs`. ## Support Docs -You can checkout support docs, provided in [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs) Or You can even seek help on our [telegram community](https://t.me/passcodescommunity) +You can checkout support docs, provided +in [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs) Or You can even +seek help on our [telegram community](https://t.me/passcodescommunity) ## Changelog & Release Notes -- Professional ChangeLog: [here](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/changelog.md) -- Casual Release Notes: [here](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/release-notes.md) +- Professional + ChangeLog: [here](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/changelog.md) +- Casual Release + Notes: [here](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/release-notes.md) ## Contribution Are Appreciated!!! > [!IMPORTANT] > Currently the project (more or less also me) is not ready for (code) contributions. -> This project is currently limited by my expertise & I am beginner. Meaning I don;t want others code in my codebase, that I don't understand, I am learning android and will surely learn basic off by start of 2026.. then i will allow the contibution to this repo... But as of now i don't admire code contribution. As I am beginner in android and might have difficuly understand code that not written by me... +> This project is currently limited by my expertise & I am beginner. Meaning I don;t want others +> code in my codebase, that I don't understand, I am learning android and will surely learn basic off +> by start of 2026.. then i will allow the contibution to this repo... But as of now i don't admire +> code contribution. As I am beginner in android and might have difficuly understand code that not +> written by me... > -> There are still other ways to contribute to project.. like by testing app, by contributing to documentation or more or less just by spreading the word around.. about the app. but, code contribution is limited from my side.... & I hope you can understand... +> There are still other ways to contribute to project.. like by testing app, by contributing to +> documentation or more or less just by spreading the word around.. about the app. but, code +> contribution is limited from my side.... & I hope you can understand... > -> For more, information on what kind of contribution we approve or allow, please open a issue in our repo. that way you avoid wasting your time... +> For more, information on what kind of contribution we approve or allow, please open a issue in our +> repo. that way you avoid wasting your time... > > [Read More](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/open-contributing-timeline.md) -By, contributing to project you accept the [Terms For Contributions](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/terms-for-contributions.md), [CONTRIBUTING.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/CONTRIBUTING.md) & [MIT License](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/LICENSE.txt). +By, contributing to project you accept +the [Terms For Contributions](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/terms-for-contributions.md), [CONTRIBUTING.md](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/CONTRIBUTING.md) & [MIT License](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/LICENSE.txt). -And also have look at [Open Contributing Timeline](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/open-contributing-timeline.md). +And also have look +at [Open Contributing Timeline](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/other-docs/open-contributing-timeline.md). ## Security Policy -Avaliable here in [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/SECURITY.md). +Avaliable here +in [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/SECURITY.md). ## License -Passcodes Project is license under [MIT](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/LICENSE.txt) License. Downloading Or Use the app or any associated stuff would mean, you are okay and have accepted the license terms. +Passcodes Project is license +under [MIT](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/LICENSE.txt) License. +Downloading Or Use the app or any associated stuff would mean, you are okay and have accepted the +license terms. diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5ab456f..f2880564 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,8 +1,8 @@ -import java.io.FileInputStream -import java.util.Properties // import org.gradle.api.GradleException import com.android.build.api.dsl.ApplicationExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.io.FileInputStream +import java.util.Properties plugins { alias(libs.plugins.android.application) @@ -93,7 +93,10 @@ android { isDebuggable = false isShrinkResources = true isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) resValue("string", "app_name", "Passcodes") resValue("string", "app_version", "v1.1.2 - Beta") @@ -117,7 +120,10 @@ android { isDebuggable = false isShrinkResources = true isMinifyEnabled = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) resValue("string", "app_name", "Passcodes Staging") resValue("string", "app_version", "v1.1.2 - staging") diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt index 7a005d9e..fbe29251 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/PasscodesApplication.kt @@ -2,8 +2,8 @@ package com.jeeldobariya.passcodes import android.app.Application import com.jeeldobariya.passcodes.core.di.coreModule -import com.jeeldobariya.passcodes.password_manager.di.passwordManagerModule import com.jeeldobariya.passcodes.database.di.databaseModule +import com.jeeldobariya.passcodes.password_manager.di.passwordManagerModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt index 5abcded6..d9752697 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt @@ -4,9 +4,9 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri -import com.jeeldobariya.passcodes.databinding.ActivityAboutUsBinding import com.jeeldobariya.passcodes.Constant import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.databinding.ActivityAboutUsBinding import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt index 05960001..ef3cacbe 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/LicenseActivity.kt @@ -4,8 +4,8 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.jeeldobariya.passcodes.databinding.ActivityLicenseBinding import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.databinding.ActivityLicenseBinding import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import java.io.BufferedReader 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 6ca8b32a..cf2fae1b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt @@ -8,9 +8,9 @@ import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.BuildConfig import com.jeeldobariya.passcodes.Constant import com.jeeldobariya.passcodes.core.datastore.appDatastore +import com.jeeldobariya.passcodes.core.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore import com.jeeldobariya.passcodes.databinding.ActivityMainBinding -import com.jeeldobariya.passcodes.core.domain.usecases.CheckForUpdateUseCase import com.jeeldobariya.passcodes.password_manager.oldui.PasswordManagerActivity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first @@ -58,7 +58,10 @@ class MainActivity : AppCompatActivity() { runBlocking { if (featureFlagsDatastore.data.first().isPreviewLayoutEnabled) { - val jetpackComposeActivity = Intent(this@MainActivity, com.jeeldobariya.passcodes.ui.MainActivity::class.java) + val jetpackComposeActivity = Intent( + this@MainActivity, + com.jeeldobariya.passcodes.ui.MainActivity::class.java + ) startActivity(jetpackComposeActivity) } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt index a70e242a..4f66b547 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/SettingsActivity.kt @@ -10,13 +10,13 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope -import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.autofill.AutofillSettingsActivity -import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow +import com.jeeldobariya.passcodes.core.R import com.jeeldobariya.passcodes.core.datastore.appDatastore import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository +import com.jeeldobariya.passcodes.core.utils.collectLatestLifecycleFlow import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding +import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking 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 a85f2be6..b504d923 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -96,7 +96,7 @@ fun MainScreen(navigateToOldUi: suspend () -> Unit) { fun GreetingPreview() { PasscodesTheme { MainScreen( - navigateToOldUi = { } + navigateToOldUi = { } ) } } diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 5800c4a9..6dbc3bdd 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -1,5 +1,4 @@ - + android:textColor="?attr/colorOnSurface" /> + android:textColor="?attr/colorOnSurfaceVariant" /> + android:padding="16dp"> + + app:tint="?attr/colorPrimary" /> + + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.LabelLarge" /> @@ -101,22 +102,24 @@ + android:padding="16dp"> + + app:tint="?attr/colorPrimary" /> + + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.LabelLarge" /> @@ -132,22 +135,24 @@ + android:padding="16dp"> + + app:tint="?attr/colorPrimary" /> + + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.LabelLarge" /> @@ -163,41 +168,44 @@ + android:padding="16dp"> + + app:tint="?attr/colorPrimary" /> + + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.LabelLarge" /> + + app:cardBackgroundColor="?attr/colorSecondaryContainer" + app:cardCornerRadius="16dp"> + android:padding="16dp"> + + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.LabelLarge" /> @@ -223,31 +232,33 @@ android:layout_marginTop="24dp" android:layout_marginBottom="16dp" android:text="@string/label_contributor" - android:textColor="?attr/colorOnSurface"/> + android:textColor="?attr/colorOnSurface" /> + android:layout_marginBottom="8dp" + app:cardCornerRadius="16dp"> + + android:text="@string/developer_name" + android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> + + android:text="@string/code_maintainer" + android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> diff --git a/app/src/main/res/layout/activity_license.xml b/app/src/main/res/layout/activity_license.xml index f0fd632b..f0f4d750 100644 --- a/app/src/main/res/layout/activity_license.xml +++ b/app/src/main/res/layout/activity_license.xml @@ -1,6 +1,5 @@ - + android:gravity="center" + android:orientation="vertical"> + android:padding="4sp" + tools:context=".oldui.MainActivity"> + android:orientation="vertical"> + android:orientation="vertical"> - + android:textSize="32sp" /> + android:textSize="16sp" /> + android:layout_gravity="right|center_vertical" + android:entries="@array/lang_options" /> @@ -64,26 +63,26 @@ + android:textSize="16sp" /> + android:textSize="12sp" /> @@ -98,24 +97,24 @@ + android:layout_margin="8dp" + android:text="@string/latest_feature" + android:textColor="?attr/colorPrimary" + android:textSize="16sp" /> + android:layout_margin="8dp" + tools:ignore="UseSwitchCompatOrMaterialXml" /> @@ -129,24 +128,24 @@ + android:layout_margin="8dp" + android:text="@string/preview_layout" + android:textColor="?attr/colorPrimary" + android:textSize="16sp" /> + android:layout_margin="8dp" + tools:ignore="UseSwitchCompatOrMaterialXml" /> @@ -160,19 +159,19 @@ + android:textSize="12sp" /> @@ -186,19 +185,19 @@ + android:textSize="12sp" /> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 345888d2..a83cd238 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 345888d2..a83cd238 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index 6f5fa173..e1e59369 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -1,12 +1,12 @@ - - - - - - - - - + + + + + + + + + diff --git a/autofill/src/main/res/layout/activity_autofill_settings.xml b/autofill/src/main/res/layout/activity_autofill_settings.xml index 4fbbbabd..73230313 100644 --- a/autofill/src/main/res/layout/activity_autofill_settings.xml +++ b/autofill/src/main/res/layout/activity_autofill_settings.xml @@ -23,9 +23,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:textColor="?attr/colorSecondary" android:text="@string/passcodes_autofill_is_preview_feature" - android:textAlignment="center" /> + android:textAlignment="center" + android:textColor="?attr/colorSecondary" /> diff --git a/changelog.md b/changelog.md index 113a31eb..b2bf9c11 100644 --- a/changelog.md +++ b/changelog.md @@ -5,19 +5,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will find short and sweet release notes. +Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will find short and sweet +release notes. > [!NOTE] > This is a raw version of the file.. -> -> Final version is over on [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/changelog.md) - +> +> Final version is over +> on [PasscodesApp/Passcodes-Docs](https://github.com/PasscodesApp/Passcodes-Docs/blob/main/user-docs/changelog.md) ## v1.1.1 - Alpha (Sept 11, 2025)
View Internal Details - + ``` Pacakage Name = "com.jeeldobariya.passcodes" Min Android = 8.0 (API level 26) @@ -26,19 +27,19 @@ Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will fi Version Name = "v1.1.1-Alpha" Master Database Version = "v1" ``` -
+
### Fixed -- **Fixed Import Passwords**: fix the bug, that was not let user select csv files from file picker. due to incorrect mimetype in code.. Contributed by [@JeelDobariya] - +- **Fixed Import Passwords**: fix the bug, that was not let user select csv files from file picker. + due to incorrect mimetype in code.. Contributed by [@JeelDobariya] ## v1.1.0 - Alpha (Sept 1, 2025)
View Internal Details - + ``` Pacakage Name = "com.jeeldobariya.passcodes" Min Android = 8.0 (API level 26) @@ -47,27 +48,37 @@ Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will fi Version Name = "v1.1.0-Alpha" Master Database Version = "v1" ``` -
+ ### Added -- **Improve UI/UX**: improve view password screen, also adjust the button colors.. Contributed by [@JeelDobariya] -- **Add Feature Flaging**: give user a control on whether they wanna latest exprience or stable exprience. add a way for launching preview features without worry about their stablity. Contributed by [@JeelDobariya] -- **Update Checker**: made a basic update checker that help users stay out to date with latest release & also notify user about already reported security vulnerability. Contributed by [@JeelDobariya] -- **Copy Button (preview feature)**: add copy button for copy passwords for easy of use. but as it is potential threat to security, made it a preview feature. Contributed by [@JeelDobariya] -- **G-Passwords Import/Export (preview feature)**: add a import/export feature. which also compatible with google passwords. I have test it with my google password setup. but, I am not sure wether this will run in every edge case or not. So, it a preview feature. Contributed by [@JeelDobariya] +- **Improve UI/UX**: improve view password screen, also adjust the button colors.. Contributed + by [@JeelDobariya] +- **Add Feature Flaging**: give user a control on whether they wanna latest exprience or stable + exprience. add a way for launching preview features without worry about their stablity. + Contributed by [@JeelDobariya] +- **Update Checker**: made a basic update checker that help users stay out to date with latest + release & also notify user about already reported security vulnerability. Contributed + by [@JeelDobariya] +- **Copy Button (preview feature)**: add copy button for copy passwords for easy of use. but as it + is potential threat to security, made it a preview feature. Contributed by [@JeelDobariya] +- **G-Passwords Import/Export (preview feature)**: add a import/export feature. which also + compatible with google passwords. I have test it with my google password setup. but, I am not sure + wether this will run in every edge case or not. So, it a preview feature. Contributed + by [@JeelDobariya] ### Changed -- **Mirgated Project**: Migrate project from `JeelDobariya38 (personal)` to `PasscodesApp (my organization)` account. To reflect my long term vision. Contributed by [@JeelDobariya]. - +- **Mirgated Project**: Migrate project from `JeelDobariya38 (personal)` to + `PasscodesApp (my organization)` account. To reflect my long term vision. Contributed + by [@JeelDobariya]. ## v1.0.0 - Stable (Aug 16, 2025)
View Internal Details - + ``` Pacakage Name = "com.jeeldobariya.passcodes" Min Android = 8.0 (API level 26) @@ -76,26 +87,31 @@ Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will fi Version Name = "v1.0.0-Stable" Master Database Version = "v1" ``` +
### Added -- **Localized App**: add language support for English, Chinese, Hindi, Indonesian, Japanese, Korean, German, Spanish, Vietnamese. Contributed by [@JeelDobariya]. -- **Improved UI/UX**: add confirmation dialogs, support for light & dark theme with additional minor changes. Contributed by [@JeelDobariya & @kudanilll]. +- **Localized App**: add language support for English, Chinese, Hindi, Indonesian, Japanese, Korean, + German, Spanish, Vietnamese. Contributed by [@JeelDobariya]. +- **Improved UI/UX**: add confirmation dialogs, support for light & dark theme with additional minor + changes. Contributed by [@JeelDobariya & @kudanilll]. - **New Icon**: add new icons to app. Contributed by [@JeelDobariya]. ### Changed -- **Mirgated Package Name**: Migrate package name from `com.passwordmanager` to `com.jeeldobariya.passcodes`. Contributed by [@JeelDobariya]. -- **Improve Safety By Kotlin Implementaion**: Move from `Java` to `Kotlin` Language. Contributed by [@JeelDobariya]. -- **Improve Data Storing Process**: Move from `SqliteDatabase` to `Room` Libaray for better datastorage. Contributed by [@JeelDobariya]. - +- **Mirgated Package Name**: Migrate package name from `com.passwordmanager` to + `com.jeeldobariya.passcodes`. Contributed by [@JeelDobariya]. +- **Improve Safety By Kotlin Implementaion**: Move from `Java` to `Kotlin` Language. Contributed + by [@JeelDobariya]. +- **Improve Data Storing Process**: Move from `SqliteDatabase` to `Room` Libaray for better + datastorage. Contributed by [@JeelDobariya]. ## v0.1.0 - Alpha (Aug 26, 2024)
View Internal Details - + ``` Pacakage Name = "com.passwordmanager" Min Android = 8.0 (API level 26) @@ -104,14 +120,19 @@ Release Notes: [docs/release-notes.md](docs/release-notes.md), there you will fi Version Name = "0.1.0-Alpha" Master Database Version = "v1" ``` +
### Added -- **App Icon Creation**: Designed and implemented the initial app icon, providing the application with a recognizable visual identity. Contributed by [@HamadaNative]. -- **Basic App Structure**: Established the foundational architecture of the app, including the main entry point and initial setup. Contributed by [@JeelDobariya]. -- **Main Page Development**: Developed the main page of the app, including basic UI components and initial layout. Contributed by [@HamadaNative]. +- **App Icon Creation**: Designed and implemented the initial app icon, providing the application + with a recognizable visual identity. Contributed by [@HamadaNative]. +- **Basic App Structure**: Established the foundational architecture of the app, including the main + entry point and initial setup. Contributed by [@JeelDobariya]. +- **Main Page Development**: Developed the main page of the app, including basic UI components and + initial layout. Contributed by [@HamadaNative]. ### Notes -- This is the initial alpha release, focused on setting up the basic structure and key visual elements of the app. +- This is the initial alpha release, focused on setting up the basic structure and key visual + elements of the app. diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt index 022b779e..f39d3c3c 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettings.kt @@ -7,7 +7,10 @@ import androidx.datastore.dataStore import com.jeeldobariya.passcodes.core.R import kotlinx.serialization.Serializable -val Context.appDatastore by dataStore(fileName = "app-settings.json", serializer = AppSettingsSerializer) +val Context.appDatastore by dataStore( + fileName = "app-settings.json", + serializer = AppSettingsSerializer +) @Serializable data class AppSettings( diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt index a1ab7f3a..03c78eb3 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/datastore/AppSettingsSerializer.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.json.Json import java.io.InputStream import java.io.OutputStream -object AppSettingsSerializer: Serializer { +object AppSettingsSerializer : Serializer { override val defaultValue: AppSettings get() = AppSettings() diff --git a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt index 67d192d9..92d16f1f 100644 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt +++ b/core/src/main/kotlin/com/jeeldobariya/passcodes/core/feature_flags/FeatureFlagsSettingsSerializer.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.json.Json import java.io.InputStream import java.io.OutputStream -object FeatureFlagsSettingsSerializer: Serializer { +object FeatureFlagsSettingsSerializer : Serializer { override val defaultValue: FeatureFlagsSettings get() = FeatureFlagsSettings() diff --git a/core/src/main/res/values-night/themes.xml b/core/src/main/res/values-night/themes.xml index cb79506a..3daf5724 100644 --- a/core/src/main/res/values-night/themes.xml +++ b/core/src/main/res/values-night/themes.xml @@ -2,7 +2,7 @@