From d6108fbbf37bc314fba42202a9e29ffba642cffd Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 1 Jun 2022 16:38:15 -0400 Subject: [PATCH] Add force legacy QR scanning switch. --- .../securesms/DeviceAddFragment.java | 3 ++- .../securesms/util/FeatureFlags.java | 11 +++++++-- .../main/java/org/signal/qr/QrScannerView.kt | 24 ++++++++++++++----- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java index e21c160f30..50e78d73f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java @@ -18,6 +18,7 @@ import androidx.core.view.ViewCompat; import org.signal.qr.QrScannerView; import org.signal.qr.kitkat.ScanListener; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.ViewUtil; @@ -56,7 +57,7 @@ public class DeviceAddFragment extends LoggingFragment { }); } - scannerView.start(getViewLifecycleOwner()); + scannerView.start(getViewLifecycleOwner(), FeatureFlags.useQrLegacyScan()); lifecycleDisposable.bindTo(getViewLifecycleOwner()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index adadb86857..4d93e33b1c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -97,6 +97,7 @@ public final class FeatureFlags { private static final String USE_FCM_FOREGROUND_SERVICE = "android.useFcmForegroundService.3"; private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum"; private static final String GIFT_BADGES = "android.giftBadges.3"; + private static final String USE_QR_LEGACY_SCAN = "android.qr.legacy_scan"; /** * We will only store remote values for flags in this set. If you want a flag to be controllable @@ -146,7 +147,8 @@ public final class FeatureFlags { PAYMENTS_COUNTRY_BLOCKLIST, USE_FCM_FOREGROUND_SERVICE, STORIES_AUTO_DOWNLOAD_MAXIMUM, - GIFT_BADGES + GIFT_BADGES, + USE_QR_LEGACY_SCAN ); @VisibleForTesting @@ -206,7 +208,8 @@ public final class FeatureFlags { USE_HARDWARE_AEC_IF_OLD, USE_AEC3, PAYMENTS_COUNTRY_BLOCKLIST, - USE_FCM_FOREGROUND_SERVICE + USE_FCM_FOREGROUND_SERVICE, + USE_QR_LEGACY_SCAN ); /** @@ -510,6 +513,10 @@ public final class FeatureFlags { return getBoolean(GIFT_BADGES, Environment.IS_STAGING); } + public static boolean useQrLegacyScan() { + return getBoolean(USE_QR_LEGACY_SCAN, false); + } + /** Only for rendering debug info. */ public static synchronized @NonNull Map getMemoryValues() { return new TreeMap<>(REMOTE_VALUES); diff --git a/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt b/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt index 588e6371d5..f136a2caad 100644 --- a/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt +++ b/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject +import org.signal.core.util.logging.Log /** * View for starting up a camera and scanning a QR-Code. Safe to use on an API version and @@ -19,15 +20,15 @@ class QrScannerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : FrameLayout(context, attrs, defStyleAttr), ScannerView { +) : FrameLayout(context, attrs, defStyleAttr) { - private val scannerView: ScannerView + private var scannerView: ScannerView? = null private val qrDataPublish: PublishSubject = PublishSubject.create() val qrData: Observable = qrDataPublish - init { - val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21) { + private fun initScannerView(forceLegacy: Boolean) { + val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21 && !forceLegacy) { ScannerView21(context) { qrDataPublish.onNext(it) } } else { ScannerView19(context) { qrDataPublish.onNext(it) } @@ -39,12 +40,23 @@ class QrScannerView @JvmOverloads constructor( this.scannerView = (scannerView as ScannerView) } - override fun start(lifecycleOwner: LifecycleOwner) { - scannerView.start(lifecycleOwner) + fun start(lifecycleOwner: LifecycleOwner, forceLegacy: Boolean = false) { + if (scannerView != null) { + Log.w(TAG, "Attempt to start scanning that has already started") + return + } + + initScannerView(forceLegacy) + + scannerView?.start(lifecycleOwner) lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { qrDataPublish.onComplete() } }) } + + companion object { + private val TAG = Log.tag(QrScannerView::class.java) + } }