diff --git a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java index 79826273..83413e02 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java +++ b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java @@ -61,6 +61,14 @@ public class Preferences { return _prefs.getBoolean("pref_account_name", true); } + public int getCodeGroupSize() { + if (_prefs.getBoolean("pref_code_group_size", false)) { + return 2; + } else { + return 3; + } + } + public boolean isIntroDone() { return _prefs.getBoolean("pref_intro", false); } 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 7179c15d..d8e03ce8 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -99,6 +99,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene // set up the entry view _entryListView = (EntryListView) getSupportFragmentManager().findFragmentById(R.id.key_profiles); _entryListView.setListener(this); + _entryListView.setCodeGroupSize(getPreferences().getCodeGroupSize()); _entryListView.setShowAccountName(getPreferences().isAccountNameVisible()); _entryListView.setSearchAccountName(getPreferences().isSearchAccountNameEnabled()); _entryListView.setHighlightEntry(getPreferences().isEntryHighlightEnabled()); @@ -220,12 +221,14 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene recreate(); } else if (data.getBooleanExtra("needsRefresh", false)) { boolean showAccountName = getPreferences().isAccountNameVisible(); + int codeGroupSize = getPreferences().getCodeGroupSize(); boolean searchAccountName = getPreferences().isSearchAccountNameEnabled(); boolean highlightEntry = getPreferences().isEntryHighlightEnabled(); boolean tapToReveal = getPreferences().isTapToRevealEnabled(); int tapToRevealTime = getPreferences().getTapToRevealTime(); ViewMode viewMode = getPreferences().getCurrentViewMode(); _entryListView.setShowAccountName(showAccountName); + _entryListView.setCodeGroupSize(codeGroupSize); _entryListView.setSearchAccountName(searchAccountName); _entryListView.setHighlightEntry(highlightEntry); _entryListView.setTapToReveal(tapToReveal); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java index 55513e2b..6b8dd876 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java @@ -206,6 +206,12 @@ public class PreferencesFragment extends PreferenceFragmentCompat { }); timeoutPreference.getOnPreferenceChangeListener().onPreferenceChange(timeoutPreference, timeoutPreference.getText());*/ + Preference codeDigitGroupingPreference = findPreference("pref_code_group_size"); + codeDigitGroupingPreference.setOnPreferenceChangeListener((preference, newValue) -> { + _result.putExtra("needsRefresh", true); + return true; + }); + Preference issuerPreference = findPreference("pref_account_name"); issuerPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java index 3a95f43b..5e941879 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java @@ -4,8 +4,6 @@ import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; import androidx.recyclerview.widget.RecyclerView; @@ -30,6 +28,7 @@ public class EntryAdapter extends RecyclerView.Adapter implements I private List _shownEntries; private List _selectedEntries; private VaultEntry _focusedEntry; + private int _codeGroupSize; private boolean _showAccountName; private boolean _searchAccountName; private boolean _highlightEntry; @@ -62,6 +61,10 @@ public class EntryAdapter extends RecyclerView.Adapter implements I _view = null; } + public void setCodeGroupSize(int codeGroupeSize) { + _codeGroupSize = codeGroupeSize; + } + public void setShowAccountName(boolean showAccountName) { _showAccountName = showAccountName; } @@ -310,7 +313,7 @@ public class EntryAdapter extends RecyclerView.Adapter implements I boolean hidden = _tapToReveal && entry != _focusedEntry; boolean dimmed = _highlightEntry && _focusedEntry != null && _focusedEntry != entry; boolean showProgress = !isPeriodUniform() && entry.getInfo() instanceof TotpInfo; - holder.setData(entry, _showAccountName, showProgress, hidden, dimmed); + holder.setData(entry, _codeGroupSize, _showAccountName, showProgress, hidden, dimmed); holder.setFocused(_selectedEntries.contains(entry)); holder.loadIcon(_view); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryHolder.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryHolder.java index dc7ac55b..ab1e74d6 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryHolder.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryHolder.java @@ -41,6 +41,8 @@ public class EntryHolder extends RecyclerView.ViewHolder { private final ImageView _selected; private final Handler _selectedHandler; + private int _codeGroupSize = 6; + private boolean _hidden; private PeriodProgressBar _progressBar; @@ -92,10 +94,15 @@ public class EntryHolder extends RecyclerView.ViewHolder { }); } - public void setData(VaultEntry entry, boolean showAccountName, boolean showProgress, boolean hidden, boolean dimmed) { + public void setData(VaultEntry entry, int codeGroupSize, boolean showAccountName, boolean showProgress, boolean hidden, boolean dimmed) { _entry = entry; _hidden = hidden; + if (codeGroupSize <= 0) + throw new IllegalArgumentException("Code group size cannot be zero or negative"); + + _codeGroupSize = codeGroupSize; + _selected.clearAnimation(); _selected.setVisibility(View.GONE); _selectedHandler.removeCallbacksAndMessages(null); @@ -207,7 +214,7 @@ public class EntryHolder extends RecyclerView.ViewHolder { if (!(info instanceof SteamInfo)) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < otp.length(); i++) { - if (i != 0 && i % 3 == 0) { + if (i != 0 && i % _codeGroupSize == 0) { sb.append(" "); } sb.append(otp.charAt(i)); 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 17c8e8f0..4fbc3878 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 @@ -223,6 +223,10 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { } } + public void setCodeGroupSize(int codeGrouping) { + _adapter.setCodeGroupSize(codeGrouping); + } + public void setShowAccountName(boolean showAccountName) { _adapter.setShowAccountName(showAccountName); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 698da70f..5aed68a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,8 @@ Theme View mode Language + Code digit grouping + Show code in 2-digit grouping instead of 3-digit grouping Show the account name Enable this to show the account name next to the issuer Timeout diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index f0b9c00c..f69ac873 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -28,6 +28,13 @@ android:defaultValue="system" app:iconSpaceReserved="false"/> + +