diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1fed3139..ead961f0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,11 +24,11 @@ jobs: - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: 17 + java-version: 21 - name: Setup Gradle uses: gradle/gradle-build-action@v2 @@ -46,14 +46,14 @@ jobs: run: ./gradlew testDebug - name: Upload build outputs (APKs) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-outputs path: app/build/outputs - name: Upload build reports if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-reports path: app/build/reports @@ -64,7 +64,8 @@ jobs: timeout-minutes: 55 strategy: matrix: - api-level: [34] + api-level: [35] + target: [google_apis] steps: - name: Delete unnecessary tools 🔧 @@ -91,28 +92,50 @@ jobs: - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: 17 + java-version: 21 - name: Setup Gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v4 + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ matrix.api-level }} + + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + force-avd-creation: false + arch: x86_64 + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: echo "Generated AVD snapshot for caching." - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none arch: x86_64 disable-animations: true - disk-size: 6000M - heap-size: 600M + disk-size: 8192M + heap-size: 1024M script: ./gradlew connectedDebugAndroidTest --daemon - name: Upload test reports if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-reports-${{ matrix.api-level }} path: '*/build/reports/androidTests' diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 8d81632f..c22b6fa9 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 39f68564..d4b3e5a2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import com.android.build.api.dsl.Packaging + /* * Copyright 2022 The Android Open Source Project * @@ -17,6 +19,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) + alias(libs.plugins.compose.compiler) alias(libs.plugins.ksp) alias(libs.plugins.hilt) id("com.example.platform.convention") @@ -24,7 +27,7 @@ plugins { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) } } @@ -50,14 +53,14 @@ android { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + "proguard-rules.pro", ) } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } buildFeatures { @@ -66,7 +69,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get() } - packagingOptions { + + packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index f921d475..febb42bb 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -23,7 +23,7 @@ group = "com.example.platform.plugin.buildlogic" java { toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) } } diff --git a/build-logic/src/main/kotlin/com.example.platform.plugin/CommonConventionPlugin.kt b/build-logic/src/main/kotlin/com.example.platform.plugin/CommonConventionPlugin.kt index ccdd8331..82ca62d9 100644 --- a/build-logic/src/main/kotlin/com.example.platform.plugin/CommonConventionPlugin.kt +++ b/build-logic/src/main/kotlin/com.example.platform.plugin/CommonConventionPlugin.kt @@ -46,7 +46,7 @@ class CommonConventionPlugin : Plugin { pluginManager.withPlugin("java") { extensions.configure { toolchain { - it.languageVersion.set(JavaLanguageVersion.of(17)) + it.languageVersion.set(JavaLanguageVersion.of(21)) } } } @@ -55,8 +55,8 @@ class CommonConventionPlugin : Plugin { extensions.configure { // Treat all Kotlin warnings as errors allWarningsAsErrors = true - // Set JVM target to 17 - jvmTarget = "17" + // Set JVM target to 21 + jvmTarget = "21" // Allow use of @OptIn freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" // Enable default methods in interfaces diff --git a/build-logic/src/main/kotlin/com.example.platform.plugin/SamplePlugin.kt b/build-logic/src/main/kotlin/com.example.platform.plugin/SamplePlugin.kt index c4c1cc1a..b069eb2d 100644 --- a/build-logic/src/main/kotlin/com.example.platform.plugin/SamplePlugin.kt +++ b/build-logic/src/main/kotlin/com.example.platform.plugin/SamplePlugin.kt @@ -41,6 +41,7 @@ class SamplePlugin : Plugin { with(pluginManager) { apply("com.android.library") apply("org.jetbrains.kotlin.android") + apply("org.jetbrains.kotlin.plugin.compose") apply("com.google.devtools.ksp") apply("dagger.hilt.android.plugin") apply("kotlin-parcelize") @@ -50,7 +51,7 @@ class SamplePlugin : Plugin { pluginManager.withPlugin("java") { extensions.configure { toolchain { - it.languageVersion.set(JavaLanguageVersion.of(17)) + it.languageVersion.set(JavaLanguageVersion.of(21)) } } } @@ -58,7 +59,7 @@ class SamplePlugin : Plugin { // TODO: remove when KSP starts respecting the Java/Kotlin toolchain tasks.withType(KotlinCompile::class.java).configureEach { it.kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } } @@ -73,8 +74,8 @@ class SamplePlugin : Plugin { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } buildFeatures { diff --git a/build.gradle.kts b/build.gradle.kts index 4411e036..8853f197 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,7 @@ plugins { alias(libs.plugins.hilt) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.affectedmoduledetector) alias(libs.plugins.versionCatalogUpdate) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f62c3af7..0bce8ed2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,60 +14,64 @@ # limitations under the License. # [versions] -accompanist = "0.32.0" -androidx-datastore = "1.0.0" -androidx-navigation = "2.7.7" -androidx-window = "1.2.0" -agp = "8.5.2" +accompanist = "0.37.0" +androidx-datastore = "1.1.2" +androidx-navigation = "2.8.7" +androidx-window = "1.3.0" +agp = "8.8.1" casa = "0.5.1" -coil = "2.4.0" -gradleDownloadTask = "4.1.2" -ksp = "1.9.22-1.0.17" -compose-bom = "2024.02.00" +coil = "2.7.0" +coreTelecom = "1.0.0-beta01" +gradleDownloadTask = "5.6.0" +ksp = "2.1.10-1.0.30" +compose-bom = "2025.02.00" composeCompiler = "1.5.9" -hilt = "2.48.1" -kotlin = "1.9.22" -kotlin-serialization = "1.6.0" +hilt = "2.55" +kotlin = "2.1.10" +kotlin-serialization = "1.8.0" ktlint = "0.48.1" -coroutines = "1.7.3" -play-services-location = "21.1.0" +coroutines = "1.10.1" +play-services-location = "21.3.0" junit4 = "4.13.2" -androidxEspresso = "3.5.1" -androidxTestCore = "1.5.0" -androidxTestExtJunit = "1.1.5" -androidxTestExtTruth = "1.5.0" -androidxTestRules = "1.5.0" -androidxTestRunner = "1.5.2" -androidxUiAutomator = "2.2.0" -media3 = "1.5.0" -appcompat = "1.6.1" -material = "1.12.0-beta01" -constraintlayout = "2.1.4" +androidxEspresso = "3.6.1" +androidxTestCore = "1.6.1" +androidxTestExtJunit = "1.2.1" +androidxTestExtTruth = "1.6.0" +androidxTestRules = "1.6.1" +androidxTestRunner = "1.6.2" +androidxUiAutomator = "2.3.0" +media3 = "1.5.1" +appcompat = "1.7.0" +material = "1.12.0" +constraintlayout = "2.2.0" glide-compose = "1.0.0-beta01" -glance = "1.1.0-SNAPSHOT" -tensorflowLite = "2.9.0" +glance = "1.1.1" +tensorflowLite = "2.17.0" +tensorflowLiteTFops = "2.16.1" tensorflowLiteGpuDelegatePlugin = "0.4.4" -tensorflowLiteSupport = "0.4.2" +tensorflowLiteSupport = "0.5.0" +litertGpuApi = "1.1.2" [libraries] # Core dependencies android-gradlePlugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -androidx-activity = "androidx.activity:activity:1.8.2" -androidx-core = "androidx.core:core-ktx:1.12.0" -androidx-appcompat = "androidx.appcompat:appcompat:1.6.1" +androidx-activity = "androidx.activity:activity:1.10.0" +androidx-core = "androidx.core:core-ktx:1.15.0" +androidx-appcompat = "androidx.appcompat:appcompat:1.7.0" +androidx-core-telecom = { module = "androidx.core:core-telecom", version.ref = "coreTelecom" } androidx-exifinterface = "androidx.exifinterface:exifinterface:1.3.7" # Fragment 1.7.0 alpha and Transition 1.5.0 alpha are required for predictive back to work with Fragments and transitions -androidx-fragment = "androidx.fragment:fragment-ktx:1.7.0-alpha10" -androidx-transition = "androidx.transition:transition-ktx:1.5.0-alpha06" -androidx-activity-compose = "androidx.activity:activity-compose:1.8.2" +androidx-fragment = "androidx.fragment:fragment-ktx:1.8.6" +androidx-transition = "androidx.transition:transition-ktx:1.5.1" +androidx-activity-compose = "androidx.activity:activity-compose:1.10.0" androidx-navigation-fragment = { module = "androidx.navigation:navigation-fragment", version.ref = "androidx-navigation" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation" } androidx-navigation-testing = { module = "androidx.navigation:navigation-testing", version.ref = "androidx-navigation" } androidx-navigation-ui = { module = "androidx.navigation:navigation-ui", version.ref = "androidx-navigation" } -androidx-lifecycle-viewmodel-compose = "androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0" -androidx-viewpager2 = "androidx.viewpager2:viewpager2:1.0.0" +androidx-lifecycle-viewmodel-compose = "androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7" +androidx-viewpager2 = "androidx.viewpager2:viewpager2:1.1.0" accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } @@ -121,27 +125,27 @@ androidx-test-uiautomator = { group = "androidx.test.uiautomator", name = "uiaut junit4 = { group = "junit", name = "junit", version.ref = "junit4" } # Sample specific dependencies -lottie = "com.airbnb.android:lottie:6.0.0" +lottie = "com.airbnb.android:lottie:6.6.2" rxjava2-android = 'io.reactivex.rxjava2:rxandroid:2.1.1' play-services-location = { module = "com.google.android.gms:play-services-location", version.ref = "play-services-location" } -androidx-work-runtime-ktx = "androidx.work:work-runtime-ktx:2.9.0" -androidx-core-remoteviews = "androidx.core:core-remoteviews:1.0.0" +androidx-work-runtime-ktx = "androidx.work:work-runtime-ktx:2.10.0" +androidx-core-remoteviews = "androidx.core:core-remoteviews:1.1.0" androidx-glance-appwidget = {group = "androidx.glance", name = "glance-appwidget", version.ref = "glance"} androidx-glance-preview = {group = "androidx.glance", name = "glance-preview", version.ref = "glance"} androidx-glance-appwidget-preview = {group = "androidx.glance", name = "glance-appwidget-preview", version.ref = "glance"} androidx-glance-material3 = {group = "androidx.glance", name = "glance-material3", version.ref = "glance"} -androidx-graphics-core = { group = "androidx.graphics", name = "graphics-core", version = "1.0.0-beta01" } -androidx-startup = 'androidx.startup:startup-runtime:1.1.1' +androidx-graphics-core = { group = "androidx.graphics", name = "graphics-core", version = "1.0.2" } +androidx-startup = 'androidx.startup:startup-runtime:1.2.0' androidx-window = { module = "androidx.window:window", version.ref = "androidx-window" } androidx-window-java = { module = "androidx.window:window-java", version.ref = "androidx-window" } androidx-window-rxjava2 = { module = "androidx.window:window-rxjava2", version.ref = "androidx-window" } androidx-window-core = { module = "androidx.window:window-core", version.ref = "androidx-window" } androidx-media = "androidx.media:media:1.7.0" -androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.1.4" +androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.0" androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "androidx-datastore" } androidx-draganddrop = "androidx.draganddrop:draganddrop:1.0.0" androidx-dynamicanimation = "androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03" @@ -151,9 +155,9 @@ androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", versi androidx-media3-transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" } androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" } -fresco = "com.facebook.fresco:fresco:3.0.0" +fresco = "com.facebook.fresco:fresco:3.6.0" fresco-nativeimagetranscoder = "com.facebook.fresco:nativeimagetranscoder:2.6.0!!" -glide = "com.github.bumptech.glide:glide:4.15.1" +glide = "com.github.bumptech.glide:glide:4.16.0" glide-compose = { group = "com.github.bumptech.glide", name = "compose", version.ref = "glide-compose" } @@ -163,18 +167,20 @@ constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayo tensorflow-lite = { module = "org.tensorflow:tensorflow-lite", version.ref = "tensorflowLite" } tensorflow-lite-gpu = { module = "org.tensorflow:tensorflow-lite-gpu", version.ref = "tensorflowLite" } tensorflow-lite-gpu-delegate-plugin = { module = "org.tensorflow:tensorflow-lite-gpu-delegate-plugin", version.ref = "tensorflowLiteGpuDelegatePlugin" } -tensorflow-lite-select-tf-ops = { module = "org.tensorflow:tensorflow-lite-select-tf-ops", version.ref = "tensorflowLite" } +tensorflow-lite-select-tf-ops = { module = "org.tensorflow:tensorflow-lite-select-tf-ops", version.ref = "tensorflowLiteTFops" } tensorflow-lite-support = { module = "org.tensorflow:tensorflow-lite-support", version.ref = "tensorflowLiteSupport" } +litert-gpu-api = { group = "com.google.ai.edge.litert", name = "litert-gpu-api", version.ref = "litertGpuApi" } [plugins] -affectedmoduledetector = { id = "com.dropbox.affectedmoduledetector", version = "0.2.0" } -versionCatalogUpdate = { id = "nl.littlerobots.version-catalog-update", version = "0.7.0" } -benManesVersions = { id = "com.github.ben-manes.versions", version = "0.44.0" } +affectedmoduledetector = { id = "com.dropbox.affectedmoduledetector", version = "0.3.1" } +versionCatalogUpdate = { id = "nl.littlerobots.version-catalog-update", version = "0.8.5" } +benManesVersions = { id = "com.github.ben-manes.versions", version = "0.52.0" } android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } android-test = { id = "com.android.test", version.ref = "agp" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6c2244bb..2f888b59 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -17,6 +17,6 @@ #Wed Dec 07 13:21:03 CET 2022 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/samples/connectivity/bluetooth/ble/src/main/AndroidManifest.xml b/samples/connectivity/bluetooth/ble/src/main/AndroidManifest.xml index 9b3a9e63..3d5221bf 100644 --- a/samples/connectivity/bluetooth/ble/src/main/AndroidManifest.xml +++ b/samples/connectivity/bluetooth/ble/src/main/AndroidManifest.xml @@ -14,7 +14,8 @@ ~ limitations under the License. --> - + + android:exported="false" + tools:targetApi="o" /> diff --git a/samples/connectivity/bluetooth/companion/src/main/AndroidManifest.xml b/samples/connectivity/bluetooth/companion/src/main/AndroidManifest.xml index 3cde873e..e5880ea8 100644 --- a/samples/connectivity/bluetooth/companion/src/main/AndroidManifest.xml +++ b/samples/connectivity/bluetooth/companion/src/main/AndroidManifest.xml @@ -14,7 +14,8 @@ ~ limitations under the License. --> - + @@ -33,7 +34,8 @@ + android:permission="android.permission.BIND_COMPANION_DEVICE_SERVICE" + tools:targetApi="s"> diff --git a/samples/connectivity/telecom/build.gradle.kts b/samples/connectivity/telecom/build.gradle.kts index 7529febe..579c3c06 100644 --- a/samples/connectivity/telecom/build.gradle.kts +++ b/samples/connectivity/telecom/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("com.example.platform.sample") alias(libs.plugins.kotlin.android) + alias(libs.plugins.compose.compiler) } android { @@ -26,7 +27,7 @@ android { } dependencies { - implementation("androidx.core:core-telecom:1.0.0-alpha02") + implementation(libs.androidx.core.telecom) implementation(project(mapOf("path" to ":samples:connectivity:audio"))) androidTestImplementation(platform(libs.compose.bom)) diff --git a/samples/connectivity/telecom/src/main/AndroidManifest.xml b/samples/connectivity/telecom/src/main/AndroidManifest.xml index bc7d46df..8b308fe4 100644 --- a/samples/connectivity/telecom/src/main/AndroidManifest.xml +++ b/samples/connectivity/telecom/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + @@ -9,7 +10,8 @@ + android:exported="false" + tools:targetApi="o" /> + android:turnScreenOn="true" + tools:targetApi="o" /> + android:exported="false" + tools:targetApi="o" /> diff --git a/samples/graphics/ultrahdr/src/main/res/layout/compress_ultrahdr.xml b/samples/graphics/ultrahdr/src/main/res/layout/compress_ultrahdr.xml index 8a0270bc..7ebf3c24 100644 --- a/samples/graphics/ultrahdr/src/main/res/layout/compress_ultrahdr.xml +++ b/samples/graphics/ultrahdr/src/main/res/layout/compress_ultrahdr.xml @@ -22,7 +22,8 @@ + android:layout_height="wrap_content" + tools:targetApi="upside_down_cake" /> @@ -21,7 +22,8 @@ + android:layout_height="wrap_content" + tools:targetApi="upside_down_cake" /> + android:layout_height="wrap_content" + tools:targetApi="upside_down_cake" /> + android:layout_height="wrap_content" + tools:targetApi="upside_down_cake" />