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" />