Add force legacy QR scanning switch.

This commit is contained in:
Cody Henthorne 2022-06-01 16:38:15 -04:00
parent 4c44f1ee02
commit d6108fbbf3
3 changed files with 29 additions and 9 deletions

View file

@ -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());

View file

@ -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<String, Object> getMemoryValues() {
return new TreeMap<>(REMOTE_VALUES);

View file

@ -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<String> = PublishSubject.create()
val qrData: Observable<String> = 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)
}
}