From eae31ef94ba86eea425797d02d07bd130222a898 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sun, 17 Jan 2021 13:12:43 +0100 Subject: [PATCH] Switch from Appcompat to Material Components theme Close #354. --- app/build.gradle | 2 +- .../beemdevelopment/aegis/OverallTest.java | 8 +- app/src/main/AndroidManifest.xml | 7 +- .../com/beemdevelopment/aegis/ThemeMap.java | 18 +- .../aegis/helpers/DropdownHelper.java | 27 + .../aegis/helpers/SpinnerHelper.java | 31 - .../aegis/ui/AboutActivity.java | 1 + .../com/beemdevelopment/aegis/ui/Dialogs.java | 6 +- .../aegis/ui/EditEntryActivity.java | 197 +++---- .../aegis/ui/GroupManagerActivity.java | 9 +- .../aegis/ui/MainActivity.java | 1 + .../aegis/ui/PreferencesActivity.java | 8 +- .../aegis/ui/SelectEntriesActivity.java | 1 + .../aegis/ui/SlotManagerActivity.java | 1 + .../aegis/ui/TransferEntriesActivity.java | 1 + .../fragments/ToolsPreferencesFragment.java | 47 +- .../res/color/text_input_box_icon_dark.xml | 6 + .../res/color/text_input_box_stroke_dark.xml | 6 + .../res/drawable/ic_counter_black_24dp.xml | 7 - .../res/drawable/ic_timelapse_black_24dp.xml | 9 - app/src/main/res/layout/activity_about.xml | 17 +- app/src/main/res/layout/activity_auth.xml | 2 +- .../main/res/layout/activity_edit_entry.xml | 536 +++++++++--------- app/src/main/res/layout/activity_groups.xml | 12 +- app/src/main/res/layout/activity_main.xml | 15 +- .../main/res/layout/activity_preferences.xml | 22 + .../res/layout/activity_select_entries.xml | 21 +- .../main/res/layout/activity_share_entry.xml | 19 +- app/src/main/res/layout/activity_slots.xml | 12 +- app/src/main/res/layout/card_entry.xml | 2 +- .../main/res/layout/card_entry_compact.xml | 2 +- app/src/main/res/layout/card_entry_small.xml | 2 +- app/src/main/res/layout/content_about.xml | 20 +- app/src/main/res/layout/dialog_export.xml | 17 +- app/src/main/res/layout/dialog_password.xml | 6 +- app/src/main/res/layout/dialog_text_input.xml | 12 +- .../main/res/layout/dropdown_list_item.xml | 8 + .../res/layout/fragment_entry_list_view.xml | 2 +- .../layout/fragment_security_setup_slide.xml | 4 +- app/src/main/res/menu/menu_main.xml | 3 +- app/src/main/res/values-ar-rSA/strings.xml | 1 - app/src/main/res/values-cs-rCZ/strings.xml | 1 - app/src/main/res/values-de-rDE/strings.xml | 1 - app/src/main/res/values-el-rGR/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-eu-rES/strings.xml | 1 - app/src/main/res/values-fa-rIR/strings.xml | 1 - app/src/main/res/values-fi-rFI/strings.xml | 1 - app/src/main/res/values-fr-rFR/strings.xml | 1 - app/src/main/res/values-hi-rIN/strings.xml | 1 - app/src/main/res/values-hu-rHU/strings.xml | 1 - app/src/main/res/values-in-rID/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-kn-rIN/strings.xml | 1 - app/src/main/res/values-nl-rNL/strings.xml | 1 - app/src/main/res/values-pl-rPL/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro-rRO/strings.xml | 1 - app/src/main/res/values-ru-rRU/strings.xml | 1 - app/src/main/res/values-tr-rTR/strings.xml | 1 - app/src/main/res/values-v23/styles.xml | 29 + app/src/main/res/values-v27/styles.xml | 33 +- app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/attrs.xml | 2 + app/src/main/res/values/colors.xml | 4 +- app/src/main/res/values/strings.xml | 6 +- app/src/main/res/values/styles.xml | 353 ++++++------ 70 files changed, 818 insertions(+), 760 deletions(-) create mode 100644 app/src/main/java/com/beemdevelopment/aegis/helpers/DropdownHelper.java delete mode 100644 app/src/main/java/com/beemdevelopment/aegis/helpers/SpinnerHelper.java create mode 100644 app/src/main/res/color/text_input_box_icon_dark.xml create mode 100644 app/src/main/res/color/text_input_box_stroke_dark.xml delete mode 100644 app/src/main/res/drawable/ic_counter_black_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_timelapse_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_preferences.xml create mode 100644 app/src/main/res/layout/dropdown_list_item.xml create mode 100644 app/src/main/res/values-v23/styles.xml diff --git a/app/build.gradle b/app/build.gradle index 1e0feb86..a9c284ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,7 +153,7 @@ dependencies { implementation "com.github.topjohnwu.libsu:core:${libsuVersion}" implementation "com.github.topjohnwu.libsu:io:${libsuVersion}" implementation "com.google.guava:guava:${guavaVersion}-android" - implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.android.material:material:1.3.0-rc01' implementation 'com.google.protobuf:protobuf-javalite:3.14.0' implementation 'com.google.zxing:core:3.4.1' implementation "com.mikepenz:iconics-core:3.2.5" diff --git a/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java b/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java index cd1be73c..7e585274 100644 --- a/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java +++ b/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java @@ -92,7 +92,7 @@ public class OverallTest extends AegisTest { onView(withId(R.id.rvKeyProfiles)).perform(RecyclerViewActions.actionOnItemAtPosition(1, longClick())); onView(withId(R.id.action_edit)).perform(click()); onView(withId(R.id.text_name)).perform(clearText(), typeText("Bob"), closeSoftKeyboard()); - onView(withId(R.id.spinner_group)).perform(click()); + onView(withId(R.id.dropdown_group)).perform(click()); onData(anything()).atPosition(1).perform(click()); onView(withId(R.id.text_input)).perform(typeText(_groupName), closeSoftKeyboard()); onView(withId(android.R.id.button1)).perform(click()); @@ -168,15 +168,15 @@ public class OverallTest extends AegisTest { if (entry.getInfo().getClass() != TotpInfo.class) { int i = entry.getInfo() instanceof HotpInfo ? 1 : 2; try { - onView(withId(R.id.spinner_type)).perform(click()); + onView(withId(R.id.dropdown_type)).perform(click()); onData(anything()).atPosition(i).perform(click()); } catch (AmbiguousViewMatcherException e) { // for some reason, clicking twice is sometimes necessary, otherwise the test fails on the next line - onView(withId(R.id.spinner_type)).perform(click()); + onView(withId(R.id.dropdown_type)).perform(click()); onData(anything()).atPosition(i).perform(click()); } if (entry.getInfo() instanceof HotpInfo) { - onView(withId(R.id.text_counter)).perform(typeText("0"), closeSoftKeyboard()); + onView(withId(R.id.text_period_counter)).perform(typeText("0"), closeSoftKeyboard()); } if (entry.getInfo() instanceof SteamInfo) { onView(withId(R.id.text_digits)).perform(clearText(), typeText("5"), closeSoftKeyboard()); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c151aadd..eb1ea9b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,8 +22,7 @@ android:icon="@mipmap/${iconName}" android:label="Aegis" android:supportsRtl="true" - android:theme="@style/AppTheme.NoActionBar" - tools:ignore="GoogleAppIndexingWarning" + android:theme="@style/Theme.Aegis.Launch" tools:replace="android:theme"> @@ -60,11 +59,9 @@ android:label="@string/title_activity_edit_entry" /> + android:name=".ui.AuthActivity" /> diff --git a/app/src/main/java/com/beemdevelopment/aegis/ThemeMap.java b/app/src/main/java/com/beemdevelopment/aegis/ThemeMap.java index 214b2f9a..65b77625 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ThemeMap.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ThemeMap.java @@ -10,20 +10,20 @@ public class ThemeMap { } public static final Map DEFAULT = ImmutableMap.of( - Theme.LIGHT, R.style.AppTheme, - Theme.DARK, R.style.AppTheme_Dark, - Theme.AMOLED, R.style.AppTheme_TrueBlack + Theme.LIGHT, R.style.Theme_Aegis_Light_Default, + Theme.DARK, R.style.Theme_Aegis_Dark_Default, + Theme.AMOLED, R.style.Theme_Aegis_TrueDark_Default ); public static final Map NO_ACTION_BAR = ImmutableMap.of( - Theme.LIGHT, R.style.AppTheme_Light_NoActionBar, - Theme.DARK, R.style.AppTheme_Dark_NoActionBar, - Theme.AMOLED, R.style.AppTheme_TrueBlack_NoActionBar + Theme.LIGHT, R.style.Theme_Aegis_Light_NoActionBar, + Theme.DARK, R.style.Theme_Aegis_Dark_NoActionBar, + Theme.AMOLED, R.style.Theme_Aegis_TrueDark_NoActionBar ); public static final Map FULLSCREEN = ImmutableMap.of( - Theme.LIGHT, R.style.AppTheme_Fullscreen, - Theme.DARK, R.style.AppTheme_Fullscreen_Dark, - Theme.AMOLED, R.style.AppTheme_Fullscreen_TrueBlack + Theme.LIGHT, R.style.Theme_Aegis_Light_Fullscreen, + Theme.DARK, R.style.Theme_Aegis_Dark_Fullscreen, + Theme.AMOLED, R.style.Theme_Aegis_TrueDark_Fullscreen ); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/helpers/DropdownHelper.java b/app/src/main/java/com/beemdevelopment/aegis/helpers/DropdownHelper.java new file mode 100644 index 00000000..34414e3a --- /dev/null +++ b/app/src/main/java/com/beemdevelopment/aegis/helpers/DropdownHelper.java @@ -0,0 +1,27 @@ +package com.beemdevelopment.aegis.helpers; + +import android.content.Context; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; + +import androidx.annotation.ArrayRes; + +import com.beemdevelopment.aegis.R; + +import java.util.List; + +public class DropdownHelper { + private DropdownHelper() { + + } + + public static void fillDropdown(Context context, AutoCompleteTextView dropdown, @ArrayRes int textArrayResId) { + ArrayAdapter adapter = ArrayAdapter.createFromResource(context, textArrayResId, R.layout.dropdown_list_item); + dropdown.setAdapter(adapter); + } + + public static void fillDropdown(Context context, AutoCompleteTextView dropdown, List items) { + ArrayAdapter adapter = new ArrayAdapter<>(context, R.layout.dropdown_list_item, items); + dropdown.setAdapter(adapter); + } +} diff --git a/app/src/main/java/com/beemdevelopment/aegis/helpers/SpinnerHelper.java b/app/src/main/java/com/beemdevelopment/aegis/helpers/SpinnerHelper.java deleted file mode 100644 index cbfbb458..00000000 --- a/app/src/main/java/com/beemdevelopment/aegis/helpers/SpinnerHelper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.beemdevelopment.aegis.helpers; - -import android.content.Context; -import android.widget.ArrayAdapter; -import android.widget.Spinner; - -import java.util.List; - -import androidx.annotation.ArrayRes; - -public class SpinnerHelper { - private SpinnerHelper() { - - } - - public static void fillSpinner(Context context, Spinner spinner, @ArrayRes int textArrayResId) { - ArrayAdapter adapter = ArrayAdapter.createFromResource(context, textArrayResId, android.R.layout.simple_spinner_item); - initSpinner(spinner, adapter); - } - - public static void fillSpinner(Context context, Spinner spinner, List items) { - ArrayAdapter adapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, items); - initSpinner(spinner, adapter); - } - - private static void initSpinner(Spinner spinner, ArrayAdapter adapter) { - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - spinner.setAdapter(adapter); - spinner.invalidate(); - } -} 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 a08e6248..8ed048bc 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AboutActivity.java @@ -42,6 +42,7 @@ public class AboutActivity extends AegisActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); + setSupportActionBar(findViewById(R.id.toolbar)); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java index 793bb37b..b38982ae 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java @@ -38,6 +38,7 @@ import com.beemdevelopment.aegis.ui.tasks.KeyDerivationTask; import com.beemdevelopment.aegis.vault.slots.PasswordSlot; import com.beemdevelopment.aegis.vault.slots.Slot; import com.beemdevelopment.aegis.vault.slots.SlotException; +import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import com.nulabinc.zxcvbn.Strength; import com.nulabinc.zxcvbn.Zxcvbn; @@ -190,11 +191,12 @@ public class Dialogs { private static void showTextInputDialog(Context context, @StringRes int titleId, @StringRes int messageId, @StringRes int hintId, TextInputListener listener, DialogInterface.OnDismissListener dismissListener, boolean isSecret) { View view = LayoutInflater.from(context).inflate(R.layout.dialog_text_input, null); - EditText input = view.findViewById(R.id.text_input); + TextInputEditText input = view.findViewById(R.id.text_input); + TextInputLayout inputLayout = view.findViewById(R.id.text_input_layout); if (isSecret) { input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); } - input.setHint(hintId); + inputLayout.setHint(hintId); AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle(titleId) 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 a5c2dc9c..86df53c3 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -1,6 +1,5 @@ package com.beemdevelopment.aegis.ui; -import android.app.Activity; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; @@ -17,13 +16,10 @@ import android.view.animation.AccelerateInterpolator; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.AdapterView; -import android.widget.EditText; +import android.widget.AutoCompleteTextView; import android.widget.ImageView; import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.TableRow; -import androidx.annotation.ArrayRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -35,7 +31,7 @@ import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.encoding.Base32; import com.beemdevelopment.aegis.encoding.EncodingException; import com.beemdevelopment.aegis.helpers.EditTextHelper; -import com.beemdevelopment.aegis.helpers.SpinnerHelper; +import com.beemdevelopment.aegis.helpers.DropdownHelper; import com.beemdevelopment.aegis.helpers.TextDrawableHelper; import com.beemdevelopment.aegis.otp.GoogleAuthInfo; import com.beemdevelopment.aegis.otp.HotpInfo; @@ -50,6 +46,8 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.textfield.TextInputLayout; import java.io.ByteArrayOutputStream; import java.util.ArrayList; @@ -73,20 +71,17 @@ public class EditEntryActivity extends AegisActivity { private CircleImageView _iconView; private ImageView _saveImageButton; - private EditText _textName; - private EditText _textIssuer; - private EditText _textPeriod; - private EditText _textCounter; - private EditText _textDigits; - private EditText _textSecret; + private TextInputEditText _textName; + private TextInputEditText _textIssuer; + private TextInputEditText _textPeriodCounter; + private TextInputLayout _textPeriodCounterLayout; + private TextInputEditText _textDigits; + private TextInputEditText _textSecret; - private TableRow _rowPeriod; - private TableRow _rowCounter; - - private Spinner _spinnerType; - private Spinner _spinnerAlgo; - private Spinner _spinnerGroup; - private List _spinnerGroupList = new ArrayList<>(); + private AutoCompleteTextView _dropdownType; + private AutoCompleteTextView _dropdownAlgo; + private AutoCompleteTextView _dropdownGroup; + private List _dropdownGroupList = new ArrayList<>(); private KropView _kropView; @@ -99,6 +94,7 @@ public class EditEntryActivity extends AegisActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_entry); + setSupportActionBar(findViewById(R.id.toolbar)); _vault = getApp().getVaultManager(); _groups = _vault.getGroups(); @@ -126,19 +122,17 @@ public class EditEntryActivity extends AegisActivity { _saveImageButton = findViewById(R.id.iv_saveImage); _textName = findViewById(R.id.text_name); _textIssuer = findViewById(R.id.text_issuer); - _textPeriod = findViewById(R.id.text_period); + _textPeriodCounter = findViewById(R.id.text_period_counter); + _textPeriodCounterLayout = findViewById(R.id.text_period_counter_layout); _textDigits = findViewById(R.id.text_digits); - _rowPeriod = findViewById(R.id.row_period); - _textCounter = findViewById(R.id.text_counter); - _rowCounter = findViewById(R.id.row_counter); _textSecret = findViewById(R.id.text_secret); - _spinnerType = findViewById(R.id.spinner_type); - SpinnerHelper.fillSpinner(this, _spinnerType, R.array.otp_types_array); - _spinnerAlgo = findViewById(R.id.spinner_algo); - SpinnerHelper.fillSpinner(this, _spinnerAlgo, R.array.otp_algo_array); - _spinnerGroup = findViewById(R.id.spinner_group); - updateGroupSpinnerList(); - SpinnerHelper.fillSpinner(this, _spinnerGroup, _spinnerGroupList); + _dropdownType = findViewById(R.id.dropdown_type); + DropdownHelper.fillDropdown(this, _dropdownType, R.array.otp_types_array); + _dropdownAlgo = findViewById(R.id.dropdown_algo); + DropdownHelper.fillDropdown(this, _dropdownAlgo, R.array.otp_algo_array); + _dropdownGroup = findViewById(R.id.dropdown_group); + updateGroupDropdownList(); + DropdownHelper.fillDropdown(this, _dropdownGroup, _dropdownGroupList); _advancedSettingsHeader = findViewById(R.id.accordian_header); _advancedSettings = findViewById(R.id.expandableLayout); @@ -162,11 +156,11 @@ public class EditEntryActivity extends AegisActivity { OtpInfo info = _origEntry.getInfo(); if (info instanceof TotpInfo) { - _textPeriod.setText(Integer.toString(((TotpInfo) info).getPeriod())); - _rowPeriod.setVisibility(View.VISIBLE); + _textPeriodCounterLayout.setHint(R.string.period_hint); + _textPeriodCounter.setText(Integer.toString(((TotpInfo) info).getPeriod())); } else if (info instanceof HotpInfo) { - _textCounter.setText(Long.toString(((HotpInfo) info).getCounter())); - _rowCounter.setVisibility(View.VISIBLE); + _textPeriodCounterLayout.setHint(R.string.counter); + _textPeriodCounter.setText(Long.toString(((HotpInfo) info).getCounter())); } else { throw new RuntimeException(String.format("Unsupported OtpInfo type: %s", info.getClass())); } @@ -178,11 +172,8 @@ public class EditEntryActivity extends AegisActivity { _textSecret.setText(secretString); } - String type = _origEntry.getInfo().getType(); - _spinnerType.setSelection(getStringResourceIndex(R.array.otp_types_array, type), false); - - String algo = _origEntry.getInfo().getAlgorithm(false); - _spinnerAlgo.setSelection(getStringResourceIndex(R.array.otp_algo_array, algo), false); + _dropdownType.setText(_origEntry.getInfo().getType().toUpperCase(), false); + _dropdownAlgo.setText(_origEntry.getInfo().getAlgorithm(false), false); String group = _origEntry.getGroup(); setGroup(group); @@ -192,58 +183,20 @@ public class EditEntryActivity extends AegisActivity { _textName.addTextChangedListener(_iconChangeListener); // show/hide period and counter fields on type change - _spinnerType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - String type = _spinnerType.getSelectedItem().toString().toLowerCase(); - switch (type) { - case TotpInfo.ID: - case SteamInfo.ID: - _rowCounter.setVisibility(View.GONE); - _rowPeriod.setVisibility(View.VISIBLE); - break; - case HotpInfo.ID: - _rowPeriod.setVisibility(View.GONE); - _rowCounter.setVisibility(View.VISIBLE); - break; - default: - throw new RuntimeException(String.format("Unsupported OTP type: %s", type)); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); - - final Activity activity = this; - _spinnerGroup.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - private int prevPosition; - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (position == _spinnerGroupList.size() - 1) { - Dialogs.showTextInputDialog(activity, R.string.set_group, R.string.group_name_hint, text -> { - String str = new String(text); - if (str.isEmpty()) { - return; - } - _groups.add(str); - // reset the selection to "No group" to work around a quirk - _spinnerGroup.setSelection(0, false); - updateGroupSpinnerList(); - _spinnerGroup.setSelection(_spinnerGroupList.indexOf(str), false); - }); - _spinnerGroup.setSelection(prevPosition, false); - } else { - prevPosition = position; - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - + _dropdownType.setOnItemClickListener((parent, view, position, id) -> { + String type = _dropdownType.getText().toString().toLowerCase(); + switch (type) { + case TotpInfo.ID: + case SteamInfo.ID: + _textPeriodCounterLayout.setHint(R.string.period_hint); + _textPeriodCounter.setText(String.format("%d", 30)); + break; + case HotpInfo.ID: + _textPeriodCounterLayout.setHint(R.string.counter); + _textPeriodCounter.setText(String.format("%d", 0)); + break; + default: + throw new RuntimeException(String.format("Unsupported OTP type: %s", type)); } }); @@ -258,15 +211,37 @@ public class EditEntryActivity extends AegisActivity { openAdvancedSettings(); setGroup(selectedGroup); } + + _dropdownGroup.setOnItemClickListener(new AdapterView.OnItemClickListener() { + private int prevPosition = _dropdownGroupList.indexOf(_dropdownGroup.getText().toString()); + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (position == _dropdownGroupList.size() - 1) { + Dialogs.showTextInputDialog(EditEntryActivity.this, R.string.set_group, R.string.group_name_hint, text -> { + String str = new String(text); + if (str.isEmpty()) { + return; + } + _groups.add(str); + updateGroupDropdownList(); + _dropdownGroup.setText(_dropdownGroupList.get(position), false); + }); + _dropdownGroup.setText(_dropdownGroupList.get(prevPosition), false); + } else { + prevPosition = position; + } + } + }); } private void setGroup(String groupName) { - if (groupName == null) { - return; + int pos = 0; + if (groupName != null) { + pos = _groups.contains(groupName) ? _groups.headSet(groupName).size() + 1 : 0; } - int pos = _groups.contains(groupName) ? _groups.headSet(groupName).size() : -1; - _spinnerGroup.setSelection(pos + 1, false); + _dropdownGroup.setText(_dropdownGroupList.get(pos), false); } private void openAdvancedSettings() { @@ -315,12 +290,12 @@ public class EditEntryActivity extends AegisActivity { }); } - private void updateGroupSpinnerList() { + private void updateGroupDropdownList() { Resources res = getResources(); - _spinnerGroupList.clear(); - _spinnerGroupList.add(res.getString(R.string.no_group)); - _spinnerGroupList.addAll(_groups); - _spinnerGroupList.add(res.getString(R.string.new_group)); + _dropdownGroupList.clear(); + _dropdownGroupList.add(res.getString(R.string.no_group)); + _dropdownGroupList.addAll(_groups); + _dropdownGroupList.add(res.getString(R.string.new_group)); } @Override @@ -493,7 +468,7 @@ public class EditEntryActivity extends AegisActivity { private int parsePeriod() throws ParseException { try { - return Integer.parseInt(_textPeriod.getText().toString()); + return Integer.parseInt(_textPeriodCounter.getText().toString()); } catch (NumberFormatException e) { throw new ParseException("Period is not an integer."); } @@ -504,8 +479,8 @@ public class EditEntryActivity extends AegisActivity { throw new ParseException("Secret is a required field."); } - String type = _spinnerType.getSelectedItem().toString(); - String algo = _spinnerAlgo.getSelectedItem().toString(); + String type = _dropdownType.getText().toString(); + String algo = _dropdownAlgo.getText().toString(); int digits; try { @@ -537,7 +512,7 @@ public class EditEntryActivity extends AegisActivity { case HotpInfo.ID: long counter; try { - counter = Long.parseLong(_textCounter.getText().toString()); + counter = Long.parseLong(_textPeriodCounter.getText().toString()); } catch (NumberFormatException e) { throw new ParseException("Counter is not an integer."); } @@ -558,9 +533,9 @@ public class EditEntryActivity extends AegisActivity { entry.setIssuer(_textIssuer.getText().toString()); entry.setName(_textName.getText().toString()); - int groupPos = _spinnerGroup.getSelectedItemPosition(); + int groupPos = _dropdownGroupList.indexOf(_dropdownGroup.getText().toString()); if (groupPos != 0) { - String group = _spinnerGroupList.get(_spinnerGroup.getSelectedItemPosition()); + String group = _dropdownGroupList.get(groupPos); entry.setGroup(group); } else { entry.setGroup(null); @@ -624,16 +599,6 @@ public class EditEntryActivity extends AegisActivity { } }; - private int getStringResourceIndex(@ArrayRes int id, String string) { - String[] res = getResources().getStringArray(id); - for (int i = 0; i < res.length; i++) { - if (res[i].equalsIgnoreCase(string)) { - return i; - } - } - return -1; - } - private static class ParseException extends Exception { public ParseException(String message) { super(message); 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 b8c23ae7..3dfc3817 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java @@ -5,6 +5,10 @@ import android.os.Bundle; import android.view.MenuItem; import android.view.View; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.ui.views.GroupAdapter; @@ -12,10 +16,6 @@ import java.text.Collator; import java.util.ArrayList; import java.util.TreeSet; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - public class GroupManagerActivity extends AegisActivity implements GroupAdapter.Listener { private GroupAdapter _adapter; private TreeSet _groups; @@ -26,6 +26,7 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_groups); + setSupportActionBar(findViewById(R.id.toolbar)); Intent intent = getIntent(); _groups = new TreeSet<>(Collator.getInstance()); 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 0960b7ed..abb6db59 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -101,6 +101,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + setSupportActionBar(findViewById(R.id.toolbar)); _app = (AegisApplication) getApplication(); _vault = _app.getVaultManager(); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java index a843aa7e..5f93834c 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java @@ -18,6 +18,8 @@ public class PreferencesActivity extends AegisActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_preferences); + setSupportActionBar(findViewById(R.id.toolbar)); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -29,7 +31,7 @@ public class PreferencesActivity extends AegisActivity implements _fragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction() - .replace(android.R.id.content, _fragment) + .replace(R.id.content, _fragment) .commit(); PreferencesFragment requestedFragment = getRequestedFragment(); @@ -38,7 +40,7 @@ public class PreferencesActivity extends AegisActivity implements showFragment(_fragment); } } else { - _fragment = (PreferencesFragment) getSupportFragmentManager().findFragmentById(android.R.id.content); + _fragment = (PreferencesFragment) getSupportFragmentManager().findFragmentById(R.id.content); } } @@ -96,7 +98,7 @@ public class PreferencesActivity extends AegisActivity implements private void showFragment(PreferencesFragment fragment) { getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right) - .replace(android.R.id.content, fragment) + .replace(R.id.content, fragment) .addToBackStack(null) .commit(); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/SelectEntriesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/SelectEntriesActivity.java index d57edbd8..69ea33bc 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/SelectEntriesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/SelectEntriesActivity.java @@ -35,6 +35,7 @@ public class SelectEntriesActivity extends AegisActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_entries); + setSupportActionBar(findViewById(R.id.toolbar)); ActionBar bar = getSupportActionBar(); bar.setHomeAsUpIndicator(R.drawable.ic_close); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java index 20ca8a05..a75ef505 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java @@ -39,6 +39,7 @@ public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Li protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_slots); + setSupportActionBar(findViewById(R.id.toolbar)); _edited = false; ActionBar bar = getSupportActionBar(); 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 9468cfc9..30ea3c29 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/TransferEntriesActivity.java @@ -37,6 +37,7 @@ public class TransferEntriesActivity extends AegisActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_share_entry); + setSupportActionBar(findViewById(R.id.toolbar)); _vault = getApp().getVaultManager(); _qrImage = findViewById(R.id.ivQrCode); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/ToolsPreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/ToolsPreferencesFragment.java index a1877cfd..1dfab1ce 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/ToolsPreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/ToolsPreferencesFragment.java @@ -7,20 +7,20 @@ import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; -import android.widget.AdapterView; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.ArrayRes; import androidx.appcompat.app.AlertDialog; import androidx.core.content.FileProvider; import androidx.preference.Preference; import com.beemdevelopment.aegis.BuildConfig; import com.beemdevelopment.aegis.R; -import com.beemdevelopment.aegis.helpers.SpinnerHelper; +import com.beemdevelopment.aegis.helpers.DropdownHelper; import com.beemdevelopment.aegis.importers.AegisImporter; import com.beemdevelopment.aegis.importers.DatabaseImporter; import com.beemdevelopment.aegis.importers.DatabaseImporterEntryException; @@ -233,20 +233,13 @@ public class ToolsPreferencesFragment extends PreferencesFragment { TextView warningText = view.findViewById(R.id.text_export_warning); CheckBox checkBoxEncrypt = view.findViewById(R.id.checkbox_export_encrypt); CheckBox checkBoxAccept = view.findViewById(R.id.checkbox_accept); - Spinner spinner = view.findViewById(R.id.spinner_export_format); - SpinnerHelper.fillSpinner(getContext(), spinner, R.array.export_formats); - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - checkBoxEncrypt.setChecked(position == 0); - checkBoxEncrypt.setEnabled(position == 0); - warningText.setVisibility(checkBoxEncrypt.isChecked() ? View.GONE : View.VISIBLE); - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } + AutoCompleteTextView dropdown = view.findViewById(R.id.dropdown_export_format); + DropdownHelper.fillDropdown(getContext(), dropdown, R.array.export_formats); + dropdown.setText(getString(R.string.export_format_aegis), false); + dropdown.setOnItemClickListener((parent, view1, position, id) -> { + checkBoxEncrypt.setChecked(position == 0); + checkBoxEncrypt.setEnabled(position == 0); + warningText.setVisibility(checkBoxEncrypt.isChecked() ? View.GONE : View.VISIBLE); }); AlertDialog dialog = new AlertDialog.Builder(getContext()) @@ -281,8 +274,9 @@ public class ToolsPreferencesFragment extends PreferencesFragment { return; } - int requestCode = getExportRequestCode(spinner.getSelectedItemPosition(), checkBoxEncrypt.isChecked()); - VaultBackupManager.FileInfo fileInfo = getExportFileInfo(spinner.getSelectedItemPosition(), checkBoxEncrypt.isChecked()); + int pos = getStringResourceIndex(R.array.export_formats, dropdown.getText().toString()); + int requestCode = getExportRequestCode(pos, checkBoxEncrypt.isChecked()); + VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, checkBoxEncrypt.isChecked()); Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType(getExportMimeType(requestCode)) @@ -293,13 +287,14 @@ public class ToolsPreferencesFragment extends PreferencesFragment { btnNeutral.setOnClickListener(v -> { dialog.dismiss(); + int pos = getStringResourceIndex(R.array.export_formats, dropdown.getText().toString()); if (!checkBoxEncrypt.isChecked() && !checkBoxAccept.isChecked()) { return; } File file; try { - VaultBackupManager.FileInfo fileInfo = getExportFileInfo(spinner.getSelectedItemPosition(), checkBoxEncrypt.isChecked()); + VaultBackupManager.FileInfo fileInfo = getExportFileInfo(pos, checkBoxEncrypt.isChecked()); file = File.createTempFile(fileInfo.getFilename() + "-", "." + fileInfo.getExtension(), getExportCacheDir()); } catch (IOException e) { e.printStackTrace(); @@ -307,7 +302,7 @@ public class ToolsPreferencesFragment extends PreferencesFragment { return; } - int requestCode = getExportRequestCode(spinner.getSelectedItemPosition(), checkBoxEncrypt.isChecked()); + int requestCode = getExportRequestCode(pos, checkBoxEncrypt.isChecked()); startExportVault(requestCode, cb -> { try (OutputStream stream = new FileOutputStream(file)) { cb.exportVault(stream); @@ -463,6 +458,16 @@ public class ToolsPreferencesFragment extends PreferencesFragment { }); } + private int getStringResourceIndex(@ArrayRes int id, String string) { + String[] res = getResources().getStringArray(id); + for (int i = 0; i < res.length; i++) { + if (res[i].equalsIgnoreCase(string)) { + return i; + } + } + return -1; + } + private class ExportResultListener implements ExportTask.Callback { @Override public void onTaskFinished(Exception e) { diff --git a/app/src/main/res/color/text_input_box_icon_dark.xml b/app/src/main/res/color/text_input_box_icon_dark.xml new file mode 100644 index 00000000..be0cce59 --- /dev/null +++ b/app/src/main/res/color/text_input_box_icon_dark.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/text_input_box_stroke_dark.xml b/app/src/main/res/color/text_input_box_stroke_dark.xml new file mode 100644 index 00000000..378a7381 --- /dev/null +++ b/app/src/main/res/color/text_input_box_stroke_dark.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_counter_black_24dp.xml b/app/src/main/res/drawable/ic_counter_black_24dp.xml deleted file mode 100644 index 740d85d9..00000000 --- a/app/src/main/res/drawable/ic_counter_black_24dp.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_timelapse_black_24dp.xml b/app/src/main/res/drawable/ic_timelapse_black_24dp.xml deleted file mode 100644 index 6e1ad692..00000000 --- a/app/src/main/res/drawable/ic_timelapse_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 8bba8729..2caa4ad2 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -4,17 +4,24 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:background="?attr/background" tools:context="com.beemdevelopment.aegis.ui.AboutActivity"> + + + - + android:isScrollContainer="true" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - diff --git a/app/src/main/res/layout/activity_auth.xml b/app/src/main/res/layout/activity_auth.xml index 3d10805a..0402b7bf 100644 --- a/app/src/main/res/layout/activity_auth.xml +++ b/app/src/main/res/layout/activity_auth.xml @@ -4,7 +4,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:background="?attr/background" tools:context="com.beemdevelopment.aegis.ui.AuthActivity"> @@ -68,6 +67,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/button_rounded_corners" + android:backgroundTint="@color/colorPrimary" android:minWidth="125dp" android:text="@string/unlock" android:textColor="@color/primary_text_inverted" diff --git a/app/src/main/res/layout/activity_edit_entry.xml b/app/src/main/res/layout/activity_edit_entry.xml index 6f3c2fbd..f162c5c0 100644 --- a/app/src/main/res/layout/activity_edit_entry.xml +++ b/app/src/main/res/layout/activity_edit_entry.xml @@ -1,323 +1,301 @@ - - - - - + - - - - - - - - - - - + + + + android:descendantFocusability="beforeDescendants" + android:focusableInTouchMode="true"> - - + + + + + + + + + + + + + + android:layout_marginBottom="5dp"> + - - - - - - - + + + + + + - - - + android:orientation="horizontal" + android:gravity="center_vertical"> + + + + + + + + + - - - + android:id="@+id/accordian_header" + android:focusable="true" + android:clickable="true"> - + - + + + - - - - - - - - - - - - - - - - - - - - + + - - - - + android:src="@drawable/ic_info_outline_black_24dp" + app:tint="?attr/iconColorPrimary" + android:layout_marginStart="15dp" + android:layout_marginEnd="15dp" + android:layout_gravity="center_vertical"/> - - + - - - - - + + + + + + + + - - + + + + + + + + + + - + + - - android:backgroundTint="#949494" - android:hint="@string/secret" - android:inputType="textPassword"/> - - - + + + + - - + + + diff --git a/app/src/main/res/layout/activity_groups.xml b/app/src/main/res/layout/activity_groups.xml index b6f0ab12..427d5e4e 100644 --- a/app/src/main/res/layout/activity_groups.xml +++ b/app/src/main/res/layout/activity_groups.xml @@ -4,10 +4,20 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:background="?attr/background" tools:context="com.beemdevelopment.aegis.ui.GroupManagerActivity"> + + + + + + + + + app:tint="@color/icon_primary_dark" /> diff --git a/app/src/main/res/layout/activity_preferences.xml b/app/src/main/res/layout/activity_preferences.xml new file mode 100644 index 00000000..b16858f8 --- /dev/null +++ b/app/src/main/res/layout/activity_preferences.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_select_entries.xml b/app/src/main/res/layout/activity_select_entries.xml index 4e25eb45..e687dfe9 100644 --- a/app/src/main/res/layout/activity_select_entries.xml +++ b/app/src/main/res/layout/activity_select_entries.xml @@ -1,14 +1,24 @@ - + + + + + android:scrollbars="vertical" + app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + app:tint="@color/icon_primary_dark" /> diff --git a/app/src/main/res/layout/activity_share_entry.xml b/app/src/main/res/layout/activity_share_entry.xml index 87b0415b..9175487a 100644 --- a/app/src/main/res/layout/activity_share_entry.xml +++ b/app/src/main/res/layout/activity_share_entry.xml @@ -4,9 +4,24 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/cardBackground" + android:background="?attr/background" tools:context="com.beemdevelopment.aegis.ui.TransferEntriesActivity"> + + + + + + + + + app:civ_circle_background_color="@color/colorPrimarySelected" /> + app:civ_circle_background_color="@color/colorPrimarySelected" /> + app:civ_circle_background_color="@color/colorPrimarySelected" /> @@ -151,7 +151,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-github" app:ico_size="16dp" /> @@ -193,7 +193,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-file-text" app:ico_size="16dp" /> @@ -268,7 +268,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-account" app:ico_size="16dp" /> @@ -313,7 +313,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-account" app:ico_size="16dp" /> @@ -358,7 +358,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-email" app:ico_size="16dp" /> @@ -390,7 +390,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:importantForAccessibility="no" - app:ico_color="@color/icon_about" + app:ico_color="?attr/iconColorPrimary" app:ico_icon="gmi-globe" app:ico_size="16dp" /> diff --git a/app/src/main/res/layout/dialog_export.xml b/app/src/main/res/layout/dialog_export.xml index 7a39d782..b59b30f3 100644 --- a/app/src/main/res/layout/dialog_export.xml +++ b/app/src/main/res/layout/dialog_export.xml @@ -12,13 +12,20 @@ android:layout_marginStart="25dp" android:layout_marginEnd="25dp" android:text="@string/export_help" /> - + android:layout_marginStart="25dp" + android:layout_marginEnd="25dp" + android:layout_marginTop="5dp" + android:hint="@string/export_format_hint" + style="?attr/dropdownStyle"> + + - - + - - - - + + diff --git a/app/src/main/res/layout/dropdown_list_item.xml b/app/src/main/res/layout/dropdown_list_item.xml new file mode 100644 index 00000000..3c115055 --- /dev/null +++ b/app/src/main/res/layout/dropdown_list_item.xml @@ -0,0 +1,8 @@ + + diff --git a/app/src/main/res/layout/fragment_entry_list_view.xml b/app/src/main/res/layout/fragment_entry_list_view.xml index 11b4d57b..8c2e7ef1 100644 --- a/app/src/main/res/layout/fragment_entry_list_view.xml +++ b/app/src/main/res/layout/fragment_entry_list_view.xml @@ -22,7 +22,7 @@ android:text="@string/groups" android:layout_gravity="end" android:layout_marginEnd="8dp" - android:textAppearance="@style/AppTheme.ActionChip" + android:textAppearance="@style/TextAppearance.Aegis.ActionChip" android:textColor="?attr/primaryText" app:chipBackgroundColor="?attr/cardBackground" app:chipEndPadding="6dp" diff --git a/app/src/main/res/layout/fragment_security_setup_slide.xml b/app/src/main/res/layout/fragment_security_setup_slide.xml index a9ea224c..9445fbce 100644 --- a/app/src/main/res/layout/fragment_security_setup_slide.xml +++ b/app/src/main/res/layout/fragment_security_setup_slide.xml @@ -40,7 +40,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - + app:actionViewClass="androidx.appcompat.widget.SearchView"/> فتح القفل البيومترية متقدم - ثواني العداد الأرقام السر diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 2da03b5e..2d56823a 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -100,7 +100,6 @@ Odemknout Biometrie Pokročilé - sekund Počítadlo Číslice Tajný klíč diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 60288308..7f958cee 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -98,7 +98,6 @@ Entsperren Biometrie Fortgeschritten - Sekunden Zähler Ziffern Schlüssel diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 9df6d883..731399ca 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -98,7 +98,6 @@ Ξεκλείδωμα Βιομετρική Σύνθετες - δευτερόλεπτα Μετρητής Ψηφία Μυστικός κωδικός diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 5cc9835f..a8c7c8a8 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -89,7 +89,6 @@ Desbloquear Biometría Avanzado - segundos Contador Dígitos Código secreto diff --git a/app/src/main/res/values-eu-rES/strings.xml b/app/src/main/res/values-eu-rES/strings.xml index a0380aac..04114748 100644 --- a/app/src/main/res/values-eu-rES/strings.xml +++ b/app/src/main/res/values-eu-rES/strings.xml @@ -96,7 +96,6 @@ Desblokeatu Biometriak Aurreratua - segundu Kontagailua Digituak Sekretua diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index 2e319515..e71a4241 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -96,7 +96,6 @@ بازکردن بیومتریک پیشرفته - ثانیه شمارنده ارقام رمز diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 15df85e2..921e2f65 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -96,7 +96,6 @@ Avaa lukitus Biometriikka Edistyneet - sekuntia Laskuri Numeroa Salausavain diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 968cfd5e..d717634c 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -98,7 +98,6 @@ Déverrouiller Biométrie Avancé - secondes Compteur Chiffres Code secret diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 4b60cd67..049999d2 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -91,7 +91,6 @@ अनलॉक बॉयोमेट्रिक्स उन्नत - सेकण्ड्स काउंटर अंक गुप्त diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 43abc48a..e6abb9c8 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -76,7 +76,6 @@ Feloldás Biometrikus adatok Speciális - másodperc Számláló Számjegy Titok diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 72e7a934..1457dcd9 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -97,7 +97,6 @@ Buka Biometrik Lanjutan - detik Penghitung Digit Rahasia diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 6bd7bb96..f3a2323d 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -98,7 +98,6 @@ Sblocca Biometrica Avanzate - secondi Contatore Cifre Chiave segreta diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 89e3691e..0fe352fe 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -96,7 +96,6 @@ ロック解除 生体認証 高度な設定 - カウンター 桁数 秘密鍵 diff --git a/app/src/main/res/values-kn-rIN/strings.xml b/app/src/main/res/values-kn-rIN/strings.xml index 2b528003..360ba10c 100644 --- a/app/src/main/res/values-kn-rIN/strings.xml +++ b/app/src/main/res/values-kn-rIN/strings.xml @@ -43,7 +43,6 @@ ದಯವಿಟ್ಟು ಗುಪ್ತಪದವನ್ನು ಖಚಿತಪಡಿಸಿ ಬೀಗ ತೆಗೆದು ಹಾಕು ಸುಧಾರಿತ - ಸೆಕೆಂಡುಗಳು ಎಣಿಕೆ ಮಾಡುವ ಯಂತ್ರ ಅಂಕೆಗಳು ರಹಸ್ಯ diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 0c92634d..94a6f99b 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -98,7 +98,6 @@ Ontgrendel Biometrie Geavanceerd - seconden Teller Cijfers Sleutel diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 18047ce6..c2d52915 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -100,7 +100,6 @@ Odblokuj Autoryzacja biometryczna Zaawansowane - sekund Licznik Cyfry Klucz diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 29e35b32..cc3b7298 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -98,7 +98,6 @@ Desbloquear Biometria Avançado - segundos Contador Dígitos Secreto diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 1a3153a1..053c7fb5 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -98,7 +98,6 @@ Desbloquear Biometria Avançado - segundos Contador Dígitos Secreto diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index d96aecb4..23574ab8 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -99,7 +99,6 @@ Deblocare Biometrice Avansat - secunde Contor Cifre Secret diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index fefc7bb3..81dcf940 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -100,7 +100,6 @@ Разблокировать Биометрия Расширенные - секунд Счётчик Цифры Секрет diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 4efbe37f..27406ae6 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -76,7 +76,6 @@ Kilidi aç Biyometrik Gelişmiş - saniye Sayaç Haneler Gizli Anahtar diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml new file mode 100644 index 00000000..fbb4ea62 --- /dev/null +++ b/app/src/main/res/values-v23/styles.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index 41f489f2..8c5deede 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -1,12 +1,37 @@ - - + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 92aadc12..53fa33a5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -97,7 +97,6 @@ 解锁 生物识别 高级设置 - 计数器 位数 密钥 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5b30f644..e09f0a7d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -90,7 +90,6 @@ 解鎖 生物識別 高級設定 - 計數器 位數 密鑰 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index aa96dea1..7d639c18 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -9,6 +9,8 @@ + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0a203ad1..892a2808 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,7 +1,8 @@ #0d47a1 - #FF1565C0 + #FF1565C0 + #FF5252 #002171 #12b600 #5472d3 @@ -11,7 +12,6 @@ #A0A0A0 #4c4c4c #0d86c1 - #757575 #8e8e8e #ffffff #efefefb diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d31e4b2c..5b56a344 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,6 +77,7 @@ I understand the risk Aegis (.JSON) Text file (.TXT) + Export format Security Aegis is a security-focused 2FA app. Tokens are stored in a vault, that can optionally be encrypted with a password of your choosing. If an attacker obtains your encrypted vault file, they will not be able to access the contents without knowing the password.\n\nWe\'ve preselected the option that we think would fit best for your device. @@ -104,13 +105,15 @@ Please enter your password. We occasionally ask you to do this so that don\'t forget it. It looks like your Authy tokens are encrypted. Please close Aegis, open Authy and unlock the tokens with your password. Instead, Aegis can also attempt to decrypt your Authy tokens for you, if you enter your password below. + Period (seconds) + Hash function + Type Share Yes No Unlock Biometrics Advanced - seconds Counter Digits Secret @@ -221,6 +224,7 @@ Custom New group… Enter a group name + Group Group name Edit groups Manage and delete your groups here diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6fe0dcea..82635f0e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,267 +1,238 @@ - - - - + - - - - - - - - - - - + @color/colorSecondary + @color/colorPrimary - - - - - - - - - - - - - - - - + + + + - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + - - - - - - -