Lint Report: 29 warnings
Issue Types

Overview

Correctness
1warning ScopedStorage: Affected by scoped storage
1warning OldTargetApi: Target SDK attribute is not targeting latest version
2warning AndroidGradlePluginVersion: Obsolete Android Gradle Plugin Version
9warning GradleDependency: Obsolete Gradle Dependency
2warning NewerVersionAvailable: Newer Library Versions Available
1warning DiscouragedApi: Using discouraged APIs
Security
1warning SetJavaScriptEnabled: Using setJavaScriptEnabled
Performance
3warning UnusedResources: Unused resources
Usability:Icons
2warning MonochromeLauncherIcon: Monochrome icon is not defined
2warning IconLocation: Image defined in density-independent drawable folder
Productivity
3warning UseKtx: Use KTX extension function
2warning UseTomlInstead: Use TOML Version Catalog Instead
Included Additional Checks (29)
Disabled Checks (39)

Affected by scoped storage

../../src/main/AndroidManifest.xml:5: READ_EXTERNAL_STORAGE is deprecated (and is not granted) when targeting Android 13+. If you need to query or interact with MediaStore or media files on the shared storage, you should instead use one or more new storage permissions: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO or READ_MEDIA_AUDIO.
  2     xmlns:tools="http://schemas.android.com/tools">
  3 
  4     <uses-permission android:name="android.permission.INTERNET"/>
  5     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>                      
  6     <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
  7     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  8     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
ScopedStorage Correctness Warning Priority 8/10

Target SDK attribute is not targeting latest version

