diff --git a/app/src/main/java/org/shadowice/flocke/andotp/Activities/SecureCaptureActivity.java b/app/src/main/java/org/shadowice/flocke/andotp/Activities/SecureCaptureActivity.java index 56f72a15..880fc0bb 100644 --- a/app/src/main/java/org/shadowice/flocke/andotp/Activities/SecureCaptureActivity.java +++ b/app/src/main/java/org/shadowice/flocke/andotp/Activities/SecureCaptureActivity.java @@ -25,9 +25,11 @@ package org.shadowice.flocke.andotp.Activities; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Build; +import android.view.Window; import android.view.WindowInsets; import android.view.WindowInsetsController; import android.view.WindowManager; + import com.journeyapps.barcodescanner.CaptureActivity; import com.journeyapps.barcodescanner.DecoratedBarcodeView; @@ -36,6 +38,25 @@ import org.shadowice.flocke.andotp.Utilities.Settings; import java.util.Locale; public class SecureCaptureActivity extends CaptureActivity { + + /** + * Overwrites {@link CaptureActivity#initializeContent()} to: + * + * + * + * Note: + * {@link android.app.Activity#setContentView(int)} in {@link CaptureActivity#initializeContent()} + * of super class needs to be called before {@link Window#getInsetsController()}, otherwise NPE will be thrown + * because the top-level view of the current {@link Window}, containing the window decor, is not yet initialized. + * + * + * @return the DecoratedBarcodeView + */ @Override @SuppressWarnings("deprecation") protected DecoratedBarcodeView initializeContent() { @@ -44,8 +65,19 @@ public class SecureCaptureActivity extends CaptureActivity { setTheme(settings.getTheme()); setLocale(settings); - if (!settings.getScreenshotsEnabled()) + // This flag must be set before setting the content view of the activity or dialog. + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED + ); + + // All window flags, that must be set before the window decoration is created, are already set + // so we are safe to call super here. + DecoratedBarcodeView barcodeScannerView = super.initializeContent(); + + if (!settings.getScreenshotsEnabled()) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { final WindowInsetsController insetsController = getWindow().getInsetsController(); @@ -54,12 +86,13 @@ public class SecureCaptureActivity extends CaptureActivity { insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); } } else { - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ); } - getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); - - return super.initializeContent(); + return barcodeScannerView; } private void setLocale(Settings settings) {