From 25bbb34e2b06f65d388b583351c99175ea53cfa5 Mon Sep 17 00:00:00 2001 From: Shankhanil Saha Date: Wed, 5 Aug 2026 21:05:29 +0530 Subject: [PATCH 1/4] refactor: Change minSDKVersion to 23. --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/AppAndroidManifest.xml | 2 +- app/src/main/DatabindingAdaptersManifest.xml | 2 +- app/src/main/DatabindingResourcesManifest.xml | 2 +- app/src/main/RecyclerviewAdaptersManifest.xml | 2 +- app/src/main/ViewModelManifest.xml | 2 +- app/src/main/ViewModelsManifest.xml | 2 +- app/src/main/ViewsManifest.xml | 2 +- .../app/thirdparty/AndroidManifest.xml | 2 +- app/src/test/AndroidManifest.xml | 2 +- build_flavors.bzl | 8 +++---- .../oppia/android/config/AndroidManifest.xml | 2 +- data/src/main/AndroidManifest.xml | 2 +- data/src/test/AndroidManifest.xml | 2 +- domain/domain_assets.bzl | 2 +- domain/src/main/AndroidManifest.xml | 2 +- domain/src/test/AndroidManifest.xml | 2 +- .../src/javatests/AndroidManifest.xml | 2 +- .../scripts/lint/LintAnalysisReporter.kt | 2 +- .../android/scripts/lint/LintModelCreator.kt | 2 +- .../scripts/lint/AndroidLintRunnerTest.kt | 23 ++++++++++--------- .../scripts/lint/LintAnalysisReporterTest.kt | 4 ++-- .../scripts/lint/LintModelCreatorTest.kt | 2 +- testing/src/main/AndroidManifest.xml | 2 +- testing/src/test/AndroidManifest.xml | 2 +- tools/download_assets.bzl | 2 +- utility/src/main/AndroidManifest.xml | 2 +- utility/src/test/AndroidManifest.xml | 2 +- 28 files changed, 43 insertions(+), 42 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7691a6416a9..9762ee317d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ - diff --git a/app/src/main/AppAndroidManifest.xml b/app/src/main/AppAndroidManifest.xml index 7b96cea3793..f85b55911e0 100644 --- a/app/src/main/AppAndroidManifest.xml +++ b/app/src/main/AppAndroidManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/DatabindingAdaptersManifest.xml b/app/src/main/DatabindingAdaptersManifest.xml index fac77236c71..76fe0633b0d 100644 --- a/app/src/main/DatabindingAdaptersManifest.xml +++ b/app/src/main/DatabindingAdaptersManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/DatabindingResourcesManifest.xml b/app/src/main/DatabindingResourcesManifest.xml index ab0bc42bc41..c5592aa1327 100644 --- a/app/src/main/DatabindingResourcesManifest.xml +++ b/app/src/main/DatabindingResourcesManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/RecyclerviewAdaptersManifest.xml b/app/src/main/RecyclerviewAdaptersManifest.xml index 5a6cdc2a2a4..88e45011c77 100644 --- a/app/src/main/RecyclerviewAdaptersManifest.xml +++ b/app/src/main/RecyclerviewAdaptersManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/ViewModelManifest.xml b/app/src/main/ViewModelManifest.xml index b5416abbbae..06f045675f3 100644 --- a/app/src/main/ViewModelManifest.xml +++ b/app/src/main/ViewModelManifest.xml @@ -2,6 +2,6 @@ - diff --git a/app/src/main/ViewModelsManifest.xml b/app/src/main/ViewModelsManifest.xml index 55189735a49..62fa06226ab 100644 --- a/app/src/main/ViewModelsManifest.xml +++ b/app/src/main/ViewModelsManifest.xml @@ -2,6 +2,6 @@ - diff --git a/app/src/main/ViewsManifest.xml b/app/src/main/ViewsManifest.xml index b5b1aa96921..2620aa747e4 100644 --- a/app/src/main/ViewsManifest.xml +++ b/app/src/main/ViewsManifest.xml @@ -2,6 +2,6 @@ - diff --git a/app/src/main/java/org/oppia/android/app/thirdparty/AndroidManifest.xml b/app/src/main/java/org/oppia/android/app/thirdparty/AndroidManifest.xml index 36487c7c805..af8f26b660f 100644 --- a/app/src/main/java/org/oppia/android/app/thirdparty/AndroidManifest.xml +++ b/app/src/main/java/org/oppia/android/app/thirdparty/AndroidManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/test/AndroidManifest.xml b/app/src/test/AndroidManifest.xml index a93c6cf73ce..3940ef4ede7 100644 --- a/app/src/test/AndroidManifest.xml +++ b/app/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/build_flavors.bzl b/build_flavors.bzl index 81875295476..7786c7a4f0e 100644 --- a/build_flavors.bzl +++ b/build_flavors.bzl @@ -36,7 +36,7 @@ _PRODUCTION_PROGUARD_SPECS = [ _FLAVOR_METADATA = { "dev": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 36, "multidex": "native", "proguard_specs": [], # Developer builds are not optimized. @@ -50,7 +50,7 @@ _FLAVOR_METADATA = { }, "alpha": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 36, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, @@ -65,7 +65,7 @@ _FLAVOR_METADATA = { }, "beta": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 36, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, @@ -80,7 +80,7 @@ _FLAVOR_METADATA = { }, "ga": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 36, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, diff --git a/config/src/java/org/oppia/android/config/AndroidManifest.xml b/config/src/java/org/oppia/android/config/AndroidManifest.xml index d5ccaf2f5de..4c8b928fa88 100644 --- a/config/src/java/org/oppia/android/config/AndroidManifest.xml +++ b/config/src/java/org/oppia/android/config/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml index 9bf811aadaf..78e034b6e81 100644 --- a/data/src/main/AndroidManifest.xml +++ b/data/src/main/AndroidManifest.xml @@ -2,5 +2,5 @@ - + diff --git a/data/src/test/AndroidManifest.xml b/data/src/test/AndroidManifest.xml index 15cf7c8ef8c..56da687204a 100644 --- a/data/src/test/AndroidManifest.xml +++ b/data/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/domain/domain_assets.bzl b/domain/domain_assets.bzl index 518b60c69b6..6733356f796 100644 --- a/domain/domain_assets.bzl +++ b/domain/domain_assets.bzl @@ -139,7 +139,7 @@ def local_assets_library( '', '' % name, - ' ' % BUILD_SDK_VERSION, + ' ' % BUILD_SDK_VERSION, "", ], ) diff --git a/domain/src/main/AndroidManifest.xml b/domain/src/main/AndroidManifest.xml index f30b84798b5..537bed0d648 100644 --- a/domain/src/main/AndroidManifest.xml +++ b/domain/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/domain/src/test/AndroidManifest.xml b/domain/src/test/AndroidManifest.xml index d59a08681ec..7b310e4e62d 100644 --- a/domain/src/test/AndroidManifest.xml +++ b/domain/src/test/AndroidManifest.xml @@ -2,7 +2,7 @@ - diff --git a/instrumentation/src/javatests/AndroidManifest.xml b/instrumentation/src/javatests/AndroidManifest.xml index 602f7c5095f..9f915c22f1a 100644 --- a/instrumentation/src/javatests/AndroidManifest.xml +++ b/instrumentation/src/javatests/AndroidManifest.xml @@ -2,7 +2,7 @@ = 23) { - val network2 = cm.activeNetwork // OK + val localeList = LocaleList.getDefault() + if (Build.VERSION.SDK_INT >= 24) { + val localeList2 = LocaleList.getDefault() // OK } } """.trimIndent() diff --git a/scripts/src/javatests/org/oppia/android/scripts/lint/LintAnalysisReporterTest.kt b/scripts/src/javatests/org/oppia/android/scripts/lint/LintAnalysisReporterTest.kt index 0f4b7a37095..a5d92723021 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/lint/LintAnalysisReporterTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/lint/LintAnalysisReporterTest.kt @@ -809,7 +809,7 @@ class LintAnalysisReporterTest { LintIssue( id = "NewApi", severity = LintSeverity.ERROR, - message = "Call requires API level 24 (current min is 21): `java.lang.Iterable#forEach`", + message = "Call requires API level 24 (current min is 23): `java.lang.Iterable#forEach`", category = "Correctness", explanation = "This check scans through all the Android API " + "calls in the application and warns about any calls that are not available", @@ -839,7 +839,7 @@ class LintAnalysisReporterTest { ) assertThat(output).contains( "Message: Call requires API level 24 " + - "(current min is 21): `java.lang.Iterable#forEach`" + "(current min is 23): `java.lang.Iterable#forEach`" ) assertThat(output).contains( "Workaround:\n" diff --git a/scripts/src/javatests/org/oppia/android/scripts/lint/LintModelCreatorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/lint/LintModelCreatorTest.kt index 8ec4ce2c335..f8a921b067c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/lint/LintModelCreatorTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/lint/LintModelCreatorTest.kt @@ -69,7 +69,7 @@ class LintModelCreatorTest { val content = variantXmlFile.readText() assertThat(content).contains(" - diff --git a/testing/src/test/AndroidManifest.xml b/testing/src/test/AndroidManifest.xml index dde3c1d1403..cb4386bd883 100644 --- a/testing/src/test/AndroidManifest.xml +++ b/testing/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/tools/download_assets.bzl b/tools/download_assets.bzl index e90c1886e20..8891250b91a 100644 --- a/tools/download_assets.bzl +++ b/tools/download_assets.bzl @@ -179,7 +179,7 @@ def downloaded_assets_library(name, download_config, pinned_versions, output_log '', '' % name, - ' ' % BUILD_SDK_VERSION, + ' ' % BUILD_SDK_VERSION, "", ], tags = tags, diff --git a/utility/src/main/AndroidManifest.xml b/utility/src/main/AndroidManifest.xml index 0fe889b0a55..137c4e23e3a 100644 --- a/utility/src/main/AndroidManifest.xml +++ b/utility/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - diff --git a/utility/src/test/AndroidManifest.xml b/utility/src/test/AndroidManifest.xml index 0bb96852855..4e9bfb920dd 100644 --- a/utility/src/test/AndroidManifest.xml +++ b/utility/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - From 453f3a43cd6fc8d4efe04dddb0c261b3ce0a245b Mon Sep 17 00:00:00 2001 From: Shankhanil Saha Date: Fri, 28 Aug 2026 16:45:07 +0530 Subject: [PATCH 2/4] fix: Remove obsolete tools:targetApi="23" --- app/src/main/res/layout/feedback_item.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/feedback_item.xml b/app/src/main/res/layout/feedback_item.xml index 83858696e0f..f87b4d316b0 100644 --- a/app/src/main/res/layout/feedback_item.xml +++ b/app/src/main/res/layout/feedback_item.xml @@ -1,6 +1,5 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -62,7 +61,6 @@ app:explorationViewPaddingBottom="@{@dimen/feedback_item_exploration_view_padding_bottom}" app:explorationViewPaddingEnd="@{@dimen/feedback_item_exploration_view_padding_end}" app:explorationViewPaddingStart="@{@dimen/feedback_item_exploration_view_padding_start}" - app:explorationViewPaddingTop="@{@dimen/feedback_item_exploration_view_padding_top}" - tools:targetApi="23"/> + app:explorationViewPaddingTop="@{@dimen/feedback_item_exploration_view_padding_top}" /> From c47b24ff32e4c497fc053e75a2605e410be56d59 Mon Sep 17 00:00:00 2001 From: Shankhanil Saha Date: Sun, 30 Aug 2026 16:53:12 +0530 Subject: [PATCH 3/4] fix: coverage failure in AndroidLintRunnerTest --- .../scripts/lint/AndroidLintRunnerTest.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt b/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt index 3ae051f9d4a..efe02839845 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt @@ -1492,4 +1492,54 @@ class AndroidLintRunnerTest { return jarFile } + + @Test + fun testMain_noArguments_throwsSecurityException() { + val exception = assertThrows { + main() + } + assertThat(exception).hasMessageThat().contains("System.exit()") + } + + @Test + fun testMain_nonExistentRepoRoot_throwsSecurityException() { + val exception = assertThrows { + main("non_existent_directory_12345") + } + assertThat(exception).hasMessageThat().contains("System.exit()") + } + + @Test + fun testMain_invalidProtoExtension_throwsSecurityException() { + val exception = assertThrows { + main(tempFolder.root.absolutePath, "--proto=invalid.txt") + } + assertThat(exception).hasMessageThat().contains("System.exit()") + } + + @Test + fun testMain_validArgs_checkScriptConsistencyMode_throwsSecurityExceptionOnExitZero() { + val exception = assertThrows { + main( + tempFolder.root.absolutePath, + "--mode=check-script-consistency", + "--processTimeout=10", + "--proto=$pathToProtoBinary", + "--checks=HardcodedText", + "--group_by_severity", + "--timer" + ) + } + assertThat(exception).hasMessageThat().contains("System.exit()") + val output = outputStream.toString() + assertThat(output).contains("CHECK PASSED: LintCheckCatalog") + } + + @Test + fun testMain_invalidModeString_printsStacktraceAndExitsWithSecurityException() { + val exception = assertThrows { + main(tempFolder.root.absolutePath, "--mode=invalid-mode") + } + assertThat(exception).hasMessageThat().contains("System.exit()") + } } From 27234bdece16e7b782a2b3f001de6ed00c9e23af Mon Sep 17 00:00:00 2001 From: Shankhanil Saha Date: Mon, 31 Aug 2026 10:58:12 +0530 Subject: [PATCH 4/4] ref: Remove obsolete target SDK specification --- app/src/main/res/layout/content_item.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/content_item.xml b/app/src/main/res/layout/content_item.xml index 1a892e5c868..d84045e6eca 100644 --- a/app/src/main/res/layout/content_item.xml +++ b/app/src/main/res/layout/content_item.xml @@ -1,6 +1,5 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -63,7 +62,6 @@ app:explorationViewPaddingBottom="@{@dimen/content_item_exploration_view_padding_bottom}" app:explorationViewPaddingEnd="@{@dimen/content_item_exploration_view_padding_end}" app:explorationViewPaddingStart="@{@dimen/content_item_exploration_view_padding_start}" - app:explorationViewPaddingTop="@{@dimen/content_item_exploration_view_padding_top}" - tools:targetApi="23"/> + app:explorationViewPaddingTop="@{@dimen/content_item_exploration_view_padding_top}" />