Lint Report: 223 warnings
Issue Types

Overview

Correctness
10warning DefaultLocale: Implied default locale in case conversion
1warning DiscouragedPrivateApi: Using Discouraged Private API
15warning UnusedAttribute: Attribute unused on older versions
1warning FragmentTagUsage: Use FragmentContainerView instead of the <fragment> tag
5warning InflateParams: Layout Inflation without a Parent
24warning NonConstantResourceId: Checks use of resource IDs in places requiring constants
2warning LockedOrientationActivity: Incompatible screenOrientation value
1warning UseCompatLoadingForDrawables: Should not call Context.getDrawable or Resources.getDrawable directly
Correctness:Messages
4warning Typos: Spelling error
1warning PluralsCandidate: Potential Plurals
9warning UnusedQuantity: Unused quantity translations
Security
2warning IntentFilterExportedReceiver: Unspecified android:exported in manifest
1warning UnspecifiedImmutableFlag: Missing PendingIntent mutability flag
Performance
10warning NotifyDataSetChanged: Invalidating All RecyclerView Data
2warning ObsoleteSdkInt: Obsolete SDK_INT Version Check
3warning UseCompoundDrawables: Node can be replaced by a TextView with compound drawables
8warning DisableBaselineAlignment: Missing baselineAligned attribute
2warning InefficientWeight: Inefficient layout weight
1warning LaunchActivityFromNotification: Notification Launches Services or BroadcastReceivers
4warning NestedWeights: Nested layout weights
12warning Overdraw: Overdraw: Painting regions more than once
38warning UnusedResources: Unused resources
6warning UselessParent: Unnecessary parent layout
Usability:Typography
3warning TypographyEllipsis: Ellipsis string can be replaced with ellipsis character
Usability:Icons
2warning IconXmlAndPng: Icon is specified both as .xml file and as a bitmap
2warning IconLocation: Image defined in density-independent drawable folder
Usability
2warning AlwaysShowAction: Usage of showAsAction=always
Accessibility
1warning ClickableViewAccessibility: Accessibility in Custom Views
39warning ContentDescription: Image without contentDescription
4warning LabelFor: Missing accessibility label
Internationalization
4warning SetTextI18n: TextView Internationalization
Internationalization:Bidirectional Text
4warning RtlSymmetry: Padding and margin symmetry
Disabled Checks (38)

Implied default locale in case conversion

