From 6840ee00fc245e7ab76d72ea4c0f1a204f422616 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 08:46:09 +0530 Subject: [PATCH 01/13] feat: add icon on home screen --- app/src/main/res/drawable/ic_passodes.png | Bin 0 -> 107783 bytes app/src/main/res/layout/activity_main.xml | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_passodes.png diff --git a/app/src/main/res/drawable/ic_passodes.png b/app/src/main/res/drawable/ic_passodes.png new file mode 100644 index 0000000000000000000000000000000000000000..47255f9077da376f3e637e55f4cfb4256fb483c2 GIT binary patch literal 107783 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�cxQzCEBww(Ym$T^qH^tP=_R0+Haz6zus`ah|&J`a?{2E=ZL;s zh(`9dR|X)b@OD$! z5he0CwQAQo9SlnrM9>9kPXz?)3jQ{5P_-tbvdOy0Fq$L)-^7i8 zwBAs^))plkmbc(`%LN-`iFc+lMi}G<+UrMljXL-+Zavi=qIeV_9Y_K4OjDR9QZ>iD zfdCrt+8R7gF%8L?3ukzFa;xK$PQO@IUO|P8+$W#BV)uE-mjSB0f&G%M43xdIx@L($ z(2jQxv9DM)B>o*t30S>aH31Yw zeQ6gkZvf90M9u@)IpAs!Rdq}iNj*{U^YEsubz`nYS-a-$&<_`sfGC6lMOBuX<&-hn zNIVB6_6N#Vr?tT+(;fhmKwILq?n2e+5%pt4Ccuf!0DZxNME)d1P*;H|AmH%A;CgL$ zo;EYM7?${|GQURf+vir9G=A{dN}`t>%H5_HYS|(OB}5?{P+QRMP=Qr&3}Sgg^6MEc?9P+(Yf*3K}pli$mTFmw;9z%>GT`?dbB!m}`0;pO&@%i4<(NH3)O&s)d zuICY8*S(d^x+-ZobUl{=gqq@4lVYN`-+fvBWJwEuWpRUA)#%J%#pY~*U@`5?a5)VQ!Lz#B zQY8bOWhNE$3!jg_Ge&`acKezcFqw+&=aQZu4B!K0h^P9fTOb;0V8G)g(3vZ@EKCE` zcD3Gwi-yFKK_;0DdEFwd3C6<(<jgB<uh==ddvBrD*G%5 zIy3M=FIi+$hD2Rubd1)ytTp^Cr!x(@W!xKMv!9Y-69`ZH_NG|;)n{t*BX5e7wVitD zSMMp&Kgv&vs2~wU2AEbT8Mk>&+TXCJv7slMl3!7|Wm}lF+%)m`Rvu6{)qVTeD&yK+ zi87$}@Rj17qX)N#vPav-7V>d_RnvfvD|Vwdd|t{Ly+liBz8c+C^mKxD6K8>E9dFH0GT0j`KcH!}3>I(xI z@zrMb#cTSi*CYzY*9L0K#+Gz33Wb#?_QY0z>+#BHA}~FpA~O`rDRqT+!T0W@XCV7t zOh9Z~aUknOs}iMPR;vWFogO*&T5CmZN!eL0WgG�lDS2j0B1An93aLHDqE1^9|!- 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 dBmW8HJmOo*$M%V3kB + + - + Date: Tue, 26 Aug 2025 09:06:52 +0530 Subject: [PATCH 02/13] feat: add a way convert data as csv --- .../passcodes/ui/PasswordManagerActivity.kt | 14 +++++++++++++- .../com/jeeldobariya/passcodes/utils/Controller.kt | 13 +++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 5ff2b07b..27023d46 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -3,18 +3,24 @@ package com.jeeldobariya.passcodes.ui import android.content.Intent import android.view.View.GONE import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat +import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityPasswordManagerBinding import com.jeeldobariya.passcodes.flags.FeatureFlagManager import com.jeeldobariya.passcodes.utils.CommonUtils +import com.jeeldobariya.passcodes.utils.Controller +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch class PasswordManagerActivity : AppCompatActivity() { - private lateinit var binding: ActivityPasswordManagerBinding // Use late init for binding + private lateinit var binding: ActivityPasswordManagerBinding + private lateinit var controller: Controller override fun onCreate(savedInstanceState: Bundle?) { CommonUtils.updateCurrTheme(this) @@ -27,6 +33,8 @@ class PasswordManagerActivity : AppCompatActivity() { binding.exportPasswordBtn.visibility = GONE } + controller = Controller(this) // Initialize the controller here + // Add event onclick listener addOnClickListenerOnButton(binding) @@ -52,6 +60,10 @@ class PasswordManagerActivity : AppCompatActivity() { binding.exportPasswordBtn.setOnClickListener { Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() + lifecycleScope.launch(context = Dispatchers.IO) { + val dataExportString = controller.generateCsvDataExportString() + Log.i("DataExport", dataExportString) + } } } } \ No newline at end of file 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 4e8a4a85..495d4248 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -5,6 +5,7 @@ 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 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) @@ -133,4 +134,16 @@ class Controller(context: Context) { throw DatabaseOperationException("Error deleting password.", e) } } + + suspend fun generateCsvDataExportString(): String { + val header = "domain,username,password,notes\n" + + val passwords: List = getAllPasswords().first() + + val rows = passwords.joinToString("\n") { password -> + "${password.domain},${password.username},${password.password},${password.notes}" + } + + return header + rows + } } From 6e5bd437fac6ff051c1609ee4b4a6aee279f6b76 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 09:35:58 +0530 Subject: [PATCH 03/13] feat: add a way to export passwords --- .../passcodes/ui/PasswordManagerActivity.kt | 41 +++++++++++++++++-- .../passcodes/ui/ViewPasswordActivity.kt | 2 + app/src/main/res/values/strings.xml | 3 ++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 27023d46..11f2fd92 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -5,6 +5,8 @@ import android.view.View.GONE import android.os.Bundle import android.util.Log import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope @@ -15,6 +17,7 @@ import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Controller import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class PasswordManagerActivity : AppCompatActivity() { @@ -22,6 +25,9 @@ class PasswordManagerActivity : AppCompatActivity() { private lateinit var binding: ActivityPasswordManagerBinding private lateinit var controller: Controller + private lateinit var exportCsvLauncher: ActivityResultLauncher + private var exportData: String? = null + override fun onCreate(savedInstanceState: Bundle?) { CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) @@ -35,6 +41,20 @@ class PasswordManagerActivity : AppCompatActivity() { controller = Controller(this) // Initialize the controller here + exportCsvLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode == RESULT_OK) { + val uri = result.data?.data + if (uri != null && !exportData.isNullOrEmpty()) { + contentResolver.openOutputStream(uri)?.use { outputStream -> + outputStream.write(exportData!!.toByteArray()) + } + Toast.makeText(this, getString(R.string.export_success), Toast.LENGTH_SHORT).show() + } + } + } + // Add event onclick listener addOnClickListenerOnButton(binding) @@ -60,10 +80,25 @@ class PasswordManagerActivity : AppCompatActivity() { binding.exportPasswordBtn.setOnClickListener { Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() - lifecycleScope.launch(context = Dispatchers.IO) { - val dataExportString = controller.generateCsvDataExportString() - Log.i("DataExport", dataExportString) + + lifecycleScope.launch(Dispatchers.IO) { + val csvDataExportBlob = controller.generateCsvDataExportString() + Log.i("DataExport", csvDataExportBlob) + + withContext(Dispatchers.Main) { + exportData = csvDataExportBlob + exportCsvFilePicker() + } } } } + + private fun exportCsvFilePicker() { + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "text/csv" + putExtra(Intent.EXTRA_TITLE, "passwords.csv") + } + exportCsvLauncher.launch(intent) + } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 54d54150..7dc8cdc4 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -97,6 +97,8 @@ class ViewPasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.copyPasswordBtn.setOnClickListener { + Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() + val confirmDialog = AlertDialog.Builder(this@ViewPasswordActivity) .setTitle(R.string.copy_password_dialog_title) .setMessage(R.string.danger_copy_to_clipboard_desc) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a537531..90cddf65 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,6 +84,9 @@ Something went wrong. Action discarded. Something Went Wrong: Invalid ID!! + + + Passwords exported Copy to Clipboard? From 1dc99bf4561c5c316d823da2ceb69a40c039efff Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 09:37:23 +0530 Subject: [PATCH 04/13] chore: remove logs for sensitive data --- .../com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 11f2fd92..6cd42d7d 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -3,7 +3,6 @@ package com.jeeldobariya.passcodes.ui import android.content.Intent import android.view.View.GONE import android.os.Bundle -import android.util.Log import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts @@ -83,7 +82,6 @@ class PasswordManagerActivity : AppCompatActivity() { lifecycleScope.launch(Dispatchers.IO) { val csvDataExportBlob = controller.generateCsvDataExportString() - Log.i("DataExport", csvDataExportBlob) withContext(Dispatchers.Main) { exportData = csvDataExportBlob From e4782df781d72cff98c0c4ec42dd9bf153e07996 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 10:02:54 +0530 Subject: [PATCH 05/13] chore(deps): change to version logs --- app/build.gradle.kts | 84 +++++++++++++-------------------------- build.gradle.kts | 10 ++--- gradle/libs.versions.toml | 50 +++++++++++++++++++++++ 3 files changed, 82 insertions(+), 62 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8cf118cb..d148f636 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,12 +4,10 @@ import org.gradle.api.GradleException import com.android.build.api.dsl.ApplicationExtension plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - id("com.google.devtools.ksp") - // If you use Kotlin Parcelize, uncomment the next line: - // id("kotlin-parcelize") - id("com.google.android.gms.oss-licenses-plugin") + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.ksp) + alias(libs.plugins.oss.licenses) } android { @@ -143,54 +141,28 @@ android { } dependencies { - val kotlinVersion = "1.9.0" - val materialVersion = "1.12.0" - val ossLicenseVersion = "17.2.1" - val appCompatVersion = "1.7.0" - val roomVersion = "2.7.2" - // val jsonVersion = "20250517" - val junitVersion = "4.13.2" - val truthVersion = "1.4.4" - val androidxTestExtJunitVersion = "1.2.1" - val espressoCoreVersion = "3.6.1" - - val coroutinesVersion = "1.10.2" - val lifecycleVersion = "2.9.2" - - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion") - - implementation("com.google.android.material:material:$materialVersion") - implementation("com.google.android.gms:play-services-oss-licenses:$ossLicenseVersion") - implementation("androidx.appcompat:appcompat:$appCompatVersion") - // viewbinding is often not explicitly needed here if buildFeatures.viewBinding = true - // implementation("androidx.databinding:viewbinding:7.4.1") - - implementation("androidx.room:room-ktx:$roomVersion") - ksp("androidx.room:room-compiler:$roomVersion") - - // Kotlin Coroutines - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion") - - // Lifecycle components for lifecycleScope - implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion") - // implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion") // Good for future ViewModels - - // // External JSON library - // implementation("org.json:json:$jsonVersion") // Standard org.json library - - // Testing dependencies - testImplementation("junit:junit:$junitVersion") - testImplementation("com.google.truth:truth:$truthVersion") - - // Room testing - androidTestImplementation("androidx.room:room-testing:$roomVersion") // Essential for Room testing - androidTestImplementation("androidx.test.ext:junit:$androidxTestExtJunitVersion") - androidTestImplementation("androidx.test.espresso:espresso-core:$espressoCoreVersion") - - // Coroutine test utilities (for runTest) - androidTestImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion") - - // Assertion library (Google Truth) - androidTestImplementation("com.google.truth:truth:$truthVersion") + implementation(libs.kotlin.stdlib) + + implementation(libs.material) + implementation(libs.oss.license) + implementation(libs.appcompat) + + implementation(libs.room.ktx) + ksp(libs.room.compiler) + + implementation(libs.coroutines.core) + implementation(libs.coroutines.android) + + implementation(libs.lifecycle.runtime) + // implementation(libs.lifecycle.viewmodel) + + // test + testImplementation(libs.junit) + testImplementation(libs.truth) + + androidTestImplementation(libs.room.testing) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) + androidTestImplementation(libs.coroutines.test) + androidTestImplementation(libs.truth) } diff --git a/build.gradle.kts b/build.gradle.kts index b982f053..92a2fdd2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,8 @@ plugins { - // These plugins are applied to the root project itself, often not needed for a typical Android app. - // If you need to define shared properties or tasks for all subprojects, you can do it here. - id("com.android.application") version "8.11.0" apply false - // id("com.android.library") version "8.11.0" apply false - id("org.jetbrains.kotlin.android") version "2.1.21" apply false - id("com.google.devtools.ksp") version "2.1.21-2.0.2" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.ksp) apply false + alias(libs.plugins.oss.licenses) apply false } // Allprojects block is common for setting up common repositories for all subprojects. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..01765b0b --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,50 @@ +[versions] +kotlin = "1.9.0" +material = "1.12.0" +oss-license = "17.2.1" +appcompat = "1.7.0" +room = "2.7.2" +# json = "20250517" +junit = "4.13.2" +truth = "1.4.4" +androidx-test-ext-junit = "1.2.1" +espresso-core = "3.6.1" +coroutines = "1.10.2" +lifecycle = "2.9.2" + +# Plugin versions +agp = "8.11.0" +kotlin-plugin = "2.1.21" +ksp = "2.1.21-2.0.2" +oss-license-plugin = "0.10.6" # latest safe version for oss-licenses-plugin + +[libraries] +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } + +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" } + +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" } + +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" } + +lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } +# lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } + +# json = { module = "org.json:json", version.ref = "json" } + +junit = { module = "junit:junit", version.ref = "junit" } +truth = { module = "com.google.truth:truth", version.ref = "truth" } +androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-test-ext-junit" } +espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso-core" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-plugin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +oss-licenses = { id = "com.google.android.gms.oss-licenses-plugin", version.ref = "oss-license-plugin" } From bd570feab1b688d62bedd6f92a4e59bf61942f90 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 15:18:09 +0530 Subject: [PATCH 06/13] refactor: improve naming --- .../jeeldobariya/passcodes/ui/PasswordManagerActivity.kt | 4 +--- .../kotlin/com/jeeldobariya/passcodes/utils/Controller.kt | 6 +++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 6cd42d7d..646879e9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -78,10 +78,8 @@ class PasswordManagerActivity : AppCompatActivity() { } binding.exportPasswordBtn.setOnClickListener { - Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() - lifecycleScope.launch(Dispatchers.IO) { - val csvDataExportBlob = controller.generateCsvDataExportString() + val csvDataExportBlob = controller.exportDataToCsvString() withContext(Dispatchers.Main) { exportData = csvDataExportBlob 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 495d4248..f7ede12b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -135,7 +135,7 @@ class Controller(context: Context) { } } - suspend fun generateCsvDataExportString(): String { + suspend fun exportDataToCsvString(): String { val header = "domain,username,password,notes\n" val passwords: List = getAllPasswords().first() @@ -146,4 +146,8 @@ class Controller(context: Context) { return header + rows } + + suspend fun importtDataFromCsvString(csvString: String) { + TODO("Under Development.....") + } } From c395414afd85398243277383ae6d13eaab26fc40 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Tue, 26 Aug 2025 16:39:47 +0530 Subject: [PATCH 07/13] feat: add a way to import passwords --- .../passcodes/ui/PasswordManagerActivity.kt | 65 +++++++++++++++++-- .../passcodes/utils/Controller.kt | 39 +++++++++-- app/src/main/res/values/strings.xml | 4 +- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 646879e9..4a881e2a 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -3,6 +3,7 @@ package com.jeeldobariya.passcodes.ui import android.content.Intent import android.view.View.GONE import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts @@ -25,7 +26,9 @@ class PasswordManagerActivity : AppCompatActivity() { private lateinit var controller: Controller private lateinit var exportCsvLauncher: ActivityResultLauncher - private var exportData: String? = null + private var tmpExportCSVData: String? = null + + private lateinit var importCsvLauncher: ActivityResultLauncher override fun onCreate(savedInstanceState: Bundle?) { CommonUtils.updateCurrTheme(this) @@ -40,14 +43,51 @@ class PasswordManagerActivity : AppCompatActivity() { controller = Controller(this) // Initialize the controller here + importCsvLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { 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 importCount: Int = controller.importtDataFromCsvString(CSVData) + + withContext(Dispatchers.Main) { + Toast.makeText( + this@PasswordManagerActivity, + getString(R.string.import_success, importCount), + Toast.LENGTH_SHORT + ).show() + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText( + this@PasswordManagerActivity, + getString(R.string.import_failed), + Toast.LENGTH_SHORT + ).show() + } + } + } + } + } + } + } + exportCsvLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { val uri = result.data?.data - if (uri != null && !exportData.isNullOrEmpty()) { + if (uri != null && !tmpExportCSVData.isNullOrEmpty()) { contentResolver.openOutputStream(uri)?.use { outputStream -> - outputStream.write(exportData!!.toByteArray()) + outputStream.write(tmpExportCSVData!!.toByteArray()) } Toast.makeText(this, getString(R.string.export_success), Toast.LENGTH_SHORT).show() } @@ -74,7 +114,7 @@ class PasswordManagerActivity : AppCompatActivity() { } binding.importPasswordBtn.setOnClickListener { - Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() + importCsvFilePicker() } binding.exportPasswordBtn.setOnClickListener { @@ -82,7 +122,7 @@ class PasswordManagerActivity : AppCompatActivity() { val csvDataExportBlob = controller.exportDataToCsvString() withContext(Dispatchers.Main) { - exportData = csvDataExportBlob + tmpExportCSVData = csvDataExportBlob exportCsvFilePicker() } } @@ -92,9 +132,20 @@ class PasswordManagerActivity : AppCompatActivity() { private fun exportCsvFilePicker() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) - type = "text/csv" + type = "text/comma-separated-values" putExtra(Intent.EXTRA_TITLE, "passwords.csv") } + exportCsvLauncher.launch(intent) } -} \ No newline at end of file + + private fun importCsvFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "text/comma-separated-values" + putExtra(Intent.EXTRA_TITLE, "passwords.csv") + } + + importCsvLauncher.launch(intent) + } +} 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 f7ede12b..f4e38564 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,8 @@ package com.jeeldobariya.passcodes.utils import android.content.Context +import android.util.Log +import android.widget.Toast import com.jeeldobariya.passcodes.database.MasterDatabase import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao @@ -10,11 +12,13 @@ import kotlinx.coroutines.flow.first 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(context: Context) { private val passwordsDao: PasswordsDao + private val CSVHEADER = "domain,username,password,notes" + init { // Initialize Room database and get the DAO instance val db = MasterDatabase.getDatabase(context) @@ -136,18 +140,41 @@ class Controller(context: Context) { } suspend fun exportDataToCsvString(): String { - val header = "domain,username,password,notes\n" - val passwords: List = getAllPasswords().first() val rows = passwords.joinToString("\n") { password -> "${password.domain},${password.username},${password.password},${password.notes}" } - return header + rows + return CSVHEADER + "\n" + rows } - suspend fun importtDataFromCsvString(csvString: String) { - TODO("Under Development.....") + suspend fun importtDataFromCsvString(csvString: String): Int { + val lines = csvString.lines().filter { it.isNotBlank() } + + if (lines.isEmpty() || lines[0] != CSVHEADER) { + throw InvalidImportFormat() + } + + var importedPasswordCount = 0 + + lines.drop(1).forEach { line -> + val cols = line.split(",") + + try { + savePasswordEntity( + domain = cols[0].trim(), + username = cols[1].trim(), + password = cols[2].trim(), + notes = cols[3].trim() + ) + + importedPasswordCount++ + } catch (e: InvalidInputException) { + e.printStackTrace() + } + } + + return importedPasswordCount } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 90cddf65..cc8f04c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,8 +84,8 @@ Something went wrong. Action discarded. Something Went Wrong: Invalid ID!! - - + Imported %1$d passwords + Failed to import CSV Passwords exported From 16afcc8e45ce0e64e89dab64f32dc21625a058ce Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 27 Aug 2025 14:19:44 +0530 Subject: [PATCH 08/13] feat: made a export data function --- .../com/jeeldobariya/passcodes/utils/Controller.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 f4e38564..64a275dd 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -17,7 +17,7 @@ class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : class Controller(context: Context) { private val passwordsDao: PasswordsDao - private val CSVHEADER = "domain,username,password,notes" + private val CSVHEADER = "name,url,username,password,notes" init { // Initialize Room database and get the DAO instance @@ -143,7 +143,7 @@ class Controller(context: Context) { val passwords: List = getAllPasswords().first() val rows = passwords.joinToString("\n") { password -> - "${password.domain},${password.username},${password.password},${password.notes}" + "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" } return CSVHEADER + "\n" + rows @@ -164,9 +164,9 @@ class Controller(context: Context) { try { savePasswordEntity( domain = cols[0].trim(), - username = cols[1].trim(), - password = cols[2].trim(), - notes = cols[3].trim() + username = cols[2].trim(), + password = cols[3].trim(), + notes = cols[4].trim() ) importedPasswordCount++ From 02c123c1609cf8b789b41f40be57e595d34873d8 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 27 Aug 2025 14:26:15 +0530 Subject: [PATCH 09/13] refactor: improve readability --- .../passcodes/ui/PasswordManagerActivity.kt | 2 +- .../com/jeeldobariya/passcodes/utils/Controller.kt | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 4a881e2a..b3a6dc75 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -56,7 +56,7 @@ class PasswordManagerActivity : AppCompatActivity() { lifecycleScope.launch(Dispatchers.IO) { if (CSVData != null) { try { - val importCount: Int = controller.importtDataFromCsvString(CSVData) + val importCount: Int = controller.importDataFromCsvString(CSVData) withContext(Dispatchers.Main) { Toast.makeText( 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 64a275dd..afbd774e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -1,8 +1,6 @@ package com.jeeldobariya.passcodes.utils import android.content.Context -import android.util.Log -import android.widget.Toast import com.jeeldobariya.passcodes.database.MasterDatabase import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.database.PasswordsDao @@ -17,14 +15,16 @@ class InvalidImportFormat(message: String = "Given Data Is In Invalid Format") : class Controller(context: Context) { private val passwordsDao: PasswordsDao - private val CSVHEADER = "name,url,username,password,notes" - init { // Initialize Room database and get the DAO instance val db = MasterDatabase.getDatabase(context) passwordsDao = db.passwordsDao } + companion object { + const val CSV_HEADER = "name,url,username,password,notes" + } + /** * Saves a new password entity into the database. * @return The rowId of the newly inserted row. @@ -146,13 +146,13 @@ class Controller(context: Context) { "${password.domain},https://local.${password.domain},${password.username},${password.password},${password.notes}" } - return CSVHEADER + "\n" + rows + return CSV_HEADER + "\n" + rows } - suspend fun importtDataFromCsvString(csvString: String): Int { + suspend fun importDataFromCsvString(csvString: String): Int { val lines = csvString.lines().filter { it.isNotBlank() } - if (lines.isEmpty() || lines[0] != CSVHEADER) { + if (lines.isEmpty() || lines[0] != CSV_HEADER) { throw InvalidImportFormat() } From 4f4a40a0d6e1d752324ff8a8228d2f3f719fd0cb Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 27 Aug 2025 18:10:50 +0530 Subject: [PATCH 10/13] feat: add a way to only import unique passwords --- .../passcodes/utils/Controller.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) 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 afbd774e..068632c3 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -76,14 +76,10 @@ class Controller(context: Context) { * Retrieves a password entity by username and domain. * @return The Password object if found. * @throws DatabaseOperationException if a database error occurs. - * @throws PasswordNotFoundException if the password is not found. */ - suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password { + suspend fun getPasswordByUsernameAndDomain(username: String, domain: String): Password? { return try { passwordsDao.getPasswordByUsernameAndDomain(username, domain) - ?: throw PasswordNotFoundException("Password for username '$username' and domain '$domain' not found.") - } catch (e: PasswordNotFoundException) { - throw e } catch (e: Exception) { e.printStackTrace() throw DatabaseOperationException("Error retrieving password by username and domain.", e) @@ -162,12 +158,24 @@ class Controller(context: Context) { val cols = line.split(",") try { - savePasswordEntity( - domain = cols[0].trim(), - username = cols[2].trim(), - password = cols[3].trim(), - notes = cols[4].trim() - ) + val password: Password? = passwordsDao.getPasswordByUsernameAndDomain(username = cols[2].trim(), domain = cols[0].trim()) + + if (password != null) { + updatePassword( + id = password.id, + domain = password.domain, + username = password.username, + password = cols[3].trim(), + notes = cols[4].trim() + ) + } else { + savePasswordEntity( + domain = cols[0].trim(), + username = cols[2].trim(), + password = cols[3].trim(), + notes = cols[4].trim() + ) + } importedPasswordCount++ } catch (e: InvalidInputException) { From e24dc50c77af75f5657765be61bbda10f13c4800 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 27 Aug 2025 18:16:21 +0530 Subject: [PATCH 11/13] feat: made destructive colors --- app/src/main/res/layout/activity_view_password.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_view_password.xml b/app/src/main/res/layout/activity_view_password.xml index f1231c0c..272b3a8b 100644 --- a/app/src/main/res/layout/activity_view_password.xml +++ b/app/src/main/res/layout/activity_view_password.xml @@ -87,10 +87,12 @@ android:layout_height="wrap_content" android:text="@string/update_password_button_text" android:textSize="14dp" /> - + Date: Wed, 27 Aug 2025 18:36:39 +0530 Subject: [PATCH 12/13] feat: add a clear data functionality --- .../passcodes/database/PasswordsDao.kt | 3 +++ .../passcodes/ui/SettingsActivity.kt | 11 +++++++- .../passcodes/utils/Controller.kt | 4 +++ app/src/main/res/layout/activity_settings.xml | 27 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 45 insertions(+), 1 deletion(-) 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 06ab4689..1c7ba6c9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/database/PasswordsDao.kt @@ -30,4 +30,7 @@ interface PasswordsDao { @Delete suspend fun deletePassword(password: Password): Int + + @Query("DELETE FROM passwords") + suspend fun clearAllPasswordData(): Int } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt index e83f3ef6..53ba7ac2 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt @@ -15,13 +15,16 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.FeatureFlagManager import androidx.core.content.edit +import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Constant +import com.jeeldobariya.passcodes.utils.Controller +import kotlinx.coroutines.launch class SettingsActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsBinding - + private lateinit var controller: Controller // List of available themes to cycle through private val THEMES = listOf( @@ -42,6 +45,8 @@ class SettingsActivity : AppCompatActivity() { binding.switchLatestFeatures.isChecked = FeatureFlagManager.get(this).latestFeaturesEnabled + controller = Controller(this) // Initialize the controller here + // Add event onclick listener addOnClickListenerOnButton() @@ -98,5 +103,9 @@ class SettingsActivity : AppCompatActivity() { FeatureFlagManager.get(this).latestFeaturesEnabled = isChecked Toast.makeText(this@SettingsActivity, getString(R.string.future_feat_clause) + isChecked.toString(), Toast.LENGTH_SHORT).show() } + + binding.clearAllDataBtn.setOnClickListener { v -> + lifecycleScope.launch { controller.clearAllData() } + } } } 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 068632c3..e264fb71 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Controller.kt @@ -135,6 +135,10 @@ class Controller(context: Context) { } } + suspend fun clearAllData() { + passwordsDao.clearAllPasswordData() + } + suspend fun exportDataToCsvString(): String { val passwords: List = getAllPasswords().first() diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index d5820a93..c0daf6eb 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -118,4 +118,31 @@ android:layout_margin="8dp"/> + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc8f04c7..c718574a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Delete Password Import Password Export Password + Clear All Data Check Security Settings Toggle Theme From a9a834800116e2cb336d07e989147d8620ccdc41 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Wed, 27 Aug 2025 18:48:15 +0530 Subject: [PATCH 13/13] feat: add a preview label --- .../com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt | 4 ++++ .../com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index b3a6dc75..393f8957 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -114,10 +114,14 @@ class PasswordManagerActivity : AppCompatActivity() { } binding.importPasswordBtn.setOnClickListener { + Toast.makeText(this@PasswordManagerActivity, getString(R.string.preview_feature), Toast.LENGTH_LONG).show() + importCsvFilePicker() } binding.exportPasswordBtn.setOnClickListener { + Toast.makeText(this@PasswordManagerActivity, getString(R.string.preview_feature), Toast.LENGTH_LONG).show() + lifecycleScope.launch(Dispatchers.IO) { val csvDataExportBlob = controller.exportDataToCsvString() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 7dc8cdc4..536c3471 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -97,7 +97,7 @@ class ViewPasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { binding.copyPasswordBtn.setOnClickListener { - Toast.makeText(this, getString(R.string.future_feat_clause), Toast.LENGTH_SHORT).show() + Toast.makeText(this, getString(R.string.preview_feature), Toast.LENGTH_SHORT).show() val confirmDialog = AlertDialog.Builder(this@ViewPasswordActivity) .setTitle(R.string.copy_password_dialog_title) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c718574a..1c50c2a6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,6 +76,7 @@ Restart App Require. This feature is currently under development. + This is preview feature.. Might have Bugs... 404: Not found. Warning: Please fill out the form first. Failed: Please try again.