Skip to content

Commit 75d7533

Browse files
authored
Merge pull request #449 from yschimke/wear_updates
Major updates for Wear
2 parents 69ea0f6 + 06abf5b commit 75d7533

22 files changed

+1033
-433
lines changed

gradle/libs.versions.toml

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ kotlin = "2.2.10"
33
ksp = "2.2.10-2.0.2"
44

55
compose-multiplatform = "1.8.2"
6-
composeUiTooling = "1.4.1"
6+
composeUiTooling = "1.5.4"
77
coroutines = "1.10.2"
88
kotlinxSerialization = "1.9.0"
99
androidGradlePlugin = "8.12.2"
@@ -12,29 +12,30 @@ koin-annotations = "2.2.0"
1212
ktor = "3.2.3"
1313
osmdroidAndroid = "6.1.20"
1414
osmAndroidCompose = "0.0.5"
15+
tiles = "1.6.0-alpha02"
16+
protolayout = "1.4.0-alpha02"
1517
slf4j = "2.0.17"
1618
sqlDelight = "2.1.0"
1719
sqlJs = "1.8.0"
1820
webPackPlugin = "9.1.0"
1921

2022

2123
androidxActivity = "1.10.1"
22-
androidxComposeBom = "2025.08.01"
23-
material3-adaptive = "1.1.0"
24-
material3-adaptive-navigation-suite = "1.3.2"
25-
androidxNavigationCompose = "2.9.3"
26-
uiToolingPreview = "1.9.0"
27-
wearCompose = "1.4.1"
28-
androidxLifecycle = "2.9.3"
29-
androidxLifecycleKMP = "2.9.3"
24+
androidxComposeBom = "2025.10.01"
25+
material3-adaptive = "1.2.0"
26+
material3-adaptive-navigation-suite = "1.4.0"
27+
androidxNavigationCompose = "2.9.5"
28+
uiToolingPreview = "1.9.4"
29+
wearCompose = "1.5.4"
30+
androidxLifecycle = "2.9.4"
31+
androidxLifecycleKMP = "2.9.5"
3032

3133
coilCompose = "2.7.0"
3234
coilCompose3 = "3.3.0"
3335

34-
horologist = "0.6.23"
35-
glanceWearTiles = "1.0.0-alpha05"
36+
horologist = "0.8.2-alpha"
3637
glanceAppWidget = "1.1.1"
37-
okhttp = "5.1.0"
38+
okhttp = "5.2.1"
3839
kermit = "2.0.8"
3940

4041
gradleVersionsPlugin = "0.52.0"
@@ -50,8 +51,14 @@ minWearSdk = "26"
5051
targetWearSdk = "33"
5152

