From de83c621eee8a4835be8b904d281e6d74432d9f7 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 24 May 2026 18:30:03 +0530 Subject: [PATCH 1/3] chore: cleanup unwanted native android files Signed-off-by: Jeel Dobariya --- .../passcodes/oldui/AboutUsActivity.kt | 59 ---- .../passcodes/oldui/MainActivity.kt | 117 ------- .../about_screen/ClassicalAboutScreen.kt | 291 ------------------ app/src/main/res/layout/activity_about_us.xml | 288 ----------------- app/src/main/res/layout/activity_main.xml | 71 ----- app/src/main/res/layout/activity_settings.xml | 203 ------------ .../domain/usecases/CheckForUpdateUseCase.kt | 92 ------ core/src/main/res/values-night/themes.xml | 198 ------------ core/src/main/res/values/themes.xml | 199 ------------ .../di/PasswordManagerModule.kt | 77 ----- .../usecases/ExportPasswordCSVUseCase.kt | 41 --- .../usecases/ImportPasswordCSVUseCase.kt | 79 ----- .../oldui/PasswordManagerActivity.kt | 124 -------- .../ClassicalPasswordManagerScreen.kt | 142 --------- .../password_manager/PasswordManagerAction.kt | 9 - .../PasswordManagerViewModel.kt | 52 ---- .../ClassicalViewPasswordScreen.kt | 102 ------ .../res/layout/activity_password_manager.xml | 56 ---- .../res/layout/activity_view_password.xml | 186 ----------- .../src/main/res/values/strings.xml | 52 ---- 20 files changed, 2438 deletions(-) delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt delete mode 100644 app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt delete mode 100644 app/src/main/res/layout/activity_about_us.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_settings.xml delete mode 100644 core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt delete mode 100644 core/src/main/res/values-night/themes.xml delete mode 100644 core/src/main/res/values/themes.xml delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/PasswordManagerModule.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerAction.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerViewModel.kt delete mode 100644 password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt delete mode 100644 password_manager/src/main/res/layout/activity_password_manager.xml delete mode 100644 password_manager/src/main/res/layout/activity_view_password.xml delete mode 100644 password_manager/src/main/res/values/strings.xml diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt deleted file mode 100644 index b9f23707..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/AboutUsActivity.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.jeeldobariya.passcodes.oldui - -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.core.net.toUri -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 - -class AboutUsActivity : AppCompatActivity() { - - private lateinit var binding: ActivityAboutUsBinding - - override fun onCreate(savedInstanceState: Bundle?) { - runBlocking { - setTheme(appDatastore.data.first().theme) - } - super.onCreate(savedInstanceState) - binding = ActivityAboutUsBinding.inflate(layoutInflater) - setContentView(binding.root) - - binding.toolbar.setNavigationOnClickListener { - onBackPressedDispatcher.onBackPressed() - } - - // Set up button click listeners - setupButtonListeners() - } - - private fun openBrowser(url: String) { - val browserIntent = Intent(Intent.ACTION_VIEW, url.toUri()) - startActivity(browserIntent) - } - - private fun setupButtonListeners() { - binding.cardSecurityGuidelines.setOnClickListener { - openBrowser(Constant.SECURITY_GUIDE_URL) - } - - binding.cardReleaseNotes.setOnClickListener { - openBrowser(Constant.RELEASE_NOTE_URL) - } - - binding.cardLicense.setOnClickListener { - startActivity(Intent(this, LicenseActivity::class.java)) - } - - binding.cardReportBug.setOnClickListener { - openBrowser(Constant.REPORT_BUG_URL) - } - - binding.cardTelegramCommunity.setOnClickListener { - openBrowser(Constant.DISCORD_COMMUNITY_URL) - } - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt deleted file mode 100644 index 51d5c021..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/oldui/MainActivity.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.jeeldobariya.passcodes.oldui - -import android.content.Intent -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.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.domain.usecases.UpdateCheckingResult -import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore -import com.jeeldobariya.passcodes.databinding.ActivityMainBinding -import com.jeeldobariya.passcodes.password_manager.oldui.PasswordManagerActivity -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 - -class MainActivity : AppCompatActivity() { - - // private lateinit var permissionsHandle: Permissions - - private lateinit var binding: ActivityMainBinding - - private val checkForUpdateUseCase: CheckForUpdateUseCase by inject() - - override fun onCreate(savedInstanceState: Bundle?) { - runBlocking { - setTheme(appDatastore.data.first().theme) - } - super.onCreate(savedInstanceState) - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - lifecycleScope.launch { - val result = checkForUpdateUseCase( - currentVersion = BuildConfig.VERSION_NAME, - githubReleaseApiUrl = Constant.GITHUB_RELEASE_API_URL, - discordUrl = Constant.DISCORD_COMMUNITY_URL - ) - - when (result) { - UpdateCheckingResult.ON_UNOFFICIAL_RELEASE, - UpdateCheckingResult.ON_PRE_RELEASE -> { - Toast.makeText(this@MainActivity, "You are on a Unofficial Release", Toast.LENGTH_LONG).show() - Toast.makeText(this@MainActivity, "Update as soon as possible!!", Toast.LENGTH_LONG).show() - } - else -> Log.e("UpdateChecking", result.toString()) - } - } - - // Add event onclick listener - addOnClickListenerOnButton() - - // Make window fullscreen - WindowCompat.setDecorFitsSystemWindows(window, false) - - /* Comment the code as permission is not need to write into app data dir. - // Check and request permission when the app is first opened - permissionsHandle = Permissions(this) - if (!permissionsHandle.checkPermission()) permissionsHandle.requestPermission() - */ - - runBlocking { - if (featureFlagsDatastore.data.first().isPreviewLayoutEnabled) { - Intent( - this@MainActivity, - com.jeeldobariya.passcodes.MainActivity::class.java - ).also { - startActivity(it) - finish() - } - } - } - } - - /* Comment the code as permission is not need to write into app data dir. - override fun onRequestPermissionsResult( - requestCode: Int, permissions: Array, grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == Permissions.PERMISSION_REQUEST_CODE) { - if (permissionsHandle.isPermissionGranted(grantResults)) { - // Permission has been granted - Toast.makeText(this, getString(R.string.permission_granted), Toast.LENGTH_LONG).show() - } else { - // Permission not granted - Toast.makeText(this, getString(R.string.permission_denied), Toast.LENGTH_LONG).show() - } - } - } - */ - - // Added all the onclick event listeners - private fun addOnClickListenerOnButton() { - binding.passwordManagerBtn.setOnClickListener { - val passwordManagerIntent = Intent(this, PasswordManagerActivity::class.java) - startActivity(passwordManagerIntent) - } - - binding.settingBtn.setOnClickListener { - val settingIntent = Intent(this, SettingsActivity::class.java) - startActivity(settingIntent) - } - - binding.aboutUsBtn.setOnClickListener { - val aboutUsIntent = Intent(this, AboutUsActivity::class.java) - startActivity(aboutUsIntent) - } - } -} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt deleted file mode 100644 index 7bb7db84..00000000 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/presentation/about_screen/ClassicalAboutScreen.kt +++ /dev/null @@ -1,291 +0,0 @@ -package com.jeeldobariya.passcodes.presentation.about_screen - -import android.content.Intent -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.core.net.toUri -import com.jeeldobariya.passcodes.Constant -import com.jeeldobariya.passcodes.R -import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme - - -@Composable -fun ClassicalAboutScreen() { - ClassicalAboutScreenContent() -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -private fun ClassicalAboutScreenContent() { - Scaffold( - topBar = { - TopAppBar( - title = { Text("About Us") }, - navigationIcon = { - IconButton(onClick = {}) { - Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = "") - } - } - ) - } - ) { padding -> - LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(padding), - contentPadding = PaddingValues(12.dp) - ) { - item { - Text( - text = stringResource(R.string.textview_app_description), - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.padding(bottom = 16.dp) - ) - } - - item { - Text( - text = stringResource(R.string.textview_app_warning), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(bottom = 24.dp) - ) - } - - // Grid Section - item { - AboutGridSection() - } - - item { - Spacer(modifier = Modifier.height(24.dp)) - } - - item { - Text( - text = stringResource(R.string.label_contributor), - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(bottom = 16.dp) - ) - } - - item { - ContributorCard(stringResource(R.string.developer_name)) - } - - item { - ContributorCard(stringResource(R.string.code_maintainer)) - } - - item { - ContributorCard(stringResource(R.string.co_developer)) - } - } - } -} - -@Composable -private fun AboutGridSection() { - val context = LocalContext.current - - Column( - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - - Row( - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - AboutCard( - modifier = Modifier.weight(1f), - icon = painterResource(R.drawable.ic_security), - text = stringResource(R.string.view_security_guidelines_button_text), - onClick = { - Intent(Intent.ACTION_VIEW, Constant.SECURITY_GUIDE_URL.toUri()).also { - context.startActivity(it) - } - } - ) - - AboutCard( - modifier = Modifier.weight(1f), - icon = painterResource(R.drawable.ic_history), - text = stringResource(R.string.view_release_notes_button_text), - onClick = { - Intent(Intent.ACTION_VIEW, Constant.RELEASE_NOTE_URL.toUri()).also { - context.startActivity(it) - } - } - ) - } - - Row( - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - AboutCard( - modifier = Modifier.weight(1f), - icon = painterResource(R.drawable.ic_article), - text = stringResource(R.string.view_license_button_text), - onClick = { - /* TODO: Add License Activity Link */ - - Intent( - Intent.ACTION_VIEW, - "https://passcodesapp.github.io/Passcodes-Docs/LICENSE/".toUri() - ).also { - context.startActivity(it) - } - } - ) - - AboutCard( - modifier = Modifier.weight(1f), - icon = painterResource(R.drawable.ic_bug_report), - text = stringResource(R.string.view_report_bug_text), - onClick = { - Intent(Intent.ACTION_VIEW, Constant.REPORT_BUG_URL.toUri()).also { - context.startActivity(it) - } - } - ) - } - - DiscordCard( - onClick = { - Intent(Intent.ACTION_VIEW, Constant.DISCORD_COMMUNITY_URL.toUri()).also { - context.startActivity(it) - } - } - ) - } -} - -@Composable -private fun AboutCard( - modifier: Modifier = Modifier, - icon: Painter, - text: String, - onClick: () -> Unit -) { - Card( - onClick = onClick, - shape = RoundedCornerShape(16.dp), - modifier = modifier - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Image( - painter = icon, - contentDescription = text, - modifier = Modifier - .size(32.dp) - .padding(bottom = 8.dp) - ) - - Text( - text = text, - style = MaterialTheme.typography.labelLarge, - textAlign = TextAlign.Center - ) - } - } -} - -@Composable -private fun DiscordCard( - text: String = "Join Discord", - onClick: () -> Unit -) { - Card( - onClick = onClick, - shape = RoundedCornerShape(16.dp), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.secondaryContainer - ) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Image( - painter = painterResource(R.drawable.ic_send), - contentDescription = text, - modifier = Modifier - .size(96.dp) - .padding(bottom = 8.dp) - ) - - Text( - text = text, - style = MaterialTheme.typography.labelLarge, - textAlign = TextAlign.Center - ) - } - } -} - -@Composable -private fun ContributorCard(text: String) { - Card( - shape = RoundedCornerShape(16.dp), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.tertiaryContainer - ), - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 8.dp) - ) { - Text( - text = text, - modifier = Modifier.padding(16.dp), - color = MaterialTheme.colorScheme.tertiary, - style = MaterialTheme.typography.bodyLarge - ) - } -} - -@Preview -@Composable -private fun ClassicalAboutScreenPreview() { - PasscodesTheme { - ClassicalAboutScreenContent() - } -} diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml deleted file mode 100644 index ec33517b..00000000 --- a/app/src/main/res/layout/activity_about_us.xml +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 3e3276f4..00000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml deleted file mode 100644 index 13c6be72..00000000 --- a/app/src/main/res/layout/activity_settings.xml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index 29e9f4aa..00000000 --- a/core/src/main/kotlin/com/jeeldobariya/passcodes/core/domain/usecases/CheckForUpdateUseCase.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.jeeldobariya.passcodes.core.domain.usecases - -import android.content.Context -import android.widget.Toast -import com.jeeldobariya.passcodes.core.domain.utils.SemVerUtils -import io.ktor.client.HttpClient -import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsText -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ensureActive -import kotlinx.coroutines.withContext -import kotlin.coroutines.CoroutineContext - -enum class UpdateCheckingResult { - ALREADY_ON_LATEST_RELEASE, - UPDATE_AVAILABLE, - ON_PRE_RELEASE, - ON_UNOFFICIAL_RELEASE, - ERROR -} - -class CheckForUpdateUseCase( - private val context: Context, - private val client: HttpClient, - private val dispatcher: CoroutineContext = Dispatchers.IO -) { - suspend operator fun invoke( - currentVersion: String, - githubReleaseApiUrl: String, - discordUrl: String - ): UpdateCheckingResult = withContext(dispatcher) { - val currNormalizedVersion = SemVerUtils.normalize(currentVersion) - - try { - val response = client.get(githubReleaseApiUrl) - val body = response.bodyAsText() - val releases = SemVerUtils.parseReleases(body) - - var userReleaseFound = false - var latestStable: String? = null - - for (release in releases) { - if (release.draft) continue - - if (release.tag == currNormalizedVersion) { - userReleaseFound = true - if (release.prerelease) { - showToast("⚠️ You are using a PRE-RELEASE ($currNormalizedVersion). Not safe for use!!") - showToast("Join Discord @ ($discordUrl)") - - return@withContext UpdateCheckingResult.ON_PRE_RELEASE - } - } - - if (!release.prerelease) { - if (latestStable == null || - SemVerUtils.compare(release.tag, latestStable) > 0 - ) { - latestStable = release.tag - } - } - } - - latestStable?.let { - if (SemVerUtils.compare(currNormalizedVersion, it) < 0) { - showToast("New Update available: $it... Visit our website...") - return@withContext UpdateCheckingResult.UPDATE_AVAILABLE - } - } - - if (!userReleaseFound) { - showToast("⚠️ Version ($currNormalizedVersion) is not an official releases on github...") - showToast("Join Discord @ ($discordUrl)") - - return@withContext UpdateCheckingResult.ON_UNOFFICIAL_RELEASE - } - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - e.printStackTrace() - return@withContext UpdateCheckingResult.ERROR - } - - return@withContext UpdateCheckingResult.ALREADY_ON_LATEST_RELEASE - } - - private suspend fun showToast(message: String) = withContext(Dispatchers.Main) { - ensureActive() - Toast.makeText(context, message, Toast.LENGTH_LONG).show() - } -} diff --git a/core/src/main/res/values-night/themes.xml b/core/src/main/res/values-night/themes.xml deleted file mode 100644 index c6e9f4ef..00000000 --- a/core/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/src/main/res/values/themes.xml b/core/src/main/res/values/themes.xml deleted file mode 100644 index 18ff5d98..00000000 --- a/core/src/main/res/values/themes.xml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/PasswordManagerModule.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/PasswordManagerModule.kt deleted file mode 100644 index 6d98bb1a..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/di/PasswordManagerModule.kt +++ /dev/null @@ -1,77 +0,0 @@ -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 -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.password_manager.PasswordManagerViewModel -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 org.koin.android.ext.koin.androidContext -import org.koin.core.module.dsl.viewModel -import org.koin.dsl.module - -val passwordManagerModule = module { - - single { - PasswordRepository(get()) - } - - factory { - ImportPasswordCSVUseCase(androidContext(), get()) - } - - factory { - ExportPasswordCSVUseCase(androidContext(), get()) - } - - factory { - StorePasswordUseCase(get()) - } - - factory { - RetrievePasswordUseCase(get()) - } - - factory { - RetrieveAllPasswordUseCase(get()) - } - - factory { - EditPasswordUseCase(get()) - } - - factory { - DeletePasswordUseCase(get()) - } - - viewModel { - PasswordManagerViewModel( - retrieveAllPasswordUseCase = get(), - importPasswordCSVUseCase = get(), - exportPasswordCSVUseCase = get() - ) - } - - viewModel { - SavePasswordViewModel(get()) - } - - viewModel { - LoadPasswordViewModel(get()) - } - - viewModel { - ViewPasswordViewModel(get(), get()) - } - - viewModel { - UpdatePasswordViewModel(get(), get()) - } -} 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 deleted file mode 100644 index 76fdab35..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ExportPasswordCSVUseCase.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.domain.usecases - -import android.content.Context -import android.net.Uri -import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository -import org.apache.commons.csv.CSVFormat -import org.apache.commons.csv.CSVPrinter -import java.io.OutputStreamWriter - -class ExportPasswordCSVUseCase( - val context: Context, - val passwordRepository: PasswordRepository -) { - suspend operator fun invoke(exportFileUri: Uri) { - val outputStream = context.contentResolver.openOutputStream(exportFileUri) - ?: throw Exception("Failed to open output stream") - - val csvFormat = CSVFormat.DEFAULT.builder() - .setHeader("name", "url", "username", "password", "notes") - .get() - - OutputStreamWriter(outputStream).use { writer -> - CSVPrinter(writer, csvFormat).use { csvPrinter -> - val passwords = passwordRepository.getAllPasswords() - - for (password in passwords) { - val domainClean = password.domain.trim() - - val url = "https://local.$domainClean" - val username = password.username.trim() - val passwordString = password.password - val notes = password.notes.trim() - - csvPrinter.printRecord(domainClean, url, username, passwordString, notes) - } - - csvPrinter.flush() - } - } - } -} 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 deleted file mode 100644 index e3036c7e..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/domain/usecases/ImportPasswordCSVUseCase.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.domain.usecases - -import android.content.Context -import android.net.Uri -import com.jeeldobariya.passcodes.password_manager.data.repository.PasswordRepository -import com.jeeldobariya.passcodes.password_manager.domain.modals.PasswordModal -import org.apache.commons.csv.CSVFormat -import org.apache.commons.csv.CSVParser -import java.io.InputStreamReader - -class ImportPasswordCSVUseCase( - val context: Context, - val passwordRepository: PasswordRepository -) { - suspend operator fun invoke(importFileUri: Uri) { - val inputStream = context.contentResolver.openInputStream(importFileUri) - ?: throw Exception("Failed to open file stream") - - val csvFormat = CSVFormat.DEFAULT.builder() - .setHeader() - .setSkipHeaderRecord(true) - .setIgnoreSurroundingSpaces(true) - .get() - - InputStreamReader(inputStream).use { reader -> - val parser: CSVParser = csvFormat.parse(reader) - - // 1. Strict Header Validation - // Google expects keys: "url", "username", "password", "notes" (sometimes "name") - val headerMap = parser.headerMap - if (!headerMap.containsKey("url") || !headerMap.containsKey("username") || !headerMap.containsKey("password")) { - throw Exception("The given CSV file has an incorrect header format. Missing required columns.") - } - - // 2. Safely process row entries - for (record in parser) { - val url = record.get("url")?.trim().orEmpty() - val name = - if (headerMap.containsKey("name")) record.get("name")?.trim().orEmpty() else "" - val username = record.get("username")?.trim().orEmpty() - val passwordString = record.get("password") - .orEmpty() // Passwords shouldn't be trimmed to preserve spacing intent - val notes = if (headerMap.containsKey("notes")) record.get("notes")?.trim() - .orEmpty() else "" - - val chosenDomain = name.ifBlank { url } - - // Skip the row if it lacks domain, username, or password - if (chosenDomain.isBlank() || username.isBlank() || passwordString.isEmpty()) { - continue - } - - // 3. Database Sync Strategy (Check for duplicate) - val existingPassword: PasswordModal? = - passwordRepository.getPasswordByUsernameAndDomain( - username = username, - domain = chosenDomain - ) - - if (existingPassword != null) { - passwordRepository.updatePassword( - id = existingPassword.id, - domain = existingPassword.domain, - username = existingPassword.username, - password = passwordString, - notes = notes - ) - } else { - passwordRepository.savePasswordEntity( - domain = chosenDomain, - username = username, - password = passwordString, - notes = notes - ) - } - } - } - } -} 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 deleted file mode 100644 index 6c534cc5..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/oldui/PasswordManagerActivity.kt +++ /dev/null @@ -1,124 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.oldui - -import android.content.Intent -import android.os.Bundle -import android.widget.Toast -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.datastore.appDatastore -import com.jeeldobariya.passcodes.password_manager.R -import com.jeeldobariya.passcodes.password_manager.databinding.ActivityPasswordManagerBinding -import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.PasswordManagerAction -import com.jeeldobariya.passcodes.password_manager.presentation.password_manager.PasswordManagerViewModel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import org.koin.androidx.viewmodel.ext.android.viewModel -import kotlin.getValue - - -class PasswordManagerActivity : AppCompatActivity() { - - private val viewModel: PasswordManagerViewModel by viewModel() - - private lateinit var binding: ActivityPasswordManagerBinding - - private val exportCsvLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == RESULT_OK) { - val uri = result.data?.data - requireNotNull(uri) - - Toast.makeText(this@PasswordManagerActivity, "Exporting...", Toast.LENGTH_SHORT).show() - - viewModel.onAction(PasswordManagerAction.OnExportGooglePassword(uri)) - } else { - Toast.makeText(this@PasswordManagerActivity, "Something went wrong...", Toast.LENGTH_SHORT).show() - } - } - - private val importCsvLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == RESULT_OK) { - val uri = result.data?.data - requireNotNull(uri) - - Toast.makeText(this@PasswordManagerActivity, "Importing...", Toast.LENGTH_SHORT).show() - - viewModel.onAction(PasswordManagerAction.OnImportGooglePassword(uri)) - } else { - Toast.makeText(this@PasswordManagerActivity, "Something went wrong...", Toast.LENGTH_SHORT).show() - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - runBlocking { - setTheme(appDatastore.data.first().theme) - } - super.onCreate(savedInstanceState) - binding = ActivityPasswordManagerBinding.inflate(layoutInflater) - setContentView(binding.root) - - // Add event onclick listener - addOnClickListenerOnButton(binding) - - // Make window fullscreen - WindowCompat.setDecorFitsSystemWindows(window, false) - } - - // Added all the onclick event listeners - private fun addOnClickListenerOnButton(binding: ActivityPasswordManagerBinding) { - binding.savePasswordBtn.setOnClickListener { - val savePasswordIntent = Intent(this, SavePasswordActivity::class.java) - startActivity(savePasswordIntent) - } - - binding.loadPasswordBtn.setOnClickListener { - val loadPasswordIntent = Intent(this, LoadPasswordActivity::class.java) - startActivity(loadPasswordIntent) - } - - 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.Main) { - exportCsvFilePicker() - } - } - } - - private fun exportCsvFilePicker() { - val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - setType("text/comma-separated-values") - putExtra(Intent.EXTRA_TITLE, "passwords.csv") - } - - exportCsvLauncher.launch(intent) - } - - private fun importCsvFilePicker() { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - setType("text/comma-separated-values") - putExtra(Intent.EXTRA_TITLE, "passwords.csv") - } - - importCsvLauncher.launch(intent) - } -} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt deleted file mode 100644 index bb30dd4c..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/ClassicalPasswordManagerScreen.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.presentation.password_manager - -import android.content.Intent -import android.widget.Toast -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.jeeldobariya.passcodes.core.navigation.Route -import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme -import com.jeeldobariya.passcodes.password_manager.R -import org.koin.compose.viewmodel.koinViewModel - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun ClassicalPasswordManagerScreen(navigateTo: (Route) -> Unit, viewModel: PasswordManagerViewModel = koinViewModel()) { - val context = LocalContext.current - - // 1. Setup the Import File Picker Launcher - val importLauncher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.StartActivityForResult() - ) { result -> - val uri = result.data?.data - requireNotNull(uri) - - if (result.resultCode == android.app.Activity.RESULT_OK) { - Toast.makeText(context, "Importing...", Toast.LENGTH_SHORT).show() - viewModel.onAction(PasswordManagerAction.OnImportGooglePassword(uri)) - } else { - Toast.makeText(context, "Something went wrong...", Toast.LENGTH_SHORT).show() - } - } - - // 2. Setup the Export Document Picker Launcher - val exportLauncher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.StartActivityForResult() - ) { result -> - val uri = result.data?.data - requireNotNull(uri) - - if (result.resultCode == android.app.Activity.RESULT_OK) { - Toast.makeText(context, "Exporting...", Toast.LENGTH_SHORT).show() - viewModel.onAction(PasswordManagerAction.OnExportGooglePassword(uri)) - } else { - Toast.makeText(context, "Something went wrong...", Toast.LENGTH_SHORT).show() - } - } - - ClassicalPasswordManagerScreenContent( - navigateTo = navigateTo, - onImportClicked = { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - setType("text/comma-separated-values") - putExtra(Intent.EXTRA_TITLE, "passwords.csv") - } - - importLauncher.launch(intent) - }, - onExportClicked = { - val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - setType("text/comma-separated-values") - putExtra(Intent.EXTRA_TITLE, "passwords.csv") - } - - exportLauncher.launch(intent) - } - ) -} - -@Composable -private fun ClassicalPasswordManagerScreenContent( - navigateTo: (Route) -> Unit, - onImportClicked: () -> Unit, - onExportClicked: () -> Unit -) { - Scaffold( - modifier = Modifier.fillMaxSize() - ) { paddingValue -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValue) - .padding(12.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text(stringResource(R.string.textview_passwordmanager_headline), fontSize = 36.sp, textAlign = TextAlign.Center) - - Spacer(modifier = Modifier.padding(8.dp)) - - Button(onClick = { - navigateTo(Route.SavePassword) - }) { - Text(stringResource(R.string.save_password_button_text)) - } - - Button(onClick = { - navigateTo(Route.LoadPassword) - }) { - Text(stringResource(R.string.load_password_button_text)) - } - - OutlinedButton(onClick = { - onImportClicked() - }) { - Text(stringResource(R.string.import_password_button_text)) - } - OutlinedButton(onClick = { - onExportClicked() - }) { - Text(stringResource(R.string.export_password_button_text)) - } - } - } -} - -@Preview -@Composable -private fun ClassicalPasswordManagerScreenPreview() { - PasscodesTheme { - ClassicalPasswordManagerScreenContent(navigateTo = {}, {}, {}) - } -} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerAction.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerAction.kt deleted file mode 100644 index bc99584a..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerAction.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.presentation.password_manager - -import android.net.Uri - -sealed interface PasswordManagerAction { - data object RefreshPassword : PasswordManagerAction - data class OnImportGooglePassword(val fileUri: Uri) : PasswordManagerAction - data class OnExportGooglePassword(val fileUri: Uri) : PasswordManagerAction -} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerViewModel.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerViewModel.kt deleted file mode 100644 index c597009d..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/password_manager/PasswordManagerViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.presentation.password_manager - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -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 kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch - -class PasswordManagerViewModel( - var retrieveAllPasswordUseCase: RetrieveAllPasswordUseCase, - val importPasswordCSVUseCase: ImportPasswordCSVUseCase, - val exportPasswordCSVUseCase: ExportPasswordCSVUseCase, -) : ViewModel() { - - private val _state = MutableStateFlow(PasswordManagerState()) - val state = _state.asStateFlow() - - fun onAction(action: PasswordManagerAction) { - when (action) { - PasswordManagerAction.RefreshPassword -> { - refreshData() - } - - is PasswordManagerAction.OnImportGooglePassword -> { - viewModelScope.launch(Dispatchers.IO) { - importPasswordCSVUseCase(action.fileUri) - } - } - - is PasswordManagerAction.OnExportGooglePassword -> { - viewModelScope.launch(Dispatchers.IO) { - exportPasswordCSVUseCase(action.fileUri) - } - } - } - } - - private fun refreshData() { - viewModelScope.launch { - _state.update { - PasswordManagerState( - passwordEntityList = retrieveAllPasswordUseCase() - ) - } - } - } -} diff --git a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt b/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt deleted file mode 100644 index 6097be6e..00000000 --- a/password_manager/src/main/kotlin/com/jeeldobariya/passcodes/password_manager/presentation/view_password/ClassicalViewPasswordScreen.kt +++ /dev/null @@ -1,102 +0,0 @@ -package com.jeeldobariya.passcodes.password_manager.presentation.view_password - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -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.core.navigation.Route -import com.jeeldobariya.passcodes.design_system.theme.PasscodesTheme -import org.koin.compose.viewmodel.koinViewModel - - -@Composable -fun ClassicalViewPasswordScreen( - passwordId: Int, - navigateTo: (Route) -> Unit, - viewmodel: ViewPasswordViewModel = koinViewModel() -) { - viewmodel.onAction(ViewPasswordAction.LoadPassword(passwordId)) - - val state by viewmodel.state.collectAsState() - - // TODO: make independent from passwordId & navigateTo - ClassicalViewPasswordScreenContent(passwordId, state, viewmodel::onAction, navigateTo) -} - -@Composable -private fun ClassicalViewPasswordScreenContent( - passwordId: Int, - state: ViewPasswordState, - onAction: (ViewPasswordAction) -> Unit, - navigateTo: (Route) -> Unit -) { - Scaffold { paddingValues -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text("View Password") - - Spacer(modifier = Modifier.padding(16.dp)) - - Column( - modifier = Modifier.padding(4.dp), - verticalArrangement = Arrangement.spacedBy(2.dp) - ) { - Text("Domain: ${state.domain}", fontSize = 18.sp) - Text("Username: ${state.username}", fontSize = 18.sp) - Text("Password: ${state.password}", fontSize = 18.sp) - Text("Notes: ${state.notes}", fontSize = 18.sp) - Text("Url: ${state.url}", fontSize = 18.sp) - Text("LastUpdateAt: ${state.lastUpdatedAt}", fontSize = 18.sp) - } - - Spacer(modifier = Modifier.padding(8.dp)) - - Button( - onClick = { - navigateTo(Route.UpdatePassword(passwordId)) - } - ) { - Text("Update Password") - } - - Button( - onClick = { - onAction(ViewPasswordAction.DeletePasswordAction) - /* TODO: Navigate Back */ - } - ) { - Text("Delete Password") - } - } - } -} - -@Preview -@Composable -private fun ClassicalViewPasswordScreenPreview() { - PasscodesTheme { - ClassicalViewPasswordScreenContent( - passwordId = 0, - state = ViewPasswordState(), - onAction = {}, - navigateTo = {} - ) - } -} diff --git a/password_manager/src/main/res/layout/activity_password_manager.xml b/password_manager/src/main/res/layout/activity_password_manager.xml deleted file mode 100644 index 6c72258c..00000000 --- a/password_manager/src/main/res/layout/activity_password_manager.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/password_manager/src/main/res/layout/activity_view_password.xml b/password_manager/src/main/res/layout/activity_view_password.xml deleted file mode 100644 index fc3eb2f3..00000000 --- a/password_manager/src/main/res/layout/activity_view_password.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/password_manager/src/main/res/values/strings.xml b/password_manager/src/main/res/values/strings.xml deleted file mode 100644 index edb94c6e..00000000 --- a/password_manager/src/main/res/values/strings.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - Domain - The name of the website or domain associated - Username - Password - Notes - URL - Last Updated - 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 - Delete Password - Import Goggle-Password - Export Goggle-Password - - - Password Manager - Load Password - Save Password - View Password - Update Password - - - ID: - Domain: - Username: - Password: - Notes: - Last Updated: - - - - 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 7763017d1a7004062ea8014942bbce3945426c34 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 24 May 2026 18:33:09 +0530 Subject: [PATCH 2/3] ci: improve codeql Signed-off-by: Jeel Dobariya --- .github/workflows/codeql.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4555263a..3b410d91 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,6 @@ jobs: fail-fast: false matrix: language: - - actions - javascript-typescript steps: From 2e14c2654226a9113fe81e1b193f232d31ccde71 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 24 May 2026 18:35:55 +0530 Subject: [PATCH 3/3] chore: update README.md Signed-off-by: Jeel Dobariya --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index be920be4..6e6e04b4 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,18 @@ in `PasscodesApp/Passcodes-Docs`. ## Building The App +1. Install Dependency + +```bash +npm install +``` + +2. Use Expo Go. (prototyping) + +```bash +npm start +``` +
Deperacted Stuff Bro!!!