../../src/main/java/com/beemdevelopment/aegis/importers/AuthyImporter.java:279: Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault().
 276       info.Issuer = info.Name.substring(0, info.Name.indexOf(" - "));
 277       separator = " - ";
 278   } else {
 279       info.Issuer = info.AccountType.substring(0, 1).toUpperCase() + info.AccountType.substring(1);
 280   }
 281 
 282   info.Name = info.Name.replace(info.Issuer + separator, "");
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:219: Implicitly using the default locale is a common source of bugs: Use toLowerCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault().
 216 
 217     private boolean isEntryFiltered(VaultEntry entry) {
 218         String group = entry.getGroup();
 219         String issuer = entry.getIssuer().toLowerCase();                                            
 220         String name = entry.getName().toLowerCase();
 221 
 222         if (!_groupFilter.isEmpty()) {
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:220: Implicitly using the default locale is a common source of bugs: Use toLowerCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault().
 217     private boolean isEntryFiltered(VaultEntry entry) {
 218         String group = entry.getGroup();
 219         String issuer = entry.getIssuer().toLowerCase();
 220         String name = entry.getName().toLowerCase();                                                
 221 
 222         if (!_groupFilter.isEmpty()) {
 223             if (group == null || !_groupFilter.contains(group)) {
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:267: Implicitly using the default locale is a common source of bugs: Use toLowerCase(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault().
 264     }
 265 
 266     public void setSearchFilter(String search) {
 267         _searchFilter = (search != null && !search.isEmpty()) ? search.toLowerCase() : null;        
 268         updateShownEntries();
 269     }
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java:442: Implicitly using the default locale is a common source of bugs: Use String.format(Locale, ...) instead
 439       if (_groupFilter.isEmpty()) {
 440           _groupChip.setText(R.string.groups);
 441       } else {
 442           _groupChip.setText(String.format("%s (%d)", getString(R.string.groups), _groupFilter.size()));
 443       }
 444   }
DefaultLocale Correctness Warning Priority 6/10

Using Discouraged Private API

../../src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java:78: Reflective access to finish, which is not part of the public SDK and therefore likely to change in future Android releases
  75   public void onLocked(boolean userInitiated) {
  76       setResult(RESULT_CANCELED, null);
  77       try {
  78           Method method = Activity.class.getDeclaredMethod("finish", int.class);                  
  79           method.setAccessible(true);
  80           method.invoke(this, 2); // FINISH_TASK_WITH_ACTIVITY = 2
  81       } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
DiscouragedPrivateApi Correctness Warning Priority 6/10

Attribute unused on older versions

../../src/main/res/layout/activity_edit_entry.xml:192: Attribute android:foreground has no effect on API levels lower than 23 (current min is 21)
 189             </LinearLayout>
 190 
 191             <RelativeLayout
 192                 android:foreground="?android:attr/selectableItemBackground"                         
 193                 android:layout_width="match_parent"
 194                 android:layout_height="wrap_content"
 195                 android:id="@+id/accordian_header"
../../src/main/res/layout/activity_import_entries.xml:26: Attribute android:foreground has no effect on API levels lower than 23 (current min is 21)
 23         android:id="@+id/list_entries"
 24         android:layout_width="match_parent"
 25         android:layout_height="match_parent"
 26         android:foreground="?android:attr/selectableItemBackground"                                 
 27         android:paddingBottom="60dp"
 28         android:clipToPadding="false"
 29         android:scrollbars="vertical"
../../src/main/res/layout/activity_main.xml:37: Attribute android:foreground has no effect on API levels lower than 23 (current min is 21)
 34             android:paddingHorizontal="10dp"
 35             android:paddingVertical="10dp"
 36             android:background="@color/colorAccent"
 37             android:foreground="?android:selectableItemBackground"                                  
 38             android:gravity="center">
 39             <ImageView
 40                 android:layout_width="wrap_content"
../../src/main/res/layout/activity_slots.xml:48: Attribute android:foreground has no effect on API levels lower than 23 (current min is 21)
  45                 android:paddingEnd="10dp"
  46                 android:clickable="true"
  47                 android:focusable="true"
  48                 android:foreground="?android:attr/selectableItemBackground">                        
  49 
  50                 <ImageView
  51                     android:layout_width="wrap_content"
../../src/main/res/layout/activity_slots.xml:76: Attribute android:foreground has no effect on API levels lower than 23 (current min is 21)
  73                 android:paddingEnd="10dp"
  74                 android:clickable="true"
  75                 android:focusable="true"
  76                 android:foreground="?android:attr/selectableItemBackground">                        
  77 
  78                 <ImageView
  79                     android:layout_width="wrap_content"
UnusedAttribute Correctness Warning Priority 6/10

Use FragmentContainerView instead of the <fragment> tag

../../src/main/res/layout/activity_main.xml:59: Replace the <fragment> tag with FragmentContainerView.
 56 
 57         </com.google.android.material.chip.ChipGroup>
 58 
 59         <fragment                                                                                   
 60             android:name="com.beemdevelopment.aegis.ui.views.EntryListView"
 61             android:id="@+id/key_profiles"
 62             android:layout_height="fill_parent"
Vendor: Android Open Source Project (fragment-1.3.6)
Identifier: fragment-1.3.6
Feedback: https://issuetracker.google.com/issues/new?component=192731
FragmentTagUsage Correctness Warning Priority 5/10

Layout Inflation without a Parent

../../src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java:220: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
 217   }
 218 
 219   private void showPasswordReminder() {
 220       View popupLayout = getLayoutInflater().inflate(R.layout.popup_password, null);              
 221       popupLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
 222 
 223       PopupWindow popup = new PopupWindow(popupLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java:389: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
 386     }
 387 
 388     private void initializeGroupChip() {
 389         View view = getLayoutInflater().inflate(R.layout.dialog_select_groups, null);               
 390         BottomSheetDialog dialog = new BottomSheetDialog(getContext());
 391         dialog.setContentView(view);
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java:415: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
 412   chipGroup.removeAllViews();
 413 
 414   for (String group : _groups) {
 415       Chip chip = (Chip) this.getLayoutInflater().inflate(R.layout.chip_material, null, false);
 416       chip.setText(group);
 417       chip.setCheckable(true);
 418       chip.setChecked(_groupFilter != null && _groupFilter.contains(group));
../../src/main/java/com/beemdevelopment/aegis/ui/dialogs/IconPickerDialog.java:44: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
  41   }
  42 
  43   public static BottomSheetDialog create(Activity activity, List<IconPack> iconPacks, String issuer, IconAdapter.Listener listener) {
  44       View view = LayoutInflater.from(activity).inflate(R.layout.dialog_icon_picker, null);       
  45       TextView textIconPack = view.findViewById(R.id.text_icon_pack);
  46 
  47       BottomSheetDialog dialog = new BottomSheetDialog(activity);
../../src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java:127: Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)
 124 
 125          FloatingActionButton fab = findViewById(R.id.fab);
 126          fab.setOnClickListener(v -> {
 127              View view = getLayoutInflater().inflate(R.layout.dialog_add_entry, null);              
 128              BottomSheetDialog dialog = new BottomSheetDialog(this);
 129              dialog.setContentView(view);
InflateParams Correctness Warning Priority 5/10

Checks use of resource IDs in places requiring constants

../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:405: Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
 402             case android.R.id.home:
 403                 onBackPressed();
 404                 break;
 405             case R.id.action_save:                                                                  
 406                 onSave();
 407                 break;
 408             case R.id.action_delete:
../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:408: Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
 405   case R.id.action_save:
 406       onSave();
 407       break;
 408   case R.id.action_delete:                                                                
 409       Dialogs.showDeleteEntriesDialog(this, Collections.singletonList(_origEntry), (dialog, which) -> {
 410           deleteAndFinish(_origEntry);
 411       });
../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:413: Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
 410                     deleteAndFinish(_origEntry);
 411                 });
 412                 break;
 413             case R.id.action_edit_icon:                                                             
 414                 startIconSelection();
 415                 break;
 416             case R.id.action_reset_usage_count:
../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:416: Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
 413             case R.id.action_edit_icon:
 414                 startIconSelection();
 415                 break;
 416             case R.id.action_reset_usage_count:                                                     
 417                 Dialogs.showSecureDialog(new AlertDialog.Builder(this)
 418                         .setTitle(R.string.action_reset_usage_count)
 419                         .setMessage(R.string.action_reset_usage_count_dialog)
../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:424: Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
 421               .setNegativeButton(android.R.string.no, null)
 422               .create());
 423       break;
 424   case R.id.action_default_icon:                                                          
 425       TextDrawable drawable = TextDrawableHelper.generate(_origEntry.getIssuer(), _origEntry.getName(), _iconView);
 426       _iconView.setImageDrawable(drawable);
NonConstantResourceId Correctness Warning Priority 5/10

Incompatible screenOrientation value

../../src/main/AndroidManifest.xml:63: Expecting android:screenOrientation="unspecified" or "fullSensor" for this activity so the user can use the application in any orientation and provide a great experience on Chrome OS devices
  60             android:name=".ui.ScannerActivity"
  61             android:configChanges="keyboardHidden|orientation|screenSize"
  62             android:label="@string/title_activity_scan_qr"
  63             android:screenOrientation="portrait" />                                                 
  64         <activity
  65             android:name=".ui.EditEntryActivity"
  66             android:label="@string/title_activity_edit_entry" />
../../src/main/AndroidManifest.xml:69: Expecting android:screenOrientation="unspecified" or "fullSensor" for this activity so the user can use the application in any orientation and provide a great experience on Chrome OS devices
  66             android:label="@string/title_activity_edit_entry" />
  67         <activity
  68             android:name=".ui.IntroActivity"
  69             android:screenOrientation="portrait" />                                                 
  70         <activity
  71             android:name=".ui.AuthActivity" />
  72         <activity
LockedOrientationActivity Correctness Warning Priority 4/10

Should not call Context.getDrawable or Resources.getDrawable directly

../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryHolder.java:83: Use ResourcesCompat.getDrawable()
  80   _progressBar = view.findViewById(R.id.progressBar);
  81   int primaryColorId = view.getContext().getResources().getColor(R.color.colorPrimary);
  82   _progressBar.getProgressDrawable().setColorFilter(primaryColorId, PorterDuff.Mode.SRC_IN);
  83   _view.setBackground(_view.getContext().getResources().getDrawable(R.color.card_background));
  84 
  85   _scaleIn = AnimationUtils.loadAnimation(view.getContext(), R.anim.item_scale_in);
  86   _scaleOut = AnimationUtils.loadAnimation(view.getContext(), R.anim.item_scale_out);
Vendor: Android Open Source Project (appcompat-1.3.1)
Identifier: appcompat-1.3.1
Feedback: https://issuetracker.google.com/issues/new?component=192731
UseCompatLoadingForDrawables Correctness Warning Priority 1/10

Spelling error

../../src/main/res/values/arrays.xml:16: Did you mean "SHA!" instead of "SHA1" ?
  13     </string-array>
  14 
  15     <string-array name="otp_algo_array">
  16         <item>SHA1</item>                                                                           
  17         <item>SHA256</item>
  18         <item>SHA512</item>
  19     </string-array>
../../src/main/res/values-de-rDE/strings.xml:44: Repeated word "die" in message: possible typo
  41   <string name="pref_timeout_title">Zeitüberschreitung</string>
  42   <string name="pref_timeout_summary">Sperrt die Datenbank automatisch nach %1$s Sekunden Inaktivität</string>
  43   <string name="pref_slots_title">Schlüsselplätze</string>
  44   <string name="pref_slots_summary">Verwalte die Liste der Schlüssel, die die Datenbank entschlüsseln können</string>
  45   <string name="pref_import_file_title">Aus Datei importieren</string>
  46   <string name="pref_import_file_summary">Token aus einer Datei importieren</string>
  47   <string name="pref_android_backups_title">Einbindung in das Sicherungssystem von Android</string>
../../src/main/res/values-pt-rPT/strings.xml:191: "A a" is a common misspelling; did you mean "A" ?
 188     <string name="lock">Bloquear</string>
 189     <string name="name">Nome</string>
 190     <string name="no_group">Sem grupo</string>
 191     <string name="sort_alphabetically">Emissor (A a Z)</string>                                     
 192     <string name="sort_alphabetically_reverse">Emissor (Z a A)</string>
 193     <string name="sort_alphabetically_name">Conta (A a Z)</string>
 194     <string name="sort_alphabetically_name_reverse">Conta (Z a A)</string>
../../src/main/res/values-pt-rPT/strings.xml:193: "A a" is a common misspelling; did you mean "A" ?
 190     <string name="no_group">Sem grupo</string>
 191     <string name="sort_alphabetically">Emissor (A a Z)</string>
 192     <string name="sort_alphabetically_reverse">Emissor (Z a A)</string>
 193     <string name="sort_alphabetically_name">Conta (A a Z)</string>                                  
 194     <string name="sort_alphabetically_name_reverse">Conta (Z a A)</string>
 195     <string name="sort_custom">Personalizado</string>
 196     <string name="new_group">Novo grupo…</string>
Typos Messages Correctness Warning Priority 7/10

Potential Plurals

../../src/main/res/values/strings.xml:327: Formatting %d followed by words ("instead"): This should probably be a plural rather than a string
 324       <item quantity="one">Scanned %d/%d QR codes</item>
 325       <item quantity="other">Scanned %d/%d QR codes</item>
 326   </plurals>
 327   <string name="google_qr_export_unexpected">Expected QR code #%d, but scanned #%d instead</string>
 328   <string name="backup_error_bar_message"><b>Vault backup failed recently</b></string>
 329   <string name="switch_camera">Switch camera</string>
PluralsCandidate Messages Correctness Warning Priority 5/10

Unused quantity translations

../../src/main/res/values-lt-rLT/strings.xml:38: For language "lt" (Lithuanian) the following quantities are not relevant: many
  35   <string name="pref_code_group_size_summary">Rodyti kodą, sugrupuotą po 2 skaitmenis, o ne po 3 skaitemenis</string>
  36   <string name="pref_account_name_title">Rodyti paskyros pavadinimą</string>
  37   <string name="pref_import_file_summary">Importuoti prieigos raktus iš failo</string>
  38   <plurals name="pref_backups_versions_summary">                                                  
  39       <item quantity="one">Laikyti %1$d atsarginės kopijos versiją</item>
  40       <item quantity="few">Laikyti %1$d atsarginės kopijos versijas</item>
  41       <item quantity="many">Laikyti %1$d atsarginės kopijos versijų</item>
../../src/main/res/values-cs-rCZ/strings.xml:56: For language "cs" (Czech) the following quantities are not relevant: many
  53     <string name="pref_backups_trigger_title">Spustit zálohování</string>
  54     <string name="pref_backups_trigger_summary">Ručně spustit zálohování</string>
  55     <string name="pref_backups_versions_title">Počet verzí k uchování</string>
  56     <plurals name="pref_backups_versions_summary">                                                  
  57         <item quantity="one">Uchovat %1$d verzi zálohy</item>
  58         <item quantity="few">Uchovat %1$d verze zálohy</item>
  59         <item quantity="many">Uchovat %1$d verzí zálohy</item>
../../src/main/res/values-lt-rLT/strings.xml:120: For language "lt" (Lithuanian) the following quantities are not relevant: many
 117   <string name="delete_entry_description">Ar tikrai norite ištrinti šį įrašą?</string>
 118   <string name="delete_entry_explanation">Šis veiksmas neišjungia dviejų faktorių tapatybės nustatymo (2FA), skirto <b>%s</b>. Norėdami neprarasti prieigos, įsitikinkite, kad esate išjungę 2FA arba, kad turite kitą būdą kaip galite sugeneruoti kodus šiai paslaugai.</string>
 119   <string name="delete_entries">Ištrinti įrašus</string>
 120   <plurals name="delete_entries_description">                                                     
 121       <item quantity="one">Ar tikrai norite ištrinti %d įrašą?</item>
 122       <item quantity="few">Ar tikrai norite ištrinti %d įrašus?</item>
 123       <item quantity="many">Ar tikrai norite ištrinti %d įrašų?</item>
../../src/main/res/values-lt-rLT/strings.xml:143: For language "lt" (Lithuanian) the following quantities are not relevant: many
 140   <string name="decryption_corrupt_error">Bandant atrakinti slėptuvę, įvyko klaida. Gali būti, kad jūsų slėptuvės failas yra pažeistas.</string>
 141   <string name="disable_encryption">Išjungti šifravimą</string>
 142   <string name="icon_pack_delete_error">Bandant ištrinti piktogramų paketą, įvyko klaida</string>
 143   <plurals name="icon_pack_info">                                                                 
 144       <item quantity="one">%d piktograma</item>
 145       <item quantity="few">%d piktogramos</item>
 146       <item quantity="many">%d piktogramų</item>
../../src/main/res/values-cs-rCZ/strings.xml:156: For language "cs" (Czech) the following quantities are not relevant: many
 153   <string name="delete_entry_description">Opravdu chcete odstranit tuto položku?</string>
 154   <string name="delete_entry_explanation">Tato akce nezakáže 2FA pro službu <b>%s</b>. Abyste zabránili ztrátě přístupu, ujistěte se, že jste zakázali 2FA nebo že máte jiný způsob generování kódů pro tuto službu.</string>
 155   <string name="delete_entries">Odstranit položky</string>
 156   <plurals name="delete_entries_description">                                                     
 157       <item quantity="one">Opravdu chcete smazat %d položku?</item>
 158       <item quantity="few">Opravdu chcete smazat %d položky?</item>
 159       <item quantity="many">Opravdu chcete smazat %d položek?</item>
UnusedQuantity Messages Correctness Warning Priority 3/10

Unspecified android:exported in manifest

../../src/main/AndroidManifest.xml:35: As of Android 12, android:exported must be set; use true to make the activity available to other apps, and false otherwise. For launcher activities, this should be set to true.
  32         <activity
  33             android:name=".ui.ImportEntriesActivity"
  34             android:label="@string/title_activity_import_entries" />
  35         <activity                                                                                   
  36             android:name=".ui.MainActivity"
  37             android:label="${title}">
  38             <intent-filter>
../../src/main/AndroidManifest.xml:81: As of Android 12, android:exported must be set; use true to make the activity available to other apps, and false otherwise.
  78         <activity
  79             android:name=".ui.GroupManagerActivity"
  80             android:label="@string/title_activity_manage_groups" />
  81         <activity                                                                                   
  82             android:name=".ui.PanicResponderActivity"
  83             android:launchMode="singleInstance"
  84             android:noHistory="true"
IntentFilterExportedReceiver Security Warning Priority 5/10

Missing PendingIntent mutability flag

../../src/main/java/com/beemdevelopment/aegis/services/NotificationService.java:29: Missing PendingIntent mutability flag
 26 
 27   public void serviceMethod() {
 28       Intent intentAction = new Intent(CODE_LOCK_VAULT_ACTION);
 29       PendingIntent lockDatabaseIntent = PendingIntent.getBroadcast(this, 1, intentAction, 0);    
 30       NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CODE_LOCK_STATUS_ID)
 31               .setSmallIcon(R.drawable.ic_fingerprint_black_24dp)
 32               .setContentTitle(getString(R.string.app_name_full))
UnspecifiedImmutableFlag Security Warning Priority 5/10

Invalidating All RecyclerView Data

../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:137: It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.
 134 
 135             position = getItemCount() - 1;
 136             if (position == 0) {
 137                 notifyDataSetChanged();                                                             
 138             } else {
 139                 notifyItemInserted(position);
 140             }
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:179: It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.
 176     public void clearEntries() {
 177         _entries.clear();
 178         _shownEntries.clear();
 179         notifyDataSetChanged();                                                                     
 180         checkPeriodUniformity();
 181     }
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:237: It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.
 234 
 235     public void refresh(boolean hard) {
 236         if (hard) {
 237             notifyDataSetChanged();                                                                 
 238         } else {
 239             for (EntryHolder holder : _holders) {
 240                 holder.refresh();
../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:289: It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.
 286         }
 287 
 288         _view.onListChange();
 289         notifyDataSetChanged();                                                                     
 290     }
 291 
 292     public void setViewMode(ViewMode viewMode) {
../../src/main/java/com/beemdevelopment/aegis/ui/views/GroupAdapter.java:27: It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.
 24 
 25         int position = getItemCount() - 1;
 26         if (position == 0) {
 27             notifyDataSetChanged();                                                                 
 28         } else {
 29             notifyItemInserted(position);
 30         }
NotifyDataSetChanged Performance Warning Priority 8/10

Obsolete SDK_INT Version Check

../../src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java:226: Unnecessary; SDK_INT is always >= 21
 223   PopupWindow popup = new PopupWindow(popupLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
 224   popup.setFocusable(false);
 225   popup.setOutsideTouchable(true);
 226   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){                                 
 227       popup.setElevation(5.0f);
 228   }
 229   _textPassword.post(() -> {
../../src/main/java/com/beemdevelopment/aegis/crypto/CryptoUtils.java:71: Unnecessary; SDK_INT is never < 21
  68         if (nonce != null) {
  69             AlgorithmParameterSpec spec;
  70             // apparently kitkat doesn't support GCMParameterSpec
  71             if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {                              
  72                 spec = new IvParameterSpec(nonce);
  73             } else {
  74                 spec = new GCMParameterSpec(CRYPTO_AEAD_TAG_SIZE * 8, nonce);
ObsoleteSdkInt Performance Warning Priority 6/10

Node can be replaced by a TextView with compound drawables

../../src/main/res/layout/activity_slots.xml:37: This tag and its children can be replaced by one <TextView/> and a compound drawable
  34                 android:layout_height="wrap_content"
  35                 android:scrollbars="vertical"/>
  36 
  37             <LinearLayout                                                                           
  38                 android:id="@+id/button_add_password"
  39                 android:layout_width="match_parent"
  40                 android:layout_height="wrap_content"
../../src/main/res/layout/activity_slots.xml:65: This tag and its children can be replaced by one <TextView/> and a compound drawable
  62                     android:textColor="?android:attr/textColorSecondary"/>
  63             </LinearLayout>
  64 
  65             <LinearLayout                                                                           
  66                 android:id="@+id/button_add_biometric"
  67                 android:layout_width="match_parent"
  68                 android:layout_height="wrap_content"
../../src/main/res/layout/activity_slots.xml:98: This tag and its children can be replaced by one <TextView/> and a compound drawable
  95                 android:layout_height="1dp"
  96                 android:background="@android:color/darker_gray"/>
  97 
  98             <LinearLayout                                                                           
  99                 android:layout_width="match_parent"
 100                 android:layout_height="wrap_content"
 101                 android:orientation="horizontal"
UseCompoundDrawables Performance Warning Priority 6/10

Missing baselineAligned attribute

../../src/main/res/layout/activity_edit_entry.xml:102: Set android:baselineAligned="false" on this element for better performance
  99                             android:inputType="text"/>
 100                     </com.google.android.material.textfield.TextInputLayout>
 101                 </LinearLayout>
 102                 <LinearLayout                                                                       
 103                     android:layout_width="match_parent"
 104                     android:layout_height="wrap_content"
 105                     android:orientation="horizontal"
../../src/main/res/layout/activity_edit_entry.xml:246: Set android:baselineAligned="false" on this element for better performance
 243                             android:layout_marginEnd="15dp"
 244                             android:layout_gravity="center_vertical"/>
 245 
 246                         <LinearLayout                                                               
 247                             android:layout_width="0dp"
 248                             android:layout_height="wrap_content"
 249                             android:layout_weight="1"
../../src/main/res/layout/activity_edit_entry.xml:281: Set android:baselineAligned="false" on this element for better performance
 278                       </com.google.android.material.textfield.TextInputLayout>
 279                   </LinearLayout>
 280               </LinearLayout>
 281               <LinearLayout                                                                   
 282                   android:layout_width="match_parent"
 283                   android:layout_height="wrap_content"
 284                   android:orientation="horizontal"
../../src/main/res/layout/card_entry.xml:12: Set android:baselineAligned="false" on this element for better performance
   9     android:layout_height="wrap_content"
  10     android:orientation="vertical">
  11 
  12     <LinearLayout                                                                                   
  13         android:orientation="horizontal"
  14         android:background="?attr/cardBackground"
  15         android:id="@+id/rlCardEntry"
../../src/main/res/layout/card_entry_compact.xml:12: Set android:baselineAligned="false" on this element for better performance
   9     android:layout_height="wrap_content"
  10     android:orientation="vertical">
  11 
  12     <LinearLayout                                                                                   
  13         android:orientation="horizontal"
  14         android:background="?attr/cardBackground"
  15         android:id="@+id/rlCardEntry"
../../src/main/res/layout/card_entry_small.xml:12: Set android:baselineAligned="false" on this element for better performance
   9     android:layout_height="wrap_content"
  10     android:orientation="vertical">
  11 
  12     <LinearLayout                                                                                   
  13         android:orientation="horizontal"
  14         android:background="?attr/cardBackground"
  15         android:id="@+id/rlCardEntry"
../../src/main/res/layout/card_group.xml:8: Set android:baselineAligned="false" on this element for better performance
  5     android:layout_height="wrap_content"
  6     android:orientation="horizontal">
  7 
  8     <LinearLayout                                                                                   
  9         android:id="@+id/button_edit"
 10         android:layout_width="0dp"
 11         android:layout_height="wrap_content"
../../src/main/res/layout/card_icon_pack.xml:8: Set android:baselineAligned="false" on this element for better performance
  5     android:layout_height="wrap_content"
  6     android:orientation="horizontal">
  7 
  8     <LinearLayout                                                                                   
  9         android:id="@+id/button_edit"
 10         android:layout_width="0dp"
 11         android:layout_height="wrap_content"
DisableBaselineAlignment Performance Warning Priority 3/10

Inefficient layout weight

../../src/main/res/layout/fragment_entry_list_view.xml:54: Use a layout_height of 0dp instead of match_parent for better performance
 51 
 52         <LinearLayout
 53             android:layout_width="match_parent"
 54             android:layout_height="match_parent"                                                    
 55             android:layout_weight="1"
 56             android:gravity="center"
 57             android:orientation="vertical"
../../src/main/res/layout/fragment_icon_packs.xml:17: Use a layout_height of 0dp instead of match_parent for better performance
 14 
 15         <LinearLayout
 16             android:layout_width="match_parent"
 17             android:layout_height="match_parent"                                                    
 18             android:layout_weight="1"
 19             android:gravity="center"
 20             android:orientation="vertical"
InefficientWeight Performance Warning Priority 3/10

Notification Launches Services or BroadcastReceivers

../../src/main/java/com/beemdevelopment/aegis/services/NotificationService.java:36: Notifications should only launch a BroadcastReceiver from notification actions (addAction)
 33              .setContentText(getString(R.string.vault_unlocked_state))
 34              .setPriority(NotificationCompat.PRIORITY_DEFAULT)
 35              .setOngoing(true)
 36              .setContentIntent(lockDatabaseIntent);                                              
 37 
 38      NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
 39      notificationManager.notify(VAULT_UNLOCKED_ID, builder.build());
    ../../src/main/java/com/beemdevelopment/aegis/services/NotificationService.java:29: This BroadcastReceiver intent is launched from a notification; this is discouraged except as notification actions
     26 
     27   public void serviceMethod() {
     28       Intent intentAction = new Intent(CODE_LOCK_VAULT_ACTION);
     29       PendingIntent lockDatabaseIntent = PendingIntent.getBroadcast(this, 1, intentAction, 0);    
     30       NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CODE_LOCK_STATUS_ID)
     31               .setSmallIcon(R.drawable.ic_fingerprint_black_24dp)
     32               .setContentTitle(getString(R.string.app_name_full))
    
LaunchActivityFromNotification Performance Warning Priority 3/10

Nested layout weights

../../src/main/res/layout/activity_edit_entry.xml:256: Nested weights are bad for performance
 253                               android:layout_width="0dp"
 254                               android:layout_height="wrap_content"
 255                               android:layout_marginEnd="5dp"
 256                               android:layout_weight="2"                                           
 257                               android:hint="@string/type"
 258                               style="?attr/dropdownStyle">
 259                               <AutoCompleteTextView
../../src/main/res/layout/card_group.xml:25: Nested weights are bad for performance
 22         <LinearLayout
 23             android:layout_width="0dp"
 24             android:layout_height="wrap_content"
 25             android:layout_weight="1"                                                               
 26             android:orientation="vertical">
 27 
 28             <TextView
../../src/main/res/layout/card_icon_pack.xml:25: Nested weights are bad for performance
 22         <LinearLayout
 23             android:layout_width="0dp"
 24             android:layout_height="wrap_content"
 25             android:layout_weight="1"                                                               
 26             android:orientation="vertical">
 27 
 28             <TextView
../../src/main/res/layout/card_slot.xml:32: Nested weights are bad for performance
 29         <LinearLayout
 30             android:layout_width="0dp"
 31             android:layout_height="wrap_content"
 32             android:layout_weight="1">                                                              
 33 
 34             <TextView
 35                 android:layout_width="wrap_content"
NestedWeights Performance Warning Priority 3/10

Overdraw: Painting regions more than once

../../src/main/res/layout/activity_about.xml:7: Possible overdraw: Root element paints background ?attr/background with a theme that also paints a background (inferred theme is @style/Theme.Aegis.Launch)
  4     xmlns:tools="http://schemas.android.com/tools"
  5     android:layout_width="match_parent"
  6     android:layout_height="match_parent"
  7     android:background="?attr/background"                                                           
  8     tools:context="com.beemdevelopment.aegis.ui.AboutActivity">
  9     <com.google.android.material.appbar.AppBarLayout
 10         android:layout_width="match_parent"
../../src/main/res/layout/activity_edit_entry.xml:8: Possible overdraw: Root element paints background ?attr/background with a theme that also paints a background (inferred theme is @style/Theme.Aegis.Launch)
   5     xmlns:tools="http://schemas.android.com/tools"
   6     android:layout_width="match_parent"
   7     android:layout_height="match_parent"
   8     android:background="?attr/background"                                                           
   9     android:orientation="vertical"
  10     tools:context="com.beemdevelopment.aegis.ui.EditEntryActivity">
  11     <com.google.android.material.appbar.AppBarLayout
../../src/main/res/layout/activity_groups.xml:7: Possible overdraw: Root element paints background ?attr/background with a theme that also paints a background (inferred theme is @style/Theme.Aegis.Launch)
  4     xmlns:tools="http://schemas.android.com/tools"
  5     android:layout_width="match_parent"
  6     android:layout_height="match_parent"
  7     android:background="?attr/background"                                                           
  8     tools:context="com.beemdevelopment.aegis.ui.GroupManagerActivity">
  9 
 10     <com.google.android.material.appbar.AppBarLayout
../../src/main/res/layout/activity_import_entries.xml:7: Possible overdraw: Root element paints background ?attr/background with a theme that also paints a background (inferred theme is @style/Theme.Aegis.Launch)
  4     xmlns:tools="http://schemas.android.com/tools"
  5     android:layout_width="match_parent"
  6     android:layout_height="match_parent"
  7     android:background="?attr/background"                                                           
  8     android:id="@+id/importEntriesRootView"
  9     tools:context="com.beemdevelopment.aegis.ui.ImportEntriesActivity">
../../src/main/res/layout/activity_intro.xml:8: Possible overdraw: Root element paints background ?attr/background with a theme that also paints a background (inferred theme is @style/Theme.Aegis.Launch)
  5     xmlns:tools="http://schemas.android.com/tools"
  6     android:layout_width="match_parent"
  7     android:layout_height="match_parent"
  8     android:background="?attr/background"                                                           
  9     tools:context="com.beemdevelopment.aegis.ui.IntroActivity">
 10     <androidx.viewpager2.widget.ViewPager2
 11         android:id="@+id/pager"
Overdraw Performance Warning Priority 3/10

Unused resources

../../src/main/res/values/arrays.xml:3: The resource R.array.authentication_methods appears to be unused
   1 <?xml version="1.0" encoding="utf-8"?>
   2 <resources>
   3     <string-array name="authentication_methods">                                                    
   4         <item>@string/authentication_method_none</item>
   5         <item>@string/authentication_method_password</item>
   6         <item>@string/authentication_method_biometrics</item>
../../src/main/res/color/bg_chip_color.xml:2: The resource R.color.bg_chip_color appears to be unused
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <selector xmlns:android="http://schemas.android.com/apk/res/android">                               
 3     <item android:color="#D7E3EF" android:state_checked="true" />
 4     <item android:color="@color/background" />
 5 </selector>
../../src/main/res/color/bg_chip_text_color.xml:2: The resource R.color.bg_chip_text_color appears to be unused
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <selector xmlns:android="http://schemas.android.com/apk/res/android">                               
 3     <item android:color="@color/colorPrimary" android:state_checked="true" />
 4     <item android:color="@color/primary_text"  />
 5 </selector>
../../src/main/res/values/colors.xml:6: The resource R.color.colorPrimaryDark appears to be unused
  3     <color name="colorPrimary">#0d47a1</color>
  4     <color name="colorPrimarySelected">#FF1565C0</color>
  5     <color name="colorSecondary">#FF5252</color>
  6     <color name="colorPrimaryDark">#002171</color>                                                  
  7     <color name="colorHeaderSuccess">#12b600</color>
  8     <color name="colorPrimaryLight">#5472d3</color>
  9     <color name="colorAccent">#FF5252</color>
../../src/main/res/values/colors.xml:7: The resource R.color.colorHeaderSuccess appears to be unused
  4     <color name="colorPrimarySelected">#FF1565C0</color>
  5     <color name="colorSecondary">#FF5252</color>
  6     <color name="colorPrimaryDark">#002171</color>
  7     <color name="colorHeaderSuccess">#12b600</color>                                                
  8     <color name="colorPrimaryLight">#5472d3</color>
  9     <color name="colorAccent">#FF5252</color>
 10     <color name="colorAccentPressed">#FF5252</color>
UnusedResources Performance Warning Priority 3/10

Unnecessary parent layout

../../src/main/res/layout/activity_edit_entry.xml:225: This LinearLayout layout or its RelativeLayout parent is possibly unnecessary
 222                 android:layout_width="match_parent"
 223                 android:layout_height="match_parent"
 224                 android:visibility="invisible">
 225                 <LinearLayout                                                                       
 226                     android:id="@+id/layout_advanced"
 227                     android:layout_width="match_parent"
 228                     android:layout_height="wrap_content"
../../src/main/res/layout/activity_groups.xml:47: This LinearLayout layout or its LinearLayout parent is unnecessary
 44         android:visibility="gone"
 45         android:orientation="vertical">
 46 
 47         <LinearLayout                                                                               
 48             android:layout_width="match_parent"
 49             android:layout_height="0dp"
 50             android:layout_weight="1"
../../src/main/res/layout/card_group.xml:22: This LinearLayout layout or its LinearLayout parent is unnecessary
 19         android:paddingBottom="12.5dp"
 20         android:foreground="?android:attr/selectableItemBackground">
 21 
 22         <LinearLayout                                                                               
 23             android:layout_width="0dp"
 24             android:layout_height="wrap_content"
 25             android:layout_weight="1"
../../src/main/res/layout/card_icon_pack.xml:22: This LinearLayout layout or its LinearLayout parent is unnecessary
 19         android:paddingBottom="12.5dp"
 20         android:foreground="?android:attr/selectableItemBackground">
 21 
 22         <LinearLayout                                                                               
 23             android:layout_width="0dp"
 24             android:layout_height="wrap_content"
 25             android:layout_weight="1"
../../src/main/res/layout/fragment_entry_list_view.xml:52: This LinearLayout layout or its LinearLayout parent is unnecessary
 49         android:id="@+id/vEmptyList"
 50         android:orientation="vertical">
 51 
 52         <LinearLayout                                                                               
 53             android:layout_width="match_parent"
 54             android:layout_height="match_parent"
 55             android:layout_weight="1"
../../src/main/res/layout/fragment_icon_packs.xml:15: This LinearLayout layout or its LinearLayout parent is unnecessary
 12         android:id="@+id/vEmptyList"
 13         android:orientation="vertical">
 14 
 15         <LinearLayout                                                                               
 16             android:layout_width="match_parent"
 17             android:layout_height="match_parent"
 18             android:layout_weight="1"
UselessParent Performance Warning Priority 2/10

Ellipsis string can be replaced with ellipsis character

../../src/main/res/values-hi-rIN/strings.xml:127: Replace "..." with ellipsis character (…, &#8230;) ?
 124   <string name="app_description">Aegis एक मुफ्त, सुरक्षित और ओपन सोर्स 2FA ऐप है</string>
 125   <string name="setup_completed">सेटअप समाप्त हुआ</string>
 126   <string name="setup_completed_description">Aegis का सेटअप हो चुका है और अब तैयार है</string>
 127   <string name="vault_not_found">वॉल्ट नहीं मिला, सेटअप शुरू हो रहा है...</string>                
 128   <string name="copied">कॉपी किया गया</string>
 129   <string name="errors_copied">त्रुटियों को क्लिपबोर्ड में कॉपी किया गया</string>
 130   <string name="version_copied">संस्करण को क्लिपबोर्ड में कॉपी किया गया</string>
../../src/main/res/values-tr-rTR/strings.xml:166: Replace "..." with ellipsis character (…, &#8230;) ?
 163   <string name="app_description">Aegis özgür, güvenli ve açık kaynak 2FA uygulamasıdır</string>
 164   <string name="setup_completed">Kurulum Tamamlandı</string>
 165   <string name="setup_completed_description">Aegis kuruldu ve kullanılmaya hazır.</string>
 166   <string name="vault_not_found">Kasa bulunmadı, kurulum başlatılıyor...</string>                 
 167   <string name="copied">Kopyalandı</string>
 168   <string name="errors_copied">Hatalar panoya kopyalandı</string>
 169   <string name="version_copied">Sürüm panoya kopyalandı</string>
../../src/main/res/values-hi-rIN/strings.xml:187: Replace "..." with ellipsis character (…, &#8230;) ?
 184     <string name="sort_alphabetically_name">खाता (A से Z)</string>
 185     <string name="sort_alphabetically_name_reverse">खाता (Z से A)</string>
 186     <string name="sort_custom">कस्टम</string>
 187     <string name="new_group">नया समूह...</string>                                                   
 188     <string name="enter_group_name">समूह का नाम दर्ज़ करें</string>
 189     <string name="group_name_hint">समूह का नाम</string>
 190     <string name="preference_manage_groups">समूहों को संपादित करें</string>
TypographyEllipsis Typography Usability Warning Priority 5/10

Icon is specified both as .xml file and as a bitmap

../../src/main/res/drawable-xxhdpi/ic_action_sort.png: The following images appear both as density independent .xml files and as bitmap files: /Users/alex/StudioProjects/Aegis/app/src/main/res/drawable-anydpi/ic_action_sort.xml, /Users/alex/StudioProjects/Aegis/app/src/main/res/drawable-hdpi/ic_action_sort.png


    mdpihdpixhdpixxhdpi
    ../../src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: The following images appear both as density independent .xml files and as bitmap files: /Users/alex/StudioProjects/Aegis/app/src/main/res/drawable/ic_launcher_foreground.xml, /Users/alex/StudioProjects/Aegis/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png


      IconXmlAndPng Icons Usability Warning Priority 7/10

      Image defined in density-independent drawable folder

      ../../src/main/res/drawable/app_icon.png: Found bitmap drawable res/drawable/app_icon.png in densityless folder
      ../../src/main/res/drawable/ic_aegis_iconx.png: Found bitmap drawable res/drawable/ic_aegis_iconx.png in densityless folder
      IconLocation Icons Usability Warning Priority 5/10

      Usage of showAsAction=always

      ../../src/main/res/menu/menu_action_mode.xml:9: Prefer "ifRoom" instead of "always"
        6         android:orderInCategory="80"
        7         android:icon="@drawable/ic_content_copy_white_24dp"
        8         android:title="@string/copy"
        9         app:showAsAction="always" />                                                                
       10 
       11     <item
       12         android:id="@+id/action_edit"


        ../../src/main/res/menu/menu_import_entries.xml:7: Prefer "ifRoom" instead of "always"
          4     <item android:id="@+id/toggle_checkboxes"
          5         android:icon="@drawable/ic_done_all_black_24dp"
          6         android:title="@string/toggle_checkboxes"
          7         app:showAsAction="always" />                                                                
          8     <item android:id="@+id/toggle_wipe_vault"
          9         android:title="@string/dialog_wipe_entries_checkbox"
         10         android:checkable="true"
        AlwaysShowAction Usability Warning Priority 3/10

        Accessibility in Custom Views

        ../../src/main/java/com/beemdevelopment/aegis/ui/views/EntryAdapter.java:426: onTouch should call View#performClick when a click is detected
         423         });
         424         holder.itemView.setOnTouchListener(new View.OnTouchListener() {
         425             @Override
         426             public boolean onTouch(View v, MotionEvent event) {                                     
         427                 // Start drag if this is the only item selected
         428                 if (event.getActionMasked() == MotionEvent.ACTION_MOVE
         429                         && _selectedEntries.size() == 1
        ClickableViewAccessibility Accessibility Warning Priority 6/10

        Image without contentDescription

        ../../src/main/res/layout/activity_auth.xml:24: Missing contentDescription attribute on image
          21             android:paddingTop="48dp"
          22             android:orientation="vertical">
          23 
          24             <ImageView                                                                              
          25                 android:id="@+id/imageView2"
          26                 android:layout_width="100dp"
          27                 android:layout_height="100dp"
        ../../src/main/res/layout/activity_edit_entry.xml:56: Missing contentDescription attribute on image
          53                     app:krop_offset="70dp"
          54                     app:krop_overlayColor="#aadddddd" >
          55 
          56                     <ImageView                                                                      
          57                         android:id="@+id/iv_saveImage"
          58                         android:layout_width="wrap_content"
          59                         android:layout_height="wrap_content"
        ../../src/main/res/layout/activity_edit_entry.xml:82: Missing contentDescription attribute on image
          79                     android:layout_width="match_parent"
          80                     android:layout_height="wrap_content"
          81                     android:orientation="horizontal">
          82                     <ImageView                                                                      
          83                         android:layout_width="wrap_content"
          84                         android:layout_height="wrap_content"
          85                         android:src="@drawable/ic_person_black_24dp"
        ../../src/main/res/layout/activity_edit_entry.xml:139: Missing contentDescription attribute on image
         136                     android:layout_height="wrap_content"
         137                     android:layout_marginTop="10dp"
         138                     android:orientation="horizontal">
         139                     <ImageView                                                                      
         140                         android:layout_width="wrap_content"
         141                         android:layout_height="wrap_content"
         142                         android:src="@drawable/ic_baseline_notes_black_24"
        ../../src/main/res/layout/activity_edit_entry.xml:165: Missing contentDescription attribute on image
         162                     android:layout_height="wrap_content"
         163                     android:layout_marginTop="10dp"
         164                     android:orientation="horizontal">
         165                     <ImageView                                                                      
         166                         android:layout_width="wrap_content"
         167                         android:layout_height="wrap_content"
         168                         android:src="@drawable/ic_vpn_key_black_24dp"
        ContentDescription Accessibility Warning Priority 3/10

        Missing accessibility label

        ../../src/main/res/layout/activity_edit_entry.xml:127: Missing accessibility label: provide either a view with an android:labelFor that references this view or provide an android:hint
         124                         android:layout_weight="1"
         125                         android:hint="@string/group"
         126                         style="?attr/dropdownStyle">
         127                         <AutoCompleteTextView                                                       
         128                             android:id="@+id/dropdown_group"
         129                             android:layout_width="match_parent"
         130                             android:layout_height="wrap_content"
        ../../src/main/res/layout/activity_edit_entry.xml:259: Missing accessibility label: provide either a view with an android:labelFor that references this view or provide an android:hint
         256                           android:layout_weight="2"
         257                           android:hint="@string/type"
         258                           style="?attr/dropdownStyle">
         259                           <AutoCompleteTextView                                               
         260                               android:id="@+id/dropdown_type"
         261                               android:layout_width="match_parent"
         262                               android:layout_height="wrap_content"
        ../../src/main/res/layout/activity_edit_entry.xml:273: Missing accessibility label: provide either a view with an android:labelFor that references this view or provide an android:hint
         270                           android:layout_weight="2"
         271                           android:hint="@string/algorithm_hint"
         272                           style="?attr/dropdownStyle">
         273                           <AutoCompleteTextView                                               
         274                               android:id="@+id/dropdown_algo"
         275                               android:layout_width="match_parent"
         276                               android:layout_height="wrap_content"
        ../../src/main/res/layout/dialog_export.xml:23: Missing accessibility label: provide either a view with an android:labelFor that references this view or provide an android:hint
         20         android:layout_marginTop="5dp"
         21         android:hint="@string/export_format_hint"
         22         style="?attr/dropdownStyle">
         23         <AutoCompleteTextView                                                                       
         24             android:id="@+id/dropdown_export_format"
         25             android:layout_width="match_parent"
         26             android:layout_height="wrap_content"
        LabelFor Accessibility Warning Priority 2/10

        TextView Internationalization

        ../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:211: Number formatting does not take into account locale settings. Consider using String.format instead.
         208         OtpInfo info = _origEntry.getInfo();
         209         if (info instanceof TotpInfo) {
         210             _textPeriodCounterLayout.setHint(R.string.period_hint);
         211             _textPeriodCounter.setText(Integer.toString(((TotpInfo) info).getPeriod()));            
         212         } else if (info instanceof HotpInfo) {
         213             _textPeriodCounterLayout.setHint(R.string.counter);
         214             _textPeriodCounter.setText(Long.toString(((HotpInfo) info).getCounter()));
        
        ../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:214: Number formatting does not take into account locale settings. Consider using String.format instead.
         211       _textPeriodCounter.setText(Integer.toString(((TotpInfo) info).getPeriod()));
         212   } else if (info instanceof HotpInfo) {
         213       _textPeriodCounterLayout.setHint(R.string.counter);
         214       _textPeriodCounter.setText(Long.toString(((HotpInfo) info).getCounter()));              
         215   } else {
         216       throw new RuntimeException(String.format("Unsupported OtpInfo type: %s", info.getClass()));
         217   }
        
        ../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:218: Number formatting does not take into account locale settings. Consider using String.format instead.
         215   } else {
         216       throw new RuntimeException(String.format("Unsupported OtpInfo type: %s", info.getClass()));
         217   }
         218   _textDigits.setText(Integer.toString(info.getDigits()));                                    
         219 
         220   byte[] secretBytes = _origEntry.getInfo().getSecret();
         221   if (secretBytes != null) {
        
        ../../src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java:289: Number formatting does not take into account locale settings. Consider using String.format instead.
         286             }
         287         });
         288 
         289         _textUsageCount.setText(getPreferences().getUsageCount(entryUUID).toString());              
         290     }
         291 
         292     private void updateAdvancedFieldStatus(String otpType) {
        
        SetTextI18n Internationalization Warning Priority 6/10

        Padding and margin symmetry

        ../../src/main/res/layout/card_entry.xml:24: When you define paddingStart you should probably also define paddingEnd for right-to-left symmetry
          21         <RelativeLayout
          22             android:layout_width="wrap_content"
          23             android:layout_height="match_parent"
          24             android:paddingStart="16dp">                                                            
          25 
          26             <de.hdodenhof.circleimageview.CircleImageView
          27                 android:id="@+id/ivTextDrawable"
        ../../src/main/res/layout/card_entry_compact.xml:24: When you define paddingStart you should probably also define paddingEnd for right-to-left symmetry
          21         <RelativeLayout
          22             android:layout_width="wrap_content"
          23             android:layout_height="match_parent"
          24             android:paddingStart="16dp">                                                            
          25 
          26             <de.hdodenhof.circleimageview.CircleImageView
          27                 android:id="@+id/ivTextDrawable"
        ../../src/main/res/layout/card_entry_small.xml:24: When you define paddingStart you should probably also define paddingEnd for right-to-left symmetry
          21         <RelativeLayout
          22             android:layout_width="wrap_content"
          23             android:layout_height="match_parent"
          24             android:paddingStart="16dp">                                                            
          25 
          26             <de.hdodenhof.circleimageview.CircleImageView
          27                 android:id="@+id/ivTextDrawable"
        ../../src/main/res/layout/card_icon_category.xml:5: When you define paddingStart you should probably also define paddingEnd for right-to-left symmetry
          2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          3     xmlns:app="http://schemas.android.com/apk/res-auto"
          4     android:paddingVertical="5dp"
          5     android:paddingStart="5dp"                                                                      
          6     android:layout_width="match_parent"
          7     android:layout_height="wrap_content"
          8     android:orientation="horizontal"
        RtlSymmetry Bidirectional Text Internationalization Warning Priority 6/10

        Disabled Checks

        One or more issues were not run by lint, either because the check is not enabled by default, or because it was disabled with a command line flag or via one or more lint.xml configuration files in the project directories.

        Suppressing Warnings and Errors

        Lint errors can be suppressed in a variety of ways:

        1. With a @SuppressLint annotation in the Java code
        2. With a tools:ignore attribute in the XML file
        3. With a //noinspection comment in the source code
        4. With ignore flags specified in the build.gradle file, as explained below
        5. With a lint.xml configuration file in the project
        6. With a lint.xml configuration file passed to lint via the --config flag
        7. With the --ignore flag passed to lint.

        To suppress a lint warning with an annotation, add a @SuppressLint("id") annotation on the class, method or variable declaration closest to the warning instance you want to disable. The id can be one or more issue id's, such as "UnusedResources" or {"UnusedResources","UnusedIds"}, or it can be "all" to suppress all lint warnings in the given scope.

        To suppress a lint warning with a comment, add a //noinspection id comment on the line before the statement with the error.

        To suppress a lint warning in an XML file, add a tools:ignore="id" attribute on the element containing the error, or one of its surrounding elements. You also need to define the namespace for the tools prefix on the root element in your document, next to the xmlns:android declaration:
        xmlns:tools="http://schemas.android.com/tools"

        To suppress a lint warning in a build.gradle file, add a section like this:
        android {
            lintOptions {
                disable 'TypographyFractions','TypographyQuotes'
            }
        }
        

        Here we specify a comma separated list of issue id's after the disable command. You can also use warning or error instead of disable to change the severity of issues.

        To suppress lint warnings with a configuration XML file, create a file named lint.xml and place it at the root directory of the module in which it applies.

        The format of the lint.xml file is something like the following:
        <?xml version="1.0" encoding="UTF-8"?>
        <lint>
            <!-- Ignore everything in the test source set -->
            <issue id="all">
                <ignore path="\*/test/\*" />
            </issue>
        
            <!-- Disable this given check in this project -->
            <issue id="IconMissingDensityFolder" severity="ignore" />
        
            <!-- Ignore the ObsoleteLayoutParam issue in the given files -->
            <issue id="ObsoleteLayoutParam">
                <ignore path="res/layout/activation.xml" />
                <ignore path="res/layout-xlarge/activation.xml" />
                <ignore regexp="(foo|bar)\.java" />
            </issue>
        
            <!-- Ignore the UselessLeaf issue in the given file -->
            <issue id="UselessLeaf">
                <ignore path="res/layout/main.xml" />
            </issue>
        
            <!-- Change the severity of hardcoded strings to "error" -->
            <issue id="HardcodedText" severity="error" />
        </lint>
        

        To suppress lint checks from the command line, pass the --ignore flag with a comma separated list of ids to be suppressed, such as:
        $ lint --ignore UnusedResources,UselessLeaf /my/project/path

        For more information, see https://developer.android.com/studio/write/lint.html#config