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 f85734e..7f1541e 100644 --- a/finished/build.gradle +++ b/finished/build.gradle @@ -15,18 +15,19 @@ */ 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" defaultConfig { applicationId "com.android.example.wear.ongoingactivity" minSdk 30 - targetSdk 34 + targetSdk 36 versionCode 1 versionName "1.0" @@ -43,15 +44,11 @@ android { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.majorVersion - } - buildFeatures { - compose true - } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() + + 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 1e6f729..20c89ed 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.2.20" 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..a13fbf0 100644 --- a/start/build.gradle +++ b/start/build.gradle @@ -15,18 +15,19 @@ */ 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" defaultConfig { applicationId "com.android.example.wear.ongoingactivity" minSdk 30 - targetSdk 34 + targetSdk 36 versionCode 1 versionName "1.0" @@ -43,15 +44,10 @@ android { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.majorVersion - } - buildFeatures { - compose true - } - composeOptions { - kotlinCompilerExtensionVersion libs.versions.compose.compiler.get() + 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(),