Overview
| Lint | |
| 1 | warning ObsoleteLintCustomCheck: Obsolete custom lint check |
| Correctness | |
| 6 | warning GradleDependency: Obsolete Gradle Dependency |
| 5 | warning NewerVersionAvailable: Newer Library Versions Available |
| 4 | warning ModifierParameter: Guidelines for Modifier parameters in a Composable function |
| Performance | |
| 7 | warning UnusedResources: Unused resources |
| Productivity | |
| 7 | warning UseKtx: Use KTX extension function |
| Included Additional Checks (70) | |
| Disabled Checks (47) |
Obsolete custom lint check
ObsoleteLintCustomCheck
Warning
Priority 10/10
Obsolete Gradle Dependency
../../build.gradle.kts:53:
50 } 51 dependencies { 52 // Mature, mutually compatible stable Compose/Kotlin line; no alpha dependencies. 53 implementation(platform("androidx.compose:compose-bom:2025.08.01")) 54 implementation("androidx.compose.ui:ui") 55 implementation("androidx.compose.ui:ui-tooling-preview") 56 implementation("androidx.compose.foundation:foundation")../../build.gradle.kts:59:
56 implementation("androidx.compose.foundation:foundation") 57 implementation("androidx.compose.material3:material3") 58 implementation("androidx.activity:activity-compose:1.13.0") 59 implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.4") 60 implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") 61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6")../../build.gradle.kts:60:
57 implementation("androidx.compose.material3:material3") 58 implementation("androidx.activity:activity-compose:1.13.0") 59 implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.4") 60 implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") 61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6") 63 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")../../build.gradle.kts:61:
58 implementation("androidx.activity:activity-compose:1.13.0") 59 implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.4") 60 implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") 61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6") 63 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") 64 implementation("com.squareup.okhttp3:okhttp:4.12.0")../../build.gradle.kts:62:
59 implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.4") 60 implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") 61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6") 63 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") 64 implementation("com.squareup.okhttp3:okhttp:4.12.0") 65 implementation("org.jsoup:jsoup:1.24.1")../../build.gradle.kts:70:
67 testImplementation("org.json:json:20250517") 68 testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0") 69 testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2") 70 androidTestImplementation(platform("androidx.compose:compose-bom:2025.08.01")) 71 androidTestImplementation("androidx.compose.ui:ui-test-junit4") 72 androidTestImplementation("androidx.test:core:1.7.0") 73 androidTestImplementation("androidx.test:runner:1.7.0")
GradleDependency
Correctness
Warning
Priority 4/10
Newer Library Versions Available
../../build.gradle.kts:63:
60 implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") 61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6") 63 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") 64 implementation("com.squareup.okhttp3:okhttp:4.12.0") 65 implementation("org.jsoup:jsoup:1.24.1") 66 testImplementation("junit:junit:4.13.2")../../build.gradle.kts:64:
61 implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4") 62 implementation("androidx.navigation:navigation-compose:2.9.6") 63 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") 64 implementation("com.squareup.okhttp3:okhttp:4.12.0") 65 implementation("org.jsoup:jsoup:1.24.1") 66 testImplementation("junit:junit:4.13.2") 67 testImplementation("org.json:json:20250517")../../build.gradle.kts:67:
64 implementation("com.squareup.okhttp3:okhttp:4.12.0") 65 implementation("org.jsoup:jsoup:1.24.1") 66 testImplementation("junit:junit:4.13.2") 67 testImplementation("org.json:json:20250517") 68 testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0") 69 testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2") 70 androidTestImplementation(platform("androidx.compose:compose-bom:2025.08.01"))../../build.gradle.kts:68:
65 implementation("org.jsoup:jsoup:1.24.1") 66 testImplementation("junit:junit:4.13.2") 67 testImplementation("org.json:json:20250517") 68 testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0") 69 testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2") 70 androidTestImplementation(platform("androidx.compose:compose-bom:2025.08.01")) 71 androidTestImplementation("androidx.compose.ui:ui-test-junit4")../../build.gradle.kts:69:
66 testImplementation("junit:junit:4.13.2") 67 testImplementation("org.json:json:20250517") 68 testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0") 69 testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2") 70 androidTestImplementation(platform("androidx.compose:compose-bom:2025.08.01")) 71 androidTestImplementation("androidx.compose.ui:ui-test-junit4") 72 androidTestImplementation("androidx.test:core:1.7.0")
NewerVersionAvailable
Correctness
Warning
Priority 4/10
Guidelines for Modifier parameters in a Composable function
../../src/main/java/com/bharatiessentials/deliverypartner/ui/DesignSystem.kt:110:
107 Column(Modifier.padding(Space.Lg),verticalArrangement=Arrangement.spacedBy(Space.Md),content=content) 108 } 109 } 110 @Composable fun PrimaryButton(text:String,onClick:()->Unit,enabled:Boolean=true,busy:Boolean=false,glyph:Glyph?=null,modifier:Modifier=Modifier){ 111 Button(onClick,modifier.fillMaxWidth().heightIn(min=UiSize.Button),enabled=enabled&&!busy,shape=ControlShape, 112 contentPadding=PaddingValues(horizontal=Space.Lg,vertical=Space.Md),elevation=ButtonDefaults.buttonElevation(defaultElevation=Space.None,pressedElevation=Space.None)){ 113 if(busy){CircularProgressIndicator(Modifier.size(UiSize.Spinner),strokeWidth=UiSize.ProgressStroke,color=LocalContentColor.current);Spacer(Modifier.width(Space.Sm))}../../src/main/java/com/bharatiessentials/deliverypartner/ui/DesignSystem.kt:118:
115 Text(text,textAlign=TextAlign.Center,style=MaterialTheme.typography.labelLarge) 116 } 117 } 118 @Composable fun SecondaryButton(text:String,onClick:()->Unit,glyph:Glyph?=null,enabled:Boolean=true,modifier:Modifier=Modifier){ 119 OutlinedButton(onClick,modifier.heightIn(min=UiSize.Touch),enabled=enabled,shape=ControlShape,border=BorderStroke(Space.Hairline,if(enabled)Line else Line.copy(alpha=.6f)),contentPadding=PaddingValues(horizontal=Space.Md,vertical=Space.Md)){ 120 glyph?.let{BIcon(it,Modifier.size(UiSize.IconSmall));Spacer(Modifier.width(Space.Sm))};Text(text,style=MaterialTheme.typography.labelLarge,textAlign=TextAlign.Center) 121 }../../src/main/java/com/bharatiessentials/deliverypartner/ui/DesignSystem.kt:140:
137 Text(text,Modifier.padding(horizontal=Space.Sm,vertical=Space.Xs),style=MaterialTheme.typography.labelSmall,color=fg) 138 } 139 } 140 @Composable fun InfoStrip(text:String,warning:Boolean=false,error:Boolean=false,modifier:Modifier=Modifier){ 141 val bg=if(error)DangerBg else if(warning)WarningBg else PaleGreen 142 val fg=if(error)Danger else if(warning)WarningInk else DeepGreen 143 Surface(modifier.fillMaxWidth(),color=bg,shape=ControlShape){../../src/main/java/com/bharatiessentials/deliverypartner/ui/DesignSystem.kt:197:
194 } 195 196 enum class Glyph { Jobs, History, Cash, Alerts, Support, Arrow, Pin, Phone, More, Refresh, Back, Check, Close, Warning, Eye, EyeOff, Person, Logout, Chevron, Package, Shield, Chat, Location } 197 @Composable fun BIcon(glyph: Glyph, modifier: Modifier = Modifier.size(UiSize.Icon), color: Color = LocalContentColor.current) { 198 Canvas(modifier.clearAndSetSemantics { }) { 199 scale(size.minDimension / 24f, pivot = Offset.Zero) { 200 val stroke = Stroke(width = IconStroke, cap = StrokeCap.Round)
Vendor: Jetpack Compose
Identifier: androidx.compose.ui
Feedback: https://issuetracker.google.com/issues/new?component=612128
Identifier: androidx.compose.ui
Feedback: https://issuetracker.google.com/issues/new?component=612128
ModifierParameter
Correctness
Warning
Priority 3/10
Unused resources
../../src/main/res/values/colors.xml:2:
1 <resources> 2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color>../../src/main/res/values/colors.xml:3:
1 <resources> 2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color> 6 <color name="background_shell">#F5F7F2</color></resources>../../src/main/res/values/colors.xml:4:
1 <resources> 2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color> 6 <color name="background_shell">#F5F7F2</color></resources>../../src/main/res/values/colors.xml:4:
1 <resources> 2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color> 6 <color name="background_shell">#F5F7F2</color></resources>../../src/main/res/values/colors.xml:5:
2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color> 6 <color name="background_shell">#F5F7F2</color></resources>../../src/main/res/values/colors.xml:5:
2 <color name="brand_green">#1A6B4F</color><color name="brand_green_dark">#156158</color> 3 <color name="paper">#FFFFFF</color><color name="soft_bg">#F4F7F5</color> 4 <color name="ink">#1A2623</color><color name="ink_muted">#55665F</color> 5 <color name="warning_bg">#FFF3DC</color><color name="warning_ink">#62450C</color> 6 <color name="background_shell">#F5F7F2</color></resources>../../src/main/res/values/strings.xml:1:
1 <resources><string name="app_name">Bharati Delivery Partner</string></resources>
UnusedResources
Performance
Warning
Priority 3/10
Use KTX extension function
../../src/main/java/com/bharatiessentials/deliverypartner/alerts/AssignmentAlertRuntime.kt:24:
21 @Synchronized override fun save(state: AssignmentAlertLedgerState): Boolean { 22 val riders = JSONArray().apply { state.baselinedRiders.filter { it > 0 }.sorted().forEach(::put) } 23 val identities = JSONArray().apply { state.handledIdentityKeys.takeLast(MAX_KEYS).forEach(::put) } 24 return prefs.edit().putString("baselined_riders", riders.toString()) 25 .putString("handled_identities", identities.toString()).commit() 26 }../../src/main/java/com/bharatiessentials/deliverypartner/ui/NativeApp.kt:200:
197 } 198 fun openExternal(context:Context,uri:String?){ 199 if(uri==null||!ExternalLinks.safeExternal(uri)){Toast.makeText(context,"Verified destination unavailable. Contact dispatch.",Toast.LENGTH_LONG).show();return} 200 try{context.startActivity(Intent(if(uri.startsWith("tel:"))Intent.ACTION_DIAL else Intent.ACTION_VIEW,Uri.parse(uri)))} 201 catch(_:ActivityNotFoundException){Toast.makeText(context,"No compatible app is installed for this action.",Toast.LENGTH_LONG).show()} 202 catch(_:SecurityException){Toast.makeText(context,"Android blocked this external action.",Toast.LENGTH_LONG).show()} 203 }../../src/main/java/com/bharatiessentials/deliverypartner/alerts/NewOrderAlerts.kt:113:
110 .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 111 .build() 112 113 fun ownerSoundUri(context: Context): Uri = Uri.parse("android.resource://${context.packageName}/${R.raw.new_order_alert}") 114 115 fun createChannels(context: Context) { 116 // minSdk 29 guarantees notification-channel APIs are available.../../src/main/java/com/bharatiessentials/deliverypartner/data/SecureStore.kt:44:
41 cipher.init(Cipher.DECRYPT_MODE, secret(), GCMParameterSpec(128, bytes.copyOfRange(0, 12))) 42 cipher.updateAAD(key.toByteArray(Charsets.UTF_8)) 43 cipher.doFinal(bytes.copyOfRange(12, bytes.size)).toString(Charsets.UTF_8) 44 } catch (_: Exception) { prefs.edit().clear().commit(); null } 45 } 46 @Synchronized override fun put(key: String, value: String) { 47 val cipher = Cipher.getInstance("AES/GCM/NoPadding")../../src/main/java/com/bharatiessentials/deliverypartner/data/SecureStore.kt:50:
47 val cipher = Cipher.getInstance("AES/GCM/NoPadding") 48 cipher.init(Cipher.ENCRYPT_MODE, secret()); cipher.updateAAD(key.toByteArray(Charsets.UTF_8)) 49 val payload = cipher.iv + cipher.doFinal(value.toByteArray(Charsets.UTF_8)) 50 check(prefs.edit().putString(key, Base64.encodeToString(payload, Base64.NO_WRAP)).commit()) { "Secure session storage unavailable" } 51 } 52 @Synchronized override fun remove(key: String) { prefs.edit().remove(key).commit() } 53 @Synchronized override fun clear() { prefs.edit().clear().commit() }../../src/main/java/com/bharatiessentials/deliverypartner/data/SecureStore.kt:52:
49 val payload = cipher.iv + cipher.doFinal(value.toByteArray(Charsets.UTF_8)) 50 check(prefs.edit().putString(key, Base64.encodeToString(payload, Base64.NO_WRAP)).commit()) { "Secure session storage unavailable" } 51 } 52 @Synchronized override fun remove(key: String) { prefs.edit().remove(key).commit() } 53 @Synchronized override fun clear() { prefs.edit().clear().commit() } 54 }../../src/main/java/com/bharatiessentials/deliverypartner/data/SecureStore.kt:53:
50 check(prefs.edit().putString(key, Base64.encodeToString(payload, Base64.NO_WRAP)).commit()) { "Secure session storage unavailable" } 51 } 52 @Synchronized override fun remove(key: String) { prefs.edit().remove(key).commit() } 53 @Synchronized override fun clear() { prefs.edit().clear().commit() } 54 } 55 56 /** Native persistence of WP session cookies never extends their server expiry; local upper bound is 48 hours. */
UseKtx
Productivity
Warning
Priority 6/10
Included Additional Checks
This card lists all the extra checks run by lint, provided from libraries,
build configuration and extra flags. This is included to help you verify
whether a particular check is included in analysis when configuring builds.
(Note that the list does not include the hundreds of built-in checks into lint,
only additional ones.)
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/pathFor more information, see https://developer.android.com/studio/write/lint.html#config