From ca530f229bd166bde0b8bed354304296c7fab8f0 Mon Sep 17 00:00:00 2001 From: Niko Diamadis Date: Thu, 21 Dec 2023 22:56:50 +0100 Subject: [PATCH] Replace startActivityForResult with result launchers --- .../aegis/ui/EditEntryActivity.java | 52 +++--- .../aegis/ui/MainActivity.java | 156 ++++++++++-------- .../BackupsPreferencesFragment.java | 20 ++- .../preferences/IconPacksManagerFragment.java | 23 ++- .../ImportExportPreferencesFragment.java | 89 ++++++---- .../preferences/PreferencesFragment.java | 4 - .../aegis/ui/slides/WelcomeSlide.java | 21 +-- .../aegis/vault/VaultManager.java | 17 +- 8 files changed, 206 insertions(+), 176 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index bdfc844b..df627de9 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -21,6 +21,8 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import androidx.activity.OnBackPressedCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -89,8 +91,6 @@ import java.util.stream.Collectors; import de.hdodenhof.circleimageview.CircleImageView; public class EditEntryActivity extends AegisActivity { - private static final int PICK_IMAGE_REQUEST = 0; - private boolean _isNew = false; private boolean _isManual = false; private VaultEntry _origEntry; @@ -128,6 +128,29 @@ public class EditEntryActivity extends AegisActivity { private BackPressHandler _backPressHandler; private IconBackPressHandler _iconBackPressHandler; + private final ActivityResultLauncher pickImageResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + Intent data = activityResult.getData(); + if (activityResult.getResultCode() != RESULT_OK || data == null || data.getData() == null) { + return; + } + String fileType = SafHelper.getMimeType(this, data.getData()); + if (fileType != null && fileType.equals(IconType.SVG.toMimeType())) { + ImportFileTask.Params params = new ImportFileTask.Params(data.getData(), "icon", null); + ImportFileTask task = new ImportFileTask(this, result -> { + if (result.getError() == null) { + CustomSvgIcon icon = new CustomSvgIcon(result.getFile()); + selectIcon(icon); + } else { + Dialogs.showErrorDialog(this, R.string.reading_file_error, result.getError()); + } + }); + task.execute(getLifecycle(), params); + } else { + startEditingIcon(data.getData()); + } + }); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -489,7 +512,7 @@ public class EditEntryActivity extends AegisActivity { Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.select_icon)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { fileIntent }); - _vaultManager.startActivityForResult(this, chooserIntent, PICK_IMAGE_REQUEST); + _vaultManager.fireIntentLauncher(this, chooserIntent, pickImageResultLauncher); } private void resetUsageCount() { @@ -618,29 +641,6 @@ public class EditEntryActivity extends AegisActivity { } } - @Override - protected void onActivityResult(int requestCode, final int resultCode, Intent data) { - if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { - String fileType = SafHelper.getMimeType(this, data.getData()); - if (fileType != null && fileType.equals(IconType.SVG.toMimeType())) { - ImportFileTask.Params params = new ImportFileTask.Params(data.getData(), "icon", null); - ImportFileTask task = new ImportFileTask(this, result -> { - if (result.getError() == null) { - CustomSvgIcon icon = new CustomSvgIcon(result.getFile()); - selectIcon(icon); - } else { - Dialogs.showErrorDialog(this, R.string.reading_file_error, result.getError()); - } - }); - task.execute(getLifecycle(), params); - } else { - startEditingIcon(data.getData()); - } - } - - super.onActivityResult(requestCode, resultCode, data); - } - private int parsePeriod() throws ParseException { try { return Integer.parseInt(_textPeriodCounter.getText().toString()); 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 1800ffd4..b68ef168 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -30,6 +30,8 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.OnBackPressedCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.view.ActionMode; @@ -68,17 +70,6 @@ import java.util.UUID; import java.util.stream.Collectors; public class MainActivity extends AegisActivity implements EntryListView.Listener { - // activity request codes - private static final int CODE_SCAN = 0; - private static final int CODE_ADD_ENTRY = 1; - private static final int CODE_EDIT_ENTRY = 2; - private static final int CODE_DO_INTRO = 3; - private static final int CODE_DECRYPT = 4; - private static final int CODE_PREFERENCES = 5; - private static final int CODE_SCAN_IMAGE = 6; - private static final int CODE_ASSIGN_ICONS = 7; - - // Permission request codes private static final int CODE_PERM_CAMERA = 0; @@ -108,6 +99,69 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene private SearchViewBackPressHandler _searchViewBackPressHandler; private ActionModeBackPressHandler _actionModeBackPressHandler; + private final ActivityResultLauncher authResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + _isAuthenticating = false; + if (activityResult.getResultCode() == RESULT_OK) { + onDecryptResult(); + } + }); + + private final ActivityResultLauncher introResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + _isDoingIntro = false; + if (activityResult.getResultCode() == RESULT_OK) { + onIntroResult(); + } + }); + + private final ActivityResultLauncher scanResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) { + return; + } + onScanResult(activityResult.getData()); + }); + + private final ActivityResultLauncher assignIconsResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) { + return; + } + onAssignEntriesResult(activityResult.getData()); + }); + + private final ActivityResultLauncher preferenceResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) { + return; + } + onPreferencesResult(activityResult.getData()); + }); + + private final ActivityResultLauncher editEntryResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) { + return; + } + onEditEntryResult(activityResult.getData()); + }); + + private final ActivityResultLauncher addEntryResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) { + return; + } + onAddEntryResult(activityResult.getData()); + }); + + private final ActivityResultLauncher codeScanResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + if (activityResult.getResultCode() == RESULT_OK && activityResult.getData() != null) { + onScanImageResult(activityResult.getData()); + } + }); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -155,7 +209,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene view.findViewById(R.id.fab_enter).setOnClickListener(v1 -> { dialog.dismiss(); - startEditEntryActivityForManual(CODE_ADD_ENTRY); + startEditEntryActivityForManual(); }); view.findViewById(R.id.fab_scan_image).setOnClickListener(v2 -> { dialog.dismiss(); @@ -201,48 +255,6 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene instance.putBoolean("isAuthenticating", _isAuthenticating); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == CODE_DECRYPT) { - _isAuthenticating = false; - } - if (requestCode == CODE_DO_INTRO) { - _isDoingIntro = false; - } - if (resultCode != RESULT_OK) { - return; - } - - switch (requestCode) { - case CODE_SCAN: - onScanResult(data); - break; - case CODE_ADD_ENTRY: - onAddEntryResult(data); - break; - case CODE_EDIT_ENTRY: - onEditEntryResult(data); - break; - case CODE_DO_INTRO: - onIntroResult(); - break; - case CODE_DECRYPT: - onDecryptResult(); - break; - case CODE_PREFERENCES: - onPreferencesResult(data); - break; - case CODE_SCAN_IMAGE: - onScanImageResult(data); - break; - case CODE_ASSIGN_ICONS: - onAssignEntriesResult(data); - break; - } - - super.onActivityResult(requestCode, resultCode, data); - } - @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (!PermissionHelper.checkResults(grantResults)) { @@ -303,27 +315,27 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } } - private void startEditEntryActivityForNew(int requestCode, VaultEntry entry) { + private void startEditEntryActivityForNew(VaultEntry entry) { Intent intent = new Intent(this, EditEntryActivity.class); intent.putExtra("newEntry", entry); intent.putExtra("isManual", false); - startActivityForResult(intent, requestCode); + addEntryResultLauncher.launch(intent); } - private void startEditEntryActivityForManual(int requestCode) { + private void startEditEntryActivityForManual() { Intent intent = new Intent(this, EditEntryActivity.class); intent.putExtra("newEntry", VaultEntry.getDefault()); intent.putExtra("isManual", true); - startActivityForResult(intent, requestCode); + addEntryResultLauncher.launch(intent); } - private void startEditEntryActivity(int requestCode, VaultEntry entry) { + private void startEditEntryActivity(VaultEntry entry) { Intent intent = new Intent(this, EditEntryActivity.class); intent.putExtra("entryUUID", entry.getUUID()); - startActivityForResult(intent, requestCode); + editEntryResultLauncher.launch(intent); } - private void startAssignIconsActivity(int requestCode, List entries) { + private void startAssignIconsActivity(List entries) { ArrayList assignIconEntriesIds = new ArrayList<>(); Intent assignIconIntent = new Intent(getBaseContext(), AssignIconsActivity.class); for (VaultEntry entry : entries) { @@ -331,13 +343,13 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } assignIconIntent.putExtra("entries", assignIconEntriesIds); - startActivityForResult(assignIconIntent, requestCode); + assignIconsResultLauncher.launch(assignIconIntent); } private void startIntroActivity() { if (!_isDoingIntro) { Intent intro = new Intent(this, IntroActivity.class); - startActivityForResult(intro, CODE_DO_INTRO); + introResultLauncher.launch(intro); _isDoingIntro = true; } } @@ -473,7 +485,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene private void importScannedEntries(List entries) { if (entries.size() == 1) { - startEditEntryActivityForNew(CODE_ADD_ENTRY, entries.get(0)); + startEditEntryActivityForNew(entries.get(0)); } else if (entries.size() > 1) { for (VaultEntry entry: entries) { _vaultManager.getVault().addEntry(entry); @@ -517,7 +529,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } Intent scannerActivity = new Intent(getApplicationContext(), ScannerActivity.class); - startActivityForResult(scannerActivity, CODE_SCAN); + scanResultLauncher.launch(scannerActivity); } private void startScanImageActivity() { @@ -531,7 +543,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.select_picture)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { fileIntent }); - _vaultManager.startActivityForResult(this, chooserIntent, CODE_SCAN_IMAGE); + _vaultManager.fireIntentLauncher(this, chooserIntent, codeScanResultLauncher); } private void startPreferencesActivity() { @@ -542,7 +554,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene Intent intent = new Intent(this, PreferencesActivity.class); intent.putExtra("fragment", fragmentType); intent.putExtra("pref", preference); - startActivityForResult(intent, CODE_PREFERENCES); + preferenceResultLauncher.launch(intent); } private void doShortcutActions() { @@ -589,7 +601,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } VaultEntry entry = new VaultEntry(info); - startEditEntryActivityForNew(CODE_ADD_ENTRY, entry); + startEditEntryActivityForNew(entry); } break; case Intent.ACTION_SEND: @@ -617,7 +629,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } VaultEntry entry = new VaultEntry(info); - startEditEntryActivityForNew(CODE_ADD_ENTRY, entry); + startEditEntryActivityForNew(entry); } } break; @@ -826,7 +838,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene if (!_isAuthenticating) { Intent intent = new Intent(this, AuthActivity.class); intent.putExtra("inhibitBioPrompt", inhibitBioPrompt); - startActivityForResult(intent, CODE_DECRYPT); + authResultLauncher.launch(intent); _isAuthenticating = true; } } @@ -1120,7 +1132,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene copyEntryCode(_selectedEntries.get(0)); mode.finish(); } else if (itemId == R.id.action_edit) { - startEditEntryActivity(CODE_EDIT_ENTRY, _selectedEntries.get(0)); + startEditEntryActivity(_selectedEntries.get(0)); mode.finish(); } else if (itemId == R.id.action_toggle_favorite) { for (VaultEntry entry : _selectedEntries) { @@ -1154,7 +1166,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene setFavoriteMenuItemVisiblity(); setIsMultipleSelected(_selectedEntries.size() > 1); } else if (itemId == R.id.action_assign_icons) { - startAssignIconsActivity(CODE_ASSIGN_ICONS, _selectedEntries); + startAssignIconsActivity(_selectedEntries); mode.finish(); } else { return false; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java index 48a4032c..2615e711 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java @@ -11,6 +11,8 @@ import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.SwitchPreferenceCompat; @@ -32,6 +34,15 @@ public class BackupsPreferencesFragment extends PreferencesFragment { private Preference _builtinBackupStatusPreference; private Preference _androidBackupStatusPreference; + private final ActivityResultLauncher backupsResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + Intent data = activityResult.getData(); + int resultCode = activityResult.getResultCode(); + if (data != null) { + onSelectBackupsLocationResult(resultCode, data); + } + }); + @Override public void onResume() { super.onResume(); @@ -137,13 +148,6 @@ public class BackupsPreferencesFragment extends PreferencesFragment { } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null && requestCode == CODE_BACKUPS) { - onSelectBackupsLocationResult(resultCode, data); - } - } - private void onSelectBackupsLocationResult(int resultCode, Intent data) { Uri uri = data.getData(); if (resultCode != Activity.RESULT_OK || uri == null) { @@ -226,7 +230,7 @@ public class BackupsPreferencesFragment extends PreferencesFragment { | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); - _vaultManager.startActivityForResult(this, intent, CODE_BACKUPS); + _vaultManager.fireIntentLauncher(this, intent, backupsResultLauncher); } private void scheduleBackup() { diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/IconPacksManagerFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/IconPacksManagerFragment.java index bc38e7f9..cb30d832 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/IconPacksManagerFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/IconPacksManagerFragment.java @@ -10,6 +10,8 @@ import android.view.animation.Animation; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -36,8 +38,6 @@ import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public class IconPacksManagerFragment extends Fragment implements IconPackAdapter.Listener { - private static final int CODE_IMPORT = 0; - @Inject IconPackManager _iconPackManager; @@ -49,6 +49,14 @@ public class IconPacksManagerFragment extends Fragment implements IconPackAdapte private LinearLayout _noIconPacksView; private FabScrollHelper _fabScrollHelper; + private final ActivityResultLauncher importResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + Intent data = activityResult.getData(); + if (activityResult.getResultCode() == Activity.RESULT_OK && data != null && data.getData() != null) { + importIconPack(data.getData()); + } + }); + public IconPacksManagerFragment() { super(R.layout.fragment_icon_packs); } @@ -112,15 +120,6 @@ public class IconPacksManagerFragment extends Fragment implements IconPackAdapte .create()); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == CODE_IMPORT && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) { - importIconPack(data.getData()); - } - } - private void importIconPack(Uri uri) { ImportIconPackTask task = new ImportIconPackTask(requireContext(), result -> { Exception e = result.getException(); @@ -162,7 +161,7 @@ public class IconPacksManagerFragment extends Fragment implements IconPackAdapte private void startImportIconPack() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); - _vaultManager.startActivityForResult(this, intent, CODE_IMPORT); + _vaultManager.fireIntentLauncher(this, intent, importResultLauncher); } private void updateEmptyState() { diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java index 43c5da61..cdd810b0 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java @@ -12,6 +12,8 @@ import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.ArrayRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -66,6 +68,35 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { private DatabaseImporter.Definition _importerDef; private Vault.EntryFilter _exportFilter; + private final ActivityResultLauncher importResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + getResult().putExtra("needsRecreate", true); + }); + + private final ActivityResultLauncher importSelectResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + Intent data = activityResult.getData(); + if (data != null) { + onImportSelectResult(activityResult.getResultCode(), data); + } + }); + + private final ActivityResultLauncher exportResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> + onExportResult(CODE_EXPORT, activityResult.getResultCode(), activityResult.getData())); + + private final ActivityResultLauncher exportPlainResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> + onExportResult(CODE_EXPORT_PLAIN, activityResult.getResultCode(), activityResult.getData())); + + private final ActivityResultLauncher exportHtmlResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> + onExportResult(CODE_EXPORT_HTML, activityResult.getResultCode(), activityResult.getData())); + + private final ActivityResultLauncher exportGoogleUriResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> + onExportResult(CODE_EXPORT_GOOGLE_URI, activityResult.getResultCode(), activityResult.getData())); + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { super.onCreatePreferences(savedInstanceState, rootKey); @@ -82,7 +113,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); - _vaultManager.startActivityForResult(this, intent, CODE_IMPORT_SELECT); + _vaultManager.fireIntentLauncher(this, intent, importSelectResultLauncher); }); return true; }); @@ -114,28 +145,6 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { outState.putSerializable("importerDef", _importerDef); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == CODE_IMPORT) { - getResult().putExtra("needsRecreate", true); - } else if (data != null) { - switch (requestCode) { - case CODE_IMPORT_SELECT: - onImportSelectResult(resultCode, data); - break; - case CODE_EXPORT: - // intentional fallthrough - case CODE_EXPORT_PLAIN: - // intentional fallthrough - case CODE_EXPORT_HTML: - // intentional fallthrough - case CODE_EXPORT_GOOGLE_URI: - onExportResult(requestCode, resultCode, data); - break; - } - } - } - private void onImportSelectResult(int resultCode, Intent data) { Uri uri = data.getData(); if (resultCode != Activity.RESULT_OK || uri == null) { @@ -157,7 +166,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { Intent intent = new Intent(requireContext(), ImportEntriesActivity.class); intent.putExtra("importerDef", importerDef); intent.putExtra("file", file); - startActivityForResult(intent, CODE_IMPORT); + importResultLauncher.launch(intent); } private void startExport() { @@ -260,14 +269,15 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { } int pos = getStringResourceIndex(R.array.export_formats, dropdown.getText().toString()); - int requestCode = getExportRequestCode(pos, checkBoxEncrypt.isChecked()); - VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, checkBoxEncrypt.isChecked()); + boolean encrypt = checkBoxEncrypt.isChecked(); + VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, encrypt); Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) - .setType(getExportMimeType(requestCode)) + .setType(getExportMimeType(getExportRequestCode(pos, encrypt))) .putExtra(Intent.EXTRA_TITLE, fileInfo.toString()); - _vaultManager.startActivityForResult(this, intent, requestCode); + ActivityResultLauncher resultLauncher = getExportRequestLauncher(pos, encrypt); + _vaultManager.fireIntentLauncher(this, intent, resultLauncher); }); btnNeutral.setOnClickListener(v -> { @@ -286,8 +296,9 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { } File file; + boolean encrypt = checkBoxEncrypt.isChecked(); try { - VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, checkBoxEncrypt.isChecked()); + VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, encrypt); file = File.createTempFile(fileInfo.getFilename() + "-", "." + fileInfo.getExtension(), getExportCacheDir()); } catch (IOException e) { e.printStackTrace(); @@ -295,7 +306,8 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { return; } - int requestCode = getExportRequestCode(pos, checkBoxEncrypt.isChecked()); + int requestCode = getExportRequestCode(pos, encrypt); + ActivityResultLauncher resultLauncher = getExportRequestLauncher(pos, encrypt); startExportVault(requestCode, cb -> { try (OutputStream stream = new FileOutputStream(file)) { cb.exportVault(stream); @@ -314,7 +326,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { .setType(getExportMimeType(requestCode)) .putExtra(Intent.EXTRA_STREAM, uri); Intent chooser = Intent.createChooser(intent, getString(R.string.pref_export_summary)); - _vaultManager.startActivity(this, chooser); + _vaultManager.fireIntentLauncher(this, chooser, resultLauncher); }, _exportFilter); _exportFilter = null; }); @@ -391,6 +403,16 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { return CODE_EXPORT_GOOGLE_URI; } + private ActivityResultLauncher getExportRequestLauncher(int spinnerPos, boolean encrypt) { + if (spinnerPos == 0) { + return encrypt ? exportResultLauncher : exportPlainResultLauncher; + } else if (spinnerPos == 1) { + return exportHtmlResultLauncher; + } + + return exportGoogleUriResultLauncher; + } + private static VaultBackupManager.FileInfo getExportFileInfo(int spinnerPos, boolean encrypt) { if (spinnerPos == 0) { String filename = encrypt ? VaultRepository.FILENAME_PREFIX_EXPORT : VaultRepository.FILENAME_PREFIX_EXPORT_PLAIN; @@ -483,7 +505,10 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { } } - private void onExportResult(int requestCode, int resultCode, Intent data) { + private void onExportResult(int requestCode, int resultCode, @Nullable Intent data) { + if (data == null) { + return; + } Uri uri = data.getData(); if (resultCode != Activity.RESULT_OK || uri == null) { return; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/PreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/PreferencesFragment.java index 4b693e2a..992400a7 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/PreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/PreferencesFragment.java @@ -25,14 +25,10 @@ import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public abstract class PreferencesFragment extends PreferenceFragmentCompat { // activity request codes - public static final int CODE_IMPORT_SELECT = 0; - public static final int CODE_GROUPS = 3; - public static final int CODE_IMPORT = 4; public static final int CODE_EXPORT = 5; public static final int CODE_EXPORT_PLAIN = 6; public static final int CODE_EXPORT_GOOGLE_URI = 7; public static final int CODE_EXPORT_HTML = 8; - public static final int CODE_BACKUPS = 9; private Intent _result; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/WelcomeSlide.java b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/WelcomeSlide.java index 26832aab..0fc753bd 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/WelcomeSlide.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/WelcomeSlide.java @@ -7,6 +7,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult; import androidx.annotation.NonNull; import com.beemdevelopment.aegis.R; @@ -24,29 +26,28 @@ import java.io.FileInputStream; import java.io.IOException; public class WelcomeSlide extends SlideFragment { - public static final int CODE_IMPORT_VAULT = 0; - private boolean _imported; private VaultFileCredentials _creds; + private final ActivityResultLauncher vaultImportResultLauncher = + registerForActivityResult(new StartActivityForResult(), activityResult -> { + Intent data = activityResult.getData(); + if (data != null && data.getData() != null) { + startImportVault(data.getData()); + } + }); + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_welcome_slide, container, false); view.findViewById(R.id.btnImport).setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); - startActivityForResult(intent, CODE_IMPORT_VAULT); + vaultImportResultLauncher.launch(intent); }); return view; } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == CODE_IMPORT_VAULT && data != null && data.getData() != null) { - startImportVault(data.getData()); - } - } - @Override public void onSaveIntroState(@NonNull Bundle introState) { introState.putBoolean("imported", _imported); diff --git a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java index 1a70396f..2f2218d6 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java @@ -6,6 +6,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -304,11 +305,11 @@ public class VaultManager { * Starts an external activity, temporarily blocks automatic lock of Aegis and * shows an error dialog if the target activity is not found. */ - public void startActivityForResult(Activity activity, Intent intent, int requestCode) { + public void fireIntentLauncher(Activity activity, Intent intent, ActivityResultLauncher resultLauncher) { setBlockAutoLock(true); try { - activity.startActivityForResult(intent, requestCode, null); + resultLauncher.launch(intent); } catch (ActivityNotFoundException e) { e.printStackTrace(); @@ -324,19 +325,11 @@ public class VaultManager { * Starts an external activity, temporarily blocks automatic lock of Aegis and * shows an error dialog if the target activity is not found. */ - public void startActivity(Fragment fragment, Intent intent) { - startActivityForResult(fragment, intent, -1); - } - - /** - * Starts an external activity, temporarily blocks automatic lock of Aegis and - * shows an error dialog if the target activity is not found. - */ - public void startActivityForResult(Fragment fragment, Intent intent, int requestCode) { + public void fireIntentLauncher(Fragment fragment, Intent intent, ActivityResultLauncher resultLauncher) { setBlockAutoLock(true); try { - fragment.startActivityForResult(intent, requestCode, null); + resultLauncher.launch(intent); } catch (ActivityNotFoundException e) { e.printStackTrace();