5253
[libraries]
54+
androidx-protolayout-material3 = { module = "androidx.wear.protolayout:protolayout-material3", version.ref = "protolayout" }
55+
androidx-tiles = { module = "androidx.wear.tiles:tiles", version.ref = "tiles" }
56+
androidx-tiles-tooling = { module = "androidx.wear.tiles:tiles-tooling", version.ref = "tiles" }
57+
androidx-tiles-tooling-preview = { module = "androidx.wear.tiles:tiles-tooling-preview", version.ref = "tiles" }
5358
androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "uiToolingPreview" }
5459
androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "uiToolingPreview" }
60+
androidx-wear-compose-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wearCompose" }
61+
horologist-tiles = { module = "com.google.android.horologist:horologist-tiles", version.ref = "horologist" }
5562
wear-ui-tooling = { module = "androidx.wear.compose:compose-ui-tooling", version.ref = "composeUiTooling" }
5663
kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "coroutines" }
5764
kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
@@ -94,14 +101,12 @@ wear-compose-founndation = { module = "androidx.wear.compose:compose-foundation"
94101
wear-compose-material = { module = "androidx.wear.compose:compose-material", version.ref = "wearCompose" }
95102
wear-compose-navigation = { module = "androidx.wear.compose:compose-navigation", version.ref = "wearCompose" }
96103

97-
coilCompose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coilCompose" }
98104
coil3-compose = { group = "io.coil-kt.coil3", name = "coil-compose", version.ref = "coilCompose3" }
99105
coil3-network-ktor = { group = "io.coil-kt.coil3", name = "coil-network-ktor3", version.ref = "coilCompose3" }
100106

101107

102108
horologist-compose-layout = { module = "com.google.android.horologist:horologist-compose-layout", version.ref = "horologist" }
103109

104-
glance-tiles = { module = "androidx.glance:glance-wear-tiles", version.ref = "glanceWearTiles" }
105110
glance-appwidget = { module = "androidx.glance:glance-appwidget", version.ref = "glanceAppWidget" }
106111

107112
androidx-navigation-compose-testing = { module = "androidx.navigation:navigation-testing", version.ref = "androidxNavigationCompose" }

wearApp/build.gradle.kts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,21 @@ android {
2727
release {
2828
isMinifyEnabled = true
2929
isShrinkResources = true
30-
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
30+
proguardFiles(
31+
getDefaultProguardFile("proguard-android-optimize.txt"),
32+
"proguard-rules.pro"
33+
)
3134
// temporary hack for local testing of release builds
3235
signingConfig = signingConfigs.getByName("debug")
3336
}
3437
create("benchmark") {
3538
isMinifyEnabled = true
3639
isShrinkResources = true
3740
isDebuggable = false
38-
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "benchmark-rules.pro")
41+
proguardFiles(
42+
getDefaultProguardFile("proguard-android-optimize.txt"),
43+
"benchmark-rules.pro"
44+
)
3945
// temporary hack for local testing of release builds
4046
signingConfig = signingConfigs.getByName("debug")
4147
matchingFallbacks.addAll(listOf("release", "debug"))
@@ -55,11 +61,15 @@ dependencies {
5561
implementation(libs.wear.compose.founndation)
5662
implementation(libs.wear.compose.material)
5763
implementation(libs.wear.compose.navigation)
64+
implementation(libs.androidx.wear.compose.compose.material3)
65+
implementation(libs.androidx.protolayout.material3)
5866

5967
implementation(libs.androidx.compose.ui.tooling)
6068
implementation(libs.horologist.compose.layout)
61-
implementation(libs.glance.tiles)
62-
implementation(libs.coilCompose)
69+
implementation(libs.horologist.tiles)
70+
implementation(libs.androidx.tiles.tooling.preview)
71+
implementation(libs.androidx.tiles)
72+
implementation(libs.coil3.compose)
6373

6474
implementation(libs.koin.core)
6575
implementation(libs.koin.android)
@@ -70,6 +80,7 @@ dependencies {
7080
implementation(libs.androidx.ui.tooling)
7181
implementation(libs.wear.ui.tooling)
7282
debugImplementation(libs.androidx.ui.tooling.preview)
83+
implementation(libs.androidx.tiles.tooling)
7384

7485
implementation(libs.okhttp)
7586
implementation(libs.loggingInterceptor)

wearApp/src/androidTest/java/com/surrus/peopleinspace/wear/PeopleInSpaceTest.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
1-
@file:OptIn(ExperimentalHorologistApi::class)
2-
3-
package dev.johnoreilly.peopleinspace.wear
1+
package com.surrus.peopleinspace.wear
42

53
import androidx.compose.ui.test.assertContentDescriptionEquals
64
import androidx.compose.ui.test.assertIsDisplayed
75
import androidx.compose.ui.test.junit4.createComposeRule
86
import androidx.compose.ui.test.onNodeWithTag
97
import androidx.compose.ui.test.onNodeWithText
108
import androidx.compose.ui.test.onParent
11-
import com.google.android.horologist.annotations.ExperimentalHorologistApi
12-
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults
9+
import com.surrus.peopleinspace.list.PersonList
10+
import com.surrus.peopleinspace.list.PersonListTag
1311
import dev.johnoreilly.common.remote.Assignment
14-
import dev.johnoreilly.peopleinspace.list.PersonList
15-
import dev.johnoreilly.peopleinspace.list.PersonListTag
1612
import org.junit.Rule
1713
import org.junit.Test
1814

@@ -40,7 +36,6 @@ class PeopleInSpaceTest {
4036
people = listOf(),
4137
personSelected = {},
4238
issMapClick = {},
43-
columnState = ScalingLazyColumnDefaults.belowTimeText().create()
4439
)
4540
}
4641

@@ -54,7 +49,6 @@ class PeopleInSpaceTest {
5449
people = peopleList,
5550
personSelected = {},
5651
issMapClick = {},
57-
columnState = ScalingLazyColumnDefaults.belowTimeText().create()
5852
)
5953
}
6054

wearApp/src/main/AndroidManifest.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
<uses-permission android:name="android.permission.WAKE_LOCK" />
55
<uses-permission android:name="android.permission.INTERNET" />
6-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
6+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
77

88
<uses-feature android:name="android.hardware.type.watch" />
99

1010
<application
11-
android:name=".PeopleInSpaceApplication"
11+
android:name="com.surrus.peopleinspace.PeopleInSpaceApplication"
1212
android:allowBackup="true"
1313
android:icon="@drawable/ic_american_astronaut"
1414
android:label="@string/app_name"
@@ -23,7 +23,7 @@
2323
android:value="true" />
2424

2525
<activity
26-
android:name=".MainActivity"
26+
android:name="com.surrus.peopleinspace.MainActivity"
2727
android:exported="true"
2828
android:icon="@drawable/ic_american_astronaut"
2929
android:label="@string/app_name">
@@ -46,7 +46,7 @@
4646
</activity>
4747

4848
<service
49-
android:name=".tile.PeopleInSpaceTile"
49+
android:name="com.surrus.peopleinspace.tile.PeopleInSpaceTile"
5050
android:exported="true"
5151
android:icon="@drawable/ic_iss"
5252
android:label="@string/app_name"

wearApp/src/main/java/com/surrus/peopleinspace/MainActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package dev.johnoreilly.peopleinspace
1+
package com.surrus.peopleinspace
22

3+
import android.R
34
import android.os.Bundle
45
import androidx.activity.ComponentActivity
56
import androidx.activity.compose.setContent
6-
import androidx.compose.runtime.LaunchedEffect
77
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
88
import androidx.navigation.NavHostController
99
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
@@ -25,7 +25,7 @@ class MainActivity : ComponentActivity() {
2525

2626
super.onCreate(savedInstanceState)
2727

28-
setTheme(android.R.style.Theme_DeviceDefault)
28+
setTheme(R.style.Theme_DeviceDefault)
2929

3030
setContent {
3131
navController = rememberSwipeDismissableNavController()

wearApp/src/main/java/com/surrus/peopleinspace/PeopleInSpaceApp.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
@file:OptIn(ExperimentalHorologistApi::class)
2-
3-
package dev.johnoreilly.peopleinspace
1+
package com.surrus.peopleinspace
42

53
import androidx.compose.foundation.layout.fillMaxSize
64
import androidx.compose.runtime.Composable
75
import androidx.compose.ui.Modifier
8-
import androidx.navigation.NavDeepLink
96
import androidx.navigation.NavHostController
107
import androidx.navigation.NavType
118
import androidx.navigation.navArgument
129
import androidx.navigation.navDeepLink
10+
import androidx.wear.compose.material3.AppScaffold
1311
import androidx.wear.compose.navigation.SwipeDismissableNavHost
1412
import androidx.wear.compose.navigation.composable
15-
import com.google.android.horologist.annotations.ExperimentalHorologistApi
16-
import com.google.android.horologist.compose.layout.AppScaffold
17-
import dev.johnoreilly.peopleinspace.list.PersonListScreen
18-
import dev.johnoreilly.peopleinspace.map.IssMapScreen
19-
import dev.johnoreilly.peopleinspace.person.PersonDetailsScreen
13+
import com.surrus.peopleinspace.list.PersonListScreen
14+
import com.surrus.peopleinspace.map.IssMapScreen
15+
import com.surrus.peopleinspace.person.PersonDetailsScreen
2016

2117
@Composable
2218
fun PeopleInSpaceApp(navController: NavHostController) {
@@ -41,7 +37,7 @@ fun PeopleInSpaceApp(navController: NavHostController) {
4137
}
4238

4339
composable(
44-
route = Screen.PersonDetails.route + "/{$PERSON_NAME_NAV_ARGUMENT}",
40+
route = Screen.PersonDetails.route + "/{${PERSON_NAME_NAV_ARGUMENT}}",
4541
arguments = listOf(
4642
navArgument(PERSON_NAME_NAV_ARGUMENT, builder = {
4743
type = NavType.StringType

wearApp/src/main/java/com/surrus/peopleinspace/PeopleInSpaceApplication.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
package dev.johnoreilly.peopleinspace
1+
package com.surrus.peopleinspace
22

33
import android.app.Application
44
import co.touchlab.kermit.Logger
5-
import coil.ImageLoader
6-
import coil.ImageLoaderFactory
5+
import coil3.ImageLoader
6+
import coil3.PlatformContext
7+
import coil3.SingletonImageLoader
8+
import com.surrus.peopleinspace.di.wearAppModule
9+
import com.surrus.peopleinspace.di.wearImageLoader
710
import dev.johnoreilly.common.di.initKoin
8-
import dev.johnoreilly.peopleinspace.di.wearAppModule
9-
import dev.johnoreilly.peopleinspace.di.wearImageLoader
11+
import dev.johnoreilly.peopleinspace.BuildConfig
1012
import org.koin.android.ext.koin.androidContext
1113
import org.koin.android.ext.koin.androidLogger
1214
import org.koin.core.component.KoinComponent
1315
import org.koin.core.component.get
1416
import org.koin.core.logger.Level
1517

16-
class PeopleInSpaceApplication : Application(), KoinComponent, ImageLoaderFactory {
18+
class PeopleInSpaceApplication : Application(), KoinComponent, SingletonImageLoader.Factory {
1719

1820
override fun onCreate() {
1921
super.onCreate()
@@ -30,6 +32,6 @@ class PeopleInSpaceApplication : Application(), KoinComponent, ImageLoaderFactor
3032
Logger.d { "PeopleInSpaceApplication" }
3133
}
3234

33-
override fun newImageLoader(): ImageLoader = get()
35+
override fun newImageLoader(context: PlatformContext): ImageLoader = get()
3436
}
3537

wearApp/src/main/java/com/surrus/peopleinspace/di/AppModule.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
package dev.johnoreilly.peopleinspace.di
1+
package com.surrus.peopleinspace.di
22

3-
import android.util.Log
4-
import coil.ImageLoader
5-
import coil.util.DebugLogger
3+
import coil3.ImageLoader
4+
import coil3.request.crossfade
5+
import coil3.util.DebugLogger
6+
import coil3.util.Logger
7+
import com.surrus.peopleinspace.list.PersonListViewModel
8+
import com.surrus.peopleinspace.map.MapViewModel
9+
import com.surrus.peopleinspace.person.PersonDetailsViewModel
610
import dev.johnoreilly.peopleinspace.BuildConfig
7-
import dev.johnoreilly.peopleinspace.list.PersonListViewModel
8-
import dev.johnoreilly.peopleinspace.map.MapViewModel
9-
import dev.johnoreilly.peopleinspace.person.PersonDetailsViewModel
1011
import org.koin.android.ext.koin.androidContext
1112
import org.koin.core.module.dsl.viewModel
1213
import org.koin.dsl.module
@@ -26,10 +27,9 @@ val wearImageLoader = module {
2627
single {
2728
ImageLoader.Builder(androidContext())
2829
.crossfade(true)
29-
.respectCacheHeaders(false)
3030
.apply {
3131
if (BuildConfig.DEBUG) {
32-
logger(DebugLogger(Log.VERBOSE))
32+
logger(DebugLogger(Logger.Level.Info))
3333
}
3434
}
3535
.build()

0 commit comments

Comments
 (0)