From c13d4e7f8d2fc621b1c1fd6e5df4d4bc218ecece Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Tue, 19 Sep 2023 23:24:19 +0200 Subject: [PATCH] Transition to non-final resource IDs and non-transitive R classes Future versions of AGP will force us to do this, so we might as well get it over with now. --- .../aegis/ui/AboutActivity.java | 2 +- .../aegis/ui/AssignIconsActivity.java | 24 +- .../aegis/ui/EditEntryActivity.java | 57 +++-- .../aegis/ui/GroupManagerActivity.java | 21 +- .../aegis/ui/ImportEntriesActivity.java | 21 +- .../aegis/ui/MainActivity.java | 210 ++++++++---------- .../aegis/ui/TransferEntriesActivity.java | 2 +- .../aegis/ui/slides/SecurityPickerSlide.java | 20 +- .../aegis/ui/views/EntryListView.java | 2 +- gradle.properties | 2 - 10 files changed, 162 insertions(+), 199 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java index a3144757..616717a1 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java @@ -136,7 +136,7 @@ public class AboutActivity extends AegisActivity { String backgroundColor = getThemeColorAsHex(backgroundColorResource); String textColor = getThemeColorAsHex(R.attr.primaryText); String licenseColor = getThemeColorAsHex(R.attr.cardBackgroundFocused); - String linkColor = getThemeColorAsHex(R.attr.colorAccent); + String linkColor = getThemeColorAsHex(androidx.appcompat.R.attr.colorAccent); stylesheet = String.format(stylesheet, backgroundColor, textColor, licenseColor, linkColor); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AssignIconsActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AssignIconsActivity.java index 572d39f2..0fa36a48 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AssignIconsActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AssignIconsActivity.java @@ -163,19 +163,17 @@ public class AssignIconsActivity extends AegisActivity implements AssignIconAdap @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - discardAndFinish(); - break; - case R.id.action_save: - try { - saveAndFinish(); - } catch (IOException e) { - Toast.makeText(this, R.string.saving_assign_icons_error, Toast.LENGTH_SHORT).show(); - } - break; - default: - return super.onOptionsItemSelected(item); + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + discardAndFinish(); + } else if (itemId == R.id.action_save) { + try { + saveAndFinish(); + } catch (IOException e) { + Toast.makeText(this, R.string.saving_assign_icons_error, Toast.LENGTH_SHORT).show(); + } + } else { + return super.onOptionsItemSelected(item); } return true; 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 99bcf8cb..bdfc844b 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -448,38 +448,33 @@ public class EditEntryActivity extends AegisActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - discardAndFinish(); - break; - case R.id.action_save: - onSave(); - break; - case R.id.action_delete: - Dialogs.showDeleteEntriesDialog(this, Collections.singletonList(_origEntry), (dialog, which) -> { - deleteAndFinish(_origEntry); - }); - break; - case R.id.action_edit_icon: - startIconSelection(); - break; - case R.id.action_reset_usage_count: - Dialogs.showSecureDialog(new AlertDialog.Builder(this) - .setTitle(R.string.action_reset_usage_count) - .setMessage(R.string.action_reset_usage_count_dialog) - .setPositiveButton(android.R.string.yes, (dialog, which) -> resetUsageCount()) - .setNegativeButton(android.R.string.no, null) - .create()); - break; - case R.id.action_default_icon: - TextDrawable drawable = TextDrawableHelper.generate(_origEntry.getIssuer(), _origEntry.getName(), _iconView); - _iconView.setImageDrawable(drawable); + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + discardAndFinish(); + } else if (itemId == R.id.action_save) { + onSave(); + } else if (itemId == R.id.action_delete) { + Dialogs.showDeleteEntriesDialog(this, Collections.singletonList(_origEntry), (dialog, which) -> { + deleteAndFinish(_origEntry); + }); + } else if (itemId == R.id.action_edit_icon) { + startIconSelection(); + } else if (itemId == R.id.action_reset_usage_count) { + Dialogs.showSecureDialog(new AlertDialog.Builder(this) + .setTitle(R.string.action_reset_usage_count) + .setMessage(R.string.action_reset_usage_count_dialog) + .setPositiveButton(android.R.string.yes, (dialog, which) -> resetUsageCount()) + .setNegativeButton(android.R.string.no, null) + .create()); + } else if (itemId == R.id.action_default_icon) { + TextDrawable drawable = TextDrawableHelper.generate(_origEntry.getIssuer(), _origEntry.getName(), _iconView); + _iconView.setImageDrawable(drawable); - _selectedIcon = null; - _hasCustomIcon = false; - _hasChangedIcon = true; - default: - return super.onOptionsItemSelected(item); + _selectedIcon = null; + _hasCustomIcon = false; + _hasChangedIcon = true; + } else { + return super.onOptionsItemSelected(item); } return true; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java index f1815711..2333f0cb 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java @@ -147,18 +147,15 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - discardAndFinish(); - break; - case R.id.action_save: - saveAndFinish(); - break; - case R.id.action_delete_unused_groups: - onRemoveUnusedGroups(); - break; - default: - return super.onOptionsItemSelected(item); + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + discardAndFinish(); + } else if (itemId == R.id.action_save) { + saveAndFinish(); + } else if (itemId == R.id.action_delete_unused_groups) { + onRemoveUnusedGroups(); + } else { + return super.onOptionsItemSelected(item); } return true; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java index 5b5b560e..93a6fee9 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java @@ -347,18 +347,15 @@ public class ImportEntriesActivity extends AegisActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - break; - case R.id.toggle_checkboxes: - _adapter.toggleCheckboxes(); - break; - case R.id.toggle_wipe_vault: - item.setChecked(!item.isChecked()); - break; - default: - return super.onOptionsItemSelected(item); + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + finish(); + } else if (itemId == R.id.toggle_checkboxes) { + _adapter.toggleCheckboxes(); + } else if (itemId == R.id.toggle_wipe_vault) { + item.setChecked(!item.isChecked()); + } else { + return super.onOptionsItemSelected(item); } return true; 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 c262ab83..3fea9cec 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -770,51 +770,42 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_settings: { - startPreferencesActivity(); - return true; - } - case R.id.action_about: { - Intent intent = new Intent(this, AboutActivity.class); - startActivity(intent); - return true; - } - case R.id.action_lock: - _vaultManager.lock(true); - return true; - default: - if (item.getGroupId() == R.id.action_sort_category) { - item.setChecked(true); + int itemId = item.getItemId(); + if (itemId == R.id.action_settings) { + startPreferencesActivity(); + } else if (itemId == R.id.action_about) { + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); + } else if (itemId == R.id.action_lock) { + _vaultManager.lock(true); + } else { + if (item.getGroupId() == R.id.action_sort_category) { + item.setChecked(true); - SortCategory sortCategory; - switch (item.getItemId()) { - case R.id.menu_sort_alphabetically: - sortCategory = SortCategory.ISSUER; - break; - case R.id.menu_sort_alphabetically_reverse: - sortCategory = SortCategory.ISSUER_REVERSED; - break; - case R.id.menu_sort_alphabetically_name: - sortCategory = SortCategory.ACCOUNT; - break; - case R.id.menu_sort_alphabetically_name_reverse: - sortCategory = SortCategory.ACCOUNT_REVERSED; - break; - case R.id.menu_sort_usage_count: - sortCategory = SortCategory.USAGE_COUNT; - break; - case R.id.menu_sort_custom: - default: - sortCategory = SortCategory.CUSTOM; - break; - } - - _entryListView.setSortCategory(sortCategory, true); - _prefs.setCurrentSortCategory(sortCategory); + SortCategory sortCategory; + int subItemId = item.getItemId(); + if (subItemId == R.id.menu_sort_alphabetically) { + sortCategory = SortCategory.ISSUER; + } else if (subItemId == R.id.menu_sort_alphabetically_reverse) { + sortCategory = SortCategory.ISSUER_REVERSED; + } else if (subItemId == R.id.menu_sort_alphabetically_name) { + sortCategory = SortCategory.ACCOUNT; + } else if (subItemId == R.id.menu_sort_alphabetically_name_reverse) { + sortCategory = SortCategory.ACCOUNT_REVERSED; + } else if (subItemId == R.id.menu_sort_usage_count) { + sortCategory = SortCategory.USAGE_COUNT; + } else { + sortCategory = SortCategory.CUSTOM; } - return super.onOptionsItemSelected(item); + + _entryListView.setSortCategory(sortCategory, true); + _prefs.setCurrentSortCategory(sortCategory); + } + + return super.onOptionsItemSelected(item); } + + return true; } private void collapseSearchView() { @@ -1105,84 +1096,75 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } private class ActionModeCallbacks implements ActionMode.Callback { - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.menu_action_mode, menu); + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_action_mode, menu); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (_selectedEntries.size() == 0) { + mode.finish(); return true; } - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + int itemId = item.getItemId(); + if (itemId == R.id.action_copy) { + copyEntryCode(_selectedEntries.get(0)); + mode.finish(); + } else if (itemId == R.id.action_edit) { + startEditEntryActivity(CODE_EDIT_ENTRY, _selectedEntries.get(0)); + mode.finish(); + } else if (itemId == R.id.action_toggle_favorite) { + for (VaultEntry entry : _selectedEntries) { + entry.setIsFavorite(!entry.isFavorite()); + _entryListView.replaceEntry(entry.getUUID(), entry); + } + _entryListView.refresh(true); + + saveAndBackupVault(); + mode.finish(); + } else if (itemId == R.id.action_share_qr) { + Intent intent = new Intent(getBaseContext(), TransferEntriesActivity.class); + ArrayList authInfos = new ArrayList<>(); + for (VaultEntry entry : _selectedEntries) { + GoogleAuthInfo authInfo = new GoogleAuthInfo(entry.getInfo(), entry.getName(), entry.getIssuer()); + authInfos.add(authInfo); + } + + intent.putExtra("authInfos", authInfos); + startActivity(intent); + + mode.finish(); + } else if (itemId == R.id.action_delete) { + Dialogs.showDeleteEntriesDialog(MainActivity.this, _selectedEntries, (d, which) -> { + deleteEntries(_selectedEntries); + _entryListView.setGroups(_vaultManager.getVault().getUsedGroups()); + mode.finish(); + }); + } else if (itemId == R.id.action_assign_icons) { + startAssignIconsActivity(CODE_ASSIGN_ICONS, _selectedEntries); + mode.finish(); + } else { return false; } - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (_selectedEntries.size() == 0) { - mode.finish(); - return true; - } - switch (item.getItemId()) { - case R.id.action_copy: - copyEntryCode(_selectedEntries.get(0)); - mode.finish(); - return true; + return true; + } - case R.id.action_edit: - startEditEntryActivity(CODE_EDIT_ENTRY, _selectedEntries.get(0)); - mode.finish(); - return true; - - case R.id.action_toggle_favorite: - for (VaultEntry entry : _selectedEntries) { - entry.setIsFavorite(!entry.isFavorite()); - _entryListView.replaceEntry(entry.getUUID(), entry); - } - _entryListView.refresh(true); - - saveAndBackupVault(); - mode.finish(); - return true; - - case R.id.action_share_qr: - Intent intent = new Intent(getBaseContext(), TransferEntriesActivity.class); - ArrayList authInfos = new ArrayList<>(); - for (VaultEntry entry : _selectedEntries) { - GoogleAuthInfo authInfo = new GoogleAuthInfo(entry.getInfo(), entry.getName(), entry.getIssuer()); - authInfos.add(authInfo); - } - - intent.putExtra("authInfos", authInfos); - startActivity(intent); - - mode.finish(); - return true; - - case R.id.action_delete: - Dialogs.showDeleteEntriesDialog(MainActivity.this, _selectedEntries, (d, which) -> { - deleteEntries(_selectedEntries); - _entryListView.setGroups(_vaultManager.getVault().getUsedGroups()); - mode.finish(); - }); - return true; - - case R.id.action_assign_icons: - startAssignIconsActivity(CODE_ASSIGN_ICONS, _selectedEntries); - mode.finish(); - return true; - - default: - return false; - } - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - _entryListView.setActionModeState(false, null); - _actionModeBackPressHandler.setEnabled(false); - _selectedEntries.clear(); - _actionMode = null; - } + @Override + public void onDestroyActionMode(ActionMode mode) { + _entryListView.setActionModeState(false, null); + _actionModeBackPressHandler.setEnabled(false); + _selectedEntries.clear(); + _actionMode = null; + } } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java index 20629205..dfa666da 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java @@ -154,7 +154,7 @@ public class TransferEntriesActivity extends AegisActivity { @ColorInt int backgroundColor = Color.WHITE; if (getConfiguredTheme() == Theme.LIGHT) { TypedValue typedValue = new TypedValue(); - getTheme().resolveAttribute(R.attr.background, typedValue, true); + getTheme().resolveAttribute(androidx.appcompat.R.attr.background, typedValue, true); backgroundColor = typedValue.data; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/SecurityPickerSlide.java b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/SecurityPickerSlide.java index 9af0a5dd..6c9afce4 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/SecurityPickerSlide.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/SecurityPickerSlide.java @@ -74,18 +74,14 @@ public class SecurityPickerSlide extends SlideFragment { int buttonId = _buttonGroup.getCheckedRadioButtonId(); int type; - switch (buttonId) { - case R.id.rb_none: - type = CRYPT_TYPE_NONE; - break; - case R.id.rb_password: - type = CRYPT_TYPE_PASS; - break; - case R.id.rb_biometrics: - type = CRYPT_TYPE_BIOMETRIC; - break; - default: - throw new RuntimeException(String.format("Unsupported security type: %d", buttonId)); + if (buttonId == R.id.rb_none) { + type = CRYPT_TYPE_NONE; + } else if (buttonId == R.id.rb_password) { + type = CRYPT_TYPE_PASS; + } else if (buttonId == R.id.rb_biometrics) { + type = CRYPT_TYPE_BIOMETRIC; + } else { + throw new RuntimeException(String.format("Unsupported security type: %d", buttonId)); } introState.putInt("cryptType", type); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java index 36edc0b6..5298f2eb 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java @@ -626,7 +626,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { private class CompactDividerDecoration extends MaterialDividerItemDecoration { public CompactDividerDecoration() { super(requireContext(), DividerItemDecoration.VERTICAL); - setDividerColor(ThemeHelper.getThemeColor(R.attr.divider, requireContext().getTheme())); + setDividerColor(ThemeHelper.getThemeColor(androidx.appcompat.R.attr.divider, requireContext().getTheme())); setLastItemDecorated(false); setDividerThickness(MetricsHelper.convertDpToPixels(requireContext(), 0.5f)); } diff --git a/gradle.properties b/gradle.properties index 8b4fd0ea..5eacb8fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,5 @@ android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false -android.nonFinalResIds=false -android.nonTransitiveRClass=false android.useAndroidX=true org.gradle.jvmargs=-Xmx8g