diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c7a7443..75ef2314 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,11 +31,11 @@ jobs: with: submodules: true - - name: Set up Java 17 - uses: actions/setup-java@v2 + - name: Set up Java 21 + uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '17' + distribution: 'temurin' + java-version: '21' - name: Test Bash Keystores scripts run: make test-bash-keystore @@ -85,11 +85,11 @@ jobs: with: submodules: true - - name: Set up Java 17 - uses: actions/setup-java@v2 + - name: Set up Java 21 + uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '17' + distribution: 'temurin' + java-version: '21' - name: Enable KVM run: | diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 602a5882..b8755ee5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,11 +22,11 @@ jobs: - name: Set release version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: Set up Java 17 - uses: actions/setup-java@v2 + - name: Set up Java 21 + uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '17' + distribution: 'temurin' + java-version: '21' - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/build.gradle b/build.gradle index 524f786b..ec8e0c0d 100644 --- a/build.gradle +++ b/build.gradle @@ -99,9 +99,14 @@ def getVersionCode = { def getVersionName = { System.env.RELEASE_VERSION ?: 'SNAPSHOT' } - +java { + // Pins the JDK used to compile + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} android { - compileSdk 35 + compileSdk 36 packagingOptions { resources { excludes += ['META-INF/LICENSE', 'META-INF/NOTICE'] @@ -114,7 +119,7 @@ android { defaultConfig { //noinspection OldTargetApi - targetSdkVersion 35 + targetSdkVersion 36 minSdkVersion 21 // Android 5.0 versionCode getVersionCode() versionName getVersionName() @@ -496,9 +501,9 @@ dependencies { compileOnly 'com.github.spotbugs:spotbugs-annotations:4.9.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' + testImplementation 'org.mockito:mockito-core:5.23.0' testImplementation 'com.google.android:android-test:4.1.1.4' - testImplementation 'org.robolectric:robolectric:4.15.1' + testImplementation 'org.robolectric:robolectric:4.16.1' testImplementation 'androidx.test.espresso:espresso-core:3.7.0' testImplementation 'androidx.test.espresso:espresso-intents:3.7.0' testImplementation 'androidx.test.ext:junit:1.3.0' diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 20c4e672..336facce 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -33,6 +33,7 @@ android:fullBackupContent="@xml/backup_rules_sdk_30_and_lower" android:dataExtractionRules="@xml/backup_rules" android:largeHeap="true" + android:enableOnBackInvokedCallback="false" tools:ignore="LockedOrientationActivity,UnusedAttribute"> diff --git a/src/test/java/org/medicmobile/webapp/mobile/SmsSenderTest.java b/src/test/java/org/medicmobile/webapp/mobile/SmsSenderTest.java index 1c3f5cea..01af6ece 100644 --- a/src/test/java/org/medicmobile/webapp/mobile/SmsSenderTest.java +++ b/src/test/java/org/medicmobile/webapp/mobile/SmsSenderTest.java @@ -21,6 +21,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.telephony.SmsManager; import androidx.core.content.ContextCompat; @@ -39,6 +40,7 @@ import org.mockito.quality.Strictness; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.Arrays; @@ -76,6 +78,21 @@ public void setup() { smsSender = SmsSender.createInstance(parentMock); } + /** + * Robolectric no longer emulates SDK < 23, so tests covering the pre-M code + * path (still reachable with minSdkVersion 21) have to force SDK_INT instead + * of using {@code @Config(sdk = 22)}. + */ + private void withSdkInt(int sdkInt, Runnable body) { + int originalSdkInt = Build.VERSION.SDK_INT; + ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", sdkInt); + try { + body.run(); + } finally { + ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", originalSdkInt); + } + } + @Test public void createInstance() { assertEquals(SmsSender.class, smsSender.getClass()); @@ -88,9 +105,8 @@ public void createInstance_RSmsSender() { } @Test - @Config(sdk = 22) public void createInstance_LSmsSender() { - assertEquals(SmsSender.LSmsSender.class, smsSender.getClass()); + withSdkInt(22, () -> assertEquals(SmsSender.LSmsSender.class, SmsSender.createInstance(parentMock).getClass())); } @Test @@ -165,7 +181,6 @@ public void send_withPermissions_sendsMultipartTextMessage_RSmsSender() { } @Test - @Config(sdk = 22) public void send_withPermissions_sendsMultipartTextMessage_LSmsSender() { try ( MockedStatic contextCompatMock = mockStatic(ContextCompat.class); @@ -173,6 +188,7 @@ public void send_withPermissions_sendsMultipartTextMessage_LSmsSender() { MockedStatic pendingIntentMock = mockStatic(PendingIntent.class) ) { //> GIVEN + withSdkInt(22, () -> smsSender = SmsSender.createInstance(parentMock)); contextCompatMock.when(() -> ContextCompat.checkSelfPermission(eq(parentMock), eq(SEND_SMS))).thenReturn(PERMISSION_GRANTED); int expectedBroadcastFlags = FLAG_ONE_SHOT; mockGetBroadcast(pendingIntentMock, expectedBroadcastFlags);