Overview
Correctness | |
10 | warning DefaultLocale: Implied default locale in case conversion |
1 | warning DiscouragedPrivateApi: Using Discouraged Private API |
15 | warning UnusedAttribute: Attribute unused on older versions |
1 | warning FragmentTagUsage: Use FragmentContainerView instead of the <fragment> tag |
5 | warning InflateParams: Layout Inflation without a Parent |
24 | warning NonConstantResourceId: Checks use of resource IDs in places requiring constants |
2 | warning LockedOrientationActivity: Incompatible screenOrientation value |
1 | warning
UseCompatLoadingForDrawables: Should not call Context.getDrawable or Resources.getDrawable directly |
Correctness:Messages | |
4 | warning Typos: Spelling error |
1 | warning PluralsCandidate: Potential Plurals |
9 | warning UnusedQuantity: Unused quantity translations |
Security | |
2 | warning
IntentFilterExportedReceiver: Unspecified android:exported in manifest |
1 | warning
UnspecifiedImmutableFlag: Missing PendingIntent mutability flag |
Performance | |
10 | warning NotifyDataSetChanged: Invalidating All RecyclerView Data |
2 | warning ObsoleteSdkInt: Obsolete SDK_INT Version Check |
3 | warning
UseCompoundDrawables: Node can be replaced by a TextView with compound drawables |
8 | warning
DisableBaselineAlignment: Missing baselineAligned attribute |
2 | warning InefficientWeight: Inefficient layout weight |
1 | warning LaunchActivityFromNotification: Notification Launches Services or BroadcastReceivers |
4 | warning NestedWeights: Nested layout weights |
12 | warning Overdraw: Overdraw: Painting regions more than once |
38 | warning UnusedResources: Unused resources |
6 | warning UselessParent: Unnecessary parent layout |
Usability:Typography | |
3 | warning TypographyEllipsis: Ellipsis string can be replaced with ellipsis character |
Usability:Icons | |
2 | warning
IconXmlAndPng: Icon is specified both as .xml file and as a bitmap |
2 | warning IconLocation: Image defined in density-independent drawable folder |
Usability | |
2 | warning
AlwaysShowAction: Usage of showAsAction=always |
Accessibility | |
1 | warning ClickableViewAccessibility: Accessibility in Custom Views |
39 | warning
ContentDescription: Image without contentDescription |
4 | warning LabelFor: Missing accessibility label |
Internationalization | |
4 | warning SetTextI18n: TextView Internationalization |
Internationalization:Bidirectional Text | |
4 | warning RtlSymmetry: Padding and margin symmetry |
Disabled Checks (38) |
Implied default locale in case conversion
../../src/main/java/com/beemdevelopment/aegis/importers/AuthyImporter.java:279:
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:
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:
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:
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:
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 }+ 5 More Occurrences...
DefaultLocale
Correctness
Warning
Priority 6/10
Using Discouraged Private API
../../src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java:78:
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:
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:
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:
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:
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:
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"+ 10 More Occurrences...
UnusedAttribute
Correctness
Warning
Priority 6/10
Use FragmentContainerView instead of the <fragment> tag
../../src/main/res/layout/activity_main.xml:59:
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
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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);+ 19 More Occurrences...
NonConstantResourceId
Correctness
Warning
Priority 5/10
Incompatible screenOrientation value
../../src/main/AndroidManifest.xml:63:
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:
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:
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
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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>+ 4 More Occurrences...
UnusedQuantity
Messages
Correctness
Warning
Priority 3/10
Unspecified android:exported in manifest
../../src/main/AndroidManifest.xml:35:
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:
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:
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:
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:
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:
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:
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:
24 25 int position = getItemCount() - 1; 26 if (position == 0) { 27 notifyDataSetChanged(); 28 } else { 29 notifyItemInserted(position); 30 }+ 5 More Occurrences...
NotifyDataSetChanged
Performance
Warning
Priority 8/10
Obsolete SDK_INT Version Check
../../src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java:226:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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());
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:
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:
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:
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:
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:
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:
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:
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:
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:
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"+ 7 More Occurrences...
Overdraw
Performance
Warning
Priority 3/10
Unused resources
../../src/main/res/values/arrays.xml:3:
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:
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:
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:
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:
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>+ 33 More Occurrences...
UnusedResources
Performance
Warning
Priority 3/10
Unnecessary parent layout
../../src/main/res/layout/activity_edit_entry.xml:225:
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:
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:
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:
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:
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:
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:
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:
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:
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:
../../src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
![]() | ![]() | ![]() | ![]() |
mdpi | hdpi | xhdpi | xxhdpi |
---|
![]() | ![]() | ![]() | ![]() | ![]() |
IconXmlAndPng
Icons
Usability
Warning
Priority 7/10
Image defined in density-independent drawable folder
IconLocation
Icons
Usability
Warning
Priority 5/10
Usage of showAsAction=always
../../src/main/res/menu/menu_action_mode.xml:9:
../../src/main/res/menu/menu_import_entries.xml:7:
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:
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:
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:
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:
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:
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:
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:
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"+ 34 More Occurrences...
ContentDescription
Accessibility
Warning
Priority 3/10
Missing accessibility label
../../src/main/res/layout/activity_edit_entry.xml:127:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
2. With a
3. With a //noinspection comment in the source code
4. With ignore flags specified in the
5. With a
6. With a
7. With the --ignore flag passed to lint.
To suppress a lint warning with an annotation, add a
To suppress a lint warning with a comment, add a
To suppress a lint warning in an XML file, add a
To suppress a lint warning in a
Here we specify a comma separated list of issue id's after the disable command. You can also use
To suppress lint warnings with a configuration XML file, create a file named
The format of the
To suppress lint checks from the command line, pass the --ignore flag with a comma separated list of ids to be suppressed, such as:
For more information, see https://developer.android.com/studio/write/lint.html#config
1. With a
@SuppressLint
annotation in the Java code2. With a
tools:ignore
attribute in the XML file3. With a //noinspection comment in the source code
4. With ignore flags specified in the
build.gradle
file, as explained below5. With a
lint.xml
configuration file in the project6. With a
lint.xml
configuration file passed to lint via the --config flag7. 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