1 {
2 "$schema" : "https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json",
3 "version" : "2.1.0",
4 "runs" : [
5 {
6 "tool": {
7 "driver": {
8 "name": "Android Lint",
9 "fullName": "Android Lint (in gradle)",
10 "version": "9.3.1",
11 "semanticVersion": "9.3.1",
12 "organization": "Google",
13 "informationUri": "https://developer.android.com/studio/write/lint",
14 "fullDescription": {
15 "text": "Static analysis originally for Android source code but now performing general analysis"
16 },
17 "language": "en-US",
18 "rules": [
19 {
20 "id": "AndroidGradlePluginVersion",
21 "shortDescription": {
22 "text": "Obsolete Android Gradle Plugin Version"
23 },
24 "fullDescription": {
25 "text": "This detector looks for usage of the Android Gradle Plugin where the version you are using is not the current stable release. Using older versions is fine, and there are cases where you deliberately want to stick with an older version. However, you may simply not be aware that a more recent version is available, and that is what this lint check helps find."
26 },
27 "defaultConfiguration": {
28 "level": "warning",
29 "rank": 70
30 },
31 "properties": {
32 "tags": [
33 "Correctness"
34 ]
35 }
36 },
37 {
38 "id": "ContentDescription",
39 "shortDescription": {
40 "text": "Image without contentDescription",
41 "markdown": "Image without `contentDescription`"
42 },
43 "fullDescription": {
44 "text": "Non-textual widgets like ImageViews and ImageButtons should use the contentDescription attribute to specify a textual description of the widget such that screen readers and other accessibility tools can adequately describe the user interface.\n\nNote that elements in application screens that are purely decorative and do not provide any content or enable a user action should not have accessibility content descriptions. In this case, set their descriptions to @null. If your app's minSdkVersion is 16 or higher, you can instead set these graphical elements' android:importantForAccessibility attributes to no.\n\nNote that for text fields, you should not set both the hint and the contentDescription attributes since the hint will never be shown. Just set the hint.",
45 "markdown": "Non-textual widgets like ImageViews and ImageButtons should use the `contentDescription` attribute to specify a textual description of the widget such that screen readers and other accessibility tools can adequately describe the user interface.\n\nNote that elements in application screens that are purely decorative and do not provide any content or enable a user action should not have accessibility content descriptions. In this case, set their descriptions to `@null`. If your app's minSdkVersion is 16 or higher, you can instead set these graphical elements' `android:importantForAccessibility` attributes to `no`.\n\nNote that for text fields, you should not set both the `hint` and the `contentDescription` attributes since the hint will never be shown. Just set the `hint`."
46 },
47 "defaultConfiguration": {
48 "level": "warning",
49 "rank": 80
50 },
51 "properties": {
52 "tags": [
53 "Accessibility"
54 ]
55 }
56 },
57 {
58 "id": "ExportedService",
59 "shortDescription": {
60 "text": "Exported service does not require permission"
61 },
62 "fullDescription": {
63 "text": "Exported services (services which either set exported=true or contain an intent-filter and do not specify exported=false) should define a permission that an entity must have in order to launch the service or bind to it. Without this, any application can use this service.",
64 "markdown": "Exported services (services which either set `exported=true` or contain an intent-filter and do not specify `exported=false`) should define a permission that an entity must have in order to launch the service or bind to it. Without this, any application can use this service."
65 },
66 "defaultConfiguration": {
67 "level": "warning",
68 "rank": 60
69 },
70 "properties": {
71 "tags": [
72 "Security"
73 ]
74 }
75 },
76 {
77 "id": "GradleDependency",
78 "shortDescription": {
79 "text": "Obsolete Gradle Dependency"
80 },
81 "fullDescription": {
82 "text": "This detector looks for usages of libraries where the version you are using is not the current stable release. Using older versions is fine, and there are cases where you deliberately want to stick with an older version. However, you may simply not be aware that a more recent version is available, and that is what this lint check helps find."
83 },
84 "defaultConfiguration": {
85 "level": "warning",
86 "rank": 70
87 },
88 "properties": {
89 "tags": [
90 "Correctness"
91 ]
92 }
93 },
94 {
95 "id": "MonochromeLauncherIcon",
96 "shortDescription": {
97 "text": "Monochrome icon is not defined"
98 },
99 "fullDescription": {
100 "text": "The system may use the coloring of the user's chosen wallpaper and theme to tint app icons. Providing a <monochrome> layer (which will be used for tinting) for every adaptive icon is strongly recommended, otherwise Android 16 QPR 2 and above will simply tint the color version of the icon, which may look unusual. Devices running earlier Android versions will (with no monochrome layer) show the untinted color icon for your app, which will look inconsistent.",
101 "markdown": "The system may use the coloring of the user's chosen wallpaper and theme to tint app icons. Providing a `<monochrome>` layer (which will be used for tinting) for every adaptive icon is strongly recommended, otherwise Android 16 QPR 2 and above will simply tint the color version of the icon, which may look unusual. Devices running earlier Android versions will (with no monochrome layer) show the untinted color icon for your app, which will look inconsistent."
102 },
103 "defaultConfiguration": {
104 "level": "warning",
105 "rank": 50
106 },
107 "properties": {
108 "tags": [
109 "Icons",
110 "Usability"
111 ]
112 }
113 },
114 {
115 "id": "OldTargetApi",
116 "shortDescription": {
117 "text": "Target SDK attribute is not targeting latest version"
118 },
119 "fullDescription": {
120 "text": "When your application or sdk runs on a version of Android that is more recent than your targetSdk specifies that it has been tested with, various compatibility modes kick in. This ensures that your application continues to work, but it may look out of place. For example, if the targetSdk is less than 14, your app may get an option button in the UI.\n\nTo fix this issue, set the targetSdk to the highest available value. Then test your app to make sure everything works correctly. You may want to consult the compatibility notes to see what changes apply to each version you are adding support for: https://developer.android.com/reference/android/os/Build.VERSION_CODES.html as well as follow this guide:\nhttps://developer.android.com/distribute/best-practices/develop/target-sdk.html",
121 "markdown": "When your application or sdk runs on a version of Android that is more recent than your `targetSdk` specifies that it has been tested with, various compatibility modes kick in. This ensures that your application continues to work, but it may look out of place. For example, if the `targetSdk` is less than 14, your app may get an option button in the UI.\n\nTo fix this issue, set the `targetSdk` to the highest available value. Then test your app to make sure everything works correctly. You may want to consult the compatibility notes to see what changes apply to each version you are adding support for: https://developer.android.com/reference/android/os/Build.VERSION_CODES.html as well as follow this guide:\nhttps://developer.android.com/distribute/best-practices/develop/target-sdk.html"
122 },
123 "defaultConfiguration": {
124 "level": "warning",
125 "rank": 50
126 },
127 "properties": {
128 "tags": [
129 "Correctness"
130 ]
131 }
132 },
133 {
134 "id": "Overdraw",
135 "shortDescription": {
136 "text": "Overdraw: Painting regions more than once"
137 },
138 "fullDescription": {
139 "text": "If you set a background drawable on a root view, then you should use a custom theme where the theme background is null. Otherwise, the theme background will be painted first, only to have your custom background completely cover it; this is called \"overdraw\".\n\nNOTE: This detector relies on figuring out which layouts are associated with which activities based on scanning the Java code, and it's currently doing that using an inexact pattern matching algorithm. Therefore, it can incorrectly conclude which activity the layout is associated with and then wrongly complain that a background-theme is hidden.\n\nIf you want your custom background on multiple pages, then you should consider making a custom theme with your custom background and just using that theme instead of a root element background.\n\nOf course it's possible that your custom drawable is translucent and you want it to be mixed with the background. However, you will get better performance if you pre-mix the background with your drawable and use that resulting image or color as a custom theme background instead."
140 },
141 "defaultConfiguration": {
142 "level": "warning",
143 "rank": 80
144 },
145 "properties": {
146 "tags": [
147 "Performance"
148 ]
149 }
150 },
151 {
152 "id": "RedundantLabel",
153 "shortDescription": {
154 "text": "Redundant label on activity"
155 },
156 "fullDescription": {
157 "text": "When an activity does not have a label attribute, it will use the one from the application tag. Since the application has already specified the same label, the label on this activity can be omitted."
158 },
159 "defaultConfiguration": {
160 "level": "warning",
161 "rank": 60
162 },
163 "properties": {
164 "tags": [
165 "Correctness"
166 ]
167 }
168 },
169 {
170 "id": "UnusedAttribute",
171 "shortDescription": {
172 "text": "Attribute unused on older versions"
173 },
174 "fullDescription": {
175 "text": "This check finds attributes set in XML files that were introduced in a version newer than the oldest version targeted by your application (with the minSdkVersion attribute).\n\nThis is not an error; the application will simply ignore the attribute. However, if the attribute is important to the appearance or functionality of your application, you should consider finding an alternative way to achieve the same result with only available attributes, and then you can optionally create a copy of the layout in a layout-vNN folder which will be used on API NN or higher where you can take advantage of the newer attribute.\n\nNote: This check does not only apply to attributes. For example, some tags can be unused too, such as the new <tag> element in layouts introduced in API 21.",
176 "markdown": "This check finds attributes set in XML files that were introduced in a version newer than the oldest version targeted by your application (with the `minSdkVersion` attribute).\n\nThis is not an error; the application will simply ignore the attribute. However, if the attribute is important to the appearance or functionality of your application, you should consider finding an alternative way to achieve the same result with only available attributes, and then you can optionally create a copy of the layout in a layout-vNN folder which will be used on API NN or higher where you can take advantage of the newer attribute.\n\nNote: This check does not only apply to attributes. For example, some tags can be unused too, such as the new `<tag>` element in layouts introduced in API 21."
177 },
178 "defaultConfiguration": {
179 "level": "warning",
180 "rank": 50
181 },
182 "properties": {
183 "tags": [
184 "Correctness"
185 ]
186 }
187 },
188 {
189 "id": "UnusedResources",
190 "shortDescription": {
191 "text": "Unused resources"
192 },
193 "fullDescription": {
194 "text": "Unused resources make applications larger and slow down builds.\n\n\nThe unused resource check can ignore tests. If you want to include resources that are only referenced from tests, consider packaging them in a test source set instead.\n\nYou can include test sources in the unused resource check by setting the system property lint.unused-resources.include-tests=true, and to exclude them (usually for performance reasons), use lint.unused-resources.exclude-tests=true.\n",
195 "markdown": "Unused resources make applications larger and slow down builds.\n\n\nThe unused resource check can ignore tests. If you want to include resources that are only referenced from tests, consider packaging them in a test source set instead.\n\nYou can include test sources in the unused resource check by setting the system property `lint.unused-resources.include-tests=true`, and to exclude them (usually for performance reasons), use `lint.unused-resources.exclude-tests=true`.\n"
196 },
197 "defaultConfiguration": {
198 "level": "warning",
199 "rank": 80
200 },
201 "properties": {
202 "tags": [
203 "Performance"
204 ]
205 }
206 }
207 ]
208 }
209 },
210 "originalUriBaseIds": {
211 "%SRCROOT%": {
212 "uri": "file:///C:/Users/jhust/Documents/jcr-guide-pro-source/android/"
213 }
214 },
215 "results": [
216 {
217 "ruleId": "OldTargetApi",
218 "ruleIndex": 5,
219 "message": {
220 "text": "Not targeting the latest versions of Android; compatibility modes apply. Consider testing and updating this version. Consult the android.os.Build.VERSION_CODES javadoc for details.",
221 "markdown": "Not targeting the latest versions of Android; compatibility modes apply. Consider testing and updating this version. Consult the `android.os.Build.VERSION_CODES` javadoc for details."
222 },
223 "locations": [
224 {
225 "physicalLocation": {
226 "artifactLocation": {
227 "uriBaseId": "%SRCROOT%",
228 "uri": "app/build.gradle"
229 },
230 "region": {
231 "startLine": 12,
232 "startColumn": 9,
233 "endLine": 12,
234 "endColumn": 21,
235 "charOffset": 185,
236 "charLength": 12,
237 "snippet": {
238 "text": "targetSdk 34"
239 }
240 },
241 "contextRegion": {
242 "startLine": 10,
243 "endLine": 15,
244 "snippet": {
245 "text": " applicationId \"com.jcrguru\"\n minSdk 21\n targetSdk 34\n versionCode 1\n versionName \"1.0.0\"\n"
246 }
247 }
248 }
249 }
250 ],
251 "fixes": [
252 {
253 "description": {
254 "text": "Update targetSdkVersion to 37"
255 },
256 "artifactChanges": [
257 {
258 "artifactLocation": {
259 "uriBaseId": "%SRCROOT%",
260 "uri": "app/build.gradle"
261 },
262 "replacements": [
263 {
264 "deletedRegion": {
265 "startLine": 12,
266 "startColumn": 19,
267 "charOffset": 195,
268 "endLine": 12,
269 "endColumn": 21,
270 "charLength": 2
271 },
272 "insertedContent": {
273 "text": "37\n"
274 }
275 }
276 ]
277 }
278 ]
279 }
280 ],
281 "partialFingerprints": {
282 "sourceContext/v1": "d74d3a4b29c6e330"
283 }
284 },
285 {
286 "ruleId": "UnusedAttribute",
287 "ruleIndex": 8,
288 "message": {
289 "text": "Attribute autoVerify is only used in API level 23 and higher (current min is 21)",
290 "markdown": "Attribute `autoVerify` is only used in API level 23 and higher (current min is 21)"
291 },
292 "locations": [
293 {
294 "physicalLocation": {
295 "artifactLocation": {
296 "uriBaseId": "%SRCROOT%",
297 "uri": "app/src/main/AndroidManifest.xml"
298 },
299 "region": {
300 "startLine": 46,
301 "startColumn": 28,
302 "endLine": 46,
303 "endColumn": 53,
304 "charOffset": 2023,
305 "charLength": 25,
306 "snippet": {
307 "text": "android:autoVerify=\"true\""
308 }
309 },
310 "contextRegion": {
311 "startLine": 44,
312 "endLine": 49,
313 "snippet": {
314 "text": "\n <!-- Handle deep links from the web app -->\n <intent-filter android:autoVerify=\"true\">\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n"
315 }
316 }
317 }
318 }
319 ],
320 "fixes": [
321 ],
322 "partialFingerprints": {
323 "sourceContext/v1": "0019baf37ef70099"
324 }
325 },
326 {
327 "ruleId": "RedundantLabel",
328 "ruleIndex": 7,
329 "message": {
330 "text": "Redundant label can be removed"
331 },
332 "locations": [
333 {
334 "physicalLocation": {
335 "artifactLocation": {
336 "uriBaseId": "%SRCROOT%",
337 "uri": "app/src/main/AndroidManifest.xml"
338 },
339 "region": {
340 "startLine": 19,
341 "startColumn": 13,
342 "endLine": 19,
343 "endColumn": 45,
344 "charOffset": 657,
345 "charLength": 32,
346 "snippet": {
347 "text": "android:label=\"@string/app_name\""
348 }
349 },
350 "contextRegion": {
351 "startLine": 17,
352 "endLine": 22,
353 "snippet": {
354 "text": " android:name=\".MainActivity\"\n android:exported=\"true\"\n android:label=\"@string/app_name\">\n <intent-filter>\n <action android:name=\"android.intent.action.MAIN\" />\n"
355 }
356 }
357 }
358 }
359 ],
360 "fixes": [
361 {
362 "description": {
363 "text": "Delete label"
364 },
365 "artifactChanges": [
366 {
367 "artifactLocation": {
368 "uriBaseId": "%SRCROOT%",
369 "uri": "app/src/main/AndroidManifest.xml"
370 },
371 "replacements": [
372 {
373 "deletedRegion": {
374 "startLine": 19,
375 "startColumn": 13,
376 "charOffset": 657,
377 "endLine": 19,
378 "endColumn": 45,
379 "charLength": 32
380 },
381 "insertedContent": {
382 "text": "\n"
383 }
384 }
385 ]
386 }
387 ]
388 }
389 ],
390 "partialFingerprints": {
391 "sourceContext/v1": "8c569282c98a4a03"
392 }
393 },
394 {
395 "ruleId": "AndroidGradlePluginVersion",
396 "ruleIndex": 0,
397 "message": {
398 "text": "A newer version of Gradle than 9.5.0 is available: 9.7.0"
399 },
400 "locations": [
401 {
402 "physicalLocation": {
403 "artifactLocation": {
404 "uriBaseId": "%SRCROOT%",
405 "uri": "gradle/wrapper/gradle-wrapper.properties"
406 },
407 "region": {
408 "startLine": 5,
409 "startColumn": 17,
410 "endLine": 5,
411 "endColumn": 80,
412 "charOffset": 138,
413 "charLength": 63,
414 "snippet": {
415 "text": "https\\://services.gradle.org/distributions/gradle-9.5.0-bin.zip"
416 }
417 },
418 "contextRegion": {
419 "startLine": 3,
420 "endLine": 6,
421 "snippet": {
422 "text": "zipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.5.0-bin.zip\n"
423 }
424 }
425 }
426 }
427 ],
428 "fixes": [
429 {
430 "description": {
431 "text": "Update to 9.7.0"
432 },
433 "artifactChanges": [
434 {
435 "artifactLocation": {
436 "uriBaseId": "%SRCROOT%",
437 "uri": "gradle/wrapper/gradle-wrapper.properties"
438 },
439 "replacements": [
440 {
441 "deletedRegion": {
442 "startLine": 5,
443 "startColumn": 67,
444 "charOffset": 188,
445 "endLine": 5,
446 "endColumn": 72,
447 "charLength": 5
448 },
449 "insertedContent": {
450 "text": "9.7.0\n"
451 }
452 }
453 ]
454 }
455 ]
456 }
457 ],
458 "partialFingerprints": {
459 "sourceContext/v1": "e7881866439724d3"
460 }
461 },
462 {
463 "ruleId": "GradleDependency",
464 "ruleIndex": 3,
465 "message": {
466 "text": "A newer version of compileSdk than 34 is available: 37",
467 "markdown": "A newer version of `compileSdk` than 34 is available: 37"
468 },
469 "locations": [
470 {
471 "physicalLocation": {
472 "artifactLocation": {
473 "uriBaseId": "%SRCROOT%",
474 "uri": "app/build.gradle"
475 },
476 "region": {
477 "startLine": 6,
478 "startColumn": 5,
479 "endLine": 6,
480 "endColumn": 18,
481 "charOffset": 60,
482 "charLength": 13,
483 "snippet": {
484 "text": "compileSdk 34"
485 }
486 },
487 "contextRegion": {
488 "startLine": 4,
489 "endLine": 9,
490 "snippet": {
491 "text": "\nandroid {\n compileSdk 34\n namespace \"com.jcrguru\"\n\n"
492 }
493 }
494 }
495 }
496 ],
497 "fixes": [
498 {
499 "description": {
500 "text": "Set compileSdk to 37"
501 },
502 "artifactChanges": [
503 {
504 "artifactLocation": {
505 "uriBaseId": "%SRCROOT%",
506 "uri": "app/build.gradle"
507 },
508 "replacements": [
509 {
510 "deletedRegion": {
511 "startLine": 6,
512 "startColumn": 16,
513 "charOffset": 71,
514 "endLine": 6,
515 "endColumn": 18,
516 "charLength": 2
517 },
518 "insertedContent": {
519 "text": "37\n"
520 }
521 }
522 ]
523 }
524 ]
525 }
526 ],
527 "partialFingerprints": {
528 "sourceContext/v1": "19bd1a6c3f0919d0"
529 }
530 },
531 {
532 "ruleId": "GradleDependency",
533 "ruleIndex": 3,
534 "message": {
535 "text": "A newer version of androidx.appcompat:appcompat than 1.6.1 is available: 1.8.0"
536 },
537 "locations": [
538 {
539 "physicalLocation": {
540 "artifactLocation": {
541 "uriBaseId": "%SRCROOT%",
542 "uri": "app/build.gradle"
543 },
544 "region": {
545 "startLine": 51,
546 "startColumn": 20,
547 "endLine": 51,
548 "endColumn": 56,
549 "charOffset": 1143,
550 "charLength": 36,
551 "snippet": {
552 "text": "'androidx.appcompat:appcompat:1.6.1'"
553 }
554 },
555 "contextRegion": {
556 "startLine": 49,
557 "endLine": 54,
558 "snippet": {
559 "text": "\ndependencies {\n implementation 'androidx.appcompat:appcompat:1.6.1'\n implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.5.0'\n}\n"
560 }
561 }
562 }
563 }
564 ],
565 "fixes": [
566 {
567 "description": {
568 "text": "Change to 1.8.0"
569 },
570 "artifactChanges": [
571 {
572 "artifactLocation": {
573 "uriBaseId": "%SRCROOT%",
574 "uri": "app/build.gradle"
575 },
576 "replacements": [
577 {
578 "deletedRegion": {
579 "startLine": 51,
580 "startColumn": 50,
581 "charOffset": 1173,
582 "endLine": 51,
583 "endColumn": 55,
584 "charLength": 5
585 },
586 "insertedContent": {
587 "text": "1.8.0\n"
588 }
589 }
590 ]
591 }
592 ]
593 }
594 ],
595 "partialFingerprints": {
596 "sourceContext/v1": "7720051b16f8fa68"
597 }
598 },
599 {
600 "ruleId": "GradleDependency",
601 "ruleIndex": 3,
602 "message": {
603 "text": "A newer version of com.google.androidbrowserhelper:androidbrowserhelper than 2.5.0 is available: 2.7.3"
604 },
605 "locations": [
606 {
607 "physicalLocation": {
608 "artifactLocation": {
609 "uriBaseId": "%SRCROOT%",
610 "uri": "app/build.gradle"
611 },
612 "region": {
613 "startLine": 52,
614 "startColumn": 20,
615 "endLine": 52,
616 "endColumn": 80,
617 "charOffset": 1199,
618 "charLength": 60,
619 "snippet": {
620 "text": "'com.google.androidbrowserhelper:androidbrowserhelper:2.5.0'"
621 }
622 },
623 "contextRegion": {
624 "startLine": 50,
625 "endLine": 54,
626 "snippet": {
627 "text": "dependencies {\n implementation 'androidx.appcompat:appcompat:1.6.1'\n implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.5.0'\n}\n"
628 }
629 }
630 }
631 }
632 ],
633 "fixes": [
634 {
635 "description": {
636 "text": "Change to 2.7.3"
637 },
638 "artifactChanges": [
639 {
640 "artifactLocation": {
641 "uriBaseId": "%SRCROOT%",
642 "uri": "app/build.gradle"
643 },
644 "replacements": [
645 {
646 "deletedRegion": {
647 "startLine": 52,
648 "startColumn": 74,
649 "charOffset": 1253,
650 "endLine": 52,
651 "endColumn": 79,
652 "charLength": 5
653 },
654 "insertedContent": {
655 "text": "2.7.3\n"
656 }
657 }
658 ]
659 }
660 ]
661 }
662 ],
663 "partialFingerprints": {
664 "sourceContext/v1": "02b23453e63df5ae"
665 }
666 },
667 {
668 "ruleId": "ExportedService",
669 "ruleIndex": 2,
670 "message": {
671 "text": "Exported service does not require permission"
672 },
673 "locations": [
674 {
675 "physicalLocation": {
676 "artifactLocation": {
677 "uriBaseId": "%SRCROOT%",
678 "uri": "app/src/main/AndroidManifest.xml"
679 },
680 "region": {
681 "startLine": 61,
682 "startColumn": 10,
683 "endLine": 61,
684 "endColumn": 17,
685 "charOffset": 2731,
686 "charLength": 7,
687 "snippet": {
688 "text": "service"
689 }
690 },
691 "contextRegion": {
692 "startLine": 59,
693 "endLine": 64,
694 "snippet": {
695 "text": " android:theme=\"@style/AppTheme\" />\n\n <service\n android:name=\"com.google.androidbrowserhelper.trusted.DelegationService\"\n android:exported=\"true\">\n"
696 }
697 }
698 }
699 }
700 ],
701 "fixes": [
702 {
703 "description": {
704 "text": "Set permission"
705 },
706 "artifactChanges": [
707 {
708 "artifactLocation": {
709 "uriBaseId": "%SRCROOT%",
710 "uri": "app/src/main/AndroidManifest.xml"
711 },
712 "replacements": [
713 {
714 "deletedRegion": {
715 "startLine": 63,
716 "startColumn": 36,
717 "charOffset": 2859
718 },
719 "insertedContent": {
720 "text": " android:permission=\"TODO\"\n"
721 }
722 }
723 ]
724 }
725 ]
726 },
727 {
728 "description": {
729 "text": "Set exported=\"false\""
730 },
731 "artifactChanges": [
732 {
733 "artifactLocation": {
734 "uriBaseId": "%SRCROOT%",
735 "uri": "app/src/main/AndroidManifest.xml"
736 },
737 "replacements": [
738 {
739 "deletedRegion": {
740 "startLine": 63,
741 "startColumn": 13,
742 "charOffset": 2836,
743 "endLine": 63,
744 "endColumn": 36,
745 "charLength": 23
746 },
747 "insertedContent": {
748 "text": "android:exported=\"false\"\n"
749 }
750 }
751 ]
752 }
753 ]
754 }
755 ],
756 "partialFingerprints": {
757 "sourceContext/v1": "1b0c92978702f276"
758 }
759 },
760 {
761 "ruleId": "Overdraw",
762 "ruleIndex": 6,
763 "message": {
764 "text": "Possible overdraw: Root element paints background #111827 with a theme that also paints a background (inferred theme is @style/AppTheme)",
765 "markdown": "Possible overdraw: Root element paints background `#111827` with a theme that also paints a background (inferred theme is `@style/AppTheme`)"
766 },
767 "locations": [
768 {
769 "physicalLocation": {
770 "artifactLocation": {
771 "uriBaseId": "%SRCROOT%",
772 "uri": "app/src/main/res/layout/activity_main.xml"
773 },
774 "region": {
775 "startLine": 5,
776 "startColumn": 5,
777 "endLine": 5,
778 "endColumn": 33,
779 "charOffset": 200,
780 "charLength": 28,
781 "snippet": {
782 "text": "android:background=\"#111827\""
783 }
784 },
785 "contextRegion": {
786 "startLine": 3,
787 "endLine": 8,
788 "snippet": {
789 "text": " android:layout_width=\"match_parent\"\r\n android:layout_height=\"match_parent\"\r\n android:background=\"#111827\">\r\n\r\n <ImageView\r\n"
790 }
791 }
792 }
793 }
794 ],
795 "partialFingerprints": {
796 "sourceContext/v1": "870de61392b2e646"
797 }
798 },
799 {
800 "ruleId": "UnusedResources",
801 "ruleIndex": 9,
802 "message": {
803 "text": "The resource R.layout.activity_main appears to be unused",
804 "markdown": "The resource `R.layout.activity_main` appears to be unused"
805 },
806 "locations": [
807 {
808 "physicalLocation": {
809 "artifactLocation": {
810 "uriBaseId": "%SRCROOT%",
811 "uri": "app/src/main/res/layout/activity_main.xml"
812 },
813 "region": {
814 "startLine": 2,
815 "startColumn": 1,
816 "endLine": 13,
817 "endColumn": 15,
818 "charOffset": 40,
819 "charLength": 389,
820 "snippet": {
821 "text": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n android:layout_width=\"match_parent\"\r\n android:layout_height=\"match_parent\"\r\n android:background=\"#111827\">\r\n\r\n <ImageView\r\n android:layout_width=\"128dp\"\r\n android:layout_height=\"128dp\"\r\n android:layout_gravity=\"center\"\r\n android:src=\"@mipmap/ic_launcher\" />\r\n\r\n</FrameLayout>"
822 }
823 },
824 "contextRegion": {
825 "startLine": 1,
826 "endLine": 14,
827 "snippet": {
828 "text": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n android:layout_width=\"match_parent\"\r\n android:layout_height=\"match_parent\"\r\n android:background=\"#111827\">\r\n\r\n <ImageView\r\n android:layout_width=\"128dp\"\r\n android:layout_height=\"128dp\"\r\n android:layout_gravity=\"center\"\r\n android:src=\"@mipmap/ic_launcher\" />\r\n\r\n</FrameLayout>\r\n"
829 }
830 }
831 }
832 }
833 ],
834 "fixes": [
835 ],
836 "partialFingerprints": {
837 "sourceContext/v1": "e9c2a5b22ad0a3c7"
838 }
839 },
840 {
841 "ruleId": "UnusedResources",
842 "ruleIndex": 9,
843 "message": {
844 "text": "The resource R.color.colorPrimaryDark appears to be unused",
845 "markdown": "The resource `R.color.colorPrimaryDark` appears to be unused"
846 },
847 "locations": [
848 {
849 "physicalLocation": {
850 "artifactLocation": {
851 "uriBaseId": "%SRCROOT%",
852 "uri": "app/src/main/res/values/colors.xml"
853 },
854 "region": {
855 "startLine": 4,
856 "startColumn": 12,
857 "endLine": 4,
858 "endColumn": 35,
859 "charOffset": 112,
860 "charLength": 23,
861 "snippet": {
862 "text": "name=\"colorPrimaryDark\""
863 }
864 },
865 "contextRegion": {
866 "startLine": 2,
867 "endLine": 7,
868 "snippet": {
869 "text": "<resources>\r\n <color name=\"colorPrimary\">#2563EB</color>\r\n <color name=\"colorPrimaryDark\">#1D4ED8</color>\r\n <color name=\"colorAccent\">#2563EB</color>\r\n <color name=\"windowBackground\">#111827</color>\r\n"
870 }
871 }
872 }
873 }
874 ],
875 "fixes": [
876 ],
877 "partialFingerprints": {
878 "sourceContext/v1": "c5f0df4b6a0931a0"
879 }
880 },
881 {
882 "ruleId": "UnusedResources",
883 "ruleIndex": 9,
884 "message": {
885 "text": "The resource R.color.colorAccent appears to be unused",
886 "markdown": "The resource `R.color.colorAccent` appears to be unused"
887 },
888 "locations": [
889 {
890 "physicalLocation": {
891 "artifactLocation": {
892 "uriBaseId": "%SRCROOT%",
893 "uri": "app/src/main/res/values/colors.xml"
894 },
895 "region": {
896 "startLine": 5,
897 "startColumn": 12,
898 "endLine": 5,
899 "endColumn": 30,
900 "charOffset": 164,
901 "charLength": 18,
902 "snippet": {
903 "text": "name=\"colorAccent\""
904 }
905 },
906 "contextRegion": {
907 "startLine": 3,
908 "endLine": 8,
909 "snippet": {
910 "text": " <color name=\"colorPrimary\">#2563EB</color>\r\n <color name=\"colorPrimaryDark\">#1D4ED8</color>\r\n <color name=\"colorAccent\">#2563EB</color>\r\n <color name=\"windowBackground\">#111827</color>\r\n</resources>\r\n"
911 }
912 }
913 }
914 }
915 ],
916 "fixes": [
917 ],
918 "partialFingerprints": {
919 "sourceContext/v1": "15d62106611bc95c"
920 }
921 },
922 {
923 "ruleId": "MonochromeLauncherIcon",
924 "ruleIndex": 4,
925 "message": {
926 "text": "The application adaptive icon is missing a monochrome tag"
927 },
928 "locations": [
929 {
930 "physicalLocation": {
931 "artifactLocation": {
932 "uriBaseId": "%SRCROOT%",
933 "uri": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml"
934 },
935 "region": {
936 "startLine": 2,
937 "startColumn": 1,
938 "endLine": 5,
939 "endColumn": 17,
940 "charOffset": 40,
941 "charLength": 236,
942 "snippet": {
943 "text": "<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <background android:drawable=\"@drawable/ic_launcher_background\" />\r\n <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\r\n</adaptive-icon>"
944 }
945 },
946 "contextRegion": {
947 "startLine": 1,
948 "endLine": 6,
949 "snippet": {
950 "text": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <background android:drawable=\"@drawable/ic_launcher_background\" />\r\n <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\r\n</adaptive-icon>\r\n"
951 }
952 }
953 }
954 }
955 ],
956 "partialFingerprints": {
957 "sourceContext/v1": "c20233581e8994ef"
958 }
959 },
960 {
961 "ruleId": "MonochromeLauncherIcon",
962 "ruleIndex": 4,
963 "message": {
964 "text": "The application adaptive roundIcon is missing a monochrome tag"
965 },
966 "locations": [
967 {
968 "physicalLocation": {
969 "artifactLocation": {
970 "uriBaseId": "%SRCROOT%",
971 "uri": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml"
972 },
973 "region": {
974 "startLine": 2,
975 "startColumn": 1,
976 "endLine": 5,
977 "endColumn": 17,
978 "charOffset": 40,
979 "charLength": 236,
980 "snippet": {
981 "text": "<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <background android:drawable=\"@drawable/ic_launcher_background\" />\r\n <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\r\n</adaptive-icon>"
982 }
983 },
984 "contextRegion": {
985 "startLine": 1,
986 "endLine": 6,
987 "snippet": {
988 "text": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <background android:drawable=\"@drawable/ic_launcher_background\" />\r\n <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\r\n</adaptive-icon>\r\n"
989 }
990 }
991 }
992 }
993 ],
994 "partialFingerprints": {
995 "sourceContext/v1": "c20233581e8994ef"
996 }
997 },
998 {
999 "ruleId": "ContentDescription",
1000 "ruleIndex": 1,
1001 "message": {
1002 "text": "Missing contentDescription attribute on image",
1003 "markdown": "Missing `contentDescription` attribute on image"
1004 },
1005 "locations": [
1006 {
1007 "physicalLocation": {
1008 "artifactLocation": {
1009 "uriBaseId": "%SRCROOT%",
1010 "uri": "app/src/main/res/layout/activity_main.xml"
1011 },
1012 "region": {
1013 "startLine": 7,
1014 "startColumn": 6,
1015 "endLine": 7,
1016 "endColumn": 15,
1017 "charOffset": 238,
1018 "charLength": 9,
1019 "snippet": {
1020 "text": "ImageView"
1021 }
1022 },
1023 "contextRegion": {
1024 "startLine": 5,
1025 "endLine": 10,
1026 "snippet": {
1027 "text": " android:background=\"#111827\">\r\n\r\n <ImageView\r\n android:layout_width=\"128dp\"\r\n android:layout_height=\"128dp\"\r\n"
1028 }
1029 }
1030 }
1031 }
1032 ],
1033 "fixes": [
1034 {
1035 "description": {
1036 "text": "Set contentDescription"
1037 },
1038 "artifactChanges": [
1039 {
1040 "artifactLocation": {
1041 "uriBaseId": "%SRCROOT%",
1042 "uri": "app/src/main/res/layout/activity_main.xml"
1043 },
1044 "replacements": [
1045 {
1046 "deletedRegion": {
1047 "startLine": 11,
1048 "startColumn": 9,
1049 "charOffset": 375
1050 },
1051 "insertedContent": {
1052 "text": "android:contentDescription=\"TODO\" \n"
1053 }
1054 }
1055 ]
1056 }
1057 ]
1058 },
1059 {
1060 "description": {
1061 "text": "Set importantForAccessibility=\"no\""
1062 },
1063 "artifactChanges": [
1064 {
1065 "artifactLocation": {
1066 "uriBaseId": "%SRCROOT%",
1067 "uri": "app/src/main/res/layout/activity_main.xml"
1068 },
1069 "replacements": [
1070 {
1071 "deletedRegion": {
1072 "startLine": 11,
1073 "startColumn": 9,
1074 "charOffset": 375
1075 },
1076 "insertedContent": {
1077 "text": "android:importantForAccessibility=\"no\" \n"
1078 }
1079 }
1080 ]
1081 }
1082 ]
1083 }
1084 ],
1085 "partialFingerprints": {
1086 "sourceContext/v1": "08acdbd9c0660c00"
1087 }
1088 }
1089 ]
1090 }
1091 ]
1092 }