../../build.gradle.kts:13: 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.
 10     defaultConfig {
 11         applicationId = "com.gramiatechnologies.gramia"
 12         minSdk = 24
 13         targetSdk = 34                                                                              
 14         versionCode = 1
 15         versionName = "1.0"
OldTargetApi Correctness Warning Priority 6/10

Obsolete Android Gradle Plugin Version

../../../gradle/wrapper/gradle-wrapper.properties:4: A newer version of Gradle than 8.13 is available: 8.14.4
 1 #Tue Jun 24 07:47:00 SAST 2025
 2 distributionBase=GRADLE_USER_HOME
 3 distributionPath=wrapper/dists
 4 distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip                      
 5 zipStoreBase=GRADLE_USER_HOME
 6 zipStorePath=wrapper/dists
../../../gradle/libs.versions.toml:2: A newer version of com.android.application than 8.11.2 is available: 9.1.0
  1 [versions]
  2 agp = "8.11.2"                                                                                      
  3 kotlin = "1.9.0"
  4 coreKtx = "1.10.1"
  5 junit = "4.13.2"
AndroidGradlePluginVersion Correctness Warning Priority 4/10

Obsolete Gradle Dependency

../../build.gradle.kts:8: A newer version of compileSdkVersion than 34 is available: 36
  5 
  6 android {
  7     namespace = "com.gramiatechnologies.gramia"
  8     compileSdk = 34                                                                                 
  9 
 10     defaultConfig {
 11         applicationId = "com.gramiatechnologies.gramia"
../../build.gradle.kts:40: A newer version of androidx.work:work-runtime-ktx than 2.9.0 is available: 2.11.1
 37 
 38 dependencies {
 39     implementation("com.squareup.okhttp3:okhttp:4.12.0") // or latest version
 40     implementation("androidx.work:work-runtime-ktx:2.9.0")                                          
 41 
 42     implementation(libs.androidx.core.ktx)
 43     implementation(libs.androidx.appcompat)
../../../gradle/libs.versions.toml:4: A newer version of androidx.core:core-ktx than 1.10.1 is available: 1.17.0
  1 [versions]
  2 agp = "8.11.2"
  3 kotlin = "1.9.0"
  4 coreKtx = "1.10.1"                                                                                  
  5 junit = "4.13.2"
  6 junitVersion = "1.1.5"
  7 espressoCore = "3.5.1"
../../../gradle/libs.versions.toml:6: A newer version of androidx.test.ext:junit than 1.1.5 is available: 1.3.0
  3 kotlin = "1.9.0"
  4 coreKtx = "1.10.1"
  5 junit = "4.13.2"
  6 junitVersion = "1.1.5"                                                                              
  7 espressoCore = "3.5.1"
  8 appcompat = "1.6.1"
  9 material = "1.10.0"
../../../gradle/libs.versions.toml:7: A newer version of androidx.test.espresso:espresso-core than 3.5.1 is available: 3.7.0
  4 coreKtx = "1.10.1"
  5 junit = "4.13.2"
  6 junitVersion = "1.1.5"
  7 espressoCore = "3.5.1"                                                                              
  8 appcompat = "1.6.1"
  9 material = "1.10.0"
 10 activity = "1.8.0"
GradleDependency Correctness Warning Priority 4/10

Newer Library Versions Available

../../build.gradle.kts:39: A newer version of com.squareup.okhttp3:okhttp than 4.12.0 is available: 5.3.2
 36 }
 37 
 38 dependencies {
 39     implementation("com.squareup.okhttp3:okhttp:4.12.0") // or latest version                       
 40     implementation("androidx.work:work-runtime-ktx:2.9.0")
 41 
 42     implementation(libs.androidx.core.ktx)
../../../gradle/libs.versions.toml:3: A newer version of org.jetbrains.kotlin.android than 1.9.0 is available: 2.3.10
  1 [versions]
  2 agp = "8.11.2"
  3 kotlin = "1.9.0"                                                                                    
  4 coreKtx = "1.10.1"
  5 junit = "4.13.2"
  6 junitVersion = "1.1.5"
NewerVersionAvailable Correctness Warning Priority 4/10

Using discouraged APIs

../../src/main/java/com/gramiatechnologies/gramia/NotificationService.kt:27: Use of scheduleAtFixedRate is strongly discouraged because it can lead to unexpected behavior when Android processes become cached (tasks may unexpectedly execute hundreds or thousands of times in quick succession when a process changes from cached to uncached); prefer using schedule
 24     startForeground(1, showNativeNotification("Easiwrap", "Notification service running"))
 25 
 26     timer = Timer()
 27     timer.scheduleAtFixedRate(object : TimerTask() {                                            
 28         override fun run() {
 29             userId?.let {
 30                 checkForNotifications(it)
DiscouragedApi Correctness Warning Priority 2/10

Using setJavaScriptEnabled

../../src/main/java/com/gramiatechnologies/gramia/MainActivity.kt:46: Using setJavaScriptEnabled can introduce XSS vulnerabilities into your application, review carefully
  43 
  44         myWebView = findViewById(R.id.myWebView)
  45         val webSettings = myWebView.settings
  46         webSettings.javaScriptEnabled = true                                                        
  47         webSettings.domStorageEnabled = true // ✅ THIS LINE
  48         webSettings.allowFileAccess = true
  49         webSettings.allowFileAccessFromFileURLs = true
SetJavaScriptEnabled Security Warning Priority 6/10

Unused resources

../../src/main/res/values/colors.xml:3: The resource R.color.black appears to be unused
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3     <color name="black">#FF000000</color>                                                           
 4     <color name="white">#FFFFFFFF</color>
 5 </resources>
../../src/main/res/values/colors.xml:4: The resource R.color.white appears to be unused
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3     <color name="black">#FF000000</color>
 4     <color name="white">#FFFFFFFF</color>                                                           
 5 </resources>
../../src/main/res/drawable/ic_launcher_foreground.xml:1: The resource R.drawable.ic_launcher_foreground appears to be unused
  1 <vector xmlns:android="http://schemas.android.com/apk/res/android"                                  
  2     xmlns:aapt="http://schemas.android.com/aapt"
  3     android:width="108dp"
  4     android:height="108dp"
UnusedResources Performance Warning Priority 3/10

Monochrome icon is not defined

../../src/main/res/mipmap-anydpi-v26/ic_launcher.xml:2: The application adaptive icon is missing a monochrome tag
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">                          
 3     <background android:drawable="@drawable/ic_launcher_background"/>
 4     <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
 5 </adaptive-icon>
../../src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:2: The application adaptive roundIcon is missing a monochrome tag
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">                          
 3     <background android:drawable="@drawable/ic_launcher_background"/>
 4     <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
 5 </adaptive-icon>
MonochromeLauncherIcon Icons Usability Warning Priority 6/10

Image defined in density-independent drawable folder

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

Use KTX extension function

../../src/main/java/com/gramiatechnologies/gramia/MainActivity.kt:101: Use the KTX extension function SharedPreferences.edit instead?
  98   }
  99 
 100   // Save the new ID
 101   sharedPreferences.edit().putString("last_institution_user_id", institutionUserId).apply()   
 102 
 103   val inputData = workDataOf(
 104       "institution_user_id" to institutionUserId,
../../src/main/java/com/gramiatechnologies/gramia/MainActivity.kt:147: Use the KTX extension function String.toUri instead?
 144         @JavascriptInterface
 145         fun openUrlExternally(url: String) {
 146             val intent = Intent(Intent.ACTION_VIEW)
 147             intent.data = Uri.parse(url)                                                            
 148             intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
 149             this@MainActivity.startActivity(intent)
 150         }
../../src/main/java/com/gramiatechnologies/gramia/MainActivity.kt:147: Use the KTX extension function String.toUri instead?
 144         @JavascriptInterface
 145         fun openUrlExternally(url: String) {
 146             val intent = Intent(Intent.ACTION_VIEW)
 147             intent.data = Uri.parse(url)                                                            
 148             intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
 149             this@MainActivity.startActivity(intent)
 150         }
UseKtx Productivity Warning Priority 6/10

Use TOML Version Catalog Instead

../../build.gradle.kts:39: Use version catalog instead
 36 }
 37 
 38 dependencies {
 39     implementation("com.squareup.okhttp3:okhttp:4.12.0") // or latest version                       
 40     implementation("androidx.work:work-runtime-ktx:2.9.0")
 41 
 42     implementation(libs.androidx.core.ktx)
../../build.gradle.kts:40: Use version catalog instead
 37 
 38 dependencies {
 39     implementation("com.squareup.okhttp3:okhttp:4.12.0") // or latest version
 40     implementation("androidx.work:work-runtime-ktx:2.9.0")                                          
 41 
 42     implementation(libs.androidx.core.ktx)
 43     implementation(libs.androidx.appcompat)
UseTomlInstead Productivity Warning Priority 4/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 @SuppressLint annotation in the Java code
2. With a tools:ignore attribute in the XML file
3. With a //noinspection comment in the source code
4. With ignore flags specified in the build.gradle file, as explained below
5. With a lint.xml configuration file in the project
6. With a lint.xml configuration file passed to lint via the --config flag
7. With the --ignore flag passed to lint.

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

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

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

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

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

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

The format of the lint.xml file is something like the following:
<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Ignore everything in the test source set -->
    <issue id="all">
        <ignore path="\*/test/\*" />
    </issue>

    <!-- Disable this given check in this project -->
    <issue id="IconMissingDensityFolder" severity="ignore" />

    <!-- Ignore the ObsoleteLayoutParam issue in the given files -->
    <issue id="ObsoleteLayoutParam">
        <ignore path="res/layout/activation.xml" />
        <ignore path="res/layout-xlarge/activation.xml" />
        <ignore regexp="(foo|bar)\.java" />
    </issue>

    <!-- Ignore the UselessLeaf issue in the given file -->
    <issue id="UselessLeaf">
        <ignore path="res/layout/main.xml" />
    </issue>

    <!-- Change the severity of hardcoded strings to "error" -->
    <issue id="HardcodedText" severity="error" />
</lint>

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

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