From 88f9b10ad03b1485ff4df16aecd6ebcb4c000bba Mon Sep 17 00:00:00 2001 From: Michael Stillwell Date: Mon, 15 Sep 2025 13:23:21 +0100 Subject: [PATCH 1/3] Partial update --- finished/build.gradle | 14 ++++----- gradle/libs.versions.toml | 37 ++++++++++++------------ gradle/wrapper/gradle-wrapper.properties | 3 +- start/build.gradle | 13 ++++----- 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/finished/build.gradle b/finished/build.gradle index f85734e..7ee766b 100644 --- a/finished/build.gradle +++ b/finished/build.gradle @@ -15,11 +15,12 @@ */ plugins { id 'com.android.application' - id 'kotlin-android' + id 'org.jetbrains.kotlin.android' + alias(libs.plugins.org.jetbrains.kotlin.plugin.compose) } android { - compileSdk 34 + compileSdk 36 namespace "com.android.example.wear.ongoingactivity" @@ -45,13 +46,10 @@ android { } kotlinOptions { jvmTarget = JavaVersion.VERSION_17.majorVersion + freeCompilerArgs += ["-P", "plugin:androidx.compose.compiler.plugins.kotlin:sourceInformation=false"] } - buildFeatures { - compose true - } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() - } + + packagingOptions { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1e6f729..00087aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,20 @@ [versions] -android-gradle-plugin = "8.1.2" -accompanist-permissions = "0.30.1" -androidx-activity = "1.8.0" -androidx-wear-compose = "1.2.1" -compose = "1.5.4" -compose-compiler = "1.5.3" -core-ktx = "1.12.0" -datastore-preferences = "1.0.0" -gradle = "8.1.2" -kotlin-gradle-plugin = "1.9.10" -kotlinx-coroutines-android = "1.7.3" -kotlinx-coroutines-core = "1.7.1" +android-gradle-plugin = "8.12.3" +accompanist-permissions = "0.37.3" +androidx-activity = "1.11.0" +androidx-wear-compose = "1.5.1" +compose = "1.9.1" +core-ktx = "1.17.0" +datastore-preferences = "1.1.7" +gradle = "8.12.3" +kotlin-gradle-plugin = "2.1.0" +kotlinx-coroutines-android = "1.10.2" +kotlinx-coroutines-core = "1.10.2" ktlint = "0.50.0" -lifecycle = "2.6.2" -org-jetbrains-kotlin = "1.9.10" +lifecycle = "2.9.3" +org-jetbrains-kotlin = "2.1.0" wear = "1.3.0" -wear-ongoing = "1.0.0" +wear-ongoing = "1.1.0" [libraries] accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist-permissions" } @@ -32,7 +31,8 @@ androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle- androidx-wear = { module = "androidx.wear:wear", version.ref = "wear" } androidx-wear-ongoing = { module = "androidx.wear:wear-ongoing", version.ref = "wear-ongoing" } -compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose-compiler" } + + compose-material-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } compose-material = { module = "androidx.compose.material:material", version.ref = "compose" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } @@ -46,5 +46,6 @@ wear-compose-material = { module = "androidx.wear.compose:compose-material", ver [plugins] com-android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" } -com-diffplug-spotless = "com.diffplug.spotless:6.22.0" -org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin" } \ No newline at end of file +com-diffplug-spotless = "com.diffplug.spotless:7.2.1" +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin" } +org-jetbrains-kotlin-plugin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "org-jetbrains-kotlin" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fce403e..1951541 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Mon Sep 15 13:07:51 BST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/start/build.gradle b/start/build.gradle index 9e9c18f..361b29b 100644 --- a/start/build.gradle +++ b/start/build.gradle @@ -15,11 +15,12 @@ */ plugins { id 'com.android.application' - id 'kotlin-android' + id 'org.jetbrains.kotlin.android' + alias(libs.plugins.org.jetbrains.kotlin.plugin.compose) } android { - compileSdk 34 + compileSdk 36 namespace "com.android.example.wear.ongoingactivity" @@ -46,12 +47,8 @@ android { kotlinOptions { jvmTarget = JavaVersion.VERSION_17.majorVersion } - buildFeatures { - compose true - } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() - } + + packagingOptions { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" From 6fde0fd71c15d9a2fa56d3275da17caa9a63fb90 Mon Sep 17 00:00:00 2001 From: Michael Stillwell Date: Mon, 15 Sep 2025 13:52:27 +0100 Subject: [PATCH 2/3] More udpates --- build.gradle | 1 + finished/build.gradle | 9 ++++----- .../data/PermissionStateDataStore.kt | 19 +++++++++++++++++-- .../data/WalkingWorkoutsDataStore.kt | 2 +- .../presentation/OngoingActivityExampleApp.kt | 6 +++--- .../presentation/PermissionRequiredScreen.kt | 2 +- gradle/libs.versions.toml | 2 +- start/build.gradle | 9 ++++----- .../data/PermissionStateDataStore.kt | 19 +++++++++++++++++-- .../data/WalkingWorkoutsDataStore.kt | 2 +- .../presentation/OngoingActivityExampleApp.kt | 6 +++--- .../presentation/PermissionRequiredScreen.kt | 2 +- 12 files changed, 54 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index e26dba4..ba5e4f1 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ buildscript { plugins { alias(libs.plugins.com.diffplug.spotless) apply(false) alias(libs.plugins.com.android.application) apply(false) + alias(libs.plugins.org.jetbrains.kotlin.plugin.compose) apply(false) } subprojects { diff --git a/finished/build.gradle b/finished/build.gradle index 7ee766b..4c6fa69 100644 --- a/finished/build.gradle +++ b/finished/build.gradle @@ -44,12 +44,11 @@ android { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.majorVersion - freeCompilerArgs += ["-P", "plugin:androidx.compose.compiler.plugins.kotlin:sourceInformation=false"] + + kotlin { + jvmToolchain(17) } - - + packagingOptions { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" diff --git a/finished/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt b/finished/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt index 9c4a907..573b0b2 100644 --- a/finished/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt +++ b/finished/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.android.example.wear.ongoingactivity.data import android.content.Context @@ -43,5 +58,5 @@ class PermissionStateDataStore(private val context: Context) { enum class ShownRationaleStatus { HAS_SHOWN, HAS_NOT_SHOWN, - UNKNOWN -} \ No newline at end of file + UNKNOWN, +} diff --git a/finished/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt b/finished/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt index ffd5ec2..95d5fd3 100644 --- a/finished/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt +++ b/finished/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt @@ -62,4 +62,4 @@ class WalkingWorkoutsDataStore(private val context: Context) { private val ACTIVE_WALKING_WORKOUT_KEY = booleanPreferencesKey("active_walking_workout") } -} \ No newline at end of file +} diff --git a/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt b/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt index d8044e0..654ea89 100644 --- a/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt +++ b/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt @@ -52,7 +52,7 @@ fun OngoingActivityExampleApp( // Below T, POST_NOTIFICATIONS does not need to be requested at runtime but must still be // specified in the Manifest. Therefore, permissionState is created such that it is already // in the granted state. - object: PermissionState { + object : PermissionState { override val permission = "no_runtime_permission_required" override val status = PermissionStatus.Granted override fun launchPermissionRequest() { } @@ -97,14 +97,14 @@ fun OngoingActivityExampleApp( // now, as opposed to the false seen from shouldShowRationale on first ever launch PermissionRequiredScreen( onPermissionClick = { permissionState.launchPermissionRequest() }, - buttonLabelResId = R.string.show_permissions + buttonLabelResId = R.string.show_permissions, ) } else if (hasPreviouslyShown == ShownRationaleStatus.HAS_SHOWN) { // Rationale has been shown previously, but the user has decided not to grant permission // Offer the user the option to go to permission settings. PermissionRequiredScreen( onPermissionClick = { launchPermissionsSettings(context) }, - buttonLabelResId = R.string.show_settings + buttonLabelResId = R.string.show_settings, ) } else if (hasPreviouslyShown == ShownRationaleStatus.HAS_NOT_SHOWN) { // First launch of permissions, show the permission request without any rationale. diff --git a/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt b/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt index 5ce527e..a3628ab 100644 --- a/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt +++ b/finished/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt @@ -34,7 +34,7 @@ import com.android.example.wear.ongoingactivity.R @Composable fun PermissionRequiredScreen( onPermissionClick: () -> Unit, - @StringRes buttonLabelResId: Int + @StringRes buttonLabelResId: Int, ) { Box( modifier = Modifier.fillMaxSize(), diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 00087aa..20c89ed 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ kotlinx-coroutines-android = "1.10.2" kotlinx-coroutines-core = "1.10.2" ktlint = "0.50.0" lifecycle = "2.9.3" -org-jetbrains-kotlin = "2.1.0" +org-jetbrains-kotlin = "2.2.20" wear = "1.3.0" wear-ongoing = "1.1.0" diff --git a/start/build.gradle b/start/build.gradle index 361b29b..a13fbf0 100644 --- a/start/build.gradle +++ b/start/build.gradle @@ -27,7 +27,7 @@ android { defaultConfig { applicationId "com.android.example.wear.ongoingactivity" minSdk 30 - targetSdk 34 + targetSdk 36 versionCode 1 versionName "1.0" @@ -44,11 +44,10 @@ android { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.majorVersion + kotlin { + jvmToolchain(17) } - - + packagingOptions { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" diff --git a/start/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt b/start/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt index 9c4a907..573b0b2 100644 --- a/start/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt +++ b/start/src/main/java/com/android/example/wear/ongoingactivity/data/PermissionStateDataStore.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.android.example.wear.ongoingactivity.data import android.content.Context @@ -43,5 +58,5 @@ class PermissionStateDataStore(private val context: Context) { enum class ShownRationaleStatus { HAS_SHOWN, HAS_NOT_SHOWN, - UNKNOWN -} \ No newline at end of file + UNKNOWN, +} diff --git a/start/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt b/start/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt index ffd5ec2..95d5fd3 100644 --- a/start/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt +++ b/start/src/main/java/com/android/example/wear/ongoingactivity/data/WalkingWorkoutsDataStore.kt @@ -62,4 +62,4 @@ class WalkingWorkoutsDataStore(private val context: Context) { private val ACTIVE_WALKING_WORKOUT_KEY = booleanPreferencesKey("active_walking_workout") } -} \ No newline at end of file +} diff --git a/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt b/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt index d8044e0..654ea89 100644 --- a/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt +++ b/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/OngoingActivityExampleApp.kt @@ -52,7 +52,7 @@ fun OngoingActivityExampleApp( // Below T, POST_NOTIFICATIONS does not need to be requested at runtime but must still be // specified in the Manifest. Therefore, permissionState is created such that it is already // in the granted state. - object: PermissionState { + object : PermissionState { override val permission = "no_runtime_permission_required" override val status = PermissionStatus.Granted override fun launchPermissionRequest() { } @@ -97,14 +97,14 @@ fun OngoingActivityExampleApp( // now, as opposed to the false seen from shouldShowRationale on first ever launch PermissionRequiredScreen( onPermissionClick = { permissionState.launchPermissionRequest() }, - buttonLabelResId = R.string.show_permissions + buttonLabelResId = R.string.show_permissions, ) } else if (hasPreviouslyShown == ShownRationaleStatus.HAS_SHOWN) { // Rationale has been shown previously, but the user has decided not to grant permission // Offer the user the option to go to permission settings. PermissionRequiredScreen( onPermissionClick = { launchPermissionsSettings(context) }, - buttonLabelResId = R.string.show_settings + buttonLabelResId = R.string.show_settings, ) } else if (hasPreviouslyShown == ShownRationaleStatus.HAS_NOT_SHOWN) { // First launch of permissions, show the permission request without any rationale. diff --git a/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt b/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt index 5ce527e..a3628ab 100644 --- a/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt +++ b/start/src/main/java/com/android/example/wear/ongoingactivity/presentation/PermissionRequiredScreen.kt @@ -34,7 +34,7 @@ import com.android.example.wear.ongoingactivity.R @Composable fun PermissionRequiredScreen( onPermissionClick: () -> Unit, - @StringRes buttonLabelResId: Int + @StringRes buttonLabelResId: Int, ) { Box( modifier = Modifier.fillMaxSize(), From 1af24b94fd8db4cb533b6e87ccb4872b1fe33307 Mon Sep 17 00:00:00 2001 From: Michael Stillwell Date: Mon, 15 Sep 2025 14:00:10 +0100 Subject: [PATCH 3/3] Updates --- finished/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/finished/build.gradle b/finished/build.gradle index 4c6fa69..7f1541e 100644 --- a/finished/build.gradle +++ b/finished/build.gradle @@ -27,7 +27,7 @@ android { defaultConfig { applicationId "com.android.example.wear.ongoingactivity" minSdk 30 - targetSdk 34 + targetSdk 36 versionCode 1 versionName "1.0"