From d3e5472ef26c3a36df7423a39547b3e3cb86a932 Mon Sep 17 00:00:00 2001 From: elena Date: Tue, 20 Dec 2022 16:21:03 +0000 Subject: [PATCH] Only enable export buttons if options are in a valid state --- .../ImportExportPreferencesFragment.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) 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 f175e3aa..7e15f04f 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 @@ -201,25 +201,45 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { Button btnPos = dialog.getButton(AlertDialog.BUTTON_POSITIVE); Button btnNeutral = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); + DialogStateValidator stateValidator = () -> { + boolean noGroupsSelected = groupsSelection.getCheckedItems().isEmpty(); + boolean validState = (checkBoxEncrypt.isChecked() || checkBoxAccept.isChecked()) && + (checkBoxExportAllGroups.isChecked() || !noGroupsSelected); + + if (noGroupsSelected && groupsSelectionLayout.getError() == null) { + CharSequence errorMsg = getString(R.string.export_no_groups_selected); + groupsSelectionLayout.setError(errorMsg); + } else if (!noGroupsSelected && groupsSelectionLayout.getError() != null) { + groupsSelectionLayout.setError(null); + groupsSelectionLayout.setErrorEnabled(false); + } + + btnPos.setEnabled(validState); + btnNeutral.setEnabled(validState); + }; + checkBoxEncrypt.setOnCheckedChangeListener((buttonView, isChecked) -> { warningText.setVisibility(isChecked ? View.GONE : View.VISIBLE); passwordInfoText.setVisibility(isChecked && isBackupPasswordSet ? View.VISIBLE : View.GONE); checkBoxAccept.setVisibility(isChecked ? View.GONE : View.VISIBLE); checkBoxAccept.setChecked(false); - btnPos.setEnabled(isChecked); - btnNeutral.setEnabled(isChecked); + + stateValidator.enableIfValid(); }); checkBoxAccept.setOnCheckedChangeListener((buttonView, isChecked) -> { - btnPos.setEnabled(isChecked); - btnNeutral.setEnabled(isChecked); + stateValidator.enableIfValid(); }); checkBoxExportAllGroups.setOnCheckedChangeListener((button, isChecked) -> { int visibility = isChecked ? View.GONE : View.VISIBLE; groupsSelectionLayout.setVisibility(visibility); + + stateValidator.enableIfValid(); }); + groupsSelection.setOnDismissListener(stateValidator::enableIfValid); + btnPos.setOnClickListener(v -> { dialog.dismiss(); @@ -257,7 +277,6 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { if (!checkBoxExportAllGroups.isChecked()) { _exportFilter = getVaultEntryFilter(groupsSelection); if (_exportFilter == null) { - Toast.makeText(requireContext(), R.string.export_no_groups_selected, Toast.LENGTH_SHORT).show(); return; } } @@ -521,4 +540,8 @@ public class ImportExportPreferencesFragment extends PreferencesFragment { private interface StartExportCallback { void exportVault(FinishExportCallback exportCb); } + + private interface DialogStateValidator { + void enableIfValid(); + } }