aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/dev/msfjarvis/aps/util
diff options
context:
space:
mode:
authorHarsh Shandilya <me@msfjarvis.dev>2022-01-09 17:50:22 +0530
committerGitHub <noreply@github.com>2022-01-09 17:50:22 +0530
commit35155e55841bc87b2c0e0dc577e1433041b44bc5 (patch)
treec9cf58da55e5876b4fe5676a415b9299881e83ef /app/src/main/java/dev/msfjarvis/aps/util
parent1738879fb3ba1b2c2d0ca7933c861bf99ae32535 (diff)
downloadHardenedPass-35155e55841bc87b2c0e0dc577e1433041b44bc5.tar.gz
HardenedPass-35155e55841bc87b2c0e0dc577e1433041b44bc5.zip
Make PGPainless backend feature flag runtime configurable (#1654)
* Make feature flags runtime configurable * Add a settings entry for PGPainless feature flag * Add changelog entry
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/util')
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt20
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt20
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/features/Feature.kt18
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/features/Features.kt21
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt11
5 files changed, 82 insertions, 8 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt b/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt
index fd8faa7f..22f2db85 100644
--- a/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt
@@ -19,13 +19,17 @@ import com.github.androidpasswordstore.autofillparser.AutofillAction
import com.github.androidpasswordstore.autofillparser.FillableForm
import com.github.androidpasswordstore.autofillparser.fillWith
import com.github.michaelbull.result.fold
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
import dev.msfjarvis.aps.autofill.oreo.ui.AutofillSmsActivity
import dev.msfjarvis.aps.ui.autofill.AutofillDecryptActivity
import dev.msfjarvis.aps.ui.autofill.AutofillDecryptActivityV2
import dev.msfjarvis.aps.ui.autofill.AutofillFilterView
import dev.msfjarvis.aps.ui.autofill.AutofillPublisherChangedActivity
import dev.msfjarvis.aps.ui.autofill.AutofillSaveActivity
-import dev.msfjarvis.aps.util.FeatureFlags
+import dev.msfjarvis.aps.util.features.Feature
+import dev.msfjarvis.aps.util.features.Features
import java.io.File
import logcat.LogPriority.ERROR
import logcat.asLog
@@ -33,7 +37,17 @@ import logcat.logcat
/** Implements [AutofillResponseBuilder]'s methods for API 30 and above */
@RequiresApi(Build.VERSION_CODES.R)
-class Api30AutofillResponseBuilder(form: FillableForm) {
+class Api30AutofillResponseBuilder
+@AssistedInject
+constructor(
+ @Assisted form: FillableForm,
+ private val features: Features,
+) {
+
+ @AssistedFactory
+ interface Factory {
+ fun create(form: FillableForm): Api30AutofillResponseBuilder
+ }
private val formOrigin = form.formOrigin
private val scenario = form.scenario
@@ -73,7 +87,7 @@ class Api30AutofillResponseBuilder(form: FillableForm) {
if (!scenario.hasFieldsToFillOn(AutofillAction.Match)) return null
val metadata = makeFillMatchMetadata(context, file)
val intentSender =
- if (FeatureFlags.ENABLE_PGP_V2_BACKEND) {
+ if (features.isEnabled(Feature.EnablePGPainlessBackend)) {
AutofillDecryptActivityV2.makeDecryptFileIntentSender(file, context)
} else {
AutofillDecryptActivity.makeDecryptFileIntentSender(file, context)
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt
index 723347f2..5c1c91d6 100644
--- a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt
@@ -19,20 +19,34 @@ import com.github.androidpasswordstore.autofillparser.Credentials
import com.github.androidpasswordstore.autofillparser.FillableForm
import com.github.androidpasswordstore.autofillparser.fillWith
import com.github.michaelbull.result.fold
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
import dev.msfjarvis.aps.autofill.oreo.ui.AutofillSmsActivity
import dev.msfjarvis.aps.ui.autofill.AutofillDecryptActivity
import dev.msfjarvis.aps.ui.autofill.AutofillDecryptActivityV2
import dev.msfjarvis.aps.ui.autofill.AutofillFilterView
import dev.msfjarvis.aps.ui.autofill.AutofillPublisherChangedActivity
import dev.msfjarvis.aps.ui.autofill.AutofillSaveActivity
-import dev.msfjarvis.aps.util.FeatureFlags
+import dev.msfjarvis.aps.util.features.Feature
+import dev.msfjarvis.aps.util.features.Features
import java.io.File
import logcat.LogPriority.ERROR
import logcat.asLog
import logcat.logcat
@RequiresApi(Build.VERSION_CODES.O)
-class AutofillResponseBuilder(form: FillableForm) {
+class AutofillResponseBuilder
+@AssistedInject
+constructor(
+ @Assisted form: FillableForm,
+ private val features: Features,
+) {
+
+ @AssistedFactory
+ interface Factory {
+ fun create(form: FillableForm): AutofillResponseBuilder
+ }
private val formOrigin = form.formOrigin
private val scenario = form.scenario
@@ -61,7 +75,7 @@ class AutofillResponseBuilder(form: FillableForm) {
if (!scenario.hasFieldsToFillOn(AutofillAction.Match)) return null
val metadata = makeFillMatchMetadata(context, file)
val intentSender =
- if (FeatureFlags.ENABLE_PGP_V2_BACKEND) {
+ if (features.isEnabled(Feature.EnablePGPainlessBackend)) {
AutofillDecryptActivityV2.makeDecryptFileIntentSender(file, context)
} else {
AutofillDecryptActivity.makeDecryptFileIntentSender(file, context)
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/features/Feature.kt b/app/src/main/java/dev/msfjarvis/aps/util/features/Feature.kt
new file mode 100644
index 00000000..7ae2e642
--- /dev/null
+++ b/app/src/main/java/dev/msfjarvis/aps/util/features/Feature.kt
@@ -0,0 +1,18 @@
+/*
+ * Copyright © 2014-2022 The Android Password Store Authors. All Rights Reserved.
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+package dev.msfjarvis.aps.util.features
+
+/** List of all feature flags for the app. */
+enum class Feature(
+ /** Default value for the flag. */
+ val defaultValue: Boolean,
+ /** Key to retrieve the current value for the flag. */
+ val configKey: String,
+) {
+
+ /** Opt into the new PGP backend powered by the PGPainless library. */
+ EnablePGPainlessBackend(false, "enable_pgp_v2_backend"),
+}
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/features/Features.kt b/app/src/main/java/dev/msfjarvis/aps/util/features/Features.kt
new file mode 100644
index 00000000..39b2c3a8
--- /dev/null
+++ b/app/src/main/java/dev/msfjarvis/aps/util/features/Features.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright © 2014-2022 The Android Password Store Authors. All Rights Reserved.
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+package dev.msfjarvis.aps.util.features
+
+import android.content.SharedPreferences
+import dev.msfjarvis.aps.injection.prefs.SettingsPreferences
+import javax.inject.Inject
+
+class Features
+@Inject
+constructor(
+ @SettingsPreferences private val preferences: SharedPreferences,
+) {
+
+ fun isEnabled(feature: Feature): Boolean {
+ return preferences.getBoolean(feature.configKey, feature.defaultValue)
+ }
+}
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt b/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt
index a52caff0..7b804f3e 100644
--- a/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt
@@ -23,6 +23,7 @@ import com.github.androidpasswordstore.autofillparser.cachePublicSuffixList
import com.github.androidpasswordstore.autofillparser.passwordValue
import com.github.androidpasswordstore.autofillparser.recoverNodes
import com.github.androidpasswordstore.autofillparser.usernameValue
+import dagger.hilt.android.AndroidEntryPoint
import dev.msfjarvis.aps.BuildConfig
import dev.msfjarvis.aps.R
import dev.msfjarvis.aps.ui.autofill.AutofillSaveActivity
@@ -32,10 +33,12 @@ import dev.msfjarvis.aps.util.extensions.getString
import dev.msfjarvis.aps.util.extensions.hasFlag
import dev.msfjarvis.aps.util.extensions.sharedPrefs
import dev.msfjarvis.aps.util.settings.PreferenceKeys
+import javax.inject.Inject
import logcat.LogPriority.ERROR
import logcat.logcat
@RequiresApi(Build.VERSION_CODES.O)
+@AndroidEntryPoint
class OreoAutofillService : AutofillService() {
companion object {
@@ -55,6 +58,9 @@ class OreoAutofillService : AutofillService() {
private const val DISABLE_AUTOFILL_DURATION_MS = 1000 * 60 * 60 * 24L
}
+ @Inject lateinit var api30ResponseBuilderFactory: Api30AutofillResponseBuilder.Factory
+ @Inject lateinit var responseBuilderFactory: AutofillResponseBuilder.Factory
+
override fun onCreate() {
super.onCreate()
cachePublicSuffixList(applicationContext)
@@ -97,10 +103,11 @@ class OreoAutofillService : AutofillService() {
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- Api30AutofillResponseBuilder(formToFill)
+ api30ResponseBuilderFactory
+ .create(formToFill)
.fillCredentials(this, request.inlineSuggestionsRequest, callback)
} else {
- AutofillResponseBuilder(formToFill).fillCredentials(this, callback)
+ responseBuilderFactory.create(formToFill).fillCredentials(this, callback)
}
}