From 189bd0d749db2c6934d4d97df3796fb8802efaec Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Wed, 1 Jul 2020 15:35:54 +0200 Subject: [PATCH] Guard against starting multiple instances of IntroActivity or AuthActivity Apparently onResume of MainActivity is sometimes called even if it's not the top level activity, causing IntroActivity or AuthActivity to be launched twice. This patch (uglily) prevents that from happening. --- .../aegis/ui/MainActivity.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java index 9ece5ffb..09a7b3cf 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -20,6 +20,7 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; @@ -76,6 +77,9 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene private String _selectedGroup; private boolean _searchSubmitted; + private boolean _isAuthenticating; + private boolean _isDoingIntro; + private List _selectedEntries; private ActionMode _actionMode; @@ -92,13 +96,16 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); _app = (AegisApplication) getApplication(); _vault = _app.getVaultManager(); _loaded = false; - // set up the main view - setContentView(R.layout.activity_main); + if (savedInstanceState != null) { + _isAuthenticating = savedInstanceState.getBoolean("isAuthenticating"); + _isDoingIntro = savedInstanceState.getBoolean("isDoingIntro"); + } // set up the entry view _entryListView = (EntryListView) getSupportFragmentManager().findFragmentById(R.id.key_profiles); @@ -137,6 +144,13 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene _selectedEntries = new ArrayList<>(); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean("isAuthenticating", _isAuthenticating); + outState.putBoolean("isDoingIntro", _isDoingIntro); + } + @Override protected void onDestroy() { _entryListView.setListener(null); @@ -162,6 +176,9 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + _isAuthenticating = false; + _isDoingIntro = false; + if (resultCode != RESULT_OK) { return; } @@ -449,12 +466,13 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene if (_vault == null) { // start the intro if the vault file doesn't exist - if (!VaultManager.fileExists(this)) { + if (!_isDoingIntro && !VaultManager.fileExists(this)) { if (getPreferences().isIntroDone()) { Toast.makeText(this, getString(R.string.vault_not_found), Toast.LENGTH_SHORT).show(); } Intent intro = new Intent(this, IntroActivity.class); startActivityForResult(intro, CODE_DO_INTRO); + _isDoingIntro = true; return; } @@ -635,10 +653,13 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } private void startAuthActivity(boolean inhibitBioPrompt) { - Intent intent = new Intent(this, AuthActivity.class); - intent.putExtra("cancelAction", CancelAction.KILL); - intent.putExtra("inhibitBioPrompt", inhibitBioPrompt); - startActivityForResult(intent, CODE_DECRYPT); + if (!_isAuthenticating) { + Intent intent = new Intent(this, AuthActivity.class); + intent.putExtra("cancelAction", CancelAction.KILL); + intent.putExtra("inhibitBioPrompt", inhibitBioPrompt); + startActivityForResult(intent, CODE_DECRYPT); + _isAuthenticating = true; + } } private void updateLockIcon() {