diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java index dd684b7d38f8fc025cde263b8eacc4885c112615..b4352e71f2e9ccf92a61b7c726f1e299c93fe84e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java @@ -41,6 +41,8 @@ import static org.briarproject.briar.android.TestingConstants.PREVENT_SCREENSHOT public abstract class BaseActivity extends AppCompatActivity implements DestroyableContext, OnTapFilteredListener { + private static final String STATE_SHOULD_SHOW_DIALOG = "shouldShowDialog"; + @Inject protected ScreenFilterMonitor screenFilterMonitor; @@ -50,7 +52,11 @@ public abstract class BaseActivity extends AppCompatActivity new ArrayList<>(); private boolean destroyed = false; - private ScreenFilterDialogFragment dialogFrag; + @Nullable + private ScreenFilterDialogFragment dialogFrag = null; + private boolean shouldShowDialog = false; + + @Nullable private Toolbar toolbar = null; private boolean searchedForToolbar = false; @@ -61,8 +67,8 @@ public abstract class BaseActivity extends AppCompatActivity } @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreate(@Nullable Bundle state) { + super.onCreate(state); if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE); @@ -80,6 +86,15 @@ public abstract class BaseActivity extends AppCompatActivity for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityCreate(this); } + + if (state != null) + shouldShowDialog = state.getBoolean(STATE_SHOULD_SHOW_DIALOG); + } + + @Override + protected void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); + state.putBoolean(STATE_SHOULD_SHOW_DIALOG, shouldShowDialog); } public ActivityComponent getActivityComponent() { @@ -115,6 +130,7 @@ public abstract class BaseActivity extends AppCompatActivity protected void onResume() { super.onResume(); protectToolbar(); + if (shouldShowDialog) showScreenFilterWarning(); } @Override @@ -123,6 +139,7 @@ public abstract class BaseActivity extends AppCompatActivity if (dialogFrag != null) { dialogFrag.dismiss(); dialogFrag = null; + shouldShowDialog = true; // Show dialog again on resume } } @@ -144,18 +161,28 @@ public abstract class BaseActivity extends AppCompatActivity private boolean showScreenFilterWarning() { // If the dialog is already visible, filter the tap - if (dialogFrag != null && dialogFrag.isVisible()) return false; + if (dialogFrag != null) return false; Collection<AppDetails> apps = screenFilterMonitor.getApps(); - // If there are no overlay apps that haven't been allowed, allow the tap - if (apps.isEmpty()) return true; - // Create dialog - dialogFrag = ScreenFilterDialogFragment.newInstance(apps); - dialogFrag.setCancelable(false); + // If all overlay apps have been allowed, allow the tap + if (apps.isEmpty()) { + shouldShowDialog = false; // May have been true when state was saved + return true; + } // Show dialog unless onSaveInstanceState() has been called, see #1112 FragmentManager fm = getSupportFragmentManager(); if (!fm.isStateSaved()) { + // Create dialog + dialogFrag = ScreenFilterDialogFragment.newInstance(apps); + shouldShowDialog = true; // When dialog is dismissed, update protection of toolbar - dialogFrag.setDismissListener(this::protectToolbar); + dialogFrag.setDismissListener(() -> { + dialogFrag = null; + shouldShowDialog = false; + protectToolbar(); + }); + // Hide soft keyboard when (re)showing dialog + View focus = getCurrentFocus(); + if (focus != null) hideSoftKeyboard(focus); dialogFrag.show(fm, dialogFrag.getTag()); } // Filter the tap diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java index 0539497c7101f5af898ac8afe44e414700dd692e..810f61f39fd654c16baf400f7e1888f7c9d7dc31 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java @@ -88,6 +88,7 @@ public class ScreenFilterDialogFragment extends DialogFragment { if (allow.isChecked()) screenFilterMonitor.allowApps(packageNames); dialog.dismiss(); }); + builder.setCancelable(false); return builder.create(); }