diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagManager.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagManager.kt index e4dcf6c1..1bd2445b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagManager.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/flags/FeatureFlagManager.kt @@ -2,18 +2,16 @@ package com.jeeldobariya.passcodes.flags import android.content.Context import androidx.core.content.edit +import com.jeeldobariya.passcodes.utils.Constant class FeatureFlagManager private constructor(context: Context) { - private val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + private val prefs = context.getSharedPreferences(Constant.FEATURE_FLAGS_PREFS_NAME, Context.MODE_PRIVATE) var latestFeaturesEnabled: Boolean - get() = prefs.getBoolean(KEY_LATEST_FEATURES, false) - set(value) { prefs.edit { putBoolean(KEY_LATEST_FEATURES, value) } } + get() = prefs.getBoolean(Constant.LATEST_FEATURES_KEY, false) + set(value) { prefs.edit { putBoolean(Constant.LATEST_FEATURES_KEY, value) } } companion object { - private const val PREFS_NAME = "feature_flags" - private const val KEY_LATEST_FEATURES = "latest_features_enabled" - @Volatile private var INSTANCE: FeatureFlagManager? = null fun get(context: Context): FeatureFlagManager { diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt index 1d4d9964..b8824ab8 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt @@ -6,12 +6,14 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri +import com.jeeldobariya.passcodes.utils.CommonUtils class AboutUsActivity : AppCompatActivity() { private lateinit var binding: ActivityAboutUsBinding override fun onCreate(savedInstanceState: Bundle?) { + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityAboutUsBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LicenseActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LicenseActivity.kt index 512e7b71..7cb9ad01 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LicenseActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LicenseActivity.kt @@ -5,12 +5,14 @@ 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.CommonUtils import java.io.BufferedReader import java.io.InputStreamReader class LicenseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) var binding = ActivityLicenseBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index f4c4527c..e53687ce 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -11,6 +11,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityLoadPasswordBinding import com.jeeldobariya.passcodes.ui.adapter.PasswordAdapter +import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DatabaseOperationException import kotlinx.coroutines.Dispatchers @@ -25,10 +26,7 @@ class LoadPasswordActivity : AppCompatActivity() { private lateinit var controller: Controller override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityLoadPasswordBinding.inflate(layoutInflater) setContentView(binding.root) 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 587a4a31..f1fe9825 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -9,6 +9,8 @@ import android.view.LayoutInflater import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityMainBinding +import com.jeeldobariya.passcodes.utils.CommonUtils + // import com.jeeldobariya.passcodes.utils.Permissions class MainActivity : AppCompatActivity() { @@ -18,10 +20,7 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) 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 fb366b63..5ff2b07b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -1,12 +1,15 @@ package com.jeeldobariya.passcodes.ui import android.content.Intent +import android.view.View.GONE 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.databinding.ActivityPasswordManagerBinding +import com.jeeldobariya.passcodes.flags.FeatureFlagManager +import com.jeeldobariya.passcodes.utils.CommonUtils class PasswordManagerActivity : AppCompatActivity() { @@ -14,14 +17,16 @@ class PasswordManagerActivity : AppCompatActivity() { private lateinit var binding: ActivityPasswordManagerBinding // Use late init for binding override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityPasswordManagerBinding.inflate(layoutInflater) setContentView(binding.root) + if (!FeatureFlagManager.get(this).latestFeaturesEnabled) { + binding.importPasswordBtn.visibility = GONE + binding.exportPasswordBtn.visibility = GONE + } + // Add event onclick listener addOnClickListenerOnButton(binding) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt index 7404bdf0..2f2c846b 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt @@ -1,6 +1,5 @@ package com.jeeldobariya.passcodes.ui -import android.content.Context import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -8,6 +7,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySavePasswordBinding +import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DatabaseOperationException import com.jeeldobariya.passcodes.utils.InvalidInputException @@ -21,10 +21,7 @@ class SavePasswordActivity : AppCompatActivity() { private lateinit var binding: ActivitySavePasswordBinding override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivitySavePasswordBinding.inflate(layoutInflater) setContentView(binding.root) 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 54e0a6a7..e83f3ef6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt @@ -15,15 +15,12 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding import com.jeeldobariya.passcodes.flags.FeatureFlagManager import androidx.core.content.edit +import com.jeeldobariya.passcodes.utils.CommonUtils +import com.jeeldobariya.passcodes.utils.Constant class SettingsActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsBinding - - companion object { - const val THEME_PREFS_NAME = "theme_prefs" - const val THEME_KEY = "selected_theme" - } // List of available themes to cycle through @@ -36,10 +33,7 @@ class SettingsActivity : AppCompatActivity() { ) override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) @@ -86,15 +80,15 @@ class SettingsActivity : AppCompatActivity() { } binding.toggleThemeBtn.setOnClickListener { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val currentThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + val sharedPrefs = getSharedPreferences(Constant.APP_PREFS_NAME, Context.MODE_PRIVATE) + val currentThemeStyle = sharedPrefs.getInt(Constant.THEME_KEY, R.style.PasscodesTheme_Default) val currentIndex = THEMES.indexOf(currentThemeStyle) val nextIndex = (currentIndex + 1) % THEMES.size val newThemeStyle = THEMES[nextIndex] // Save the new theme and restart the application to apply it - sharedPrefs.edit { putInt(THEME_KEY, newThemeStyle) } + sharedPrefs.edit { putInt(Constant.THEME_KEY, newThemeStyle) } recreate() Toast.makeText(this@SettingsActivity, getString(R.string.restart_app_require), Toast.LENGTH_SHORT).show() diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt index 2a1af6b5..8f0f7288 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.lifecycleScope import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityUpdatePasswordBinding +import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DatabaseOperationException import com.jeeldobariya.passcodes.utils.InvalidInputException @@ -29,10 +30,7 @@ class UpdatePasswordActivity : AppCompatActivity() { private lateinit var binding: ActivityUpdatePasswordBinding override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityUpdatePasswordBinding.inflate(layoutInflater) setContentView(binding.root) 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 d41bfe2f..54d54150 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -14,6 +14,7 @@ import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.database.Password import com.jeeldobariya.passcodes.databinding.ActivityViewPasswordBinding import com.jeeldobariya.passcodes.flags.FeatureFlagManager +import com.jeeldobariya.passcodes.utils.CommonUtils import com.jeeldobariya.passcodes.utils.Controller import com.jeeldobariya.passcodes.utils.DatabaseOperationException import com.jeeldobariya.passcodes.utils.DateTimeUtils @@ -33,10 +34,7 @@ class ViewPasswordActivity : AppCompatActivity() { private lateinit var passwordEntity: Password override fun onCreate(savedInstanceState: Bundle?) { - val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) - val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) - setTheme(savedThemeStyle) - + CommonUtils.updateCurrTheme(this) super.onCreate(savedInstanceState) binding = ActivityViewPasswordBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/CommonUtils.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/CommonUtils.kt new file mode 100644 index 00000000..c0644414 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/CommonUtils.kt @@ -0,0 +1,19 @@ +package com.jeeldobariya.passcodes.utils + +import android.content.Context +import android.content.Context.MODE_PRIVATE +import com.jeeldobariya.passcodes.R + +class CommonUtils { + companion object { + fun getCurrTheme(context: Context): Int { + val sharedPrefs = context.getSharedPreferences(Constant.APP_PREFS_NAME, MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(Constant.THEME_KEY, R.style.PasscodesTheme_Default) + return savedThemeStyle + } + + fun updateCurrTheme(context: Context) { + context.setTheme(getCurrTheme(context.applicationContext)) + } + } +} 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 3b062c31..5dc959bd 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt @@ -1,9 +1,18 @@ package com.jeeldobariya.passcodes.utils object Constant { + // Url Constants const val REPO_URL = "https://github.com/JeelDobariya38/Passcodes" const val REPORT_BUG_URL = "https://github.com/JeelDobariya38/password-manager/issues/new?template=bug-report.md" const val RELEASE_NOTE_URL = "https://github.com/JeelDobariya38/Passcodes/blob/main/docs/release-notes.md" const val SECURITY_GUIDE_URL = "https://github.com/JeelDobariya38/Passcodes/blob/main/docs/security-guide.md" const val TELEGRAM_COMMUNITY_URL = "https://t.me/passcodescommunity" + + + // 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" } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 90dacb61..67998b5f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -47,6 +47,7 @@ Username Password Notes - Copied Successfully + 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 + Copy Password Save Password Load Password Update Password @@ -39,7 +39,7 @@ Language: Contributor: Themes: - Preview Features: + Preview Features: About Us @@ -47,8 +47,8 @@ Security Guidelines View Release Notes View License - Third Party License - Passcodes Telegram Community + Third Party License + Passcodes Telegram Community Password Manager @@ -86,11 +86,11 @@ Something Went Wrong: Invalid ID!! - Copy to Clipboard? + 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!!! + Copying sensitive data like passwords to clipboard is not so good for security!!! Confirm Discard diff --git a/lint.xml b/lint.xml index e1452c37..f6db615e 100644 --- a/lint.xml +++ b/lint.xml @@ -3,4 +3,6 @@ - \ No newline at end of file + + +