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.QrScannerView;
import org.signal.qr.kitkat.ScanListener; import org.signal.qr.kitkat.ScanListener;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.LifecycleDisposable;
import org.thoughtcrime.securesms.util.ViewUtil; 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()); 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 USE_FCM_FOREGROUND_SERVICE = "android.useFcmForegroundService.3";
private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum"; private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum";
private static final String GIFT_BADGES = "android.giftBadges.3"; 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 * 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, PAYMENTS_COUNTRY_BLOCKLIST,
USE_FCM_FOREGROUND_SERVICE, USE_FCM_FOREGROUND_SERVICE,
STORIES_AUTO_DOWNLOAD_MAXIMUM, STORIES_AUTO_DOWNLOAD_MAXIMUM,
GIFT_BADGES GIFT_BADGES,
USE_QR_LEGACY_SCAN
); );
@VisibleForTesting @VisibleForTesting
@ -206,7 +208,8 @@ public final class FeatureFlags {
USE_HARDWARE_AEC_IF_OLD, USE_HARDWARE_AEC_IF_OLD,
USE_AEC3, USE_AEC3,
PAYMENTS_COUNTRY_BLOCKLIST, 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); return getBoolean(GIFT_BADGES, Environment.IS_STAGING);
} }
public static boolean useQrLegacyScan() {
return getBoolean(USE_QR_LEGACY_SCAN, false);
}
/** Only for rendering debug info. */ /** Only for rendering debug info. */
public static synchronized @NonNull Map<String, Object> getMemoryValues() { public static synchronized @NonNull Map<String, Object> getMemoryValues() {
return new TreeMap<>(REMOTE_VALUES); return new TreeMap<>(REMOTE_VALUES);

View file

@ -8,6 +8,7 @@ import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.subjects.PublishSubject 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 * 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, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 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() private val qrDataPublish: PublishSubject<String> = PublishSubject.create()
val qrData: Observable<String> = qrDataPublish val qrData: Observable<String> = qrDataPublish
init { private fun initScannerView(forceLegacy: Boolean) {
val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21) { val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21 && !forceLegacy) {
ScannerView21(context) { qrDataPublish.onNext(it) } ScannerView21(context) { qrDataPublish.onNext(it) }
} else { } else {
ScannerView19(context) { qrDataPublish.onNext(it) } ScannerView19(context) { qrDataPublish.onNext(it) }
@ -39,12 +40,23 @@ class QrScannerView @JvmOverloads constructor(
this.scannerView = (scannerView as ScannerView) this.scannerView = (scannerView as ScannerView)
} }
override fun start(lifecycleOwner: LifecycleOwner) { fun start(lifecycleOwner: LifecycleOwner, forceLegacy: Boolean = false) {
scannerView.start(lifecycleOwner) 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 { lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) { override fun onDestroy(owner: LifecycleOwner) {
qrDataPublish.onComplete() qrDataPublish.onComplete()
} }
}) })
} }
companion object {
private val TAG = Log.tag(QrScannerView::class.java)
}
} }