From 361f4f7a7dd3b6f42e1e00654958bab34677a6f2 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Mon, 13 Oct 2025 22:46:25 -0400 Subject: [PATCH 01/40] did i forget this? --- .../simplewear/wearable/WearableManager.kt | 25 ++++++++----------- .../tiles/MediaPlayerTileMessenger.kt | 9 +++---- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/mobile/src/main/java/com/thewizrd/simplewear/wearable/WearableManager.kt b/mobile/src/main/java/com/thewizrd/simplewear/wearable/WearableManager.kt index cb4bd802..cb40c8fe 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/wearable/WearableManager.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/wearable/WearableManager.kt @@ -9,7 +9,6 @@ import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager -import android.content.pm.ResolveInfo import android.graphics.Bitmap import android.os.Build import android.os.Bundle @@ -267,29 +266,32 @@ class WearableManager(private val mContext: Context) : OnCapabilityChangedListen } suspend fun sendSupportedMusicPlayers(nodeID: String) { - val mediaBrowserInfos = mContext.packageManager.queryIntentServices( + val appInfos = mutableListOf() + + mContext.packageManager.queryIntentServices( Intent(MediaBrowserServiceCompat.SERVICE_INTERFACE), PackageManager.GET_RESOLVED_FILTER - ) + ).mapTo(appInfos) { it.serviceInfo.applicationInfo } val activeSessions = MediaAppControllerUtils.getActiveMediaSessions( mContext, NotificationListener.getComponentName(mContext) ) - val activeMediaInfos = MediaAppControllerUtils.getMediaAppsFromControllers( + MediaAppControllerUtils.getMediaAppsFromControllers( mContext, activeSessions - ) + ).run { appInfos.addAll(this) } + val activeController = activeSessions.firstOrNull { it.playbackState?.isPlaybackStateActive() == true } // Sort result Collections.sort( - mediaBrowserInfos, - ResolveInfo.DisplayNameComparator(mContext.packageManager) + appInfos, + ApplicationInfo.DisplayNameComparator(mContext.packageManager) ) - val supportedPlayers = ArrayList(mediaBrowserInfos.size) + val supportedPlayers = ArrayList(appInfos.size) val musicPlayers = mutableSetOf() var activePlayerKey: String? = null @@ -333,12 +335,7 @@ class WearableManager(private val mContext: Context) : OnCapabilityChangedListen } } - for (info in mediaBrowserInfos) { - val appInfo = info.serviceInfo.applicationInfo - addPlayerInfo(appInfo) - } - - for (info in activeMediaInfos) { + for (info in appInfos) { addPlayerInfo(info) } diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileMessenger.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileMessenger.kt index 9166b445..7a5e0663 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileMessenger.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileMessenger.kt @@ -5,7 +5,6 @@ import android.util.Log import com.google.android.gms.common.api.ApiException import com.google.android.gms.wearable.CapabilityClient import com.google.android.gms.wearable.CapabilityInfo -import com.google.android.gms.wearable.DataClient import com.google.android.gms.wearable.MessageClient import com.google.android.gms.wearable.MessageEvent import com.google.android.gms.wearable.Node @@ -240,7 +239,7 @@ class MediaPlayerTileMessenger( .addListener( listener, WearableHelper.getWearDataUri("*", MediaHelper.MediaPlayerStatePath), - DataClient.FILTER_LITERAL + MessageClient.FILTER_LITERAL ) .await() @@ -265,7 +264,7 @@ class MediaPlayerTileMessenger( .addListener( listener, WearableHelper.getWearDataUri("*", MediaHelper.MediaPlayerArtPath), - DataClient.FILTER_LITERAL + MessageClient.FILTER_LITERAL ) .await() @@ -332,7 +331,7 @@ class MediaPlayerTileMessenger( "*", MediaHelper.MediaVolumeStatusPath ), - DataClient.FILTER_LITERAL + MessageClient.FILTER_LITERAL ) } @@ -343,7 +342,7 @@ class MediaPlayerTileMessenger( "*", MediaHelper.MediaPlayerStatePath ), - DataClient.FILTER_LITERAL + MessageClient.FILTER_LITERAL ) } } From 42ddb8ff2312e2ba51df458e6d1c09a62ad9bf25 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Mon, 13 Oct 2025 22:46:53 -0400 Subject: [PATCH 02/40] gradle: update dependencies --- build.gradle | 48 ++++++++++++------------ gradle/wrapper/gradle-wrapper.properties | 2 +- mobile/build.gradle | 6 +-- wear/build.gradle | 10 ++--- wearsettings/build.gradle | 4 +- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 6a141a3d..6b6e0e85 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - compileSdkVersion = 35 + compileSdkVersion = 36 minSdkVersion = 24 targetSdkVersion = 34 @@ -11,39 +11,39 @@ buildscript { desugar_version = '2.1.5' - firebase_version = '33.13.0' + firebase_version = '34.4.0' - activity_version = '1.10.1' - appcompat_version = '1.7.0' + activity_version = '1.11.0' + appcompat_version = '1.7.1' constraintlayout_version = '2.2.1' - core_version = '1.16.0' - fragment_version = '1.8.6' - lifecycle_version = '2.9.0' + core_version = '1.17.0' + fragment_version = '1.8.9' + lifecycle_version = '2.9.4' preference_version = '1.2.1' recyclerview_version = '1.4.0' coresplash_version = '1.0.1' - work_version = '2.10.1' - navigation_version = '2.9.0' + work_version = '2.10.5' + navigation_version = '2.9.5' datastore_version = '1.1.7' - test_core_version = '1.6.1' - test_runner_version = '1.6.2' - test_rules_version = '1.6.1' - junit_version = '1.2.1' - androidx_truth_version = '1.6.0' - google_truth_version = '1.4.4' + test_core_version = '1.7.0' + test_runner_version = '1.7.0' + test_rules_version = '1.7.0' + junit_version = '1.3.0' + androidx_truth_version = '1.7.0' + google_truth_version = '1.4.5' - material_version = '1.12.0' + material_version = '1.14.0-alpha05' - compose_bom_version = '2025.05.00' + compose_bom_version = '2025.10.00' compose_compiler_version = '1.5.15' - wear_compose_version = '1.4.1' - wear_tiles_version = '1.4.1' + wear_compose_version = '1.5.3' + wear_tiles_version = '1.5.0' wear_watchface_version = '1.2.1' - horologist_version = '0.6.23' + horologist_version = '0.7.15' accompanist_version = '0.37.3' - gson_version = '2.13.1' + gson_version = '2.13.2' timber_version = '5.0.1' // Shizuku @@ -57,9 +57,9 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:8.10.0' - classpath 'com.google.gms:google-services:4.4.2' - classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.3' + classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.google.gms:google-services:4.4.4' + classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.6' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:compose-compiler-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cfd35bc0..2558dbe0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip diff --git a/mobile/build.gradle b/mobile/build.gradle index fd7b6b96..40914c1f 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -101,12 +101,12 @@ dependencies { implementation "androidx.appcompat:appcompat:$appcompat_version" implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" - implementation "androidx.recyclerview:recyclerview-selection:1.1.0" - implementation 'androidx.media:media:1.7.0' + implementation "androidx.recyclerview:recyclerview-selection:1.2.0" + implementation 'androidx.media:media:1.7.1' implementation "com.google.android.material:material:$material_version" implementation "com.jakewharton.timber:timber:$timber_version" implementation "com.google.code.gson:gson:$gson_version" - implementation 'com.linkedin.dexmaker:dexmaker:2.28.4' + implementation 'com.linkedin.dexmaker:dexmaker:2.28.6' } \ No newline at end of file diff --git a/wear/build.gradle b/wear/build.gradle index d679732c..880eb2f5 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -24,13 +24,13 @@ android { applicationIdSuffix ".debug" debuggable true minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } release { minifyEnabled true shrinkResources true crunchPngs true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -93,7 +93,7 @@ dependencies { compileOnly 'com.google.android.wearable:wearable:2.9.0' // Needed for Ambient Mode implementation 'androidx.wear:wear:1.3.0' - implementation 'androidx.wear:wear-ongoing:1.0.0' + implementation 'androidx.wear:wear-ongoing:1.1.0' implementation 'androidx.wear:wear-phone-interactions:1.1.0' implementation 'androidx.wear:wear-remote-interactions:1.1.0' implementation "androidx.wear.watchface:watchface-complications-data:$wear_watchface_version" @@ -105,7 +105,7 @@ dependencies { testImplementation "androidx.wear.tiles:tiles-testing:$wear_tiles_version" debugImplementation "androidx.wear.tiles:tiles-tooling:$wear_tiles_version" implementation "androidx.wear.tiles:tiles-tooling-preview:$wear_tiles_version" - implementation 'androidx.wear.protolayout:protolayout-material:1.2.1' + implementation 'androidx.wear.protolayout:protolayout-material3:1.3.0' implementation "com.google.android.horologist:horologist-tiles:$horologist_version" // WearOS Compose @@ -120,7 +120,7 @@ dependencies { implementation "androidx.compose.material:material-icons-core" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" implementation "androidx.wear.compose:compose-foundation:$wear_compose_version" - implementation "androidx.wear.compose:compose-material:$wear_compose_version" + implementation "androidx.wear.compose:compose-material3:$wear_compose_version" implementation "androidx.wear.compose:compose-navigation:$wear_compose_version" implementation "androidx.wear:wear-tooling-preview:1.0.0" diff --git a/wearsettings/build.gradle b/wearsettings/build.gradle index b2213084..209f604a 100644 --- a/wearsettings/build.gradle +++ b/wearsettings/build.gradle @@ -24,13 +24,13 @@ android { applicationIdSuffix ".debug" debuggable true minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } release { minifyEnabled true shrinkResources true crunchPngs true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } From 7fc28fbd2c0ca392090d30ace7e31f3356ebb21a Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sat, 18 Oct 2025 22:59:08 -0400 Subject: [PATCH 03/40] SimpleWear: initial Material3Expressive migration --- build.gradle | 1 + .../media/MediaControllerService.kt | 17 +- .../shared_resources/media/MediaItem.kt | 3 + .../shared_resources/media/QueueItems.kt | 3 + wear/build.gradle | 8 +- .../simplewear/media/AudioOutputRepository.kt | 2 +- .../simplewear/media/MediaItemModel.kt | 3 + .../simplewear/media/MediaPlayerViewModel.kt | 1 + .../ui/components/ConfirmationOverlay.kt | 198 +++- .../ui/components/HorizontalPagerScreen.kt | 49 + .../ui/components/LoadingContent.kt | 2 +- .../simplewear/ui/components/PullRefresh.kt | 26 - .../ui/components/ScalingLazyColumn.kt | 47 - .../components/SwipeToDismissPagerScreen.kt | 236 ---- .../ui/simplewear/AppLauncherScreen.kt | 351 +++--- .../simplewear/ui/simplewear/CallManagerUi.kt | 73 +- .../simplewear/ui/simplewear/Dashboard.kt | 166 ++- .../ui/simplewear/DashboardScreen.kt | 257 +++-- .../simplewear/ui/simplewear/GesturesUi.kt | 196 ++-- .../simplewear/ui/simplewear/MediaPlayer.kt | 172 ++- .../ui/simplewear/MediaPlayerListUi.kt | 310 +++-- .../simplewear/ui/simplewear/MediaPlayerUi.kt | 1004 +++++++++++------ .../simplewear/ui/simplewear/PhoneSyncUi.kt | 143 ++- .../simplewear/ui/simplewear/SimpleWearApp.kt | 243 ++-- .../ui/simplewear/TimedActionSetupUi.kt | 439 +++---- .../simplewear/ui/simplewear/TimedActionUi.kt | 508 ++++----- .../ui/simplewear/ValueActionScreen.kt | 110 +- .../com/thewizrd/simplewear/ui/theme/Color.kt | 43 +- .../com/thewizrd/simplewear/ui/theme/Theme.kt | 6 +- .../simplewear/ui/theme/Typography.kt | 14 +- .../simplewear/ui/tools/WearPreviewDevices.kt | 7 + .../viewmodels/AppLauncherViewModel.kt | 23 +- .../viewmodels/ConfirmationViewModel.kt | 34 +- .../viewmodels/DashboardViewModel.kt | 3 +- .../viewmodels/WearableListenerViewModel.kt | 3 +- .../tiles/DashboardTileProviderService.kt | 32 +- .../tiles/MediaPlayerTileProviderService.kt | 32 +- .../simplewear/wearable/tiles/TilePreviews.kt | 328 +++--- ...rotoLayoutVersionUtils.kt => TileUtils.kt} | 25 + .../res/drawable/rounded_equalizer_24.xml | 12 + 40 files changed, 2695 insertions(+), 2435 deletions(-) create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/HorizontalPagerScreen.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/PullRefresh.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/ScalingLazyColumn.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/SwipeToDismissPagerScreen.kt rename wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/{ProtoLayoutVersionUtils.kt => TileUtils.kt} (57%) create mode 100644 wear/src/main/res/drawable/rounded_equalizer_24.xml diff --git a/build.gradle b/build.gradle index 6b6e0e85..fbd634c4 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,7 @@ buildscript { google_truth_version = '1.4.5' material_version = '1.14.0-alpha05' + material_compose_version = '1.5.0-alpha06' compose_bom_version = '2025.10.00' compose_compiler_version = '1.5.15' diff --git a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt index 080918ee..e20cdb96 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt @@ -34,6 +34,7 @@ import android.util.Log import android.util.TypedValue import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat +import androidx.core.app.ServiceCompat import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.scale @@ -311,7 +312,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene disconnectMedia(invalidateData = true) - stopForeground(true) + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) scope.cancel() super.onDestroy() } @@ -1198,7 +1199,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene if (!isActive) return@launch - if (mNodes.size == 0 || mItems.isNullOrEmpty()) { + if (mNodes.isEmpty() || mItems.isNullOrEmpty()) { // Remove all items (datamap) sendDataByChannel(itemNodePath, null, BrowseMediaItems::class.java) return@launch @@ -1206,10 +1207,13 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene // Send media items to datamap val mediaItems = mItems?.map { + val size = dpToPx(48f).toInt() + MediaItem( mediaId = it.mediaId ?: "", title = it.description.title.toString(), - icon = it.description.iconBitmap?.toByteArray() + subTitle = it.description.subtitle?.toString(), + icon = it.description.iconBitmap?.scale(size, size)?.toByteArray() ) } @@ -1274,7 +1278,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene } protected open fun unsubscribe() { - if (mNodes.size > 0) { + if (mNodes.isNotEmpty()) { mBrowser!!.unsubscribe(mNodes.peek(), callback) } updateItems(null) @@ -1318,10 +1322,13 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene // Send action items to datamap val queueItems = mQueueItems.map { + val size = dpToPx(48f).toInt() + QueueItem( queueId = it.queueId, title = it.description.title.toString(), - icon = it.description.iconBitmap?.toByteArray() + subTitle = it.description.subtitle?.toString(), + icon = it.description.iconBitmap?.scale(size, size)?.toByteArray() ) } diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/media/MediaItem.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/media/MediaItem.kt index 18e577d6..f51ba937 100644 --- a/shared_resources/src/main/java/com/thewizrd/shared_resources/media/MediaItem.kt +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/media/MediaItem.kt @@ -3,6 +3,7 @@ package com.thewizrd.shared_resources.media data class MediaItem( val mediaId: String, val title: String, + val subTitle: String? = null, val icon: ByteArray? = null ) { override fun equals(other: Any?): Boolean { @@ -11,6 +12,7 @@ data class MediaItem( if (mediaId != other.mediaId) return false if (title != other.title) return false + if (subTitle != other.subTitle) return false if (icon != null) { if (other.icon == null) return false if (!icon.contentEquals(other.icon)) return false @@ -22,6 +24,7 @@ data class MediaItem( override fun hashCode(): Int { var result = mediaId.hashCode() result = 31 * result + title.hashCode() + result = 31 * result + subTitle.hashCode() result = 31 * result + (icon?.contentHashCode() ?: 0) return result } diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/media/QueueItems.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/media/QueueItems.kt index d9f1fc8c..1eb5dd70 100644 --- a/shared_resources/src/main/java/com/thewizrd/shared_resources/media/QueueItems.kt +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/media/QueueItems.kt @@ -8,6 +8,7 @@ data class QueueItems( data class QueueItem( val queueId: Long, val title: String, + val subTitle: String? = null, val icon: ByteArray? = null ) { override fun equals(other: Any?): Boolean { @@ -16,6 +17,7 @@ data class QueueItem( if (queueId != other.queueId) return false if (title != other.title) return false + if (subTitle != other.subTitle) return false if (icon != null) { if (other.icon == null) return false if (!icon.contentEquals(other.icon)) return false @@ -27,6 +29,7 @@ data class QueueItem( override fun hashCode(): Int { var result = queueId.hashCode() result = 31 * result + title.hashCode() + result = 31 * result + subTitle.hashCode() result = 31 * result + (icon?.contentHashCode() ?: 0) return result } diff --git a/wear/build.gradle b/wear/build.gradle index 880eb2f5..09cb9781 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -116,20 +116,20 @@ dependencies { implementation "androidx.compose.ui:ui-tooling-preview" implementation "androidx.compose.animation:animation-graphics" implementation "androidx.compose.runtime:runtime-livedata" - implementation "androidx.compose.material:material" implementation "androidx.compose.material:material-icons-core" + implementation "androidx.compose.material3:material3:$material_compose_version" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" implementation "androidx.wear.compose:compose-foundation:$wear_compose_version" implementation "androidx.wear.compose:compose-material3:$wear_compose_version" implementation "androidx.wear.compose:compose-navigation:$wear_compose_version" + implementation "androidx.wear.compose:compose-ui-tooling:$wear_compose_version" implementation "androidx.wear:wear-tooling-preview:1.0.0" implementation "com.google.accompanist:accompanist-drawablepainter:$accompanist_version" - implementation "com.google.android.horologist:horologist-audio-ui:$horologist_version" + implementation "com.google.android.horologist:horologist-audio-ui-material3:$horologist_version" implementation "com.google.android.horologist:horologist-compose-layout:$horologist_version" - implementation "com.google.android.horologist:horologist-compose-material:$horologist_version" implementation "com.google.android.horologist:horologist-compose-tools:$horologist_version" - implementation "com.google.android.horologist:horologist-media-ui:$horologist_version" + implementation "com.google.android.horologist:horologist-media-ui-material3:$horologist_version" androidTestImplementation platform("androidx.compose:compose-bom:$compose_bom_version") androidTestImplementation "androidx.compose.ui:ui-test-junit4" diff --git a/wear/src/main/java/com/thewizrd/simplewear/media/AudioOutputRepository.kt b/wear/src/main/java/com/thewizrd/simplewear/media/AudioOutputRepository.kt index 3d00d40d..e3177e86 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/media/AudioOutputRepository.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/media/AudioOutputRepository.kt @@ -14,5 +14,5 @@ class NoopAudioOutputRepository : AudioOutputRepository { override fun close() {} - override fun launchOutputSelection(closeOnConnect: Boolean) {} + override fun launchOutputSelection(closeOnConnect: Boolean, clientPackageName: String?) {} } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/media/MediaItemModel.kt b/wear/src/main/java/com/thewizrd/simplewear/media/MediaItemModel.kt index 95e4907b..509e9a21 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/media/MediaItemModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/media/MediaItemModel.kt @@ -5,6 +5,7 @@ import android.graphics.Bitmap data class MediaItemModel(val id: String) { var icon: Bitmap? = null var title: String? = null + var subTitle: String? = null override fun equals(other: Any?): Boolean { if (this === other) return true @@ -15,6 +16,7 @@ data class MediaItemModel(val id: String) { if (id != other.id) return false if (icon != other.icon) return false if (title != other.title) return false + if (subTitle != other.subTitle) return false return true } @@ -23,6 +25,7 @@ data class MediaItemModel(val id: String) { var result = id.hashCode() result = 31 * result + (icon?.hashCode() ?: 0) result = 31 * result + (title?.hashCode() ?: 0) + result = 31 * result + (subTitle?.hashCode() ?: 0) return result } } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt index b2f39118..9bd72078 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt @@ -646,6 +646,7 @@ class MediaPlayerViewModel(app: Application) : WearableListenerViewModel(app) { MediaItemModel(item.queueId.toString()).apply { this.icon = item.icon?.toBitmap() this.title = item.title + this.subTitle = item.subTitle } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/ConfirmationOverlay.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/ConfirmationOverlay.kt index b4a4d007..7a526f83 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/components/ConfirmationOverlay.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/components/ConfirmationOverlay.kt @@ -1,102 +1,176 @@ package com.thewizrd.simplewear.ui.components -import androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalAccessibilityManager import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.dialog.Dialog -import androidx.wear.compose.material.dialog.DialogDefaults -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.rememberColumnState -import com.google.android.horologist.compose.material.ConfirmationContent +import androidx.compose.ui.res.stringResource +import androidx.wear.compose.material3.ConfirmationDialog +import androidx.wear.compose.material3.ConfirmationDialogDefaults +import androidx.wear.compose.material3.FailureConfirmationDialog +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.SuccessConfirmationDialog +import androidx.wear.compose.material3.Text +import com.thewizrd.simplewear.R import com.thewizrd.simplewear.viewmodels.ConfirmationData -import kotlinx.coroutines.delay +import com.thewizrd.simplewear.viewmodels.ConfirmationType -@OptIn(ExperimentalHorologistApi::class, ExperimentalAnimationGraphicsApi::class) @Composable fun ConfirmationOverlay( confirmationData: ConfirmationData?, onTimeout: () -> Unit, showDialog: Boolean = confirmationData != null ) { - val currentOnDismissed by rememberUpdatedState(onTimeout) - val durationMillis = remember(confirmationData) { - confirmationData?.durationMs ?: DialogDefaults.ShortDurationMillis - } - - val a11yDurationMillis = LocalAccessibilityManager.current?.calculateRecommendedTimeoutMillis( - originalTimeoutMillis = durationMillis, - containsIcons = confirmationData?.iconResId != null, - containsText = confirmationData?.title != null, - containsControls = false, - ) ?: durationMillis - - val columnState = rememberColumnState( - ScalingLazyColumnDefaults.responsive( - verticalArrangement = Arrangement.spacedBy( - space = 4.dp, - alignment = Alignment.CenterVertically - ), - additionalPaddingAtBottom = 0.dp, - ), - ) + when (confirmationData?.confirmationType) { + ConfirmationType.Success -> { + if (confirmationData.message != null) { + ConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + colors = ConfirmationDialogDefaults.successColors(), + text = { + Text(text = confirmationData.message) + }, + content = { + ConfirmationDialogDefaults.SuccessIcon( + modifier = Modifier.size(ConfirmationDialogDefaults.SmallIconSize) + ) + } + ) + } else { + SuccessConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + curvedText = null + ) + } + } - LaunchedEffect(a11yDurationMillis, confirmationData) { - if (showDialog) { - delay(a11yDurationMillis) - currentOnDismissed() + ConfirmationType.Failure -> { + if (confirmationData.message != null) { + ConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + colors = ConfirmationDialogDefaults.failureColors(), + text = { + Text(text = confirmationData.message) + }, + content = { + ConfirmationDialogDefaults.FailureIcon( + modifier = Modifier.size(ConfirmationDialogDefaults.SmallIconSize) + ) + } + ) + } else { + FailureConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + curvedText = null + ) + } } - } - Dialog( - showDialog = showDialog, - onDismissRequest = currentOnDismissed, - scrollState = columnState.state, - ) { - ConfirmationContent( - icon = confirmationData?.animatedVectorResId?.let { iconResId -> - { - val image = AnimatedImageVector.animatedVectorResource(iconResId) + ConfirmationType.OpenOnPhone -> { + ConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + colors = ConfirmationDialogDefaults.colors(), + text = confirmationData.message?.let { + { + Text(text = it) + } + }, + content = { + val image = + AnimatedImageVector.animatedVectorResource(R.drawable.open_on_phone_animation) var atEnd by remember { mutableStateOf(false) } Icon( - modifier = Modifier.size(48.dp), + modifier = Modifier.size( + if (confirmationData.message != null) { + ConfirmationDialogDefaults.SmallIconSize + } else { + ConfirmationDialogDefaults.IconSize + } + ), painter = rememberAnimatedVectorPainter(image, atEnd), - contentDescription = null + contentDescription = stringResource(R.string.common_open_on_phone) ) - LaunchedEffect(iconResId) { + LaunchedEffect(Unit) { atEnd = !atEnd } } - } ?: confirmationData?.iconResId?.let { iconResId -> - { + ) + } + + else -> { + ConfirmationDialog( + visible = showDialog, + onDismissRequest = onTimeout, + colors = ConfirmationDialogDefaults.colors(), + text = confirmationData?.message?.let { + { + Text(text = it) + } + }, + content = confirmationData?.animatedVectorResId?.let { iconResId -> + { + val image = AnimatedImageVector.animatedVectorResource(iconResId) + var atEnd by remember { mutableStateOf(false) } + + Icon( + modifier = Modifier.size( + if (confirmationData.message != null) { + ConfirmationDialogDefaults.SmallIconSize + } else { + ConfirmationDialogDefaults.IconSize + } + ), + painter = rememberAnimatedVectorPainter(image, atEnd), + contentDescription = null + ) + + LaunchedEffect(iconResId) { + atEnd = !atEnd + } + } + } ?: confirmationData?.iconResId?.let { iconResId -> + { + Icon( + modifier = Modifier.size( + if (confirmationData.message != null) { + ConfirmationDialogDefaults.SmallIconSize + } else { + ConfirmationDialogDefaults.IconSize + } + ), + painter = painterResource(iconResId), + contentDescription = null + ) + } + } ?: { Icon( - modifier = Modifier.size(48.dp), - painter = painterResource(iconResId), + modifier = Modifier.size( + if (confirmationData?.message != null) { + ConfirmationDialogDefaults.SmallIconSize + } else { + ConfirmationDialogDefaults.IconSize + } + ), + painter = painterResource(R.drawable.ic_check_white_24dp), contentDescription = null ) } - }, - title = confirmationData?.title, - columnState = columnState, - showPositionIndicator = false, - ) + ) + } } } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/HorizontalPagerScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/HorizontalPagerScreen.kt new file mode 100644 index 00000000..760af286 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/components/HorizontalPagerScreen.kt @@ -0,0 +1,49 @@ +package com.thewizrd.simplewear.ui.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.isUnspecified +import androidx.wear.compose.foundation.pager.HorizontalPager +import androidx.wear.compose.foundation.pager.PagerScope +import androidx.wear.compose.foundation.pager.PagerState +import androidx.wear.compose.material3.HorizontalPageIndicator +import androidx.wear.compose.material3.HorizontalPagerScaffold +import androidx.wear.compose.material3.PageIndicatorDefaults + +@Composable +fun HorizontalPagerScreen( + modifier: Modifier = Modifier, + pagerState: PagerState, + hidePagerIndicator: Boolean = false, + pagerKey: ((index: Int) -> Any)? = null, + userScrollEnabled: Boolean = true, + pagerIndicatorBackgroundColor: Color = Color.Unspecified, + content: @Composable PagerScope.(page: Int) -> Unit, +) { + HorizontalPagerScaffold( + modifier = modifier, + pagerState = pagerState, + pageIndicator = if (hidePagerIndicator) { + null + } else { + { + HorizontalPageIndicator( + pagerState = pagerState, + backgroundColor = if (pagerIndicatorBackgroundColor.isUnspecified) { + PageIndicatorDefaults.backgroundColor + } else { + pagerIndicatorBackgroundColor + } + ) + } + } + ) { + HorizontalPager( + state = pagerState, + key = pagerKey, + userScrollEnabled = userScrollEnabled, + content = content + ) + } +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/LoadingContent.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/LoadingContent.kt index 993170d8..6b54c6b6 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/components/LoadingContent.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/components/LoadingContent.kt @@ -5,7 +5,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.wear.compose.material.CircularProgressIndicator +import androidx.wear.compose.material3.CircularProgressIndicator @Composable fun LoadingContent( diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/PullRefresh.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/PullRefresh.kt deleted file mode 100644 index dec59eaf..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/components/PullRefresh.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.thewizrd.simplewear.ui.components - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshState -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@OptIn(ExperimentalMaterialApi::class) -@Composable -fun PullRefresh( - modifier: Modifier = Modifier, - state: PullRefreshState, - indicator: @Composable BoxScope.() -> Unit, - content: @Composable () -> Unit -) { - Box( - modifier = modifier.pullRefresh(state) - ) { - content() - - indicator() - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/ScalingLazyColumn.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/ScalingLazyColumn.kt deleted file mode 100644 index 5981462f..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/components/ScalingLazyColumn.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.thewizrd.simplewear.ui.components - -import androidx.compose.foundation.gestures.ScrollableDefaults -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi -import androidx.wear.compose.foundation.lazy.ScalingLazyListScope -import androidx.wear.compose.foundation.rememberActiveFocusRequester -import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults -import androidx.wear.compose.foundation.rotary.rotaryScrollable -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.layout.ScalingLazyColumnState -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState - -@ExperimentalWearFoundationApi -@ExperimentalHorologistApi -@Composable -fun ScalingLazyColumn( - modifier: Modifier = Modifier, - scrollState: ScalingLazyColumnState = rememberResponsiveColumnState(), - focusRequester: FocusRequester = rememberActiveFocusRequester(), - content: ScalingLazyListScope.() -> Unit -) { - androidx.wear.compose.foundation.lazy.ScalingLazyColumn( - modifier = modifier - .fillMaxSize() - .rotaryScrollable( - behavior = RotaryScrollableDefaults.behavior(scrollState), - focusRequester = focusRequester, - reverseDirection = scrollState.reverseLayout - ), - state = scrollState.state, - contentPadding = scrollState.contentPadding, - reverseLayout = scrollState.reverseLayout, - verticalArrangement = scrollState.verticalArrangement, - horizontalAlignment = scrollState.horizontalAlignment, - flingBehavior = ScrollableDefaults.flingBehavior(), - rotaryScrollableBehavior = null, - userScrollEnabled = scrollState.userScrollEnabled, - scalingParams = scrollState.scalingParams, - anchorType = scrollState.anchorType, - autoCentering = scrollState.autoCentering, - content = content - ) -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/SwipeToDismissPagerScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/SwipeToDismissPagerScreen.kt deleted file mode 100644 index c1621e0f..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/components/SwipeToDismissPagerScreen.kt +++ /dev/null @@ -1,236 +0,0 @@ -package com.thewizrd.simplewear.ui.components - -import androidx.compose.animation.core.tween -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.gestures.awaitEachGesture -import androidx.compose.foundation.gestures.awaitFirstDown -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.PagerDefaults -import androidx.compose.foundation.pager.PagerState -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.input.pointer.PointerEventPass -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalViewConfiguration -import androidx.compose.ui.platform.ViewConfiguration -import androidx.compose.ui.semantics.ScrollAxisRange -import androidx.compose.ui.semantics.horizontalScrollAxisRange -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.unit.dp -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi -import androidx.wear.compose.foundation.HierarchicalFocusCoordinator -import androidx.wear.compose.foundation.SwipeToDismissBoxState -import androidx.wear.compose.foundation.edgeSwipeToDismiss -import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState -import com.google.android.horologist.compose.layout.PagerScaffold -import com.google.android.horologist.compose.pager.HorizontalPagerDefaults -import kotlinx.coroutines.coroutineScope - -// https://slack-chats.kotlinlang.org/t/16230979/problem-changing-basicswipetodismiss-background-color-gt -@OptIn(ExperimentalFoundationApi::class, ExperimentalWearFoundationApi::class) -@Composable -fun SwipeToDismissPagerScreen( - modifier: Modifier = Modifier, - state: PagerState, - hidePagerIndicator: Boolean = false, - timeText: (@Composable () -> Unit)? = null, - pagerKey: ((index: Int) -> Any)? = null, - content: @Composable (Int) -> Unit -) { - val screenWidth = with(LocalDensity.current) { - LocalConfiguration.current.screenWidthDp.dp.toPx() - } - var allowPaging by remember { mutableStateOf(true) } - - val originalTouchSlop = LocalViewConfiguration.current.touchSlop - - CustomTouchSlopProvider(newTouchSlop = originalTouchSlop * 2) { - PagerScaffold( - modifier = Modifier.fillMaxSize(), - timeText = timeText, - pagerState = if (hidePagerIndicator) null else state - ) { - HorizontalPager( - modifier = modifier - .pointerInput(screenWidth) { - coroutineScope { - awaitEachGesture { - allowPaging = true - val firstDown = - awaitFirstDown(false, PointerEventPass.Initial) - val xPosition = firstDown.position.x - // Define edge zone of 15% - allowPaging = xPosition > screenWidth * 0.15f - } - } - } - .semantics { - horizontalScrollAxisRange = if (allowPaging) { - ScrollAxisRange(value = { state.currentPage.toFloat() }, - maxValue = { 3f }) - } else { - // signals system swipe to dismiss that they can take over - ScrollAxisRange(value = { 0f }, - maxValue = { 0f }) - } - }, - state = state, - flingBehavior = PagerDefaults.flingBehavior( - state, - snapAnimationSpec = tween(150, 0), - ), - userScrollEnabled = allowPaging, - key = pagerKey - ) { page -> - HierarchicalFocusCoordinator(requiresFocus = { page == state.currentPage }) { - content(page) - } - } - } - } -} - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun SwipeToDismissPagerScreen( - modifier: Modifier = Modifier, - isRoot: Boolean = true, - swipeToDismissBoxState: SwipeToDismissBoxState = rememberSwipeToDismissBoxState(), - state: PagerState, - hidePagerIndicator: Boolean = false, - timeText: (@Composable () -> Unit)? = null, - pagerKey: ((index: Int) -> Any)? = null, - content: @Composable (Int) -> Unit -) { - if (isRoot) { - SwipeToDismissPagerScreen( - modifier, - state, - hidePagerIndicator, - timeText, - pagerKey, - content - ) - } else { - SwipeToDismissPagerScreen( - modifier, - swipeToDismissBoxState, - state, - hidePagerIndicator, - timeText, - pagerKey, - content - ) - } -} - -@OptIn(ExperimentalFoundationApi::class, ExperimentalWearFoundationApi::class) -@Composable -private fun SwipeToDismissPagerScreen( - modifier: Modifier = Modifier, - swipeToDismissBoxState: SwipeToDismissBoxState = rememberSwipeToDismissBoxState(), - state: PagerState, - hidePagerIndicator: Boolean = false, - timeText: (@Composable () -> Unit)? = null, - pagerKey: ((index: Int) -> Any)? = null, - content: @Composable (Int) -> Unit -) { - PagerScaffold( - modifier = Modifier - .fillMaxSize() - .edgeSwipeToDismiss(swipeToDismissBoxState), - timeText = timeText, - pagerState = if (hidePagerIndicator) null else state - ) { - HorizontalPager( - modifier = modifier, - state = state, - flingBehavior = HorizontalPagerDefaults.flingParams(state), - key = pagerKey - ) { page -> - HierarchicalFocusCoordinator(requiresFocus = { page == state.currentPage }) { - content(page) - } - } - } -} - -//MARK: - Horologist code - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun ClippedBox(pagerState: PagerState, content: @Composable () -> Unit) { - val shape = rememberClipWhenScrolling(pagerState) - Box( - modifier = Modifier - .fillMaxSize() - .optionalClip(shape), - ) { - content() - } -} - -@OptIn(ExperimentalFoundationApi::class) -@Composable -private fun rememberClipWhenScrolling(state: PagerState): State { - val shape = if (LocalConfiguration.current.isScreenRound) CircleShape else null - return remember(state) { - derivedStateOf { - if (shape != null && state.currentPageOffsetFraction != 0f) { - shape - } else { - null - } - } - } -} - -private fun Modifier.optionalClip(shapeState: State): Modifier { - val shape = shapeState.value - - return if (shape != null) { - clip(shape) - } else { - this - } -} - - -// MARK: - Steve Bower code - -@Composable -private fun CustomTouchSlopProvider( - newTouchSlop: Float, - content: @Composable () -> Unit -) { - CompositionLocalProvider( - LocalViewConfiguration provides CustomTouchSlop( - newTouchSlop, - LocalViewConfiguration.current - ) - ) { - content() - } -} - -private class CustomTouchSlop( - private val customTouchSlop: Float, - currentConfiguration: ViewConfiguration -) : ViewConfiguration by currentConfiguration { - override val touchSlop: Float - get() = customTouchSlop -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt index 5a0ca150..e4510ce9 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -23,43 +22,43 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastAll import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmap import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavController -import androidx.wear.compose.foundation.SwipeToDismissBoxState +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn +import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState import androidx.wear.compose.foundation.lazy.items -import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState -import androidx.wear.compose.material.Chip -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.CompactChip -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.PositionIndicator -import androidx.wear.compose.material.Switch -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.ToggleChip -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.layout.ScalingLazyColumn -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.ScalingLazyColumnState -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.ListHeaderDefaults.firstItemPadding -import com.google.android.horologist.compose.material.ResponsiveListHeader +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.foundation.pager.rememberPagerState +import androidx.wear.compose.material3.AnimatedPage +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.CompactButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation +import androidx.wear.compose.material3.SwitchButton +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.helpers.WearableHelper +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent -import com.thewizrd.simplewear.ui.components.SwipeToDismissPagerScreen import com.thewizrd.simplewear.ui.theme.findActivity +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.AppLauncherUiState import com.thewizrd.simplewear.viewmodels.AppLauncherViewModel import com.thewizrd.simplewear.viewmodels.ConfirmationData @@ -67,14 +66,9 @@ import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.launch -@OptIn( - ExperimentalHorologistApi::class -) @Composable fun AppLauncherScreen( - modifier: Modifier = Modifier, - navController: NavController, - swipeToDismissBoxState: SwipeToDismissBoxState = rememberSwipeToDismissBoxState() + modifier: Modifier = Modifier ) { val context = LocalContext.current val activity = context.findActivity() @@ -86,41 +80,26 @@ fun AppLauncherScreen( val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Unspecified, - last = ScalingLazyColumnDefaults.ItemType.Chip, - ) - ) - - val isRoot = navController.previousBackStackEntry == null - val pagerState = rememberPagerState( initialPage = 0, pageCount = { 2 } ) - SwipeToDismissPagerScreen( + HorizontalPagerScreen( modifier = modifier, - isRoot = isRoot, - swipeToDismissBoxState = swipeToDismissBoxState, - state = pagerState, + pagerState = pagerState, hidePagerIndicator = uiState.isLoading, - timeText = { - if (pagerState.currentPage == 0) { - TimeText(modifier = Modifier.scrollAway { scrollState }) - } - } ) { pageIdx -> - if (pageIdx == 0) { - AppLauncherScreen( - appLauncherViewModel = appLauncherViewModel, - scrollState = scrollState - ) - } else { - AppLauncherSettings( - appLauncherViewModel = appLauncherViewModel - ) + AnimatedPage(pageIdx, pagerState) { + if (pageIdx == 0) { + AppLauncherScreen( + appLauncherViewModel = appLauncherViewModel + ) + } else { + AppLauncherSettings( + appLauncherViewModel = appLauncherViewModel + ) + } } } @@ -186,11 +165,7 @@ fun AppLauncherScreen( } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) appLauncherViewModel.openAppOnPhone(activity, false) } @@ -204,6 +179,15 @@ fun AppLauncherScreen( else -> {} } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } @@ -215,117 +199,134 @@ fun AppLauncherScreen( } } -@OptIn(ExperimentalHorologistApi::class) @Composable private fun AppLauncherScreen( - appLauncherViewModel: AppLauncherViewModel, - scrollState: ScalingLazyColumnState + appLauncherViewModel: AppLauncherViewModel ) { - val context = LocalContext.current - val activity = context.findActivity() - val uiState by appLauncherViewModel.uiState.collectAsState() AppLauncherScreen( uiState = uiState, - scrollState = scrollState, onItemClicked = { - appLauncherViewModel.openRemoteApp(activity, it) + appLauncherViewModel.openRemoteApp(it) }, onRefresh = { appLauncherViewModel.refreshApps() } ) + + LaunchedEffect(uiState.loadAppIcons) { + if (!uiState.isLoading && uiState.loadAppIcons && uiState.appsList.isNotEmpty() && uiState.appsList.fastAll { it.bitmapIcon == null }) { + appLauncherViewModel.refreshApps() + } + } } -@OptIn(ExperimentalHorologistApi::class) @Composable private fun AppLauncherScreen( uiState: AppLauncherUiState, - scrollState: ScalingLazyColumnState = rememberResponsiveColumnState(), + scrollState: TransformingLazyColumnState = rememberTransformingLazyColumnState(), onItemClicked: (AppItemViewModel) -> Unit = {}, onRefresh: () -> Unit = {} ) { - Box( - modifier = Modifier.fillMaxSize() - ) { - LoadingContent( - empty = uiState.appsList.isEmpty(), - emptyContent = { - Box( - modifier = Modifier - .fillMaxSize() - .wrapContentHeight(), - contentAlignment = Alignment.Center - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button + ) + + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + scrollState = scrollState, + contentPadding = contentPadding + ) { contentPadding -> + Box( + modifier = Modifier.fillMaxSize() + ) { + LoadingContent( + empty = uiState.appsList.isEmpty(), + emptyContent = { + Box( + modifier = Modifier + .fillMaxSize() + .wrapContentHeight(), + contentAlignment = Alignment.Center ) { - Text( - modifier = Modifier.padding(horizontal = 14.dp), - text = stringResource(id = R.string.error_noapps), - textAlign = TextAlign.Center - ) - CompactChip( - label = { - Text(text = stringResource(id = R.string.action_refresh)) - }, - icon = { - Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), - contentDescription = stringResource(id = R.string.action_refresh) - ) - }, - onClick = onRefresh - ) + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + modifier = Modifier.padding(horizontal = 14.dp), + text = stringResource(id = R.string.error_noapps), + textAlign = TextAlign.Center + ) + CompactButton( + label = { + Text(text = stringResource(id = R.string.action_refresh)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + contentDescription = stringResource(id = R.string.action_refresh) + ) + }, + onClick = onRefresh + ) + } } - } - }, - loading = uiState.isLoading - ) { - ScalingLazyColumn( - modifier = Modifier.fillMaxSize(), - columnState = scrollState, + }, + loading = uiState.isLoading ) { - item { - ResponsiveListHeader(contentPadding = firstItemPadding()) { - Text(text = stringResource(id = R.string.action_apps)) + TransformingLazyColumn( + modifier = Modifier.fillMaxSize(), + state = scrollState, + contentPadding = contentPadding + ) { + item { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { + Text(text = stringResource(id = R.string.action_apps)) + } } - } - items( - items = uiState.appsList, - key = { Pair(it.activityName, it.packageName) } - ) { appItem -> - Chip( - modifier = Modifier.fillMaxWidth(), - label = { - Text(text = appItem.appLabel ?: "") - }, - icon = if (uiState.loadAppIcons) { - appItem.bitmapIcon?.let { - { - Icon( - modifier = Modifier.requiredSize(ChipDefaults.IconSize), - bitmap = it.asImageBitmap(), - contentDescription = appItem.appLabel, - tint = Color.Unspecified - ) + items( + items = uiState.appsList, + key = { Pair(it.activityName, it.packageName) } + ) { appItem -> + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = appItem.appLabel ?: "") + }, + icon = if (uiState.loadAppIcons) { + appItem.bitmapIcon?.let { + { + Icon( + modifier = Modifier.requiredSize(ButtonDefaults.IconSize), + bitmap = it.asImageBitmap(), + contentDescription = appItem.appLabel, + tint = Color.Unspecified + ) + } } + } else { + null + }, + onClick = { + onItemClicked(appItem) } - } else { - null - }, - colors = ChipDefaults.secondaryChipColors(), - onClick = { - onItemClicked(appItem) - } - ) + ) + } } } - - PositionIndicator(scalingLazyListState = scrollState.state) } } } @@ -344,47 +345,51 @@ private fun AppLauncherSettings( ) } -@OptIn(ExperimentalHorologistApi::class) @Composable private fun AppLauncherSettings( uiState: AppLauncherUiState, onCheckChanged: (Boolean) -> Unit = {} ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Unspecified, - last = ScalingLazyColumnDefaults.ItemType.Chip, - ) - ) + val columnState = rememberTransformingLazyColumnState() - ScalingLazyColumn( - columnState = scrollState - ) { - item { - ResponsiveListHeader( - modifier = Modifier.fillMaxWidth(), - contentPadding = firstItemPadding() - ) { - Text(text = stringResource(id = R.string.title_settings)) - } - } - item { - ToggleChip( - modifier = Modifier.fillMaxWidth(), - label = { - Text(text = stringResource(id = R.string.pref_loadicons_title)) - }, - checked = uiState.loadAppIcons, - onCheckedChange = onCheckChanged, - toggleControl = { - Switch(checked = uiState.loadAppIcons) + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + scrollState = columnState, + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding + ) { + item { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { + Text(text = stringResource(id = R.string.title_settings)) } - ) + } + item { + SwitchButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.pref_loadicons_title)) + }, + checked = uiState.loadAppIcons, + onCheckedChange = onCheckChanged + ) + } } } } -@OptIn(ExperimentalHorologistApi::class) @WearPreviewDevices @Composable private fun PreviewAppLauncherScreen() { @@ -408,7 +413,6 @@ private fun PreviewAppLauncherScreen() { AppLauncherScreen(uiState = uiState) } -@OptIn(ExperimentalHorologistApi::class) @WearPreviewDevices @Composable private fun PreviewLoadingAppLauncherScreen() { @@ -426,7 +430,6 @@ private fun PreviewLoadingAppLauncherScreen() { AppLauncherScreen(uiState = uiState) } -@OptIn(ExperimentalHorologistApi::class) @WearPreviewDevices @Composable private fun PreviewNoContentAppLauncherScreen() { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index f615a52b..8bb98601 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -44,7 +44,6 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role @@ -57,18 +56,15 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.wear.compose.material.Button -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Scaffold -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.Vignette -import androidx.wear.compose.material.VignettePosition -import androidx.wear.compose.material.dialog.Dialog -import androidx.wear.compose.material.ripple -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.Dialog +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.TimeText +import androidx.wear.compose.material3.ripple import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions @@ -82,9 +78,9 @@ import com.thewizrd.simplewear.ui.components.LoadingContent import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.CallManagerUiState import com.thewizrd.simplewear.viewmodels.CallManagerViewModel -import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.launch @@ -104,21 +100,18 @@ fun CallManagerUi( val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - timeText = { - if (!uiState.isLoading) TimeText() - }, - ) { + ScreenScaffold { contentPadding -> LoadingContent( empty = !uiState.isCallActive, emptyContent = { - NoCallActiveScreen() + NoCallActiveScreen( + modifier = Modifier.padding(contentPadding) + ) }, loading = uiState.isLoading ) { CallManagerUi( + modifier = Modifier.padding(contentPadding), callManagerViewModel = callManagerViewModel, navController = navController ) @@ -177,9 +170,9 @@ fun CallManagerUi( event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus if (status == ActionStatus.PERMISSION_DENIED) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -199,6 +192,7 @@ fun CallManagerUi( @Composable fun CallManagerUi( + modifier: Modifier = Modifier, callManagerViewModel: CallManagerViewModel, navController: NavController ) { @@ -210,6 +204,7 @@ fun CallManagerUi( var showKeyPadUi by remember { mutableStateOf(false) } CallManagerUi( + modifier = modifier, uiState = uiState, onShowKeypadUi = { showKeyPadUi = true @@ -232,7 +227,7 @@ fun CallManagerUi( Dialog( modifier = Modifier.fillMaxSize(), - showDialog = showKeyPadUi, + visible = showKeyPadUi, onDismissRequest = { showKeyPadUi = false } ) { KeypadScreen( @@ -246,6 +241,7 @@ fun CallManagerUi( @OptIn(ExperimentalFoundationApi::class, ExperimentalLayoutApi::class) @Composable private fun CallManagerUi( + modifier: Modifier = Modifier, uiState: CallManagerUiState, onMute: () -> Unit = {}, onShowKeypadUi: () -> Unit = {}, @@ -257,7 +253,7 @@ private fun CallManagerUi( val isRound = LocalConfiguration.current.isScreenRound Box( - modifier = Modifier.fillMaxSize() + modifier = modifier.fillMaxSize() ) { if (isPreview) { TimeText() @@ -343,9 +339,9 @@ private fun CallManagerUi( modifier = Modifier .requiredSize(40.dp) .align(Alignment.CenterHorizontally), - colors = ButtonDefaults.primaryButtonColors( - backgroundColor = colorResource(id = android.R.color.holo_red_dark), - contentColor = Color.White + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer ), onClick = onEndCall ) { @@ -376,7 +372,7 @@ private fun CallUiButton( role = Role.Button, interactionSource = remember { MutableInteractionSource() }, indication = ripple( - color = MaterialTheme.colors.onSurface, + color = MaterialTheme.colorScheme.onSurface, radius = 20.dp ) ) @@ -403,9 +399,11 @@ private fun CallUiButton( @WearPreviewDevices @Composable -private fun NoCallActiveScreen() { +private fun NoCallActiveScreen( + modifier: Modifier = Modifier +) { Box( - modifier = Modifier.fillMaxSize(), + modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { Text( @@ -430,7 +428,14 @@ private fun KeypadScreen( var keypadText by remember { mutableStateOf("") } val digits by remember { - derivedStateOf { listOf('1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#') } + derivedStateOf { + listOf( + '1', '2', '3', + '4', '5', '6', + '7', '8', '9', + '*', '0', '#' + ) + } } Column( diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt index 3d6fdc17..8698d424 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt @@ -12,10 +12,8 @@ import androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons @@ -41,22 +39,14 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.withStarted import androidx.navigation.NavController import androidx.preference.PreferenceManager -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.PositionIndicator -import androidx.wear.compose.material.Scaffold -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.Vignette -import androidx.wear.compose.material.VignettePosition -import androidx.wear.compose.material.dialog.Dialog +import androidx.wear.compose.material3.AlertDialog +import androidx.wear.compose.material3.AlertDialogDefaults +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.rememberColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.AlertContent -import com.google.android.horologist.compose.material.AlertDialog -import com.google.android.horologist.compose.material.Chip import com.thewizrd.shared_resources.actions.Action import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions @@ -107,12 +97,10 @@ fun Dashboard( var showUpdateDialog by remember { mutableStateOf(false) } var showAppUpdateConfirmation by remember { mutableStateOf(false) } - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - timeText = { TimeText(modifier = Modifier.scrollAway { scrollState }) }, - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - positionIndicator = { PositionIndicator(scrollState = scrollState) } - ) { + ScreenScaffold( + modifier = modifier, + scrollState = scrollState + ) { contentPadding -> DashboardScreen( dashboardViewModel = dashboardViewModel, scrollState = scrollState, @@ -121,8 +109,8 @@ fun Dashboard( } AlertDialog( - showDialog = showUpdateDialog, - onDismiss = { + visible = showUpdateDialog, + onDismissRequest = { Settings.setLastUpdateCheckTime(Instant.now()) showUpdateDialog = false }, @@ -132,15 +120,19 @@ fun Dashboard( contentDescription = null ) }, - message = stringResource(id = R.string.message_wearappupdate_available) + title = {}, + text = { + Text(text = stringResource(id = R.string.message_wearappupdate_available)) + } ) { item { Spacer(modifier = Modifier.height(12.dp)) } item { - Chip( - modifier = Modifier.padding(horizontal = 16.dp), - label = stringResource(id = R.string.action_update), + Button( + label = { + Text(text = stringResource(id = R.string.action_update)) + }, onClick = { runCatching { // Open store on device @@ -156,57 +148,55 @@ fun Dashboard( } if (inAppUpdateMgr.updatePriority <= 3) { item { - Chip( - label = stringResource(id = android.R.string.cancel), + FilledTonalButton( + label = { + Text(text = stringResource(id = android.R.string.cancel)) + }, onClick = { Settings.setLastUpdateCheckTime(Instant.now()) showUpdateDialog = false - }, - colors = ChipDefaults.secondaryChipColors() + } ) } } } - if (showAppUpdateConfirmation) { - var startAnim by remember { mutableStateOf(false) } - val dialogScrollState = rememberColumnState( - ScalingLazyColumnDefaults.responsive(), - ) + AlertDialog( + visible = showAppUpdateConfirmation, + onDismissRequest = { + Settings.setLastUpdateCheckTime(Instant.now()) + showAppUpdateConfirmation = false + }, + icon = { + var startAnim by remember { mutableStateOf(false) } - Dialog( - showDialog = showAppUpdateConfirmation, - onDismissRequest = { - Settings.setLastUpdateCheckTime(Instant.now()) - showAppUpdateConfirmation = false - }, - scrollState = dialogScrollState.state - ) { - AlertContent( - icon = { - Icon( - modifier = Modifier.size(36.dp), - painter = rememberAnimatedVectorPainter( - animatedImageVector = AnimatedImageVector.animatedVectorResource(id = R.drawable.open_on_phone_animation), - atEnd = startAnim - ), - contentDescription = null - ) - }, - message = stringResource(id = R.string.message_phoneappupdate_available), - onOk = { + Icon( + modifier = Modifier.size(36.dp), + painter = rememberAnimatedVectorPainter( + animatedImageVector = AnimatedImageVector.animatedVectorResource(id = R.drawable.open_on_phone_animation), + atEnd = startAnim + ), + contentDescription = null + ) + + LaunchedEffect(showAppUpdateConfirmation) { + delay(250) + startAnim = true + } + }, + title = {}, + text = { + Text(text = stringResource(id = R.string.message_phoneappupdate_available)) + }, + edgeButton = { + AlertDialogDefaults.EdgeButton( + onClick = { Settings.setLastUpdateCheckTime(Instant.now()) showAppUpdateConfirmation = false - }, - state = dialogScrollState + } ) } - - LaunchedEffect(showAppUpdateConfirmation) { - delay(250) - startAnim = true - } - } + ) ConfirmationOverlay( confirmationData = confirmationData, @@ -357,9 +347,9 @@ fun Dashboard( ActionStatus.PERMISSION_DENIED -> { if (action.actionType == Actions.TORCH) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_torch_action) + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_torch_action ) ) } else if (action.actionType == Actions.SLEEPTIMER) { @@ -370,22 +360,17 @@ fun Dashboard( if (intentAndroid.resolveActivity(activity.packageManager) != null) { activity.startActivity(intentAndroid) - Toast.makeText( - activity, - R.string.error_sleeptimer_notinstalled, - Toast.LENGTH_LONG - ).show() } else { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_sleeptimer_notinstalled) + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_sleeptimer_notinstalled ) ) } } else { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_permissiondenied ) ) } @@ -394,27 +379,16 @@ fun Dashboard( } ActionStatus.TIMEOUT -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_sendmessage) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_sendmessage)) } ActionStatus.REMOTE_FAILURE -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_remoteactionfailed) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_remoteactionfailed)) } ActionStatus.REMOTE_PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) + dashboardViewModel.openAppOnPhone(activity, false) } ActionStatus.SUCCESS -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt index c58e2131..4cca2721 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt @@ -1,5 +1,3 @@ -@file:OptIn(ExperimentalWearFoundationApi::class, ExperimentalMaterialApi::class) - package com.thewizrd.simplewear.ui.simplewear import android.content.ComponentName @@ -26,10 +24,10 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.PullRefreshDefaults -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.rememberPullRefreshState +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults +import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.Stable @@ -44,13 +42,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.geometry.Size -import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalViewConfiguration -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -62,24 +58,21 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.NavOptions -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi -import androidx.wear.compose.foundation.rememberActiveFocusRequester +import androidx.wear.compose.foundation.requestFocusOnHierarchyActive import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults import androidx.wear.compose.foundation.rotary.rotaryScrollable -import androidx.wear.compose.material.Button -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.Chip -import androidx.wear.compose.material.ChipColors -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.CircularProgressIndicator -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.OutlinedChip -import androidx.wear.compose.material.Switch -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.ToggleChip -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonColors +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.CircularProgressIndicator +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.OutlinedButton +import androidx.wear.compose.material3.SwitchButton +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.TimeText +import androidx.wear.compose.material3.contentColorFor import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.BatteryStatus import com.thewizrd.shared_resources.controls.ActionButtonViewModel @@ -90,9 +83,10 @@ import com.thewizrd.shared_resources.utils.ContextUtils.isSmallestWidth import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.onClick import com.thewizrd.simplewear.preferences.Settings -import com.thewizrd.simplewear.ui.components.PullRefresh import com.thewizrd.simplewear.ui.components.WearDivider import com.thewizrd.simplewear.ui.navigation.Screen +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.DashboardState import com.thewizrd.simplewear.viewmodels.DashboardViewModel import kotlinx.coroutines.delay @@ -103,6 +97,7 @@ import kotlin.math.sqrt @Composable fun DashboardScreen( + modifier: Modifier = Modifier, dashboardViewModel: DashboardViewModel, scrollState: ScrollState = rememberScrollState(), navController: NavController @@ -114,6 +109,7 @@ fun DashboardScreen( val uiState by dashboardViewModel.uiState.collectAsState() DashboardScreen( + modifier = modifier, isRefreshing = refreshing, onRefresh = { refreshing = true @@ -159,6 +155,7 @@ fun DashboardScreen( ) } +@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun DashboardScreen( modifier: Modifier = Modifier, @@ -171,30 +168,21 @@ fun DashboardScreen( onDashTileSettingsClick: () -> Unit = {}, ) { val isPreview = LocalInspectionMode.current - val configuration = LocalConfiguration.current - val refreshThreshold = remember(configuration) { - (configuration.screenHeightDp / 3f).dp - } - - val pullRefreshState = rememberPullRefreshState( - refreshing = isRefreshing, - onRefresh = onRefresh, - refreshThreshold = refreshThreshold, - refreshingOffset = PullRefreshDefaults.RefreshingOffset + 4.dp - ) + val pullRefreshState = rememberPullToRefreshState() - PullRefresh( + PullToRefreshBox( modifier = modifier.fillMaxSize(), + isRefreshing = isRefreshing, + onRefresh = onRefresh, state = pullRefreshState, indicator = { - PullRefreshIndicator( + PullToRefreshDefaults.LoadingIndicator( modifier = Modifier.align(Alignment.TopCenter), - refreshing = isRefreshing, state = pullRefreshState, - backgroundColor = MaterialTheme.colors.surface, - contentColor = MaterialTheme.colors.primary, - scale = true + isRefreshing = isRefreshing, + containerColor = MaterialTheme.colorScheme.primaryContainer, + color = MaterialTheme.colorScheme.onPrimaryContainer, ) } ) { @@ -202,8 +190,9 @@ fun DashboardScreen( modifier = Modifier .fillMaxSize() .verticalScroll(scrollState) + .requestFocusOnHierarchyActive() .rotaryScrollable( - focusRequester = rememberActiveFocusRequester(), + focusRequester = rememberFocusRequester(), behavior = RotaryScrollableDefaults.behavior(scrollState) ), ) { @@ -251,7 +240,7 @@ private fun DeviceStateChip( isStatusLoading: Boolean = false, connectionStatus: WearConnectionStatus? = null ) { - OutlinedChip( + OutlinedButton( modifier = Modifier.fillMaxWidth(), icon = { Icon( @@ -292,11 +281,8 @@ private fun DeviceStateChip( }, onClick = {}, enabled = false, - colors = transparentChipColors(), - border = ChipDefaults.outlinedChipBorder( - borderColor = Color.Transparent, - disabledBorderColor = Color.Transparent - ) + colors = transparentButtonColors(), + border = null ) } @@ -309,7 +295,7 @@ private fun BatteryStatusChip( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start ) { - OutlinedChip( + OutlinedButton( modifier = Modifier.weight(1f, fill = true), icon = { Icon( @@ -340,11 +326,8 @@ private fun BatteryStatusChip( }, onClick = {}, enabled = false, - colors = transparentChipColors(), - border = ChipDefaults.outlinedChipBorder( - borderColor = Color.Transparent, - disabledBorderColor = Color.Transparent - ) + colors = transparentButtonColors(), + border = null ) if (isStatusLoading) { Box( @@ -361,18 +344,6 @@ private fun BatteryStatusChip( } } -@Composable -private fun transparentChipColors(): ChipColors = ChipDefaults.chipColors( - backgroundColor = Color.Transparent, - disabledBackgroundColor = Color.Transparent, - contentColor = Color.White, - disabledContentColor = Color.White, - iconColor = Color.White, - disabledIconColor = Color.White, - secondaryContentColor = MaterialTheme.colors.onSurfaceVariant, - disabledSecondaryContentColor = MaterialTheme.colors.onSurfaceVariant, -) - @OptIn(ExperimentalLayoutApi::class) @Composable private fun ActionsList( @@ -392,7 +363,7 @@ private fun ActionsList( .heightIn(min = 48.dp) .wrapContentHeight(align = Alignment.CenterVertically), text = stringResource(id = R.string.title_actions), - style = MaterialTheme.typography.button, + style = MaterialTheme.typography.labelMedium, textAlign = TextAlign.Center, maxLines = 1 ) @@ -475,19 +446,10 @@ private fun ActionGridButton( interactionSource = interactionSource, enabled = model.buttonState != null, colors = model.buttonState?.let { state -> - ButtonDefaults.buttonColors( - backgroundColor = if (state) { - colorResource(id = R.color.colorPrimary) - } else { - MaterialTheme.colors.surface - } - ) + actionButtonColors(state) } ?: run { // Indeterminate state - ButtonDefaults.buttonColors( - backgroundColor = colorResource(id = R.color.colorPrimaryDark), - disabledBackgroundColor = colorResource(id = R.color.colorPrimaryDark) - ) + indeterminateActionButtonColors() }, onClick = { if (isClickable && model.getItemViewType() != ActionItemType.READONLY_ACTION) { @@ -531,23 +493,14 @@ private fun ActionListButton( ) { val context = LocalContext.current - Chip( + Button( modifier = Modifier.fillMaxWidth(), enabled = model.buttonState != null, colors = model.buttonState?.let { state -> - ChipDefaults.chipColors( - backgroundColor = if (state) { - colorResource(id = R.color.colorPrimary) - } else { - MaterialTheme.colors.surface - } - ) + actionButtonColors(state) } ?: run { // Indeterminate state - ChipDefaults.chipColors( - backgroundColor = colorResource(id = R.color.colorPrimaryDark), - disabledBackgroundColor = colorResource(id = R.color.colorPrimaryDark) - ) + indeterminateActionButtonColors() }, label = { Text( @@ -606,7 +559,7 @@ private fun LayoutPreferenceButton( ) { val lifecycleOwner = LocalLifecycleOwner.current - Chip( + FilledTonalButton( modifier = Modifier.fillMaxWidth(), label = { Text(text = stringResource(id = R.string.pref_layout)) @@ -634,9 +587,6 @@ private fun LayoutPreferenceButton( } ) }, - colors = ChipDefaults.secondaryChipColors( - secondaryContentColor = MaterialTheme.colors.onSurfaceVariant - ), onClick = { AnalyticsLogger.logEvent("dash_layout_btn_clicked", Bundle().apply { putBoolean("isGridLayout", isGridLayout) @@ -655,7 +605,7 @@ private fun LayoutPreferenceButton( private fun DashboardConfigButton( onClick: () -> Unit = {} ) { - Chip( + FilledTonalButton( modifier = Modifier.fillMaxWidth(), label = { Text(text = stringResource(id = R.string.pref_title_dasheditor)) @@ -666,7 +616,6 @@ private fun DashboardConfigButton( contentDescription = stringResource(id = R.string.pref_title_dasheditor) ) }, - colors = ChipDefaults.secondaryChipColors(), onClick = onClick ) } @@ -675,7 +624,7 @@ private fun DashboardConfigButton( private fun TileDashboardConfigButton( onClick: () -> Unit = {} ) { - Chip( + FilledTonalButton( modifier = Modifier.fillMaxWidth(), label = { Text(text = stringResource(id = R.string.pref_title_tiledasheditor)) @@ -686,7 +635,6 @@ private fun TileDashboardConfigButton( contentDescription = stringResource(id = R.string.pref_title_tiledasheditor) ) }, - colors = ChipDefaults.secondaryChipColors(), onClick = onClick ) } @@ -701,7 +649,7 @@ private fun MediaControllerSwitch() { var isChecked by remember { mutableStateOf(false) } - ToggleChip( + SwitchButton( modifier = Modifier.fillMaxWidth(), checked = isChecked, onCheckedChange = { @@ -718,11 +666,6 @@ private fun MediaControllerSwitch() { text = stringResource(id = R.string.pref_title_mediacontroller_launcher), maxLines = 10 ) - }, - toggleControl = { - Switch( - checked = isChecked - ) } ) @@ -732,6 +675,54 @@ private fun MediaControllerSwitch() { } } +@Composable +private fun transparentButtonColors(): ButtonColors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colorScheme.onSurface, + secondaryContentColor = MaterialTheme.colorScheme.onSurfaceVariant, + iconColor = MaterialTheme.colorScheme.onSurface, + disabledContentColor = MaterialTheme.colorScheme.onSurface, + disabledSecondaryContentColor = MaterialTheme.colorScheme.onSurfaceVariant, + disabledIconColor = MaterialTheme.colorScheme.onSurface, +) + +@Composable +private fun actionButtonColors(state: Boolean): ButtonColors { + return ButtonDefaults.buttonColors( + containerColor = if (state) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.surfaceContainer + }, + contentColor = if (state) { + MaterialTheme.colorScheme.onPrimary + } else { + MaterialTheme.colorScheme.onSurface + }, + secondaryContentColor = if (state) { + MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.8f) + } else { + MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f) + }, + iconColor = if (state) { + MaterialTheme.colorScheme.onPrimary + } else { + MaterialTheme.colorScheme.onSurface + } + ) +} + +@Composable +private fun indeterminateActionButtonColors(): ButtonColors { + val color = MaterialTheme.colorScheme.primaryContainer + + return ButtonDefaults.buttonColors( + disabledContainerColor = color, + disabledContentColor = contentColorFor(color), + disabledSecondaryContentColor = contentColorFor(color).copy(alpha = 0.8f), + disabledIconColor = contentColorFor(color) + ) +} + @Stable private fun Modifier.fillDashboard(): Modifier = composed { val isRound = LocalConfiguration.current.isScreenRound @@ -780,6 +771,62 @@ private fun PreviewDashboardScreen() { } } +@WearPreviewDevices +@Composable +private fun PreviewDashboardScreen_List() { + val dashboardState = remember { + DashboardState( + connectionStatus = WearConnectionStatus.CONNECTED, + isStatusLoading = true, + batteryStatus = BatteryStatus(100, false), + isGridLayout = false, + showBatteryState = true, + isActionsClickable = true, + actions = Actions.entries.map { + ActionButtonViewModel.getViewModelFromAction(it) + } + ) + } + + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + DashboardScreen( + dashboardState = dashboardState + ) + } +} + +@WearPreviewDevices +@Composable +private fun PreviewDashboardScreen_Indeterminate() { + val dashboardState = remember { + DashboardState( + connectionStatus = WearConnectionStatus.CONNECTED, + isStatusLoading = true, + batteryStatus = BatteryStatus(100, false), + isGridLayout = true, + showBatteryState = true, + isActionsClickable = true, + actions = Actions.entries.map { + ActionButtonViewModel.getViewModelFromAction(it).apply { + buttonState = null + } + } + ) + } + + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + DashboardScreen( + dashboardState = dashboardState + ) + } +} + private fun ActionButtonViewModel.getItemViewType(): Int { return when (this.actionType) { Actions.WIFI, Actions.BLUETOOTH, Actions.MOBILEDATA, Actions.TORCH, Actions.HOTSPOT -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt index 474a7092..886122e0 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt @@ -1,4 +1,4 @@ -@file:OptIn(ExperimentalLayoutApi::class, ExperimentalHorologistApi::class) +@file:OptIn(ExperimentalLayoutApi::class) package com.thewizrd.simplewear.ui.simplewear @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft @@ -40,9 +39,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.rotary.onRotaryScrollEvent import androidx.compose.ui.platform.LocalConfiguration @@ -56,17 +53,15 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.wear.compose.foundation.SwipeToDismissBoxState -import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState -import androidx.wear.compose.material.CompactChip -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.foundation.pager.rememberPagerState +import androidx.wear.compose.material3.AnimatedPage +import androidx.wear.compose.material3.CompactButton +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.material.Button import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.GestureActionState import com.thewizrd.shared_resources.helpers.GestureUIHelper @@ -74,11 +69,12 @@ import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent -import com.thewizrd.simplewear.ui.components.SwipeToDismissPagerScreen import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.viewmodels.ConfirmationData +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.GestureUiState import com.thewizrd.simplewear.viewmodels.GestureUiViewModel @@ -95,8 +91,7 @@ import kotlin.math.sqrt @Composable fun GesturesUi( modifier: Modifier = Modifier, - navController: NavController, - swipeToDismissBoxState: SwipeToDismissBoxState = rememberSwipeToDismissBoxState() + navController: NavController ) { val context = LocalContext.current val activity = context.findActivity() @@ -112,59 +107,73 @@ fun GesturesUi( if (uiState.actionState.accessibilityEnabled && uiState.actionState.keyEventSupported) 2 else 1 } - val isRoot = navController.previousBackStackEntry == null - - SwipeToDismissPagerScreen( - modifier = modifier.background(MaterialTheme.colors.background), - isRoot = isRoot, - swipeToDismissBoxState = swipeToDismissBoxState, - state = pagerState, - timeText = { - if (!uiState.isLoading) TimeText() - }, - hidePagerIndicator = uiState.isLoading + HorizontalPagerScreen( + modifier = modifier, + pagerState = pagerState, + hidePagerIndicator = uiState.isLoading, ) { pageIdx -> - LoadingContent( - empty = !uiState.actionState.accessibilityEnabled, - emptyContent = { - NoAccessibilityScreen( - onRefresh = { - gestureUiViewModel.refreshState() - } - ) - }, - loading = uiState.isLoading - ) { - when (pageIdx) { - // Gestures - 0 -> { - GestureScreen( - modifier = modifier, - uiState = uiState, - onDPadDirection = { direction -> - when (direction) { - KeyEvent.KEYCODE_DPAD_UP -> gestureUiViewModel.requestDPad(top = 1) - KeyEvent.KEYCODE_DPAD_DOWN -> gestureUiViewModel.requestDPad(bottom = 1) - KeyEvent.KEYCODE_DPAD_LEFT -> gestureUiViewModel.requestDPad(left = 1) - KeyEvent.KEYCODE_DPAD_RIGHT -> gestureUiViewModel.requestDPad(right = 1) + AnimatedPage(pageIdx, pagerState) { + ScreenScaffold { contentPadding -> + LoadingContent( + empty = !uiState.actionState.accessibilityEnabled, + emptyContent = { + NoAccessibilityScreen( + modifier = Modifier.padding(contentPadding), + onRefresh = { + gestureUiViewModel.refreshState() } - }, - onDPadClicked = { - gestureUiViewModel.requestDPadClick() - }, - onScroll = { dX, dY, screenWidth, screenHeight -> - gestureUiViewModel.requestScroll(dX, dY, screenWidth, screenHeight) + ) + }, + loading = uiState.isLoading + ) { + when (pageIdx) { + // Gestures + 0 -> { + GestureScreen( + modifier = modifier.padding(contentPadding), + uiState = uiState, + onDPadDirection = { direction -> + when (direction) { + KeyEvent.KEYCODE_DPAD_UP -> gestureUiViewModel.requestDPad( + top = 1 + ) + + KeyEvent.KEYCODE_DPAD_DOWN -> gestureUiViewModel.requestDPad( + bottom = 1 + ) + + KeyEvent.KEYCODE_DPAD_LEFT -> gestureUiViewModel.requestDPad( + left = 1 + ) + + KeyEvent.KEYCODE_DPAD_RIGHT -> gestureUiViewModel.requestDPad( + right = 1 + ) + } + }, + onDPadClicked = { + gestureUiViewModel.requestDPadClick() + }, + onScroll = { dX, dY, screenWidth, screenHeight -> + gestureUiViewModel.requestScroll( + dX, + dY, + screenWidth, + screenHeight + ) + } + ) } - ) - } - // Buttons - 1 -> { - ButtonScreen( - modifier = modifier, - onKeyPressed = { keyEvent -> - gestureUiViewModel.requestKeyEvent(keyEvent) + // Buttons + 1 -> { + ButtonScreen( + modifier = modifier.padding(contentPadding), + onKeyPressed = { keyEvent -> + gestureUiViewModel.requestKeyEvent(keyEvent) + } + ) } - ) + } } } } @@ -222,9 +231,9 @@ fun GesturesUi( event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus if (status == ActionStatus.PERMISSION_DENIED) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -280,7 +289,7 @@ private fun GestureScreen( context.resources.displayMetrics.widthPixels } - val focusRequester = remember { FocusRequester() } + val focusRequester = rememberFocusRequester() Box( modifier = modifier @@ -371,7 +380,7 @@ private fun GestureScreen( onDPadDirection(KeyEvent.KEYCODE_DPAD_UP) }, imageVector = Icons.Filled.KeyboardArrowUp, - tint = Color.White, + tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_up) ) Icon( @@ -383,7 +392,7 @@ private fun GestureScreen( onDPadDirection(KeyEvent.KEYCODE_DPAD_DOWN) }, imageVector = Icons.Filled.KeyboardArrowDown, - tint = Color.White, + tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_down) ) Icon( @@ -395,7 +404,7 @@ private fun GestureScreen( onDPadDirection(KeyEvent.KEYCODE_DPAD_LEFT) }, imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft, - tint = Color.White, + tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_left) ) Icon( @@ -407,7 +416,7 @@ private fun GestureScreen( onDPadDirection(KeyEvent.KEYCODE_DPAD_RIGHT) }, imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, - tint = Color.White, + tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_right) ) if (uiState.actionState.dpadSupported) { @@ -420,7 +429,7 @@ private fun GestureScreen( ) { onDPadClicked() } - .background(Color.White, shape = RoundedCornerShape(50)) + .background(MaterialTheme.colorScheme.primary, shape = RoundedCornerShape(50)) ) } @@ -449,23 +458,35 @@ private fun ButtonScreen( verticalArrangement = Arrangement.spacedBy(6.dp, Alignment.CenterVertically), overflow = FlowRowOverflow.Visible, ) { - Button( - imageVector = Icons.AutoMirrored.Outlined.ArrowBack, - contentDescription = stringResource(id = R.string.label_back), + FilledIconButton( + content = { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = stringResource(id = R.string.label_back) + ) + }, onClick = { onKeyPressed(KeyEvent.KEYCODE_BACK) } ) - Button( - imageVector = Icons.Outlined.Home, - contentDescription = stringResource(id = R.string.label_home), + FilledIconButton( + content = { + Icon( + imageVector = Icons.Outlined.Home, + contentDescription = stringResource(id = R.string.label_home), + ) + }, onClick = { onKeyPressed(KeyEvent.KEYCODE_HOME) } ) - Button( - id = R.drawable.ic_outline_view_apps, - contentDescription = stringResource(id = R.string.label_recents), + FilledIconButton( + content = { + Icon( + painter = painterResource(R.drawable.ic_outline_view_apps), + contentDescription = stringResource(id = R.string.label_recents), + ) + }, onClick = { onKeyPressed(KeyEvent.KEYCODE_APP_SWITCH) } @@ -478,10 +499,11 @@ private fun ButtonScreen( @WearPreviewFontScales @Composable private fun NoAccessibilityScreen( + modifier: Modifier = Modifier, onRefresh: () -> Unit = {} ) { Box( - modifier = Modifier + modifier = modifier .fillMaxSize() .wrapContentHeight(), contentAlignment = Alignment.Center @@ -495,7 +517,7 @@ private fun NoAccessibilityScreen( text = stringResource(R.string.message_accessibility_svc_disabled), textAlign = TextAlign.Center ) - CompactChip( + CompactButton( label = { Text(text = stringResource(id = R.string.action_refresh)) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt index 13a11dd9..9778846c 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt @@ -5,14 +5,14 @@ import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavType import androidx.navigation.navArgument -import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState +import androidx.wear.compose.material3.AppScaffold +import androidx.wear.compose.material3.TimeText +import androidx.wear.compose.material3.TimeTextDefaults import androidx.wear.compose.navigation.SwipeDismissableNavHost import androidx.wear.compose.navigation.composable import androidx.wear.compose.navigation.rememberSwipeDismissableNavController -import androidx.wear.compose.navigation.rememberSwipeDismissableNavHostState import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.utils.AnalyticsLogger @@ -20,111 +20,107 @@ import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.controls.AppItemViewModel import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.WearAppTheme -import com.thewizrd.simplewear.ui.theme.findActivity @Composable fun MediaPlayer( startDestination: String = Screen.MediaPlayer.autoLaunch() ) { WearAppTheme { - val context = LocalContext.current - val activity = context.findActivity() - val navController = rememberSwipeDismissableNavController() - val swipeToDismissBoxState = rememberSwipeToDismissBoxState() - val swipeDismissNavState = rememberSwipeDismissableNavHostState( - swipeToDismissBoxState = swipeToDismissBoxState - ) - - SwipeDismissableNavHost( - navController = navController, - startDestination = startDestination, - state = swipeDismissNavState - ) { - composable(route = Screen.MediaPlayerList.route) { - MediaPlayerListUi(navController = navController) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.MediaPlayerList.route) - }) - } + AppScaffold( + timeText = { + TimeText(backgroundColor = TimeTextDefaults.backgroundColor().copy(alpha = 0.5f)) } + ) { + SwipeDismissableNavHost( + navController = navController, + startDestination = startDestination + ) { + composable(route = Screen.MediaPlayerList.route) { + MediaPlayerListUi(navController = navController) - composable( - route = Screen.MediaPlayer.route + "?autoLaunch={autoLaunch}&app={app}", - arguments = listOf( - navArgument("autoLaunch") { - type = NavType.BoolType - defaultValue = false - }, - navArgument("app") { - type = NavType.StringType - nullable = true + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.MediaPlayerList.route) + }) } - ) - ) { backstackEntry -> - val autoLaunch = backstackEntry.arguments?.getBoolean("autoLaunch") - val app = remember(backstackEntry) { - JSONParser.deserializer( - backstackEntry.arguments?.getString("app"), - AppItemViewModel::class.java - ) } - MediaPlayerUi( - navController = navController, - swipeToDismissBoxState = swipeToDismissBoxState, - autoLaunch = autoLaunch ?: (app == null), - app = app - ) - - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.MediaPlayer.route) - app?.let { - putString("app", it.packageName) + composable( + route = Screen.MediaPlayer.route + "?autoLaunch={autoLaunch}&app={app}", + arguments = listOf( + navArgument("autoLaunch") { + type = NavType.BoolType + defaultValue = false + }, + navArgument("app") { + type = NavType.StringType + nullable = true } - }) - } - } + ) + ) { backstackEntry -> + val autoLaunch = backstackEntry.arguments?.getBoolean("autoLaunch") + val app = remember(backstackEntry) { + JSONParser.deserializer( + backstackEntry.arguments?.getString("app"), + AppItemViewModel::class.java + ) + } - composable( - route = Screen.ValueAction.route + "/{actionId}?streamType={streamType}", - arguments = listOf( - navArgument("actionId") { - type = NavType.IntType - }, - navArgument("streamType") { - type = NavType.EnumType(AudioStreamType::class.java) - defaultValue = AudioStreamType.MUSIC + MediaPlayerUi( + navController = navController, + autoLaunch = autoLaunch ?: (app == null), + app = app + ) + + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.MediaPlayer.route) + app?.let { + putString("app", it.packageName) + } + }) } - ) - ) { backstackEntry -> - val actionType = backstackEntry.arguments?.getInt("actionId")?.let { - Actions.valueOf(it) } - val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - backstackEntry.arguments?.getSerializable( - "streamType", - AudioStreamType::class.java + + composable( + route = Screen.ValueAction.route + "/{actionId}?streamType={streamType}", + arguments = listOf( + navArgument("actionId") { + type = NavType.IntType + }, + navArgument("streamType") { + type = NavType.EnumType(AudioStreamType::class.java) + defaultValue = AudioStreamType.MUSIC + } ) - } else { - backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType - } + ) { backstackEntry -> + val actionType = backstackEntry.arguments?.getInt("actionId")?.let { + Actions.valueOf(it) + } + val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + backstackEntry.arguments?.getSerializable( + "streamType", + AudioStreamType::class.java + ) + } else { + backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType + } - ValueActionScreen( - actionType = actionType ?: Actions.VOLUME, - audioStreamType = streamType - ) + ValueActionScreen( + actionType = actionType ?: Actions.VOLUME, + audioStreamType = streamType + ) - LaunchedEffect(navController, actionType) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.ValueAction.route) - actionType?.let { - putString("actionType", it.name) - } - }) + LaunchedEffect(navController, actionType) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.ValueAction.route) + actionType?.let { + putString("actionType", it.name) + } + }) + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index 667d5660..4a8a11ef 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -1,9 +1,6 @@ -@file:OptIn(ExperimentalWearFoundationApi::class, ExperimentalHorologistApi::class) - package com.thewizrd.simplewear.ui.simplewear import android.content.Intent -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,7 +11,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -38,46 +34,40 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import androidx.navigation.NavOptions -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.items -import androidx.wear.compose.foundation.rememberActiveFocusRequester -import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults -import androidx.wear.compose.foundation.rotary.rotaryScrollable -import androidx.wear.compose.material.Checkbox -import androidx.wear.compose.material.Chip -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.CompactChip -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.PositionIndicator -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.ToggleChip -import androidx.wear.compose.material.dialog.Dialog -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.foundation.pager.rememberPagerState +import androidx.wear.compose.material3.AnimatedPage +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.CompactButton +import androidx.wear.compose.material3.Dialog +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.TextToggleButton +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.layout.ScalingLazyColumn -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.ScalingLazyColumnState -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.ListHeaderDefaults -import com.google.android.horologist.compose.material.ResponsiveListHeader +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel -import com.thewizrd.simplewear.helpers.showConfirmationOverlay -import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent -import com.thewizrd.simplewear.ui.components.SwipeToDismissPagerScreen import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.viewmodels.ConfirmationData +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.MediaPlayerListUiState import com.thewizrd.simplewear.viewmodels.MediaPlayerListViewModel @@ -99,37 +89,28 @@ fun MediaPlayerListUi( val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Unspecified, - last = ScalingLazyColumnDefaults.ItemType.Chip, - ) - ) - val pagerState = rememberPagerState( initialPage = 0, pageCount = { 2 } ) - SwipeToDismissPagerScreen( - state = pagerState, + HorizontalPagerScreen( + modifier = modifier, + pagerState = pagerState, hidePagerIndicator = uiState.isLoading, - timeText = { - if (pagerState.currentPage == 0) { - TimeText(modifier = Modifier.scrollAway { scrollState }) - } - } ) { pageIdx -> - if (pageIdx == 0) { - MediaPlayerListScreen( - mediaPlayerListViewModel = mediaPlayerListViewModel, - navController = navController, - scrollState = scrollState - ) - } else { - MediaPlayerListSettings( - mediaPlayerListViewModel = mediaPlayerListViewModel - ) + AnimatedPage(pageIdx, pagerState) { + if (pageIdx == 0) { + MediaPlayerListScreen( + mediaPlayerListViewModel = mediaPlayerListViewModel, + confirmationViewModel = confirmationViewModel, + navController = navController + ) + } else { + MediaPlayerListSettings( + mediaPlayerListViewModel = mediaPlayerListViewModel + ) + } } } @@ -189,9 +170,9 @@ fun MediaPlayerListUi( event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus if (status == ActionStatus.PERMISSION_DENIED) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -231,18 +212,14 @@ fun MediaPlayerListUi( @Composable private fun MediaPlayerListScreen( mediaPlayerListViewModel: MediaPlayerListViewModel, - navController: NavController, - scrollState: ScalingLazyColumnState + confirmationViewModel: ConfirmationViewModel, + navController: NavController ) { - val context = LocalContext.current - val activity = context.findActivity() - val lifecycleOwner = LocalLifecycleOwner.current val uiState by mediaPlayerListViewModel.uiState.collectAsState() MediaPlayerListScreen( uiState = uiState, - scrollState = scrollState, onItemClicked = { lifecycleOwner.lifecycleScope.launch { val success = mediaPlayerListViewModel.startMediaApp(it) @@ -256,7 +233,7 @@ private fun MediaPlayerListScreen( .build() ) } else { - activity.showConfirmationOverlay(false) + confirmationViewModel.showFailure() } } }, @@ -270,13 +247,20 @@ private fun MediaPlayerListScreen( @Composable private fun MediaPlayerListScreen( uiState: MediaPlayerListUiState, - scrollState: ScalingLazyColumnState = rememberResponsiveColumnState(), onItemClicked: (AppItemViewModel) -> Unit = {}, onRefresh: () -> Unit = {} ) { - Box( - modifier = Modifier.fillMaxSize() - ) { + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + contentPadding = contentPadding + ) { contentPadding -> LoadingContent( empty = uiState.mediaAppsSet.isEmpty(), emptyContent = { @@ -296,7 +280,7 @@ private fun MediaPlayerListScreen( text = stringResource(id = R.string.error_nomusicplayers), textAlign = TextAlign.Center ) - CompactChip( + CompactButton( label = { Text(text = stringResource(id = R.string.action_refresh)) }, @@ -313,12 +297,18 @@ private fun MediaPlayerListScreen( }, loading = uiState.isLoading ) { - ScalingLazyColumn( + TransformingLazyColumn( modifier = Modifier.fillMaxSize(), - columnState = scrollState, + state = columnState, + contentPadding = contentPadding ) { item { - ResponsiveListHeader(contentPadding = ListHeaderDefaults.firstItemPadding()) { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { Text(text = stringResource(id = R.string.action_apps)) } } @@ -327,15 +317,18 @@ private fun MediaPlayerListScreen( items = uiState.mediaAppsSet.toList(), key = { Pair(it.activityName, it.packageName) } ) { mediaItem -> - Chip( - modifier = Modifier.fillMaxWidth(), + Button( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), label = { Text(text = mediaItem.appLabel ?: "") }, icon = mediaItem.bitmapIcon?.let { { Icon( - modifier = Modifier.requiredSize(ChipDefaults.IconSize), + modifier = Modifier.requiredSize(ButtonDefaults.IconSize), bitmap = it.asImageBitmap(), contentDescription = mediaItem.appLabel, tint = Color.Unspecified @@ -343,9 +336,9 @@ private fun MediaPlayerListScreen( } }, colors = if (mediaItem.key == uiState.activePlayerKey) { - ChipDefaults.gradientBackgroundChipColors() + ButtonDefaults.filledVariantButtonColors() } else { - ChipDefaults.secondaryChipColors() + ButtonDefaults.filledTonalButtonColors() }, onClick = { onItemClicked(mediaItem) @@ -353,8 +346,6 @@ private fun MediaPlayerListScreen( ) } } - - PositionIndicator(scalingLazyListState = scrollState.state) } } } @@ -367,9 +358,6 @@ private fun MediaPlayerListSettings( MediaPlayerListSettings( uiState = uiState, - onCheckChanged = { - Settings.setAutoLaunchMediaCtrls(it) - }, onCommitSelectedItems = { mediaPlayerListViewModel.updateFilteredApps(it) } @@ -379,55 +367,55 @@ private fun MediaPlayerListSettings( @Composable private fun MediaPlayerListSettings( uiState: MediaPlayerListUiState, - onCheckChanged: (Boolean) -> Unit = {}, onCommitSelectedItems: (Set) -> Unit = {} ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Unspecified, - last = ScalingLazyColumnDefaults.ItemType.Chip, - ) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) + val transformationSpec = rememberTransformationSpec() var showFilterDialog by remember { mutableStateOf(false) } - ScalingLazyColumn( - columnState = scrollState - ) { - item { - ResponsiveListHeader( - modifier = Modifier.fillMaxWidth(), - contentPadding = ListHeaderDefaults.firstItemPadding() - ) { - Text(text = stringResource(id = R.string.title_settings)) - } - } - item { - Chip( - modifier = Modifier.fillMaxWidth(), - label = { - Text(text = stringResource(id = R.string.title_filter_apps)) - }, - onClick = { - showFilterDialog = true - }, - colors = ChipDefaults.secondaryChipColors(), - icon = { - Icon( - painter = painterResource(id = R.drawable.ic_baseline_filter_list_24), - contentDescription = stringResource(id = R.string.title_filter_apps) - ) + ScreenScaffold( + scrollState = columnState, + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding + ) { + item { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { + Text(text = stringResource(id = R.string.title_settings)) } - ) + } + item { + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.title_filter_apps)) + }, + onClick = { + showFilterDialog = true + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_baseline_filter_list_24), + contentDescription = stringResource(id = R.string.title_filter_apps) + ) + } + ) + } } - } - val dialogScrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Unspecified, - last = ScalingLazyColumnDefaults.ItemType.Chip, - ) - ) + } var selectedItems by remember(uiState.filteredAppsList) { mutableStateOf(uiState.filteredAppsList) @@ -435,18 +423,15 @@ private fun MediaPlayerListSettings( Dialog( modifier = Modifier - .fillMaxSize() - .background(MaterialTheme.colors.background), - showDialog = showFilterDialog, + .fillMaxSize(), + visible = showFilterDialog, onDismissRequest = { onCommitSelectedItems.invoke(selectedItems) showFilterDialog = false - }, - scrollState = dialogScrollState.state + } ) { MediaPlayerFilterScreen( uiState = uiState, - dialogScrollState = dialogScrollState, selectedItems = selectedItems, onSelectedItemsChanged = { selectedItems = it @@ -456,34 +441,33 @@ private fun MediaPlayerListSettings( showFilterDialog = false } ) - - LaunchedEffect(showFilterDialog) { - dialogScrollState.state.scrollToItem(0) - } } } @Composable private fun MediaPlayerFilterScreen( uiState: MediaPlayerListUiState, - dialogScrollState: ScalingLazyColumnState = rememberResponsiveColumnState(), selectedItems: Set = emptySet(), onSelectedItemsChanged: (Set) -> Unit = {}, onDismissRequest: () -> Unit = {} ) { - ScalingLazyColumn( - modifier = Modifier - .fillMaxSize() - .rotaryScrollable( - focusRequester = rememberActiveFocusRequester(), - behavior = RotaryScrollableDefaults.behavior(dialogScrollState) - ), - columnState = dialogScrollState, + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding ) { item { - ResponsiveListHeader( - modifier = Modifier.fillMaxWidth(), - contentPadding = ListHeaderDefaults.firstItemPadding() + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) ) { Text(text = stringResource(id = R.string.title_filter_apps)) } @@ -492,8 +476,10 @@ private fun MediaPlayerFilterScreen( items(uiState.allMediaAppsSet.toList()) { val isChecked = selectedItems.contains(it.packageName!!) - ToggleChip( - modifier = Modifier.fillMaxWidth(), + TextToggleButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), checked = isChecked, onCheckedChange = { checked -> onSelectedItemsChanged.invoke( @@ -504,15 +490,10 @@ private fun MediaPlayerFilterScreen( } ) }, - label = { + content = { Text( text = it.appLabel!! ) - }, - toggleControl = { - Checkbox( - checked = isChecked - ) } ) } @@ -522,8 +503,11 @@ private fun MediaPlayerFilterScreen( } item { - Chip( - modifier = Modifier.fillMaxWidth(), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), label = { Text(text = stringResource(id = R.string.clear_all)) }, @@ -535,17 +519,16 @@ private fun MediaPlayerFilterScreen( }, onClick = { onSelectedItemsChanged.invoke(emptySet()) - }, - colors = ChipDefaults.secondaryChipColors( - backgroundColor = MaterialTheme.colors.onBackground, - contentColor = MaterialTheme.colors.background - ) + } ) } item { - Chip( - modifier = Modifier.fillMaxWidth(), + Button( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), label = { Text(text = stringResource(id = android.R.string.ok)) }, @@ -557,8 +540,7 @@ private fun MediaPlayerFilterScreen( }, onClick = { onDismissRequest.invoke() - }, - colors = ChipDefaults.primaryChipColors() + } ) } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index 78b353c7..e8f89182 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -1,27 +1,27 @@ -@file:OptIn( - ExperimentalHorologistApi::class, ExperimentalFoundationApi::class, - ExperimentalWearFoundationApi::class, ExperimentalWearMaterialApi::class -) +@file:OptIn(ExperimentalHorologistApi::class) package com.thewizrd.simplewear.ui.simplewear import android.content.Intent -import androidx.compose.foundation.ExperimentalFoundationApi +import android.graphics.Bitmap import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect @@ -33,17 +33,19 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmap @@ -52,44 +54,54 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import androidx.navigation.NavOptions -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi -import androidx.wear.compose.foundation.SwipeToDismissBoxState +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.items -import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.foundation.pager.rememberPagerState import androidx.wear.compose.foundation.rotary.rotaryScrollable -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.CompactChip -import androidx.wear.compose.material.ExperimentalWearMaterialApi -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.CompactButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.ListHeaderDefaults +import androidx.wear.compose.material3.PageIndicatorDefaults +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight +import androidx.wear.compose.material3.touchTargetAwareSize import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.audio.ui.VolumePositionIndicator import com.google.android.horologist.audio.ui.VolumeUiState import com.google.android.horologist.audio.ui.VolumeViewModel -import com.google.android.horologist.audio.ui.components.actions.SettingsButton -import com.google.android.horologist.audio.ui.volumeRotaryBehavior +import com.google.android.horologist.audio.ui.material3.VolumeLevelIndicator +import com.google.android.horologist.audio.ui.material3.components.actions.SettingsButton +import com.google.android.horologist.audio.ui.material3.components.actions.SettingsButtonDefaults +import com.google.android.horologist.audio.ui.material3.volumeRotaryBehavior import com.google.android.horologist.compose.ambient.AmbientAware import com.google.android.horologist.compose.ambient.AmbientState -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.Chip +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding +import com.google.android.horologist.images.base.paintable.BitmapPaintable.Companion.asPaintable import com.google.android.horologist.media.model.PlaybackStateEvent import com.google.android.horologist.media.model.TimestampProvider -import com.google.android.horologist.media.ui.components.ControlButtonLayout -import com.google.android.horologist.media.ui.components.animated.AnimatedMediaControlButtons -import com.google.android.horologist.media.ui.components.animated.MarqueeTextMediaDisplay -import com.google.android.horologist.media.ui.components.controls.MediaButton -import com.google.android.horologist.media.ui.components.display.LoadingMediaDisplay -import com.google.android.horologist.media.ui.components.display.NothingPlayingDisplay -import com.google.android.horologist.media.ui.screens.player.PlayerScreen +import com.google.android.horologist.media.ui.material3.components.ButtonGroupLayoutDefaults +import com.google.android.horologist.media.ui.material3.components.ambient.AmbientMediaControlButtons +import com.google.android.horologist.media.ui.material3.components.ambient.AmbientMediaInfoDisplay +import com.google.android.horologist.media.ui.material3.components.ambient.AmbientSeekToNextButton +import com.google.android.horologist.media.ui.material3.components.ambient.AmbientSeekToPreviousButton +import com.google.android.horologist.media.ui.material3.components.animated.AnimatedMediaControlButtons +import com.google.android.horologist.media.ui.material3.components.animated.AnimatedMediaInfoDisplay +import com.google.android.horologist.media.ui.material3.components.background.ArtworkImageBackground +import com.google.android.horologist.media.ui.material3.components.display.TextMediaDisplay +import com.google.android.horologist.media.ui.material3.screens.player.PlayerScreen import com.google.android.horologist.media.ui.state.LocalTimestampProvider import com.google.android.horologist.media.ui.state.mapper.TrackPositionUiModelMapper +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.AudioStreamState import com.thewizrd.shared_resources.actions.AudioStreamType @@ -111,25 +123,24 @@ import com.thewizrd.simplewear.media.PlayerUiController import com.thewizrd.simplewear.media.toPlaybackStateEvent import com.thewizrd.simplewear.ui.ambient.ambientMode import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent -import com.thewizrd.simplewear.ui.components.ScalingLazyColumn -import com.thewizrd.simplewear.ui.components.SwipeToDismissPagerScreen import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester -import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch @Composable fun MediaPlayerUi( modifier: Modifier = Modifier, navController: NavController, - swipeToDismissBoxState: SwipeToDismissBoxState = rememberSwipeToDismissBoxState(), app: AppItemViewModel? = null, autoLaunch: Boolean = (app == null), ) { @@ -150,8 +161,6 @@ fun MediaPlayerUi( val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - val isRoot = navController.previousBackStackEntry == null - val pagerState = rememberPagerState( initialPage = 0, pageCount = { mediaPagerState.pageCount } @@ -190,18 +199,12 @@ fun MediaPlayerUi( } } - SwipeToDismissPagerScreen( + HorizontalPagerScreen( modifier = modifier, - isRoot = isRoot, - swipeToDismissBoxState = swipeToDismissBoxState, - state = pagerState, + pagerState = pagerState, hidePagerIndicator = ambientState.isAmbient || uiState.isLoading || !uiState.isPlayerAvailable, - timeText = { - if (pagerState.currentPage == 0) { - TimeText() - } - }, - pagerKey = keyFunc + pagerKey = keyFunc, + pagerIndicatorBackgroundColor = PageIndicatorDefaults.backgroundColor.copy(alpha = 0.5f) ) { pageIdx -> val key = keyFunc(pageIdx) @@ -312,9 +315,9 @@ fun MediaPlayerUi( event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus if (actionStatus == ActionStatus.PERMISSION_DENIED) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -327,11 +330,7 @@ fun MediaPlayerUi( event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus if (actionStatus == ActionStatus.TIMEOUT) { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_playback_failed) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_playback_failed)) } } } @@ -433,92 +432,114 @@ private fun MediaPlayerControlsPage( // Progress val timestampProvider = remember { TimestampProvider { System.currentTimeMillis() } } - LoadingContent( - empty = !uiState.isPlayerAvailable && !isAmbient, - emptyContent = { - Box( - modifier = Modifier - .fillMaxSize() - .wrapContentHeight(), - contentAlignment = Alignment.Center - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + scrollIndicator = { + VolumeLevelIndicator( + volumeUiState = { volumeUiState }, + displayIndicatorEvents = displayVolumeIndicatorEvents + ) + } + ) { contentPadding -> + LoadingContent( + empty = !uiState.isPlayerAvailable && !isAmbient, + emptyContent = { + Box( + modifier = Modifier + .padding(contentPadding) + .fillMaxSize() + .wrapContentHeight(), + contentAlignment = Alignment.Center ) { - Text( - modifier = Modifier.padding(horizontal = 14.dp), - text = stringResource(id = R.string.error_nomusicplayers), - textAlign = TextAlign.Center - ) - CompactChip( - label = { - Text(text = stringResource(id = R.string.action_retry)) - }, - icon = { - Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), - contentDescription = stringResource(id = R.string.action_retry) - ) - }, - onClick = onRefresh - ) + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + modifier = Modifier.padding(horizontal = 14.dp), + text = stringResource(id = R.string.error_nomusicplayers), + textAlign = TextAlign.Center + ) + CompactButton( + label = { + Text(text = stringResource(id = R.string.action_retry)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + contentDescription = stringResource(id = R.string.action_retry) + ) + }, + onClick = onRefresh + ) + } } - } - }, - loading = uiState.isLoading && !isAmbient - ) { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center, + }, + loading = uiState.isLoading && !isAmbient ) { - PlayerScreen( - modifier = modifier, - mediaDisplay = { - if (uiState.isPlaybackLoading && !isAmbient) { - LoadingMediaDisplay() - } else if (!playerState.isEmpty()) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + PlayerScreen( + modifier = modifier, + mediaDisplay = { + val mediaUiModel = remember(playerState, uiState.isPlaybackLoading) { + if (!playerState.isEmpty() && !uiState.isPlaybackLoading) { + MediaUiModel.Ready( + id = "", + title = playerState.title ?: "", + subtitle = playerState.artist ?: "" + ) + } else { + MediaUiModel.Loading + } + } + if (!isAmbient) { - MarqueeTextMediaDisplay( - title = playerState.title, - artist = playerState.artist + AnimatedMediaInfoDisplay( + media = mediaUiModel, + loading = uiState.isPlaybackLoading ) } else { - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - text = playerState.title.orEmpty(), - modifier = Modifier - .fillMaxWidth(0.7f) - .padding(top = 2.dp, bottom = .8.dp), - color = MaterialTheme.colors.onBackground, - textAlign = TextAlign.Center, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - style = MaterialTheme.typography.button, - ) - Text( - text = playerState.artist.orEmpty(), - modifier = Modifier - .fillMaxWidth(0.8f) - .padding(top = 2.dp, bottom = .6.dp), - color = MaterialTheme.colors.onBackground, - textAlign = TextAlign.Center, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - style = MaterialTheme.typography.body2, + AmbientMediaInfoDisplay( + media = mediaUiModel, + loading = uiState.isPlaybackLoading + ) + } + }, + controlButtons = { + if (!isAmbient) { + CompositionLocalProvider(LocalTimestampProvider provides timestampProvider) { + AnimatedMediaControlButtons( + onPlayButtonClick = { + playerUiController.play() + }, + onPauseButtonClick = { + playerUiController.pause() + }, + playPauseButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, + playing = playerState.playbackState == PlaybackState.PLAYING, + onSeekToPreviousButtonClick = { + playerUiController.skipToPreviousMedia() + }, + seekToPreviousButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, + onSeekToNextButtonClick = { + playerUiController.skipToNextMedia() + }, + seekToNextButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, + trackPositionUiModel = TrackPositionUiModelMapper.map( + playbackStateEvent + ) ) } - } - } else { - NothingPlayingDisplay() - } - }, - controlButtons = { - if (!isAmbient) { - CompositionLocalProvider(LocalTimestampProvider provides timestampProvider) { - AnimatedMediaControlButtons( + } else { + val leftButtonPadding = + ButtonGroupLayoutDefaults.getSideButtonsPadding(isLeftButton = true) + val rightButtonPadding = + ButtonGroupLayoutDefaults.getSideButtonsPadding(isLeftButton = false) + + AmbientMediaControlButtons( onPlayButtonClick = { playerUiController.play() }, @@ -527,123 +548,292 @@ private fun MediaPlayerControlsPage( }, playPauseButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, playing = playerState.playbackState == PlaybackState.PLAYING, - onSeekToPreviousButtonClick = { - playerUiController.skipToPreviousMedia() - }, - seekToPreviousButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, - onSeekToNextButtonClick = { - playerUiController.skipToNextMedia() - }, - seekToNextButtonEnabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, - trackPositionUiModel = TrackPositionUiModelMapper.map( - playbackStateEvent - ) - ) - } - } else { - ControlButtonLayout( - leftButton = {}, - middleButton = { - Box( - modifier = Modifier - .fillMaxSize() - .clip(CircleShape), - contentAlignment = Alignment.Center, - ) { - if (playerState.playbackState == PlaybackState.PLAYING) { - MediaButton( - onClick = {}, - icon = ImageVector.vectorResource(id = R.drawable.ic_outline_pause_24), - contentDescription = stringResource(id = R.string.horologist_pause_button_content_description) - ) - } else { - MediaButton( - onClick = {}, - icon = ImageVector.vectorResource(id = R.drawable.ic_outline_play_arrow_24), - contentDescription = stringResource(id = R.string.horologist_play_button_content_description) - ) - } - } - }, - rightButton = {} - ) - } - }, - buttons = { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - if (!isAmbient) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - SettingsButton( - onClick = onVolumeDown, - imageVector = ImageVector.vectorResource(id = R.drawable.ic_baseline_volume_down_24), - contentDescription = stringResource(R.string.horologist_volume_screen_volume_down_content_description), - tapTargetSize = ButtonDefaults.ExtraSmallButtonSize - ) - Spacer(modifier = Modifier.width(10.dp)) - uiState.mediaPlayerDetails.bitmapIcon?.let { - Image( - modifier = Modifier - .size(32.dp) - .clickable(onClick = onOpenPlayerList), - bitmap = it.asImageBitmap(), - contentDescription = stringResource(R.string.desc_open_player_list) + leftButton = { + AmbientSeekToPreviousButton( + onClick = { + playerUiController.skipToPreviousMedia() + }, + buttonPadding = leftButtonPadding, + enabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, ) - } ?: run { - Image( - modifier = Modifier - .size(32.dp) - .clickable(onClick = onOpenPlayerList), - painter = painterResource(R.drawable.ic_play_circle_filled_white_24dp), - contentDescription = stringResource(R.string.desc_open_player_list) + }, + rightButton = { + AmbientSeekToNextButton( + onClick = { + playerUiController.skipToNextMedia() + }, + buttonPadding = rightButtonPadding, + enabled = !uiState.isPlaybackLoading || playerState.playbackState > PlaybackState.LOADING, ) } - Spacer(modifier = Modifier.width(10.dp)) - SettingsButton( - onClick = onVolumeUp, - imageVector = ImageVector.vectorResource(id = R.drawable.ic_volume_up_white_24dp), - contentDescription = stringResource(R.string.horologist_volume_screen_volume_up_content_description), - tapTargetSize = ButtonDefaults.ExtraSmallButtonSize - ) - } + ) } - } - }, - background = { - playerState.artworkBitmap?.takeUnless { isAmbient }?.let { - Image( + }, + buttons = { + SettingsButtonsLayout( modifier = Modifier.fillMaxSize(), - bitmap = it.asImageBitmap(), - colorFilter = ColorFilter.tint( - Color.Black.copy(alpha = 0.66f), - BlendMode.SrcAtop + isAmbient = isAmbient, + leftButton = SettingsButtonData( + onClick = onVolumeDown, + imageVector = ImageVector.vectorResource(id = R.drawable.ic_baseline_volume_down_24), + contentDescription = stringResource(R.string.horologist_volume_screen_volume_down_content_description) + ), + brandImage = BrandImageData( + bitmap = uiState.mediaPlayerDetails.bitmapIcon, + onClick = onOpenPlayerList ), - contentDescription = stringResource(R.string.desc_artwork) + rightButton = SettingsButtonData( + onClick = onVolumeUp, + imageVector = ImageVector.vectorResource(id = R.drawable.ic_volume_up_white_24dp), + contentDescription = stringResource(R.string.horologist_volume_screen_volume_up_content_description) + ) + ) + }, + background = { + ArtworkImageBackground( + artwork = playerState.artworkBitmap?.takeUnless { isAmbient } + ?.asPaintable() ) } + ) + + LaunchedEffect(uiState, uiState.pagerState) { + if (uiState.pagerState.currentPageKey == MediaPageType.Player) { + delay(500) + focusRequester.requestFocus() + } } - ) + } + } + } +} - VolumePositionIndicator( - volumeUiState = { volumeUiState }, - displayIndicatorEvents = displayVolumeIndicatorEvents +private data class SettingsButtonData( + val imageVector: ImageVector, + val contentDescription: String, + val onClick: () -> Unit +) + +private data class BrandImageData( + val imageVector: ImageVector? = null, + val painter: Painter? = null, + val bitmap: Bitmap? = null, + val onClick: () -> Unit +) + +@Composable +private fun SettingsButtonsLayout( + modifier: Modifier = Modifier, + isAmbient: Boolean, + leftButton: SettingsButtonData, + brandImage: BrandImageData, + rightButton: SettingsButtonData, +) { + val isRound = LocalConfiguration.current.isScreenRound + + if (isRound) { + RoundSettingsButtonsLayout( + modifier = modifier, + isAmbient = isAmbient, + leftButton = leftButton, + brandImage = brandImage, + rightButton = rightButton + ) + } else { + SimpleSettingsButtonsLayout( + modifier = modifier, + isAmbient = isAmbient, + leftButton = leftButton, + brandImage = brandImage, + rightButton = rightButton + ) + } +} + +@Composable +private fun SimpleSettingsButtonsLayout( + modifier: Modifier = Modifier, + isAmbient: Boolean, + leftButton: SettingsButtonData, + brandImage: BrandImageData, + rightButton: SettingsButtonData, +) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Spacer(modifier = Modifier.fillMaxWidth(0.11f)) + SettingsButton( + modifier = Modifier.weight(1f), + onClick = leftButton.onClick, + imageVector = leftButton.imageVector, + contentDescription = leftButton.contentDescription, + iconSize = ButtonDefaults.ExtraSmallIconSize, + buttonColors = if (!isAmbient) { + SettingsButtonDefaults.buttonColors() + } else { + SettingsButtonDefaults.ambientButtonColors() + }, + border = if (!isAmbient) { + null + } else { + SettingsButtonDefaults.ambientButtonBorder(true) + } + ) + Box( + modifier = Modifier + .weight(1f) + .fillMaxSize() + .clickable(onClick = brandImage.onClick), + contentAlignment = Alignment.Center + ) { + BrandImage(brandImage) + } + SettingsButton( + modifier = Modifier.weight(1f), + onClick = rightButton.onClick, + imageVector = rightButton.imageVector, + contentDescription = rightButton.contentDescription, + iconSize = ButtonDefaults.ExtraSmallIconSize, + buttonColors = if (!isAmbient) { + SettingsButtonDefaults.buttonColors() + } else { + SettingsButtonDefaults.ambientButtonColors() + }, + border = if (!isAmbient) { + null + } else { + SettingsButtonDefaults.ambientButtonBorder(true) + } ) + Spacer(modifier = Modifier.fillMaxWidth(0.11f)) + } + } +} - LaunchedEffect(uiState, uiState.pagerState) { - if (uiState.pagerState.currentPageKey == MediaPageType.Player) { - delay(500) - focusRequester.requestFocus() +@Composable +private fun RoundSettingsButtonsLayout( + modifier: Modifier = Modifier, + isAmbient: Boolean, + leftButton: SettingsButtonData, + brandImage: BrandImageData, + rightButton: SettingsButtonData, +) { + val screenHeightDp = LocalConfiguration.current.screenHeightDp + val isLargeWidth = LocalConfiguration.current.screenWidthDp >= 225 + val horizontalSpacerFraction = if (isLargeWidth) 0.11f else 0.145f + + BoxWithConstraints( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Row( + modifier = Modifier.padding(bottom = (maxHeight * 0.012f)), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Spacer(modifier = Modifier.fillMaxWidth(horizontalSpacerFraction)) + if (isLargeWidth) { + SettingsButton( + modifier = Modifier.weight(1f), + alignment = Alignment.TopCenter, + onClick = leftButton.onClick, + imageVector = leftButton.imageVector, + contentDescription = leftButton.contentDescription, + iconSize = ButtonDefaults.ExtraSmallIconSize, + buttonColors = if (!isAmbient) { + SettingsButtonDefaults.buttonColors() + } else { + SettingsButtonDefaults.ambientButtonColors() + }, + border = if (!isAmbient) { + null + } else { + SettingsButtonDefaults.ambientButtonBorder(true) + } + ) + } + Box( + modifier = Modifier + .weight(1f) + .fillMaxSize() + .padding( + bottom = if (isLargeWidth) { + (screenHeightDp * 0.03f).dp + } else { + 0.dp + } + ) + .clickable( + onClick = brandImage.onClick, + indication = null, + interactionSource = null, + role = Role.Button + ), + contentAlignment = if (isLargeWidth) { + Alignment.BottomCenter + } else { + Alignment.TopCenter } + ) { + BrandImage(brandImage) } + SettingsButton( + modifier = Modifier.weight(1f), + alignment = Alignment.TopCenter, + onClick = rightButton.onClick, + imageVector = rightButton.imageVector, + contentDescription = rightButton.contentDescription, + iconSize = ButtonDefaults.ExtraSmallIconSize, + buttonColors = if (!isAmbient) { + SettingsButtonDefaults.buttonColors() + } else { + SettingsButtonDefaults.ambientButtonColors() + }, + border = if (!isAmbient) { + null + } else { + SettingsButtonDefaults.ambientButtonBorder(true) + } + ) + Spacer(modifier = Modifier.fillMaxWidth(horizontalSpacerFraction)) } } } +@Composable +private fun BrandImage(data: BrandImageData) { + if (data.imageVector != null) { + Image( + modifier = Modifier.touchTargetAwareSize(IconButtonDefaults.LargeIconSize), + imageVector = data.imageVector, + contentDescription = stringResource(R.string.desc_open_player_list) + ) + } else if (data.painter != null) { + Image( + modifier = Modifier.touchTargetAwareSize(IconButtonDefaults.LargeIconSize), + painter = data.painter, + contentDescription = stringResource(R.string.desc_open_player_list) + ) + } else if (data.bitmap != null) { + Image( + modifier = Modifier.touchTargetAwareSize(IconButtonDefaults.LargeIconSize), + bitmap = data.bitmap.asImageBitmap(), + contentDescription = stringResource(R.string.desc_open_player_list) + ) + } else { + Image( + modifier = Modifier.touchTargetAwareSize(IconButtonDefaults.LargeIconSize), + painter = painterResource(R.drawable.ic_play_circle_filled_white_24dp), + contentDescription = stringResource(R.string.desc_open_player_list) + ) + } +} + @Composable private fun MediaCustomControlsPage( mediaPlayerViewModel: MediaPlayerViewModel @@ -675,29 +865,62 @@ private fun MediaCustomControlsPage( emptyContent = {}, loading = uiState.isLoading ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Chip, - last = ScalingLazyColumnDefaults.ItemType.Chip - ) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) + val transformationSpec = rememberTransformationSpec() - Box( - modifier = Modifier.fillMaxSize() - ) { - TimeText(Modifier.scrollAway { scrollState }) - - ScalingLazyColumn( - scrollState = scrollState, - focusRequester = focusRequester + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + modifier = Modifier + .fillMaxSize() + .focusable() + .focusRequester(focusRequester), + state = columnState, + contentPadding = contentPadding ) { + item { + ListHeader( + contentPadding = PaddingValues( + start = ListHeaderDefaults.ContentPadding.calculateStartPadding( + LocalLayoutDirection.current + ), + top = 0.dp, + end = ListHeaderDefaults.ContentPadding.calculateEndPadding( + LocalLayoutDirection.current + ), + bottom = ListHeaderDefaults.ContentPadding.calculateBottomPadding() + ) + ) { + TextMediaDisplay( + title = uiState.playerState.title ?: "", + subtitle = uiState.playerState.artist ?: "", + titleIcon = uiState.mediaPlayerDetails.bitmapIcon?.asPaintable() + ) + } + } + items(uiState.mediaCustomItems) { item -> - Chip( - label = item.title ?: "", + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = item.title ?: "") + }, + secondaryLabel = item.subTitle?.let { + { Text(text = it) } + }, icon = { item.icon?.let { bmp -> Icon( - modifier = Modifier.size(ChipDefaults.IconSize), + modifier = Modifier.size(ButtonDefaults.IconSize), bitmap = bmp.asImageBitmap(), tint = Color.White, contentDescription = item.title @@ -706,14 +929,13 @@ private fun MediaCustomControlsPage( }, onClick = { onItemClick(item) - }, - colors = ChipDefaults.secondaryChipColors() + } ) } } LaunchedEffect(Unit) { - scrollState.state.scrollToItem(0) + columnState.scrollToItem(0) } LaunchedEffect(uiState, uiState.pagerState) { @@ -751,48 +973,78 @@ private fun MediaBrowserPage( focusRequester: FocusRequester = rememberFocusRequester(), onItemClick: (MediaItemModel) -> Unit = {} ) { - LoadingContent( - empty = false, - emptyContent = {}, - loading = uiState.isLoading - ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Chip, - last = ScalingLazyColumnDefaults.ItemType.Chip - ) - ) - - Box( - modifier = Modifier.fillMaxSize() + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + contentPadding = contentPadding + ) { contentPadding -> + LoadingContent( + empty = false, + emptyContent = {}, + loading = uiState.isLoading ) { - TimeText(Modifier.scrollAway { scrollState }) - - ScalingLazyColumn( - scrollState = scrollState, - focusRequester = focusRequester + TransformingLazyColumn( + modifier = Modifier.fillMaxSize(), + state = columnState, + contentPadding = contentPadding ) { + item { + ListHeader( + contentPadding = PaddingValues( + start = ListHeaderDefaults.ContentPadding.calculateStartPadding( + LocalLayoutDirection.current + ), + top = 0.dp, + end = ListHeaderDefaults.ContentPadding.calculateEndPadding( + LocalLayoutDirection.current + ), + bottom = ListHeaderDefaults.ContentPadding.calculateBottomPadding() + ) + ) { + TextMediaDisplay( + title = uiState.playerState.title ?: "", + subtitle = uiState.playerState.artist ?: "", + titleIcon = uiState.mediaPlayerDetails.bitmapIcon?.asPaintable() + ) + } + } + items(uiState.mediaBrowserItems) { item -> - Chip( - label = if (item.id == MediaHelper.ACTIONITEM_BACK) { - stringResource(id = R.string.label_back) - } else { - item.title ?: "" + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text( + text = if (item.id == MediaHelper.ACTIONITEM_BACK) { + stringResource(id = R.string.label_back) + } else { + item.title ?: "" + } + ) + }, + secondaryLabel = item.takeIf { it.id != MediaHelper.ACTIONITEM_BACK }?.subTitle?.let { + { Text(text = it) } }, icon = { if (item.id == MediaHelper.ACTIONITEM_BACK) { Icon( - modifier = Modifier.size(ChipDefaults.IconSize), + modifier = Modifier.size(ButtonDefaults.IconSize), painter = painterResource(id = R.drawable.ic_baseline_arrow_back_24), - tint = Color.White, contentDescription = stringResource(id = R.string.label_back) ) } else { item.icon?.let { bmp -> Icon( - modifier = Modifier.size(ChipDefaults.IconSize), + modifier = Modifier.size(ButtonDefaults.IconSize), bitmap = bmp.asImageBitmap(), - tint = Color.White, contentDescription = item.title ) } @@ -800,14 +1052,13 @@ private fun MediaBrowserPage( }, onClick = { onItemClick(item) - }, - colors = ChipDefaults.secondaryChipColors() + } ) } } LaunchedEffect(Unit) { - scrollState.state.scrollToItem(0) + columnState.scrollToItem(0) } LaunchedEffect(uiState, uiState.pagerState) { @@ -845,65 +1096,109 @@ private fun MediaQueuePage( focusRequester: FocusRequester = rememberFocusRequester(), onItemClick: (MediaItemModel) -> Unit = {} ) { - val lifecycleOwner = LocalLifecycleOwner.current - - LoadingContent( - empty = false, - emptyContent = {}, - loading = uiState.isLoading - ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Chip, - last = ScalingLazyColumnDefaults.ItemType.Chip - ) - ) + val context = LocalContext.current + val activeQueueItemIndex = remember(uiState.activeQueueItemId, uiState.mediaQueueItems) { + (uiState.activeQueueItemId.takeIf { it > -1L }?.let { activeId -> + uiState.mediaQueueItems.indexOfFirst { it.id.toLong() == activeId }.takeIf { it > 0 } + } ?: 0) + 1 + } - Box( - modifier = Modifier.fillMaxSize() + val columnState = rememberTransformingLazyColumnState( + initialAnchorItemIndex = 1 + ) + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + contentPadding = contentPadding + ) { contentPadding -> + LoadingContent( + empty = false, + emptyContent = {}, + loading = uiState.isLoading ) { - TimeText(Modifier.scrollAway { scrollState }) - - ScalingLazyColumn( - scrollState = scrollState, - focusRequester = focusRequester + TransformingLazyColumn( + modifier = Modifier.fillMaxSize(), + state = columnState, + contentPadding = contentPadding ) { + item { + ListHeader( + contentPadding = PaddingValues( + start = ListHeaderDefaults.ContentPadding.calculateStartPadding( + LocalLayoutDirection.current + ), + top = 0.dp, + end = ListHeaderDefaults.ContentPadding.calculateEndPadding( + LocalLayoutDirection.current + ), + bottom = ListHeaderDefaults.ContentPadding.calculateBottomPadding() + ) + ) { + TextMediaDisplay( + title = uiState.playerState.title ?: "", + subtitle = uiState.playerState.artist ?: "", + titleIcon = uiState.mediaPlayerDetails.bitmapIcon?.asPaintable() + ) + } + } + items(uiState.mediaQueueItems) { item -> - Chip( - label = item.title ?: "", - icon = { - item.icon?.let { bmp -> - Icon( - modifier = Modifier.size(ChipDefaults.IconSize), + Button( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = item.title ?: "") + }, + secondaryLabel = item.subTitle?.let { + { Text(text = it) } + }, + icon = item.icon?.let { bmp -> + { + Image( + modifier = Modifier + .size(ButtonDefaults.IconSize) + .clip(RoundedCornerShape(4.dp)), bitmap = bmp.asImageBitmap(), - contentDescription = item.title, - tint = Color.Unspecified + contentDescription = item.title ) } + } ?: run { + if (item.id.toLong() == uiState.activeQueueItemId) { + { + Icon( + modifier = Modifier.size(ButtonDefaults.IconSize), + painter = painterResource(id = R.drawable.rounded_equalizer_24), + contentDescription = item.title + ) + } + } else { + null + } }, onClick = { onItemClick(item) - lifecycleOwner.lifecycleScope.launch { - delay(1000) - scrollState.state.scrollToItem(0) - } }, colors = if (item.id.toLong() == uiState.activeQueueItemId) { - ChipDefaults.gradientBackgroundChipColors() + ButtonDefaults.filledVariantButtonColors() } else { - ChipDefaults.secondaryChipColors() + ButtonDefaults.filledTonalButtonColors() } ) } } - LaunchedEffect(Unit) { - if (uiState.activeQueueItemId != -1L) { - uiState.mediaQueueItems.indexOfFirst { - it.id.toLong() == uiState.activeQueueItemId - }.takeIf { it > 0 }?.run { - scrollState.state.scrollToItem(this) - } + LaunchedEffect(uiState.activeQueueItemId, uiState.mediaQueueItems) { + delay(500) + + if (isActive && !columnState.isScrollInProgress) { + columnState.animateScrollToItem(activeQueueItemIndex) } } @@ -998,16 +1293,65 @@ private fun PreviewCustomControls() { val uiState = remember { MediaPlayerUiState( isPlayerAvailable = true, + playerState = PlayerState( + playbackState = PlaybackState.PLAYING, + title = "Title", + artist = "Artist", + artworkBitmap = ContextCompat.getDrawable(context, R.drawable.sample_image)!! + .toBitmap() + ), + mediaPlayerDetails = AppItemViewModel().apply { + activityName = "Media Player" + bitmapIcon = + ContextCompat.getDrawable(context, R.mipmap.ic_launcher_round)!!.toBitmap() + }, mediaCustomItems = List(5) { MediaItemModel(it.toString()).apply { title = "Item ${it + 1}" icon = ContextCompat.getDrawable(context, R.drawable.ic_icon)!!.toBitmap() } - } + }, + activeQueueItemId = 0 ) } MediaCustomControlsPage( uiState = uiState ) +} + +@WearPreviewDevices +@WearPreviewFontScales +@Composable +private fun PreviewMediaQueue() { + val context = LocalContext.current + + val uiState = remember { + MediaPlayerUiState( + isPlayerAvailable = true, + playerState = PlayerState( + playbackState = PlaybackState.PLAYING, + title = "Title", + artist = "Artist", + artworkBitmap = ContextCompat.getDrawable(context, R.drawable.sample_image)!! + .toBitmap() + ), + mediaPlayerDetails = AppItemViewModel().apply { + activityName = "Media Player" + bitmapIcon = + ContextCompat.getDrawable(context, R.mipmap.ic_launcher_round)!!.toBitmap() + }, + mediaQueueItems = List(5) { + MediaItemModel(it.toString()).apply { + title = "Item ${it + 1}" + icon = ContextCompat.getDrawable(context, R.drawable.sample_image)!!.toBitmap() + } + }, + activeQueueItemId = 0 + ) + } + + MediaQueuePage( + uiState = uiState + ) } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt index 84da6104..49c47107 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt @@ -7,7 +7,9 @@ import android.content.Intent import android.os.Build import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.background +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -18,15 +20,17 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -36,18 +40,18 @@ import androidx.core.content.ContextCompat import androidx.core.content.PermissionChecker import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope -import androidx.wear.compose.material.Button -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.CircularProgressIndicator -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.ListHeader -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Scaffold -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.Vignette -import androidx.wear.compose.material.VignettePosition -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices +import androidx.wear.compose.material3.AppScaffold +import androidx.wear.compose.material3.ArcProgressIndicator +import androidx.wear.compose.material3.ArcProgressIndicatorDefaults +import androidx.wear.compose.material3.CircularProgressIndicator +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.ProgressIndicatorDefaults +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.thewizrd.shared_resources.helpers.WearConnectionStatus @@ -55,6 +59,7 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.PhoneSyncUiState import com.thewizrd.simplewear.viewmodels.PhoneSyncViewModel import kotlinx.coroutines.Dispatchers @@ -69,10 +74,8 @@ fun PhoneSyncUi( val phoneSyncViewModel = activityViewModel() WearAppTheme { - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - timeText = { TimeText() }, + AppScaffold( + modifier = modifier ) { PhoneSyncUi(phoneSyncViewModel) } @@ -163,11 +166,13 @@ private fun PhoneSyncUi( val context = LocalContext.current val isRound = LocalConfiguration.current.isScreenRound - Box( + ScreenScaffold( modifier = Modifier.fillMaxSize() - ) { + ) { contentPadding -> Column( - modifier = Modifier.fillMaxSize() + modifier = Modifier + .padding(contentPadding) + .fillMaxSize() ) { ListHeader( modifier = Modifier @@ -202,7 +207,6 @@ private fun PhoneSyncUi( } }, overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.button, textAlign = TextAlign.Center ) } @@ -215,14 +219,12 @@ private fun PhoneSyncUi( horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally) ) { if (uiState.showWifiButton) { - Button( - modifier = Modifier.requiredSize(36.dp), - onClick = onWifiButtonClicked, - colors = ButtonDefaults.primaryButtonColors( - backgroundColor = colorResource(id = R.color.colorPrimary) - ) + FilledIconButton( + modifier = Modifier.requiredSize(IconButtonDefaults.ExtraSmallButtonSize), + onClick = onWifiButtonClicked ) { Icon( + modifier = Modifier.requiredSize(IconButtonDefaults.SmallIconSize - 4.dp), painter = painterResource(id = R.drawable.ic_network_wifi_white_24dp), contentDescription = stringResource(id = R.string.action_wifi) ) @@ -232,23 +234,42 @@ private fun PhoneSyncUi( Box( contentAlignment = Alignment.Center ) { - if (uiState.isLoading) { - CircularProgressIndicator( - modifier = Modifier.requiredSize(44.dp), - trackColor = Color.Transparent, - strokeWidth = 4.dp - ) + if (!isRound) { + Box { + var isVisible by remember { mutableStateOf(true) } + + androidx.compose.animation.AnimatedVisibility( + visible = isVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + CircularProgressIndicator( + modifier = Modifier.requiredSize(IconButtonDefaults.ExtraSmallButtonSize + 12.dp), + strokeWidth = 4.dp, + colors = ProgressIndicatorDefaults.colors( + trackColor = Color.Transparent, + indicatorColor = MaterialTheme.colorScheme.onSurface + ) + ) + } + + LaunchedEffect(uiState.isLoading) { + if (!uiState.isLoading) { + delay(500) + } + if (isActive) { + isVisible = uiState.isLoading + } + } + } } - Button( - modifier = Modifier.requiredSize(36.dp), - onClick = onSyncButtonClicked, - colors = ButtonDefaults.primaryButtonColors( - backgroundColor = colorResource(id = R.color.colorPrimary) - ) + FilledIconButton( + modifier = Modifier.requiredSize(IconButtonDefaults.ExtraSmallButtonSize), + onClick = onSyncButtonClicked ) { Icon( - modifier = Modifier.size(24.dp), + modifier = Modifier.requiredSize(IconButtonDefaults.SmallIconSize - 4.dp), painter = when (uiState.connectionStatus) { WearConnectionStatus.DISCONNECTED -> { painterResource(id = R.drawable.ic_phonelink_erase_white_24dp) @@ -284,14 +305,12 @@ private fun PhoneSyncUi( } if (uiState.showBTButton) { - Button( - modifier = Modifier.requiredSize(36.dp), - onClick = onBTButtonClicked, - colors = ButtonDefaults.primaryButtonColors( - backgroundColor = colorResource(id = R.color.colorPrimary) - ) + FilledIconButton( + modifier = Modifier.requiredSize(IconButtonDefaults.ExtraSmallButtonSize), + onClick = onBTButtonClicked ) { Icon( + modifier = Modifier.requiredSize(IconButtonDefaults.SmallIconSize - 4.dp), painter = painterResource(id = R.drawable.ic_bluetooth_white_24dp), contentDescription = stringResource(id = R.string.action_bt) ) @@ -299,6 +318,36 @@ private fun PhoneSyncUi( } } } + + if (isRound) { + Box( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = contentPadding.calculateBottomPadding() / 2), + ) { + var isVisible by remember { mutableStateOf(true) } + + AnimatedVisibility( + visible = isVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + ArcProgressIndicator( + modifier = + Modifier.size(ArcProgressIndicatorDefaults.recommendedIndeterminateDiameter) + ) + } + + LaunchedEffect(uiState.isLoading) { + if (!uiState.isLoading) { + delay(500) + } + if (isActive) { + isVisible = uiState.isLoading + } + } + } + } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt index 75622b28..fcfb5de2 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt @@ -10,6 +10,7 @@ import androidx.navigation.NavType import androidx.navigation.activity import androidx.navigation.navArgument import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState +import androidx.wear.compose.material3.AppScaffold import androidx.wear.compose.navigation.SwipeDismissableNavHost import androidx.wear.compose.navigation.composable import androidx.wear.compose.navigation.rememberSwipeDismissableNavController @@ -38,158 +39,154 @@ fun SimpleWearApp( swipeToDismissBoxState = swipeToDismissBoxState ) - SwipeDismissableNavHost( - navController = navController, - startDestination = startDestination, - state = swipeDismissNavState - ) { - composable(Screen.Dashboard.route) { - Dashboard(navController = navController) - - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.Dashboard.route) - }) - } - } - - composable( - route = Screen.ValueAction.route + "/{actionId}?streamType={streamType}", - arguments = listOf( - navArgument("actionId") { - type = NavType.IntType - }, - navArgument("streamType") { - type = NavType.EnumType(AudioStreamType::class.java) - defaultValue = AudioStreamType.MUSIC + AppScaffold { + SwipeDismissableNavHost( + navController = navController, + startDestination = startDestination, + state = swipeDismissNavState + ) { + composable(Screen.Dashboard.route) { + Dashboard(navController = navController) + + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.Dashboard.route) + }) } - ) - ) { backstackEntry -> - val actionType = backstackEntry.arguments?.getInt("actionId")?.let { - Actions.valueOf(it) } - val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - backstackEntry.arguments?.getSerializable( - "streamType", - AudioStreamType::class.java + + composable( + route = Screen.ValueAction.route + "/{actionId}?streamType={streamType}", + arguments = listOf( + navArgument("actionId") { + type = NavType.IntType + }, + navArgument("streamType") { + type = NavType.EnumType(AudioStreamType::class.java) + defaultValue = AudioStreamType.MUSIC + } ) - } else { - backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType - } + ) { backstackEntry -> + val actionType = backstackEntry.arguments?.getInt("actionId")?.let { + Actions.valueOf(it) + } + val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + backstackEntry.arguments?.getSerializable( + "streamType", + AudioStreamType::class.java + ) + } else { + backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType + } - ValueActionScreen( - actionType = actionType ?: Actions.VOLUME, - audioStreamType = streamType - ) + ValueActionScreen( + actionType = actionType ?: Actions.VOLUME, + audioStreamType = streamType + ) - LaunchedEffect(navController, actionType) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.ValueAction.route) - actionType?.let { - putString("actionType", it.name) - } - }) + LaunchedEffect(navController, actionType) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.ValueAction.route) + actionType?.let { + putString("actionType", it.name) + } + }) + } } - } - activity(route = Screen.MediaPlayerList.route) { - targetPackage = context.packageName - activityClass = MediaPlayerActivity::class - } + activity(route = Screen.MediaPlayerList.route) { + targetPackage = context.packageName + activityClass = MediaPlayerActivity::class + } - composable(Screen.AppLauncher.route) { - AppLauncherScreen( - navController = navController, - swipeToDismissBoxState = swipeToDismissBoxState - ) + composable(Screen.AppLauncher.route) { + AppLauncherScreen() - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.AppLauncher.route) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.AppLauncher.route) + }) + } } - } - composable(Screen.CallManager.route) { - CallManagerUi(navController = navController) + composable(Screen.CallManager.route) { + CallManagerUi(navController = navController) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.CallManager.route) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.CallManager.route) + }) + } } - } - composable(Screen.GesturesAction.route) { - GesturesUi( - navController = navController, - swipeToDismissBoxState = swipeToDismissBoxState - ) + composable(Screen.GesturesAction.route) { + GesturesUi(navController = navController) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.GesturesAction.route) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.GesturesAction.route) + }) + } } - } - composable(Screen.TimedActions.route) { - TimedActionUi(navController = navController) + composable(Screen.TimedActions.route) { + TimedActionUi(navController = navController) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.TimedActions.route) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.TimedActions.route) + }) + } } - } - composable( - route = Screen.TimedActionDetail.route + "?action={action}", - arguments = listOf( - navArgument("action") { - type = NavType.StringType - nullable = false + composable( + route = Screen.TimedActionDetail.route + "?action={action}", + arguments = listOf( + navArgument("action") { + type = NavType.StringType + nullable = false + } + ) + ) { backstackEntry -> + val action = remember(backstackEntry) { + JSONParser.deserializer( + backstackEntry.arguments?.getString("action"), + TimedAction::class.java + )!! } - ) - ) { backstackEntry -> - val action = remember(backstackEntry) { - JSONParser.deserializer( - backstackEntry.arguments?.getString("action"), - TimedAction::class.java - )!! - } - TimedActionDetailUi( - action = action, - navController = navController - ) + TimedActionDetailUi( + action = action, + navController = navController + ) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.TimedActionDetail.route) - putString("actionType", action.action.actionType.name) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.TimedActionDetail.route) + putString("actionType", action.action.actionType.name) + }) + } } - } - composable(Screen.TimedActionSetup.route) { - TimedActionSetupUi(navController = navController) + composable(Screen.TimedActionSetup.route) { + TimedActionSetupUi(navController = navController) - LaunchedEffect(navController) { - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.TimedActionSetup.route) - }) + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.TimedActionSetup.route) + }) + } } - } - activity(route = Screen.DashboardConfig.route) { - targetPackage = context.packageName - activityClass = DashboardConfigActivity::class - } + activity(route = Screen.DashboardConfig.route) { + targetPackage = context.packageName + activityClass = DashboardConfigActivity::class + } - activity(route = Screen.DashboardTileConfig.route) { - targetPackage = context.packageName - activityClass = DashboardTileConfigActivity::class + activity(route = Screen.DashboardTileConfig.route) { + targetPackage = context.packageName + activityClass = DashboardTileConfigActivity::class + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt index 778bb9d3..36a7b2c2 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt @@ -1,21 +1,8 @@ -@file:OptIn( - ExperimentalFoundationApi::class, ExperimentalHorologistApi::class, - ExperimentalWearFoundationApi::class -) - package com.thewizrd.simplewear.ui.simplewear -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.PagerState -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -25,9 +12,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -36,27 +21,33 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.items -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.ListHeader -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.foundation.pager.PagerState +import androidx.wear.compose.foundation.pager.rememberPagerState +import androidx.wear.compose.material3.AnimatedPage +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonColors +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.FilledTonalIconButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.RadioButton +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation +import androidx.wear.compose.material3.SwitchButton +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.TimePicker +import androidx.wear.compose.material3.TimePickerType +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.composables.TimePicker -import com.google.android.horologist.compose.layout.PagerScaffold -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.Button -import com.google.android.horologist.compose.material.Chip -import com.google.android.horologist.compose.material.ResponsiveListHeader -import com.google.android.horologist.compose.material.ToggleChip -import com.google.android.horologist.compose.material.ToggleChipToggleControl +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.Action import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions @@ -66,13 +57,12 @@ import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.helpers.showConfirmationOverlay import com.thewizrd.simplewear.ui.components.ConfirmationOverlay -import com.thewizrd.simplewear.ui.components.ScalingLazyColumn +import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices -import com.thewizrd.simplewear.viewmodels.ConfirmationData +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.TimedActionUiViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.EXTRA_STATUS @@ -113,7 +103,7 @@ fun TimedActionSetupUi( delay(15000) if (isActive) { lifecycleOwner.lifecycleScope.launch { - activity.showConfirmationOverlay(false) + confirmationViewModel.showFailure() navController.popBackStack() } } @@ -144,9 +134,9 @@ fun TimedActionSetupUi( } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -187,47 +177,55 @@ private fun TimedActionSetupUi( var shouldSetInitialAction by remember { mutableStateOf(false) } var initialAction: Action? by remember { mutableStateOf(null) } - val focusRequester = remember { FocusRequester() } + val focusRequester = rememberFocusRequester() - PagerScaffold(modifier = modifier) { - HorizontalPager( - state = pagerState, - userScrollEnabled = false - ) { index -> - when (index) { + HorizontalPagerScreen( + modifier = modifier, + pagerState = pagerState, + userScrollEnabled = false, + hidePagerIndicator = true + ) { pageIdx -> + AnimatedPage(pageIdx, pagerState) { + when (pageIdx) { // Time 0 -> { TimePicker( - onTimeConfirm = { + onTimePicked = { scheduledTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(it.hour.toLong()) + TimeUnit.MINUTES.toMillis(it.minute.toLong()) compositionScope.launch { - pagerState.animateScrollToPage(index + 1) + pagerState.animateScrollToPage(pageIdx + 1) } }, - time = LocalTime.of(0, 15), - showSeconds = false + initialTime = LocalTime.of(0, 15), + timePickerType = TimePickerType.HoursMinutes24H ) } // Actions 1 -> { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Text, - last = ScalingLazyColumnDefaults.ItemType.Chip - ) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) - - Box { - TimeText(modifier = Modifier.scrollAway { scrollState }) - - ScalingLazyColumn( - scrollState = scrollState, - focusRequester = focusRequester + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + scrollState = columnState, + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding ) { item { - ResponsiveListHeader { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { Text(text = stringResource(id = R.string.title_actions)) } } @@ -239,19 +237,24 @@ private fun TimedActionSetupUi( ActionButtonViewModel.getViewModelFromAction(it) } - Chip( - label = stringResource(id = model.actionLabelResId), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = stringResource(id = model.actionLabelResId)) + }, icon = { Icon( painter = painterResource(id = model.drawableResId), contentDescription = stringResource(id = model.actionLabelResId) ) }, - colors = ChipDefaults.secondaryChipColors(), onClick = { selectedAction = Action.getDefaultAction(it) compositionScope.launch { - pagerState.animateScrollToPage(index + 1) + pagerState.animateScrollToPage(pageIdx + 1) } } ) @@ -259,7 +262,7 @@ private fun TimedActionSetupUi( } LaunchedEffect(pagerState, pagerState.targetPage) { - if (pagerState.targetPage == index) { + if (pagerState.targetPage == pageIdx) { focusRequester.requestFocus() } } @@ -267,12 +270,12 @@ private fun TimedActionSetupUi( } // State 2 -> { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Text, - last = ScalingLazyColumnDefaults.ItemType.Chip - ) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) + val transformationSpec = rememberTransformationSpec() var actionState by remember { mutableStateOf(null) } var initActionState by remember { mutableStateOf(null) } @@ -281,63 +284,47 @@ private fun TimedActionSetupUi( ActionButtonViewModel(selectedAction) } - Box { - TimeText(modifier = Modifier.scrollAway { scrollState }) - - ScalingLazyColumn( - scrollState = scrollState, - focusRequester = focusRequester + ScreenScaffold( + scrollState = columnState, + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding ) { item { - ResponsiveListHeader { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { Text(text = stringResource(id = R.string.title_confirm_action)) } } item { - androidx.wear.compose.material.Chip( - modifier = Modifier.fillMaxWidth(), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), enabled = false, - colors = ChipDefaults.secondaryChipColors(), - border = ChipDefaults.chipBorder(), + icon = { + Icon( + painter = painterResource(id = model.drawableResId), + contentDescription = stringResource(id = model.actionLabelResId) + ) + }, + label = { + Text(text = stringResource(id = R.string.label_action)) + }, + secondaryLabel = { + Text(text = stringResource(id = model.actionLabelResId)) + }, + colors = disabledButtonColors(), onClick = {} - ) { - Row( - modifier = Modifier.fillMaxSize() - ) { - Box( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Icon( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(id = model.drawableResId), - contentDescription = stringResource(id = model.actionLabelResId), - tint = MaterialTheme.colors.onSurface - ) - } - Spacer(modifier = Modifier.size(6.dp)) - Column( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Row { - Text( - text = stringResource(id = R.string.label_action), - style = MaterialTheme.typography.button, - color = MaterialTheme.colors.onSurface - ) - } - Row { - Text( - text = stringResource(id = model.actionLabelResId), - style = MaterialTheme.typography.caption2, - color = MaterialTheme.colors.onSurface.copy( - alpha = 0.75f - ) - ) - } - } - } - } + ) } item { @@ -350,70 +337,58 @@ private fun TimedActionSetupUi( ) } - androidx.wear.compose.material.Chip( - modifier = Modifier.fillMaxWidth(), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), enabled = false, - colors = ChipDefaults.secondaryChipColors(), - border = ChipDefaults.chipBorder(), + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_alarm_white_24dp), + contentDescription = stringResource(id = R.string.label_time), + ) + }, + label = { + Text(text = stringResource(id = R.string.label_time)) + }, + secondaryLabel = { + Text(text = timeString) + }, + colors = disabledButtonColors(), onClick = {} - ) { - Row( - modifier = Modifier.fillMaxSize() - ) { - Box( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Icon( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(id = R.drawable.ic_alarm_white_24dp), - contentDescription = stringResource(id = R.string.label_time), - tint = MaterialTheme.colors.onSurface - ) - } - Spacer(modifier = Modifier.size(6.dp)) - Column( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Row { - Text( - text = stringResource(id = R.string.label_time), - style = MaterialTheme.typography.button, - color = MaterialTheme.colors.onSurface - ) - } - Row { - Text( - text = timeString, - style = MaterialTheme.typography.caption2, - color = MaterialTheme.colors.onSurface.copy( - alpha = 0.75f - ) - ) - } - } - } - } + ) } item { - ToggleChip( + SwitchButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), checked = shouldSetInitialAction, - onCheckedChanged = { + onCheckedChange = { initialAction = Action.getDefaultAction(selectedAction.actionType) shouldSetInitialAction = it }, - label = stringResource(id = R.string.title_set_initial_state), - toggleControl = ToggleChipToggleControl.Switch + label = { + Text(text = stringResource(id = R.string.title_set_initial_state)) + } ) } if (shouldSetInitialAction) { item { - ListHeader { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + ) { Text( text = stringResource(id = R.string.title_initial_state), - style = MaterialTheme.typography.caption1 + style = MaterialTheme.typography.labelSmall ) } } @@ -428,14 +403,21 @@ private fun TimedActionSetupUi( ActionButtonViewModel(tA) } - ToggleChip( + SwitchButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation( + transformationSpec + ), checked = tA.isEnabled, - onCheckedChanged = { + onCheckedChange = { tA.isEnabled = it initActionState = it }, - label = stringResource(id = actionModel.stateLabelResId), - toggleControl = ToggleChipToggleControl.Switch + label = { + Text(text = stringResource(id = actionModel.stateLabelResId)) + } ) } } @@ -454,14 +436,21 @@ private fun TimedActionSetupUi( ) } - ToggleChip( - checked = mA.choice == choice, - onCheckedChanged = { + RadioButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation( + transformationSpec + ), + selected = mA.choice == choice, + onSelect = { mA.choice = choice - initActionState = it + initActionState = true }, - label = stringResource(id = multiActionModel.stateLabelResId), - toggleControl = ToggleChipToggleControl.Radio + label = { + Text(text = stringResource(id = multiActionModel.stateLabelResId)) + } ) } } @@ -471,10 +460,15 @@ private fun TimedActionSetupUi( } item { - ListHeader { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + ) { Text( text = stringResource(id = R.string.title_scheduled_state), - style = MaterialTheme.typography.caption1 + style = MaterialTheme.typography.labelSmall ) } } @@ -486,14 +480,21 @@ private fun TimedActionSetupUi( selectedAction as ToggleAction } - ToggleChip( + SwitchButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation( + transformationSpec + ), checked = tA.isEnabled, - onCheckedChanged = { + onCheckedChange = { tA.isEnabled = it actionState = it }, - label = stringResource(id = model.stateLabelResId), - toggleControl = ToggleChipToggleControl.Switch + label = { + Text(text = stringResource(id = model.stateLabelResId)) + } ) } } @@ -512,22 +513,37 @@ private fun TimedActionSetupUi( ) } - ToggleChip( - checked = mA.choice == choice, - onCheckedChanged = { + RadioButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation( + transformationSpec + ), + selected = mA.choice == choice, + onSelect = { mA.choice = choice actionState = choice }, - label = stringResource(id = multiActionModel.stateLabelResId), - toggleControl = ToggleChipToggleControl.Radio + label = { + Text(text = stringResource(id = multiActionModel.stateLabelResId)) + } ) } } else -> { item { - Chip( - label = stringResource(id = R.string.label_action_not_supported), + Button( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation( + transformationSpec + ), + label = { + Text(text = stringResource(id = R.string.label_action_not_supported)) + }, onClick = {}, enabled = false ) @@ -541,32 +557,38 @@ private fun TimedActionSetupUi( if (selectedAction is ToggleAction || selectedAction is MultiChoiceAction) { item { - Button( - id = R.drawable.ic_check_white_24dp, - contentDescription = stringResource(id = android.R.string.ok), + FilledIconButton( + content = { + Icon( + painter = painterResource(R.drawable.ic_check_white_24dp), + contentDescription = stringResource(id = android.R.string.ok), + ) + }, onClick = { onAddAction.invoke( initialAction, TimedAction(scheduledTime, selectedAction) ) - }, - colors = ButtonDefaults.primaryButtonColors() + } ) } } else { item { - Button( - id = R.drawable.ic_close_white_24dp, - contentDescription = stringResource(id = android.R.string.cancel), - onClick = onCancel, - colors = ButtonDefaults.secondaryButtonColors() + FilledTonalIconButton( + content = { + Icon( + painter = painterResource(R.drawable.ic_close_white_24dp), + contentDescription = stringResource(id = android.R.string.cancel), + ) + }, + onClick = onCancel ) } } } LaunchedEffect(pagerState, pagerState.targetPage) { - if (pagerState.targetPage == index) { + if (pagerState.targetPage == pageIdx) { focusRequester.requestFocus() } } @@ -577,6 +599,15 @@ private fun TimedActionSetupUi( } } +@Composable +private fun disabledButtonColors(): ButtonColors { + return ButtonDefaults.filledTonalButtonColors( + disabledContentColor = MaterialTheme.colorScheme.onSurface, + disabledSecondaryContentColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f), + disabledIconColor = MaterialTheme.colorScheme.onSurface, + ) +} + @WearPreviewDevices @WearPreviewFontScales @Composable diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt index 9fa90441..f950d7f9 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt @@ -1,28 +1,20 @@ -@file:OptIn( - ExperimentalHorologistApi::class, - ExperimentalWearFoundationApi::class, - ExperimentalWearMaterialApi::class -) - package com.thewizrd.simplewear.ui.simplewear import android.text.format.DateFormat -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material.LocalContentColor +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Delete import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -31,7 +23,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -44,43 +35,33 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.items -import androidx.wear.compose.foundation.rememberActiveFocusRequester -import androidx.wear.compose.foundation.rememberRevealState -import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults -import androidx.wear.compose.foundation.rotary.rotaryScrollable -import androidx.wear.compose.material.Button -import androidx.wear.compose.material.ButtonDefaults -import androidx.wear.compose.material.Chip -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.ExperimentalWearMaterialApi -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.ListHeader -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.PositionIndicator -import androidx.wear.compose.material.Scaffold -import androidx.wear.compose.material.SwipeToRevealChip -import androidx.wear.compose.material.SwipeToRevealDefaults -import androidx.wear.compose.material.SwipeToRevealPrimaryAction -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.Vignette -import androidx.wear.compose.material.VignettePosition -import androidx.wear.compose.material.dialog.Dialog +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.Dialog +import androidx.wear.compose.material3.EdgeButton +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.RadioButton +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation +import androidx.wear.compose.material3.SwipeToReveal +import androidx.wear.compose.material3.SwitchButton +import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.TimePicker +import androidx.wear.compose.material3.TimePickerType +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.composables.TimePicker -import com.google.android.horologist.composables.TimePickerWith12HourClock -import com.google.android.horologist.compose.layout.ScalingLazyColumn -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults -import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults.listTextPadding +import com.google.android.horologist.compose.layout.ColumnItemType import com.google.android.horologist.compose.layout.fillMaxRectangle -import com.google.android.horologist.compose.layout.rememberResponsiveColumnState -import com.google.android.horologist.compose.layout.scrollAway -import com.google.android.horologist.compose.material.ResponsiveListHeader -import com.google.android.horologist.compose.material.ToggleChip -import com.google.android.horologist.compose.material.ToggleChipToggleControl +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.DNDChoice @@ -94,10 +75,10 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.LoadingContent import com.thewizrd.simplewear.ui.navigation.Screen +import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices -import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.TimedActionUiViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.EXTRA_STATUS @@ -177,9 +158,9 @@ fun TimedActionUi( } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -210,37 +191,38 @@ private fun TimedActionUi( onActionDelete: (TimedAction) -> Unit = {}, onAddAction: () -> Unit = {} ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Text, - last = ScalingLazyColumnDefaults.ItemType.SingleButton - ) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) + val transformationSpec = rememberTransformationSpec() - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - timeText = { TimeText(modifier = Modifier.scrollAway { scrollState }) }, - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - positionIndicator = { PositionIndicator(scalingLazyListState = scrollState.state) } + ScreenScaffold( + modifier = modifier, + scrollState = columnState, + contentPadding = contentPadding, + edgeButton = { + EdgeButton(onClick = onAddAction) { + Icon( + painter = painterResource(id = R.drawable.ic_add_white_24dp), + contentDescription = stringResource(id = R.string.label_add_action) + ) + } + } ) { - ScalingLazyColumn( - modifier = modifier - .fillMaxSize() - .rotaryScrollable( - focusRequester = rememberActiveFocusRequester(), - behavior = RotaryScrollableDefaults.behavior(scrollState) - ), - columnState = scrollState + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding ) { item { - Box( - modifier = Modifier.padding(bottom = 12.dp) + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) ) { - Text( - modifier = Modifier.listTextPadding(), - text = stringResource(id = R.string.title_actions), - style = MaterialTheme.typography.button - ) + Text(text = stringResource(id = R.string.title_actions)) } } items( @@ -253,17 +235,6 @@ private fun TimedActionUi( onActionDelete = onActionDelete ) } - item { - Spacer(modifier = Modifier.height(16.dp)) - } - item { - Button(onClick = onAddAction) { - Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), - contentDescription = stringResource(id = R.string.label_add_action) - ) - } - } } } } @@ -273,13 +244,13 @@ private fun EmptyTimedActionUi( modifier: Modifier = Modifier, onAddAction: () -> Unit = {} ) { - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - timeText = { TimeText() }, - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) } - ) { + ScreenScaffold( + modifier = modifier + ) { contentPadding -> Column( - modifier = Modifier.fillMaxRectangle() + modifier = Modifier + .padding(contentPadding) + .fillMaxRectangle() ) { Box( modifier = Modifier @@ -292,8 +263,7 @@ private fun EmptyTimedActionUi( ) { Text( text = stringResource(id = R.string.title_schedule_action), - textAlign = TextAlign.Center, - color = MaterialTheme.colors.onBackground + textAlign = TextAlign.Center ) } @@ -332,37 +302,32 @@ private fun TimedActionChip( ) ) } - val revealState = rememberRevealState() - val chipColors = ChipDefaults.secondaryChipColors() + val buttonColors = ButtonDefaults.filledTonalButtonColors() - SwipeToRevealChip( + SwipeToReveal( primaryAction = { - SwipeToRevealPrimaryAction( - revealState = revealState, + PrimaryActionButton( onClick = { onActionDelete.invoke(timedAction) }, icon = { Icon( - imageVector = SwipeToRevealDefaults.Delete, + imageVector = Icons.Outlined.Delete, contentDescription = stringResource(id = R.string.action_delete) ) }, - label = { + text = { Text(text = stringResource(id = R.string.action_delete)) } ) }, - revealState = revealState, - onFullSwipe = { + onSwipePrimaryAction = { onActionDelete.invoke(timedAction) } ) { - Chip( + FilledTonalButton( modifier = Modifier.fillMaxWidth(), - colors = chipColors, - border = ChipDefaults.chipBorder(), onClick = { onActionClicked.invoke(timedAction) } @@ -384,7 +349,7 @@ private fun TimedActionChip( ) { model.getDescription(context) }, - tint = chipColors.iconColor(enabled = true).value + tint = buttonColors.iconColor ) } Spacer(modifier = Modifier.size(6.dp)) @@ -394,8 +359,8 @@ private fun TimedActionChip( Row { Text( text = stringResource(id = model.actionLabelResId), - style = MaterialTheme.typography.button, - color = chipColors.contentColor(enabled = true).value, + style = MaterialTheme.typography.labelMedium, + color = buttonColors.contentColor, maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -404,8 +369,8 @@ private fun TimedActionChip( Row { Text( text = stringResource(id = model.stateLabelResId), - style = MaterialTheme.typography.caption1, - color = chipColors.secondaryContentColor(enabled = true).value, + style = MaterialTheme.typography.labelSmall, + color = buttonColors.secondaryContentColor, maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -414,8 +379,8 @@ private fun TimedActionChip( Row { Text( text = timeString, - style = MaterialTheme.typography.caption2, - color = chipColors.secondaryContentColor(enabled = true).value, + style = MaterialTheme.typography.bodySmall, + color = buttonColors.secondaryContentColor, maxLines = 1 ) } @@ -471,9 +436,9 @@ fun TimedActionDetailUi( } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - title = context.getString(R.string.error_permissiondenied) + confirmationViewModel.showOpenOnPhoneForFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -503,13 +468,13 @@ private fun TimedActionDetailUi( onActionUpdate: (TimedAction) -> Unit = {}, onActionDelete: (TimedAction) -> Unit = {} ) { - val scrollState = rememberResponsiveColumnState( - contentPadding = ScalingLazyColumnDefaults.padding( - first = ScalingLazyColumnDefaults.ItemType.Text, - last = ScalingLazyColumnDefaults.ItemType.SingleButton, - ), - verticalArrangement = Arrangement.spacedBy(6.dp, Alignment.CenterVertically) + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, ) + val transformationSpec = rememberTransformationSpec() + val context = LocalContext.current val is24Hour = remember(context) { DateFormat.is24HourFormat(context) @@ -531,122 +496,87 @@ private fun TimedActionDetailUi( ) } - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - timeText = { TimeText(modifier = Modifier.scrollAway { scrollState }) }, - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - positionIndicator = { PositionIndicator(scalingLazyListState = scrollState.state) } - ) { - ScalingLazyColumn( - columnState = scrollState + ScreenScaffold( + scrollState = columnState, + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + state = columnState, + contentPadding = contentPadding ) { item { - ResponsiveListHeader { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { Text(text = stringResource(id = R.string.title_edit_action)) } } item { - Chip( - modifier = Modifier.fillMaxWidth(), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), enabled = false, - colors = ChipDefaults.secondaryChipColors(), - border = ChipDefaults.chipBorder(), - onClick = {} - ) { - Row( - modifier = Modifier.fillMaxSize() - ) { - Box( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Icon( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(id = model.drawableResId), - contentDescription = remember( - context, - model.actionLabelResId, - model.stateLabelResId - ) { - model.getDescription(context) - }, - tint = MaterialTheme.colors.onSurface - ) - } - Spacer(modifier = Modifier.size(6.dp)) - Column( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Row { - Text( - text = stringResource(id = R.string.label_action), - style = MaterialTheme.typography.button, - color = MaterialTheme.colors.onSurface - ) - } - Row { - Text( - text = stringResource(id = model.actionLabelResId), - style = MaterialTheme.typography.caption2, - color = MaterialTheme.colors.onSurface.copy(alpha = 0.75f) - ) + icon = { + Icon( + modifier = Modifier.align(Alignment.Center), + painter = painterResource(id = model.drawableResId), + contentDescription = remember( + context, + model.actionLabelResId, + model.stateLabelResId + ) { + model.getDescription(context) } - } - } - } + ) + }, + label = { + Text(text = stringResource(id = R.string.label_action)) + }, + secondaryLabel = { + Text(text = stringResource(id = model.actionLabelResId)) + }, + onClick = {} + ) } item { - Chip( - modifier = Modifier.fillMaxWidth(), - colors = ChipDefaults.secondaryChipColors(), - border = ChipDefaults.chipBorder(), + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), onClick = { showTimePicker = true + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_alarm_white_24dp), + contentDescription = stringResource(id = R.string.label_time) + ) + }, + label = { + Text(text = stringResource(id = R.string.label_time)) + }, + secondaryLabel = { + Text(text = timeString) } - ) { - Row( - modifier = Modifier.fillMaxSize() - ) { - Box( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Icon( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(id = R.drawable.ic_alarm_white_24dp), - contentDescription = stringResource(id = R.string.label_time), - tint = MaterialTheme.colors.onSurface - ) - } - Spacer(modifier = Modifier.size(6.dp)) - Column( - modifier = Modifier.align(Alignment.CenterVertically) - ) { - Row { - Text( - text = stringResource(id = R.string.label_time), - style = MaterialTheme.typography.button, - color = MaterialTheme.colors.onSurface - ) - } - Row { - Text( - text = timeString, - style = MaterialTheme.typography.caption2, - color = MaterialTheme.colors.onSurface.copy(alpha = 0.75f) - ) - } - } - } - } + ) } item { - ListHeader { - Text( - text = stringResource(id = R.string.label_state), - style = MaterialTheme.typography.caption1 - ) + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { + Text(text = stringResource(id = R.string.label_state)) } } @@ -657,14 +587,19 @@ private fun TimedActionDetailUi( action.action as ToggleAction } - ToggleChip( + SwitchButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), checked = tA.isEnabled, - onCheckedChanged = { + onCheckedChange = { tA.isEnabled = it actionState = it }, - label = stringResource(id = model.stateLabelResId), - toggleControl = ToggleChipToggleControl.Switch + label = { + Text(text = stringResource(id = model.stateLabelResId)) + } ) } } @@ -678,22 +613,33 @@ private fun TimedActionDetailUi( ActionButtonViewModel(MultiChoiceAction(mA.actionType, choice)) } - ToggleChip( - checked = mA.choice == choice, - onCheckedChanged = { + RadioButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + selected = mA.choice == choice, + onSelect = { mA.choice = choice actionState = choice }, - label = stringResource(id = multiActionModel.stateLabelResId), - toggleControl = ToggleChipToggleControl.Radio + label = { + Text(text = stringResource(id = multiActionModel.stateLabelResId)) + } ) } } else -> { item { - com.google.android.horologist.compose.material.Chip( - label = stringResource(id = R.string.label_action_not_supported), + Button( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = stringResource(id = R.string.label_action_not_supported)) + }, onClick = {}, enabled = false ) @@ -702,7 +648,9 @@ private fun TimedActionDetailUi( } item { - Spacer(modifier = Modifier.size(16.dp)) + Spacer( + modifier = Modifier.size(16.dp) + ) } item { @@ -712,20 +660,27 @@ private fun TimedActionDetailUi( Alignment.CenterHorizontally ) ) { - com.google.android.horologist.compose.material.Button( - id = R.drawable.ic_check_white_24dp, - contentDescription = stringResource(id = android.R.string.ok), + FilledIconButton( + content = { + Icon( + painter = painterResource(R.drawable.ic_check_white_24dp), + contentDescription = stringResource(id = android.R.string.ok), + ) + }, onClick = { onActionUpdate.invoke(action) - }, - colors = ButtonDefaults.primaryButtonColors() + } ) - com.google.android.horologist.compose.material.Button( - id = R.drawable.ic_delete_outline, - contentDescription = stringResource(id = R.string.action_delete), - colors = ButtonDefaults.primaryButtonColors( - backgroundColor = MaterialTheme.colors.error, - contentColor = MaterialTheme.colors.onError + FilledIconButton( + content = { + Icon( + painter = painterResource(R.drawable.ic_delete_outline), + contentDescription = stringResource(id = R.string.action_delete), + ) + }, + colors = IconButtonDefaults.iconButtonColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer, ), onClick = { onActionDelete.invoke(action) @@ -737,7 +692,7 @@ private fun TimedActionDetailUi( } Dialog( - showDialog = showTimePicker, + visible = showTimePicker, onDismissRequest = { showTimePicker = false } @@ -748,42 +703,27 @@ private fun TimedActionDetailUi( .toLocalTime() } - if (is24Hour) { - TimePicker( - time = localTime, - onTimeConfirm = { - val today = LocalDate.now() - val now = LocalTime.now() - - action.timeInMillis = if (it < now) { - today.plusDays(1).atTime(it).atZone(ZoneId.systemDefault()).toInstant() - .toEpochMilli() - } else { - today.atTime(it).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() - } - - showTimePicker = false - }, - showSeconds = false - ) - } else { - TimePickerWith12HourClock( - time = localTime, - onTimeConfirm = { - val today = LocalDate.now() - val now = LocalTime.now() - - action.timeInMillis = if (it < now) { - today.plusDays(1).atTime(it).atZone(ZoneId.systemDefault()).toInstant() - .toEpochMilli() - } else { - today.atTime(it).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() - } - - showTimePicker = false + TimePicker( + initialTime = localTime, + onTimePicked = { + val today = LocalDate.now() + val now = LocalTime.now() + + action.timeInMillis = if (it < now) { + today.plusDays(1).atTime(it).atZone(ZoneId.systemDefault()).toInstant() + .toEpochMilli() + } else { + today.atTime(it).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() } - ) - } + + showTimePicker = false + }, + timePickerType = if (is24Hour) { + TimePickerType.HoursMinutes24H + } else { + TimePickerType.HoursMinutesAmPm12H + } + ) } } @@ -810,9 +750,7 @@ private fun PreviewTimedActionUi() { ) } - CompositionLocalProvider( - LocalContentColor provides Color.White - ) { + WearAppTheme { TimedActionUi( actions = actions ) @@ -834,9 +772,7 @@ private fun PreviewTimedActionDetailUi() { ) } - CompositionLocalProvider( - LocalContentColor provides Color.White - ) { + WearAppTheme { TimedActionDetailUi( action = action ) @@ -847,9 +783,7 @@ private fun PreviewTimedActionDetailUi() { @WearPreviewFontScales @Composable private fun PreviewEmptyTimedActionUi() { - CompositionLocalProvider( - LocalContentColor provides Color.White - ) { + WearAppTheme { EmptyTimedActionUi() } } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index 071a66aa..45f5a623 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -1,11 +1,9 @@ -@file:OptIn(ExperimentalWearFoundationApi::class, ExperimentalHorologistApi::class) - package com.thewizrd.simplewear.ui.simplewear import android.content.Intent -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -19,24 +17,16 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.wear.compose.foundation.ExperimentalWearFoundationApi -import androidx.wear.compose.foundation.rememberActiveFocusRequester +import androidx.wear.compose.foundation.requestFocusOnHierarchyActive import androidx.wear.compose.foundation.rotary.rotaryScrollable -import androidx.wear.compose.material.Chip -import androidx.wear.compose.material.ChipDefaults -import androidx.wear.compose.material.Icon -import androidx.wear.compose.material.MaterialTheme -import androidx.wear.compose.material.Scaffold -import androidx.wear.compose.material.Stepper -import androidx.wear.compose.material.Text -import androidx.wear.compose.material.TimeText -import androidx.wear.compose.material.Vignette -import androidx.wear.compose.material.VignettePosition -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.audio.ui.VolumePositionIndicator +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Stepper +import androidx.wear.compose.material3.Text import com.google.android.horologist.audio.ui.VolumeUiState -import com.google.android.horologist.audio.ui.volumeRotaryBehavior +import com.google.android.horologist.audio.ui.material3.VolumeLevelIndicator +import com.google.android.horologist.audio.ui.material3.volumeRotaryBehavior import com.thewizrd.shared_resources.actions.Action import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions @@ -50,7 +40,8 @@ import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.viewmodels.ConfirmationData +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.ValueActionUiState import com.thewizrd.simplewear.viewmodels.ValueActionViewModel @@ -77,14 +68,12 @@ fun ValueActionScreen( val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - Scaffold( - modifier = modifier.background(MaterialTheme.colors.background), - vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }, - timeText = { - TimeText() - }, - ) { - ValueActionScreen(valueActionViewModel, volumeViewModel) + ScreenScaffold { contentPadding -> + ValueActionScreen( + modifier = modifier.padding(contentPadding), + valueActionViewModel = valueActionViewModel, + volumeViewModel = volumeViewModel + ) } ConfirmationOverlay( @@ -154,19 +143,17 @@ fun ValueActionScreen( lifecycleOwner.lifecycleScope.launch { when (actionStatus) { ActionStatus.UNKNOWN, ActionStatus.FAILURE -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - iconResId = R.drawable.ws_full_sad, - title = context.getString(R.string.error_actionfailed), + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_actionfailed ) ) } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - iconResId = R.drawable.ws_full_sad, - title = context.getString(R.string.error_permissiondenied), + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_permissiondenied ) ) @@ -177,10 +164,9 @@ fun ValueActionScreen( } ActionStatus.TIMEOUT -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - iconResId = R.drawable.ws_full_sad, - title = context.getString(R.string.error_sendmessage) + confirmationViewModel.showFailure( + message = context.getString( + R.string.error_sendmessage ) ) } @@ -198,21 +184,11 @@ fun ValueActionScreen( when (status) { ActionStatus.UNKNOWN, ActionStatus.FAILURE -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - iconResId = R.drawable.ws_full_sad, - title = context.getString(R.string.error_actionfailed) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_actionfailed)) } ActionStatus.PERMISSION_DENIED -> { - confirmationViewModel.showConfirmation( - ConfirmationData( - iconResId = R.drawable.ws_full_sad, - title = context.getString(R.string.error_permissiondenied) - ) - ) + confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) valueActionViewModel.openAppOnPhone(activity, false) } @@ -233,6 +209,7 @@ fun ValueActionScreen( @Composable fun ValueActionScreen( + modifier: Modifier = Modifier, valueActionViewModel: ValueActionViewModel, volumeViewModel: ValueActionVolumeViewModel ) { @@ -243,13 +220,15 @@ fun ValueActionScreen( val progressUiState by volumeViewModel.volumeUiState.collectAsState() ValueActionScreen( - modifier = Modifier.rotaryScrollable( - focusRequester = rememberActiveFocusRequester(), - behavior = volumeRotaryBehavior( - volumeUiStateProvider = { progressUiState }, - onRotaryVolumeInput = { newValue -> volumeViewModel.setVolume(newValue) } - ) - ), + modifier = modifier + .requestFocusOnHierarchyActive() + .rotaryScrollable( + focusRequester = rememberFocusRequester(), + behavior = volumeRotaryBehavior( + volumeUiStateProvider = { progressUiState }, + onRotaryVolumeInput = { newValue -> volumeViewModel.setVolume(newValue) } + ) + ), uiState = uiState, volumeUiState = progressUiState, onValueChanged = { newValue -> volumeViewModel.setVolume(newValue) }, @@ -286,12 +265,12 @@ fun ValueActionScreen( if (uiState.action == Actions.VOLUME) { Icon( painter = painterResource(id = R.drawable.ic_volume_up_white_24dp), - contentDescription = stringResource(id = R.string.horologist_stepper_increase_content_description) + contentDescription = stringResource(id = R.string.horologist_volume_screen_volume_up_content_description) ) } else { Icon( painter = painterResource(id = R.drawable.ic_add_white_24dp), - contentDescription = stringResource(id = R.string.horologist_stepper_increase_content_description) + contentDescription = stringResource(id = R.string.wear_m3c_slider_increase_content_description) ) } }, @@ -299,17 +278,17 @@ fun ValueActionScreen( if (uiState.action == Actions.VOLUME) { Icon( painter = painterResource(id = R.drawable.ic_baseline_volume_down_24), - contentDescription = stringResource(id = R.string.horologist_stepper_decrease_content_description) + contentDescription = stringResource(id = R.string.horologist_volume_screen_volume_down_content_description) ) } else { Icon( painter = painterResource(id = R.drawable.ic_remove_white_24dp), - contentDescription = stringResource(id = R.string.horologist_stepper_decrease_content_description) + contentDescription = stringResource(id = R.string.wear_m3c_slider_decrease_content_description) ) } } ) { - Chip( + Button( label = { when (uiState.action) { Actions.VOLUME -> { @@ -381,11 +360,10 @@ fun ValueActionScreen( } } }, - colors = ChipDefaults.secondaryChipColors(), onClick = onActionChange ) } - VolumePositionIndicator( + VolumeLevelIndicator( volumeUiState = { volumeUiState } ) } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt index 35b6b539..bdfd2e8a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt @@ -1,11 +1,42 @@ package com.thewizrd.simplewear.ui.theme import androidx.compose.ui.graphics.Color -import androidx.wear.compose.material.Colors +import androidx.wear.compose.material3.ColorScheme -internal val wearColorPalette: Colors = Colors( - primary = Color(0xFF9FCAFF), - primaryVariant = Color(0xFF004881), - secondary = Color(0xFF8BCEFF), - secondaryVariant = Color(0xFF004B71) +internal val wearColorScheme: ColorScheme = ColorScheme( + primary = Color(0xFFA2C9FD), + primaryContainer = Color(0xFF1C4975), + primaryDim = Color(0xFFA2C9FD), + onPrimary = Color(0xFF00325A), + onPrimaryContainer = Color(0xFFD2E4FF), + + secondary = Color(0xFF95CDF7), + secondaryContainer = Color(0xFF004B6F), + secondaryDim = Color(0xFF95CDF7), + onSecondary = Color(0xFF00344E), + onSecondaryContainer = Color(0xFFC9E6FF), + + tertiary = Color(0xFFA9C7FF), + tertiaryContainer = Color(0xFF264777), + tertiaryDim = Color(0xFFA9C7FF), + onTertiary = Color(0xFF07305F), + onTertiaryContainer = Color(0xFFD6E3FF), + + surfaceContainer = Color(0xFF1D2024), + surfaceContainerLow = Color(0xFF191C20), + surfaceContainerHigh = Color(0xFF272A2F), + onSurface = Color(0xFFE1E2E8), + onSurfaceVariant = Color(0xFFC3C6CF), + + error = Color(0xFFFFB4AB), + errorDim = Color(0xFFBA1B1B), + errorContainer = Color(0xFF93000A), + onError = Color(0xFF690005), + onErrorContainer = Color(0xFFFFDAD6), + + //background = Color(0xFF111418), + //onBackground = Color(0xFFE1E2E8), + + outline = Color(0xFF8D9199), + outlineVariant = Color(0xFF43474E), ) \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Theme.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Theme.kt index fe8b3889..14c47fc4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Theme.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Theme.kt @@ -1,14 +1,16 @@ package com.thewizrd.simplewear.ui.theme import androidx.compose.runtime.Composable -import androidx.wear.compose.material.MaterialTheme +import androidx.compose.ui.platform.LocalContext +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.dynamicColorScheme @Composable fun WearAppTheme( content: @Composable () -> Unit ) { MaterialTheme( - colors = wearColorPalette, + colorScheme = dynamicColorScheme(LocalContext.current) ?: wearColorScheme, typography = WearTypography, content = content ) diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Typography.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Typography.kt index 05689261..f8e326b4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Typography.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Typography.kt @@ -1,15 +1,5 @@ package com.thewizrd.simplewear.ui.theme -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp -import androidx.wear.compose.material.Typography +import androidx.wear.compose.material3.Typography -val WearTypography = Typography( - body1 = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp - ) -) \ No newline at end of file +val WearTypography = Typography() \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt index aa776d77..e3adaa28 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt @@ -40,6 +40,13 @@ import androidx.wear.tooling.preview.devices.WearDevices showBackground = true, group = "Devices - Square" ) +@Preview( + device = WearDevices.RECT, + showSystemUi = true, + backgroundColor = 0xff000000, + showBackground = true, + group = "Devices - Rect" +) public annotation class WearPreviewDevices @Preview( diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/AppLauncherViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/AppLauncherViewModel.kt index 86d2d8e0..5dc44536 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/AppLauncherViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/AppLauncherViewModel.kt @@ -1,6 +1,5 @@ package com.thewizrd.simplewear.viewmodels -import android.app.Activity import android.app.Application import android.os.Bundle import android.util.Log @@ -16,10 +15,10 @@ import com.thewizrd.shared_resources.data.AppItemSerializer import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.ImageUtils.toBitmap +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.shared_resources.utils.Logger import com.thewizrd.shared_resources.utils.bytesToString import com.thewizrd.simplewear.controls.AppItemViewModel -import com.thewizrd.simplewear.helpers.showConfirmationOverlay import com.thewizrd.simplewear.preferences.Settings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -61,7 +60,7 @@ class AppLauncherViewModel(app: Application) : WearableListenerViewModel(app) { viewModelState.update { state -> state.copy( - appsList = createAppsList(items ?: emptyList()), + appsList = createAppsList(items), isLoading = false ) } @@ -164,7 +163,7 @@ class AppLauncherViewModel(app: Application) : WearableListenerViewModel(app) { } } - fun openRemoteApp(activity: Activity, item: AppItemViewModel) { + fun openRemoteApp(item: AppItemViewModel) { viewModelScope.launch { val success = runCatching { val intent = WearableHelper.createRemoteActivityIntent( @@ -174,7 +173,21 @@ class AppLauncherViewModel(app: Application) : WearableListenerViewModel(app) { startRemoteActivity(intent) }.getOrDefault(false) - activity.showConfirmationOverlay(success) + _eventsFlow.tryEmit( + WearableEvent( + ACTION_SHOWCONFIRMATION, + Bundle().apply { + putString( + EXTRA_ACTIONDATA, + JSONParser.serializer( + ConfirmationData( + confirmationType = if (success) ConfirmationType.OpenOnPhone else ConfirmationType.Failure + ), ConfirmationData::class.java + ) + ) + } + ) + ) } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/ConfirmationViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/ConfirmationViewModel.kt index 42c6d0e1..ffa8307d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/ConfirmationViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/ConfirmationViewModel.kt @@ -3,7 +3,7 @@ package com.thewizrd.simplewear.viewmodels import androidx.annotation.DrawableRes import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import androidx.wear.compose.material.dialog.DialogDefaults +import androidx.wear.compose.material3.ConfirmationDialogDefaults import com.thewizrd.simplewear.R import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted @@ -30,7 +30,8 @@ class ConfirmationViewModel : ViewModel() { _confirmationEventsFlow.update { ConfirmationData( animatedVectorResId = R.drawable.confirmation_animation, - title = message + confirmationType = ConfirmationType.Success, + message = message ) } } @@ -39,7 +40,8 @@ class ConfirmationViewModel : ViewModel() { _confirmationEventsFlow.update { ConfirmationData( animatedVectorResId = R.drawable.failure_animation, - title = message + confirmationType = ConfirmationType.Failure, + message = message ) } } @@ -48,7 +50,18 @@ class ConfirmationViewModel : ViewModel() { _confirmationEventsFlow.update { ConfirmationData( animatedVectorResId = R.drawable.open_on_phone_animation, - title = message + confirmationType = ConfirmationType.OpenOnPhone, + message = message + ) + } + } + + fun showOpenOnPhoneForFailure(message: String? = null) { + _confirmationEventsFlow.update { + ConfirmationData( + animatedVectorResId = R.drawable.open_on_phone_animation, + confirmationType = ConfirmationType.Custom, + message = message ) } } @@ -59,8 +72,13 @@ class ConfirmationViewModel : ViewModel() { } data class ConfirmationData( - val title: String? = null, - @DrawableRes val iconResId: Int? = R.drawable.ws_full_sad, + val message: String? = null, + @DrawableRes val iconResId: Int? = null, @DrawableRes val animatedVectorResId: Int? = null, - val durationMs: Long = DialogDefaults.ShortDurationMillis -) \ No newline at end of file + val confirmationType: ConfirmationType = ConfirmationType.Custom, + val durationMs: Long = ConfirmationDialogDefaults.DurationMillis +) + +enum class ConfirmationType { + Success, Failure, OpenOnPhone, Custom +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt index 4d13e0d0..94fbbd36 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt @@ -78,7 +78,8 @@ class DashboardViewModel(app: Application) : WearableListenerViewModel(app) { EXTRA_ACTIONDATA, JSONParser.serializer( ConfirmationData( - title = it.getString(R.string.error_sendmessage) + confirmationType = ConfirmationType.Failure, + message = it.getString(R.string.error_sendmessage) ), ConfirmationData::class.java ) ) diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt index 01ef6036..6db7ad7c 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.util.Log import androidx.annotation.RestrictTo import androidx.annotation.VisibleForTesting +import androidx.concurrent.futures.await import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.wear.phone.interactions.PhoneTypeHelper @@ -37,10 +38,10 @@ import com.thewizrd.shared_resources.utils.bytesToString import com.thewizrd.shared_resources.utils.stringToBytes import com.thewizrd.simplewear.helpers.showConfirmationOverlay import com.thewizrd.simplewear.utils.ErrorMessage +import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.ACTION_OPENONPHONE import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.guava.await import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await import kotlin.coroutines.cancellation.CancellationException diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileProviderService.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileProviderService.kt index 07fa0eb4..2e56610a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileProviderService.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileProviderService.kt @@ -6,13 +6,15 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.SystemClock +import androidx.concurrent.futures.SuspendToFutureAdapter import androidx.lifecycle.lifecycleScope import androidx.wear.protolayout.ResourceBuilders -import androidx.wear.tiles.EventBuilders +import androidx.wear.tiles.EventBuilders.TileInteractionEvent import androidx.wear.tiles.RequestBuilders import androidx.wear.tiles.TileBuilders import com.google.android.horologist.annotations.ExperimentalHorologistApi import com.google.android.horologist.tiles.SuspendingTileService +import com.google.common.util.concurrent.ListenableFuture import com.thewizrd.shared_resources.actions.Action import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.NormalAction @@ -114,9 +116,7 @@ class DashboardTileProviderService : SuspendingTileService() { super.onDestroy() } - override fun onTileEnterEvent(requestParams: EventBuilders.TileEnterEvent) { - super.onTileEnterEvent(requestParams) - + private fun onTileInteractionEnterEvent(requestParams: TileInteractionEvent) { Logger.debug(TAG, "onTileEnterEvent called with: tileId = ${requestParams.tileId}") AnalyticsLogger.logEvent("on_tile_enter", Bundle().apply { putString("tile", TAG) @@ -134,12 +134,32 @@ class DashboardTileProviderService : SuspendingTileService() { } } - override fun onTileLeaveEvent(requestParams: EventBuilders.TileLeaveEvent) { - super.onTileLeaveEvent(requestParams) + private fun onTileInteractionLeaveEvent(requestParams: TileInteractionEvent) { Logger.debug(TAG, "$TAG: onTileLeaveEvent called with: tileId = ${requestParams.tileId}") isInFocus = false } + override fun onRecentInteractionEventsAsync(events: List): ListenableFuture { + return SuspendToFutureAdapter.launchFuture { + val lastEvent = events.lastOrNull() + + when (lastEvent?.eventType) { + TileInteractionEvent.ENTER -> { + onTileInteractionEnterEvent(lastEvent) + } + + TileInteractionEvent.LEAVE -> { + onTileInteractionLeaveEvent(lastEvent) + } + + TileInteractionEvent.UNKNOWN -> { /* no-op */ + } + } + + null + } + } + override suspend fun tileRequest(requestParams: RequestBuilders.TileRequest): TileBuilders.Tile { Logger.debug(TAG, "tileRequest: ${requestParams.currentState}") val startTime = SystemClock.elapsedRealtimeNanos() diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileProviderService.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileProviderService.kt index e8fd85ac..7fb78e62 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileProviderService.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/MediaPlayerTileProviderService.kt @@ -4,13 +4,15 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.SystemClock +import androidx.concurrent.futures.SuspendToFutureAdapter import androidx.lifecycle.lifecycleScope import androidx.wear.protolayout.ResourceBuilders -import androidx.wear.tiles.EventBuilders +import androidx.wear.tiles.EventBuilders.TileInteractionEvent import androidx.wear.tiles.RequestBuilders import androidx.wear.tiles.TileBuilders import com.google.android.horologist.annotations.ExperimentalHorologistApi import com.google.android.horologist.tiles.SuspendingTileService +import com.google.common.util.concurrent.ListenableFuture import com.thewizrd.shared_resources.appLib import com.thewizrd.shared_resources.utils.AnalyticsLogger import com.thewizrd.shared_resources.utils.Logger @@ -113,9 +115,7 @@ class MediaPlayerTileProviderService : SuspendingTileService() { super.onDestroy() } - override fun onTileEnterEvent(requestParams: EventBuilders.TileEnterEvent) { - super.onTileEnterEvent(requestParams) - + private fun onTileInteractionEnterEvent(requestParams: TileInteractionEvent) { Logger.debug(TAG, "onTileEnterEvent called with: tileId = ${requestParams.tileId}") AnalyticsLogger.logEvent("on_tile_enter", Bundle().apply { putString("tile", TAG) @@ -136,8 +136,7 @@ class MediaPlayerTileProviderService : SuspendingTileService() { } } - override fun onTileLeaveEvent(requestParams: EventBuilders.TileLeaveEvent) { - super.onTileLeaveEvent(requestParams) + private fun onTileInteractionLeaveEvent(requestParams: TileInteractionEvent) { Logger.debug(TAG, "onTileLeaveEvent called with: tileId = ${requestParams.tileId}") isInFocus = false @@ -146,6 +145,27 @@ class MediaPlayerTileProviderService : SuspendingTileService() { } } + override fun onRecentInteractionEventsAsync(events: List): ListenableFuture { + return SuspendToFutureAdapter.launchFuture { + val lastEvent = events.lastOrNull() + + when (lastEvent?.eventType) { + TileInteractionEvent.ENTER -> { + onTileInteractionEnterEvent(lastEvent) + } + + TileInteractionEvent.LEAVE -> { + onTileInteractionLeaveEvent(lastEvent) + } + + TileInteractionEvent.UNKNOWN -> { /* no-op */ + } + } + + null + } + } + override suspend fun tileRequest(requestParams: RequestBuilders.TileRequest): TileBuilders.Tile { Logger.debug(TAG, "tileRequest: ${requestParams.currentState}") val startTime = SystemClock.elapsedRealtimeNanos() diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt index 9dd1fbf3..e9418f21 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt @@ -1,14 +1,14 @@ +@file:OptIn(ExperimentalHorologistApi::class) +@file:Suppress("FunctionName") + package com.thewizrd.simplewear.wearable.tiles -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext +import android.content.Context import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmapOrNull -import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices -import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales +import androidx.wear.tiles.tooling.preview.TilePreviewData import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.tools.TileLayoutPreview +import com.google.android.horologist.compose.tools.tileRendererPreviewData import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.AudioStreamState import com.thewizrd.shared_resources.actions.AudioStreamType @@ -23,221 +23,147 @@ import com.thewizrd.shared_resources.media.PlaybackState import com.thewizrd.shared_resources.media.PositionState import com.thewizrd.shared_resources.utils.ImageUtils.toByteArray import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.ui.tools.WearTilePreviewDevices import kotlinx.coroutines.runBlocking -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@Composable -fun DashboardTilePreview() { - val context = LocalContext.current - val state = remember { - DashboardTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) +@WearTilePreviewDevices +private fun DashboardTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) ) - } - val renderer = remember { - DashboardTileRenderer(context, debugResourceMode = true) - } + ), + resourceState = Unit +) - TileLayoutPreview( - state = state, - resourceState = Unit, - renderer = renderer - ) -} +@WearTilePreviewDevices +private fun DashboardLoadingTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + batteryStatus = null, + actions = emptyMap() + ), + resourceState = Unit +) -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@Composable -fun DashboardLoadingTilePreview() { - val context = LocalContext.current - val state = remember { - DashboardTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - batteryStatus = null, - actions = emptyMap() +@WearTilePreviewDevices +private fun DashboardDisconnectTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.DISCONNECTED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) ) - } - val renderer = remember { - DashboardTileRenderer(context, debugResourceMode = true) - } + ), + resourceState = Unit +) - TileLayoutPreview( - state = state, - resourceState = Unit, - renderer = renderer - ) -} - -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@WearPreviewFontScales -@Composable -fun DashboardDisconnectTilePreview() { - val context = LocalContext.current - val state = remember { - DashboardTileState( - connectionStatus = WearConnectionStatus.DISCONNECTED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) +@WearTilePreviewDevices +private fun DashboardNotInstalledTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.APPNOTINSTALLED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) ) - } - val renderer = remember { - DashboardTileRenderer(context, debugResourceMode = true) - } + ), + resourceState = Unit +) - TileLayoutPreview( - state = state, - resourceState = Unit, - renderer = renderer +@WearTilePreviewDevices +private fun MediaPlayerTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = "Title", + artist = "Artist", + playbackState = PlaybackState.PAUSED, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + positionState = PositionState(100, 50), + artwork = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ws_full_sad)?.toBitmapOrNull() + ?.toByteArray() + }, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } ) -} - -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@WearPreviewFontScales -@Composable -fun DashboardNotInstalledTilePreview() { - val context = LocalContext.current - val state = remember { - DashboardTileState( - connectionStatus = WearConnectionStatus.APPNOTINSTALLED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) - ) - } - val renderer = remember { - DashboardTileRenderer(context, debugResourceMode = true) - } - TileLayoutPreview( - state = state, - resourceState = Unit, - renderer = renderer + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state ) } -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@WearPreviewFontScales -@Composable -fun MediaPlayerTilePreview() { - val context = LocalContext.current - val state = remember { - MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = "Title", - artist = "Artist", - playbackState = PlaybackState.PAUSED, - audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), - positionState = PositionState(100, 50), - artwork = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ws_full_sad)?.toBitmapOrNull() - ?.toByteArray() - }, - appIcon = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) - ?.toBitmapOrNull() - ?.toByteArray() - } - ) - } - val renderer = remember { - MediaPlayerTileRenderer(context, debugResourceMode = true) - } - - TileLayoutPreview( - state = state, - resourceState = state, - renderer = renderer +@WearTilePreviewDevices +private fun MediaPlayerEmptyTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = null, + artist = null, + playbackState = null, + audioStreamState = null, + artwork = null ) -} -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@Composable -fun MediaPlayerEmptyTilePreview() { - val context = LocalContext.current - val state = remember { - MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = null, - artist = null, - playbackState = null, - audioStreamState = null, - artwork = null - ) - } - val renderer = remember { - MediaPlayerTileRenderer(context, debugResourceMode = true) - } - - TileLayoutPreview( - state = state, - resourceState = state, - renderer = renderer + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state ) } -@OptIn(ExperimentalHorologistApi::class) -@WearPreviewDevices -@Composable -fun MediaPlayerNotPlayingTilePreview() { - val context = LocalContext.current - val state = remember { - MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = null, - artist = null, - playbackState = PlaybackState.NONE, - audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), - artwork = null, - appIcon = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) - ?.toBitmapOrNull() - ?.toByteArray() - } - ) - } - val renderer = remember { - MediaPlayerTileRenderer(context, debugResourceMode = true) - } +@WearTilePreviewDevices +private fun MediaPlayerNotPlayingTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = null, + artist = null, + playbackState = PlaybackState.NONE, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + artwork = null, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } + ) - TileLayoutPreview( - state = state, + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, resourceState = state, - renderer = renderer ) } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/ProtoLayoutVersionUtils.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt similarity index 57% rename from wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/ProtoLayoutVersionUtils.kt rename to wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt index bbd16fc3..3408f19d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/ProtoLayoutVersionUtils.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt @@ -2,6 +2,7 @@ package com.thewizrd.simplewear.wearable.tiles.layouts import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters import androidx.wear.protolayout.expression.VersionBuilders.VersionInfo +import kotlin.math.max fun DeviceParameters.supportsTransformation(): Boolean { // @RequiresSchemaVersion(major = 1, minor = 400) @@ -19,4 +20,28 @@ fun DeviceParameters.supportsDynamicValue(): Boolean { .build() return this.rendererSchemaVersion >= supportedVersion +} + +fun DeviceParameters.isSmallWatch(): Boolean { + return max(screenHeightDp, screenWidthDp) < 225 +} + +fun DeviceParameters.isLargeWatch(): Boolean { + return max(screenHeightDp, screenWidthDp) >= 225 +} + +fun DeviceParameters.isSmallHeight(): Boolean { + return screenHeightDp < 225 +} + +fun DeviceParameters.isLargeHeight(): Boolean { + return screenHeightDp >= 225 +} + +fun DeviceParameters.isSmallWidth(): Boolean { + return screenWidthDp < 225 +} + +fun DeviceParameters.isLargeWidth(): Boolean { + return screenWidthDp >= 225 } \ No newline at end of file diff --git a/wear/src/main/res/drawable/rounded_equalizer_24.xml b/wear/src/main/res/drawable/rounded_equalizer_24.xml new file mode 100644 index 00000000..a940e053 --- /dev/null +++ b/wear/src/main/res/drawable/rounded_equalizer_24.xml @@ -0,0 +1,12 @@ + + + + + From 4c48bc1e1d9918a7e6ee2a03735cb08e2be3e8a2 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sat, 18 Oct 2025 23:29:13 -0400 Subject: [PATCH 04/40] SimpleWear: remove legacy ConfirmationOverlay usage --- .../thewizrd/simplewear/PhoneSyncActivity.kt | 35 ------------- .../helpers/ConfirmationResultReceiver.kt | 37 -------------- .../ui/simplewear/AppLauncherScreen.kt | 4 +- .../simplewear/ui/simplewear/CallManagerUi.kt | 15 +++++- .../simplewear/ui/simplewear/Dashboard.kt | 8 +-- .../simplewear/ui/simplewear/GesturesUi.kt | 15 +++++- .../ui/simplewear/MediaPlayerListUi.kt | 18 +++++-- .../simplewear/ui/simplewear/MediaPlayerUi.kt | 15 +++++- .../simplewear/ui/simplewear/PhoneSyncUi.kt | 49 ++++++++++++++++++- .../ui/simplewear/TimedActionSetupUi.kt | 17 +++++-- .../simplewear/ui/simplewear/TimedActionUi.kt | 31 +++++++++--- .../ui/simplewear/ValueActionScreen.kt | 19 ++++--- .../viewmodels/WearableListenerViewModel.kt | 45 ++++++++++++----- 13 files changed, 188 insertions(+), 120 deletions(-) delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/helpers/ConfirmationResultReceiver.kt diff --git a/wear/src/main/java/com/thewizrd/simplewear/PhoneSyncActivity.kt b/wear/src/main/java/com/thewizrd/simplewear/PhoneSyncActivity.kt index b8e2bd0c..b440aa4d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/PhoneSyncActivity.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/PhoneSyncActivity.kt @@ -1,17 +1,12 @@ package com.thewizrd.simplewear import android.os.Bundle -import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.lifecycle.lifecycleScope import com.thewizrd.simplewear.ui.simplewear.PhoneSyncUi -import com.thewizrd.simplewear.utils.ErrorMessage import com.thewizrd.simplewear.viewmodels.PhoneSyncViewModel -import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.ACTION_OPENONPHONE -import kotlinx.coroutines.launch class PhoneSyncActivity : ComponentActivity() { private val phoneSyncViewModel by viewModels() @@ -27,37 +22,7 @@ class PhoneSyncActivity : ComponentActivity() { override fun onStart() { super.onStart() - phoneSyncViewModel.initActivityContext(this) - - lifecycleScope.launch { - phoneSyncViewModel.eventFlow.collect { event -> - when (event.eventType) { - ACTION_OPENONPHONE -> { - Toast.makeText( - this@PhoneSyncActivity, - R.string.error_syncing, - Toast.LENGTH_SHORT - ).show() - } - } - } - } - - lifecycleScope.launch { - phoneSyncViewModel.errorMessagesFlow.collect { error -> - when (error) { - is ErrorMessage.String -> { - Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT).show() - } - - is ErrorMessage.Resource -> { - Toast.makeText(applicationContext, error.stringId, Toast.LENGTH_SHORT) - .show() - } - } - } - } } override fun onResume() { diff --git a/wear/src/main/java/com/thewizrd/simplewear/helpers/ConfirmationResultReceiver.kt b/wear/src/main/java/com/thewizrd/simplewear/helpers/ConfirmationResultReceiver.kt deleted file mode 100644 index c8761e33..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/helpers/ConfirmationResultReceiver.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.thewizrd.simplewear.helpers - -import android.app.Activity -import androidx.fragment.app.Fragment -import androidx.wear.widget.ConfirmationOverlay - -fun Activity.showConfirmationOverlay(success: Boolean) { - val overlay = ConfirmationOverlay() - if (!success) { - overlay.setType(ConfirmationOverlay.FAILURE_ANIMATION) - } else { - overlay.setType(ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION) - } - overlay.showOn(this) -} - -fun Fragment.showConfirmationOverlay(success: Boolean) { - val overlay = ConfirmationOverlay() - if (!success) { - overlay.setType(ConfirmationOverlay.FAILURE_ANIMATION) - } else { - overlay.setType(ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION) - } - overlay.showAbove(requireView()) -} - -fun Activity.showConfirmationOverlay(@ConfirmationOverlay.OverlayType type: Int) { - val overlay = ConfirmationOverlay() - overlay.setType(type) - overlay.showOn(this) -} - -fun Fragment.showConfirmationOverlay(@ConfirmationOverlay.OverlayType type: Int) { - val overlay = ConfirmationOverlay() - overlay.setType(type) - overlay.showAbove(requireView()) -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt index e4510ce9..d9a88a6d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt @@ -138,7 +138,7 @@ fun AppLauncherScreen( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - appLauncherViewModel.openPlayStore(activity) + appLauncherViewModel.openPlayStore() // Navigate activity.startActivity( @@ -167,7 +167,7 @@ fun AppLauncherScreen( ActionStatus.PERMISSION_DENIED -> { confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) - appLauncherViewModel.openAppOnPhone(activity, false) + appLauncherViewModel.openAppOnPhone(false) } ActionStatus.FAILURE -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index 8bb98601..d9f57b65 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -71,6 +71,7 @@ import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.helpers.InCallUIHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay @@ -81,6 +82,7 @@ import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.CallManagerUiState import com.thewizrd.simplewear.viewmodels.CallManagerViewModel +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.launch @@ -149,7 +151,7 @@ fun CallManagerUi( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - callManagerViewModel.openPlayStore(activity) + callManagerViewModel.openPlayStore() // Navigate activity.startActivity( @@ -176,7 +178,16 @@ fun CallManagerUi( ) ) - callManagerViewModel.openAppOnPhone(activity, false) + callManagerViewModel.openAppOnPhone(false) + } + } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt index 8698d424..d0f6e322 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt @@ -311,7 +311,7 @@ fun Dashboard( WearConnectionStatus.CONNECTING -> {} WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - dashboardViewModel.openPlayStore(activity) + dashboardViewModel.openPlayStore() // Navigate activity.startActivity( @@ -375,7 +375,7 @@ fun Dashboard( ) } - dashboardViewModel.openAppOnPhone(activity, false) + dashboardViewModel.openAppOnPhone(false) } ActionStatus.TIMEOUT -> { @@ -388,7 +388,7 @@ fun Dashboard( ActionStatus.REMOTE_PERMISSION_DENIED -> { confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) - dashboardViewModel.openAppOnPhone(activity, false) + dashboardViewModel.openAppOnPhone(false) } ActionStatus.SUCCESS -> { @@ -441,7 +441,7 @@ fun Dashboard( phoneVersionCode?.let { showAppUpdateConfirmation = !WearableHelper.isAppUpToDate(it) if (showAppUpdateConfirmation) { - dashboardViewModel.openPlayStore(activity, false) + dashboardViewModel.openPlayStore(false) } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt index 886122e0..07c99094 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt @@ -66,6 +66,7 @@ import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.GestureActionState import com.thewizrd.shared_resources.helpers.GestureUIHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay @@ -75,6 +76,7 @@ import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.GestureUiState import com.thewizrd.simplewear.viewmodels.GestureUiViewModel @@ -210,7 +212,7 @@ fun GesturesUi( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - gestureUiViewModel.openPlayStore(activity) + gestureUiViewModel.openPlayStore() // Navigate activity.startActivity( @@ -237,7 +239,16 @@ fun GesturesUi( ) ) - gestureUiViewModel.openAppOnPhone(activity, false) + gestureUiViewModel.openAppOnPhone(false) + } + } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index 4a8a11ef..f1436cc3 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -59,6 +59,7 @@ import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadd import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel @@ -68,6 +69,7 @@ import com.thewizrd.simplewear.ui.components.LoadingContent import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.MediaPlayerListUiState import com.thewizrd.simplewear.viewmodels.MediaPlayerListViewModel @@ -149,7 +151,7 @@ fun MediaPlayerListUi( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - mediaPlayerListViewModel.openPlayStore(activity) + mediaPlayerListViewModel.openPlayStore() // Navigate activity.startActivity( @@ -176,10 +178,7 @@ fun MediaPlayerListUi( ) ) - mediaPlayerListViewModel.openAppOnPhone( - activity, - false - ) + mediaPlayerListViewModel.openAppOnPhone(false) } } @@ -197,6 +196,15 @@ fun MediaPlayerListUi( ) } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index e8f89182..ac8e0397 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -108,6 +108,7 @@ import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.media.PlaybackState +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel @@ -129,6 +130,7 @@ import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.delay @@ -293,7 +295,7 @@ fun MediaPlayerUi( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - mediaPlayerViewModel.openPlayStore(activity) + mediaPlayerViewModel.openPlayStore() // Navigate activity.startActivity( @@ -321,7 +323,7 @@ fun MediaPlayerUi( ) ) - mediaPlayerViewModel.openAppOnPhone(activity, false) + mediaPlayerViewModel.openAppOnPhone(false) } } @@ -333,6 +335,15 @@ fun MediaPlayerUi( confirmationViewModel.showFailure(message = context.getString(R.string.error_playback_failed)) } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt index 49c47107..00623c10 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.bluetooth.BluetoothAdapter import android.content.Intent import android.os.Build +import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility @@ -40,6 +41,7 @@ import androidx.core.content.ContextCompat import androidx.core.content.PermissionChecker import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.wear.compose.material3.AppScaffold import androidx.wear.compose.material3.ArcProgressIndicator import androidx.wear.compose.material3.ArcProgressIndicatorDefaults @@ -55,13 +57,19 @@ import androidx.wear.compose.material3.Text import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.utils.ErrorMessage +import com.thewizrd.simplewear.viewmodels.ConfirmationData +import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.PhoneSyncUiState import com.thewizrd.simplewear.viewmodels.PhoneSyncViewModel +import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.isActive @@ -93,6 +101,9 @@ private fun PhoneSyncUi( val uiState by phoneSyncViewModel.uiState.collectAsState() + val confirmationViewModel = viewModel() + val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() + val bluetoothRequestLauncher = rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { @@ -146,7 +157,7 @@ private fun PhoneSyncUi( WearConnectionStatus.APPNOTINSTALLED -> { lifecycleOwner.lifecycleScope.launch { - phoneSyncViewModel.openPlayStore(activity) + phoneSyncViewModel.openPlayStore() } } @@ -154,6 +165,42 @@ private fun PhoneSyncUi( } } ) + + ConfirmationOverlay( + confirmationData = confirmationData, + onTimeout = { confirmationViewModel.clearFlow() }, + ) + + LaunchedEffect(lifecycleOwner) { + lifecycleOwner.lifecycleScope.launch { + phoneSyncViewModel.eventFlow.collect { event -> + when (event.eventType) { + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } + } + } + } + + lifecycleOwner.lifecycleScope.launch { + phoneSyncViewModel.errorMessagesFlow.collect { error -> + when (error) { + is ErrorMessage.String -> { + Toast.makeText(context, error.message, Toast.LENGTH_SHORT).show() + } + + is ErrorMessage.Resource -> { + Toast.makeText(context, error.stringId, Toast.LENGTH_SHORT).show() + } + } + } + } + } } @Composable diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt index 36a7b2c2..1cf084ae 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt @@ -56,6 +56,7 @@ import com.thewizrd.shared_resources.actions.TimedAction import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearableHelper +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen @@ -63,8 +64,10 @@ import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.TimedActionUiViewModel +import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.EXTRA_STATUS import kotlinx.coroutines.delay import kotlinx.coroutines.isActive @@ -140,10 +143,7 @@ fun TimedActionSetupUi( ) ) - timedActionUiViewModel.openAppOnPhone( - activity, - showAnimation = false - ) + timedActionUiViewModel.openAppOnPhone(showAnimation = false) } else -> { @@ -153,6 +153,15 @@ fun TimedActionSetupUi( } } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt index f950d7f9..3f85490b 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt @@ -71,6 +71,7 @@ import com.thewizrd.shared_resources.actions.TimedAction import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearableHelper +import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.LoadingContent @@ -79,8 +80,10 @@ import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.TimedActionUiViewModel +import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.EXTRA_STATUS import kotlinx.coroutines.launch import java.time.Instant @@ -164,10 +167,7 @@ fun TimedActionUi( ) ) - timedActionUiViewModel.openAppOnPhone( - activity, - showAnimation = false - ) + timedActionUiViewModel.openAppOnPhone(showAnimation = false) } else -> { @@ -177,6 +177,15 @@ fun TimedActionUi( } } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } @@ -442,10 +451,7 @@ fun TimedActionDetailUi( ) ) - timedActionUiViewModel.openAppOnPhone( - activity, - showAnimation = false - ) + timedActionUiViewModel.openAppOnPhone(showAnimation = false) } else -> { @@ -455,6 +461,15 @@ fun TimedActionDetailUi( } } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index 45f5a623..a3a1916c 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -42,6 +42,7 @@ import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.ValueActionUiState import com.thewizrd.simplewear.viewmodels.ValueActionViewModel @@ -115,7 +116,7 @@ fun ValueActionScreen( WearConnectionStatus.APPNOTINSTALLED -> { // Open store on remote device - valueActionViewModel.openPlayStore(activity) + valueActionViewModel.openPlayStore() // Navigate activity.startActivity( @@ -157,10 +158,7 @@ fun ValueActionScreen( ) ) - valueActionViewModel.openAppOnPhone( - activity, - false - ) + valueActionViewModel.openAppOnPhone(false) } ActionStatus.TIMEOUT -> { @@ -190,12 +188,21 @@ fun ValueActionScreen( ActionStatus.PERMISSION_DENIED -> { confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) - valueActionViewModel.openAppOnPhone(activity, false) + valueActionViewModel.openAppOnPhone(false) } else -> {} } } + + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { + val jsonData = + event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) + + JSONParser.deserializer(jsonData, ConfirmationData::class.java)?.let { + confirmationViewModel.showConfirmation(it) + } + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt index 6db7ad7c..cf9a8745 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt @@ -36,7 +36,6 @@ import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.shared_resources.utils.Logger import com.thewizrd.shared_resources.utils.bytesToString import com.thewizrd.shared_resources.utils.stringToBytes -import com.thewizrd.simplewear.helpers.showConfirmationOverlay import com.thewizrd.simplewear.utils.ErrorMessage import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel.Companion.ACTION_OPENONPHONE import kotlinx.coroutines.channels.BufferOverflow @@ -95,7 +94,7 @@ abstract class WearableListenerViewModel(private val app: Application) : Android activityContext = null } - fun openAppOnPhone(activity: Activity, showAnimation: Boolean = true) { + fun openAppOnPhone(showAnimation: Boolean = true) { viewModelScope.launch { connect() @@ -104,7 +103,7 @@ abstract class WearableListenerViewModel(private val app: Application) : Android when (PhoneTypeHelper.getPhoneDeviceType(appContext)) { PhoneTypeHelper.DEVICE_TYPE_ANDROID -> { - openPlayStore(activity, showAnimation) + openPlayStore(showAnimation) } PhoneTypeHelper.DEVICE_TYPE_IOS -> { @@ -122,20 +121,16 @@ abstract class WearableListenerViewModel(private val app: Application) : Android WearableHelper.StartActivityPath, ByteArray(0) ) + val success = result != -1 if (showAnimation) { - activity.showConfirmationOverlay(result != -1) + sendConfirmationEvent(success) } - - _eventsFlow.tryEmit(WearableEvent(ACTION_OPENONPHONE, Bundle().apply { - putBoolean(EXTRA_SUCCESS, result != -1) - putBoolean(EXTRA_SHOWANIMATION, showAnimation) - })) } } } - suspend fun openPlayStore(activity: Activity, showAnimation: Boolean = true) { + suspend fun openPlayStore(showAnimation: Boolean = true) { // Open store on remote device val intentAndroid = Intent(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_BROWSABLE) @@ -146,11 +141,11 @@ abstract class WearableListenerViewModel(private val app: Application) : Android .await() if (showAnimation) { - activity.showConfirmationOverlay(true) + sendConfirmationEvent(true) } }.onFailure { if (it !is CancellationException && showAnimation) { - activity.showConfirmationOverlay(false) + sendConfirmationEvent(false) } } } @@ -393,6 +388,32 @@ abstract class WearableListenerViewModel(private val app: Application) : Android } } + protected fun sendConfirmationEvent(success: Boolean) { + if (success) { + sendConfirmationEvent(ConfirmationType.OpenOnPhone) + } else { + sendConfirmationEvent(ConfirmationType.Failure) + } + } + + protected fun sendConfirmationEvent(confirmationType: ConfirmationType) { + _eventsFlow.tryEmit( + WearableEvent( + ACTION_SHOWCONFIRMATION, + Bundle().apply { + putString( + EXTRA_ACTIONDATA, + JSONParser.serializer( + ConfirmationData( + confirmationType = confirmationType + ), ConfirmationData::class.java + ) + ) + } + ) + ) + } + /* * There should only ever be one phone in a node set (much less w/ the correct capability), so * I am just grabbing the first one (which should be the only one). From 5142bbbf668dac54481ede28c0a41fd781fba5b9 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 19 Oct 2025 15:55:29 -0400 Subject: [PATCH 05/40] SimpleWear: migrate DashboardConfig to compose --- build.gradle | 2 +- wear/build.gradle | 2 + wear/src/main/AndroidManifest.xml | 14 - .../activities/AppCompatLiteActivity.java | 50 -- .../activities/AppCompatLiteViewInflater.kt | 104 ---- .../simplewear/adapters/AddButtonAdapter.kt | 68 --- .../adapters/DashBattStatusItemAdapter.kt | 131 ----- .../simplewear/adapters/TileActionAdapter.kt | 184 ------- .../simplewear/controls/WearChipButton.kt | 420 --------------- .../simplewear/helpers/AcceptDenyDialog.java | 159 ------ .../helpers/SpacerItemDecoration.kt | 38 -- .../helpers/TileActionsItemTouchCallback.kt | 42 -- .../preferences/AddActionDialogBuilder.kt | 109 ---- .../preferences/DashboardConfigActivity.kt | 187 ------- .../DashboardTileConfigActivity.kt | 186 ------- .../simplewear/preferences/Settings.kt | 41 ++ .../ui/compose/LazyGridScrollIndicator.kt | 23 + .../ui/compose/LazyGridStateAdapter.kt | 176 ++++++ .../simplewear/ui/simplewear/Dashboard.kt | 20 - .../ui/simplewear/DashboardConfigUi.kt | 482 +++++++++++++++++ .../ui/simplewear/DashboardScreen.kt | 2 - .../ui/simplewear/DashboardTileConfigUi.kt | 500 ++++++++++++++++++ .../simplewear/ui/simplewear/SimpleWearApp.kt | 24 +- .../simplewear/ui/utils/Reorderable.kt | 52 ++ .../simplewear/utils/ResourcesUtils.kt | 54 -- .../viewmodels/DashboardViewModel.kt | 12 + 26 files changed, 1305 insertions(+), 1777 deletions(-) delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/activities/AppCompatLiteActivity.java delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/activities/AppCompatLiteViewInflater.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/adapters/AddButtonAdapter.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/adapters/DashBattStatusItemAdapter.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/adapters/TileActionAdapter.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/controls/WearChipButton.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/helpers/AcceptDenyDialog.java delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/helpers/SpacerItemDecoration.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/helpers/TileActionsItemTouchCallback.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/preferences/AddActionDialogBuilder.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardConfigActivity.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardTileConfigActivity.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridScrollIndicator.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridStateAdapter.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/utils/Reorderable.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/utils/ResourcesUtils.kt diff --git a/build.gradle b/build.gradle index fbd634c4..74901930 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { minSdkVersion = 24 targetSdkVersion = 34 - kotlin_version = '2.1.10' + kotlin_version = '2.1.20' kotlinx_version = '1.10.2' desugar_version = '2.1.5' diff --git a/wear/build.gradle b/wear/build.gradle index 09cb9781..cb8757c6 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -131,6 +131,8 @@ dependencies { implementation "com.google.android.horologist:horologist-compose-tools:$horologist_version" implementation "com.google.android.horologist:horologist-media-ui-material3:$horologist_version" + implementation 'sh.calvin.reorderable:reorderable:3.0.0' + androidTestImplementation platform("androidx.compose:compose-bom:$compose_bom_version") androidTestImplementation "androidx.compose.ui:ui-test-junit4" debugImplementation "androidx.compose.ui:ui-tooling" diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 9db4ae1c..8d556b82 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -95,20 +95,6 @@ android:theme="@style/WearAppTheme.MediaLauncher" android:taskAffinity=".mediaPlayer" /> - - - - installViewFactory()); - } - - private void installViewFactory() { - LayoutInflater layoutInflater = LayoutInflater.from(this); - if (layoutInflater.getFactory() == null) { - LayoutInflaterCompat.setFactory2(layoutInflater, new AppCompatLiteViewInflater()); - } else { - if (!(layoutInflater.getFactory2() instanceof AppCompatLiteViewInflater)) { - Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed" - + " so we can not install AppCompat's"); - } - } - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/activities/AppCompatLiteViewInflater.kt b/wear/src/main/java/com/thewizrd/simplewear/activities/AppCompatLiteViewInflater.kt deleted file mode 100644 index 00d9d3c3..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/activities/AppCompatLiteViewInflater.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.thewizrd.simplewear.activities - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import androidx.appcompat.widget.* -import com.google.android.material.button.MaterialButton -import com.google.android.material.checkbox.MaterialCheckBox -import com.google.android.material.radiobutton.MaterialRadioButton -import com.google.android.material.textfield.MaterialAutoCompleteTextView -import com.google.android.material.textview.MaterialTextView - -class AppCompatLiteViewInflater : LayoutInflater.Factory2 { - override fun onCreateView( - parent: View?, - name: String, - context: Context, - attrs: AttributeSet - ): View? { - return createView(parent, name, context, attrs) - } - - override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { - return createView(null, name, context, attrs) - } - - protected fun createView( - parent: View?, - name: String, - context: Context, - attrs: AttributeSet - ): View? { - var view: View? = null - - // We need to 'inject' our tint aware Views in place of the standard framework versions - when (name) { - "TextView" -> { - view = MaterialTextView(context, attrs) - verifyNotNull(view, name) - } - "ImageView" -> { - view = AppCompatImageView(context, attrs) - verifyNotNull(view, name) - } - "Button" -> { - view = MaterialButton(context, attrs) - verifyNotNull(view, name) - } - "EditText" -> { - view = AppCompatEditText(context, attrs) - verifyNotNull(view, name) - } - "Spinner" -> { - view = AppCompatSpinner(context, attrs) - verifyNotNull(view, name) - } - "ImageButton" -> { - view = AppCompatImageButton(context, attrs) - verifyNotNull(view, name) - } - "CheckBox" -> { - view = MaterialCheckBox(context, attrs) - verifyNotNull(view, name) - } - "RadioButton" -> { - view = MaterialRadioButton(context, attrs) - verifyNotNull(view, name) - } - "CheckedTextView" -> { - view = AppCompatCheckedTextView(context, attrs) - verifyNotNull(view, name) - } - "AutoCompleteTextView" -> { - view = MaterialAutoCompleteTextView(context, attrs) - verifyNotNull(view, name) - } - "MultiAutoCompleteTextView" -> { - view = AppCompatMultiAutoCompleteTextView(context, attrs) - verifyNotNull(view, name) - } - "RatingBar" -> { - view = AppCompatRatingBar(context, attrs) - verifyNotNull(view, name) - } - "SeekBar" -> { - view = AppCompatSeekBar(context, attrs) - verifyNotNull(view, name) - } - "ToggleButton" -> { - view = AppCompatToggleButton(context, attrs) - verifyNotNull(view, name) - } - } - - return view - } - - private fun verifyNotNull(view: View?, name: String) { - checkNotNull(view) { - ("${this.javaClass.name} asked to inflate view for <$name>, but returned null") - } - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/adapters/AddButtonAdapter.kt b/wear/src/main/java/com/thewizrd/simplewear/adapters/AddButtonAdapter.kt deleted file mode 100644 index ce31994f..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/adapters/AddButtonAdapter.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.thewizrd.simplewear.adapters - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.thewizrd.shared_resources.utils.ContextUtils.dpToPx -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.databinding.LayoutDashAddButtonBinding - -class AddButtonAdapter : RecyclerView.Adapter() { - companion object { - const val ITEM_TYPE = R.drawable.ic_add_white_24dp - } - - private var onClickListener: View.OnClickListener? = null - - fun setOnClickListener(listener: View.OnClickListener?) { - onClickListener = listener - } - - inner class ViewHolder(binding: LayoutDashAddButtonBinding) : - RecyclerView.ViewHolder(binding.root) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val recyclerView = parent as RecyclerView - val viewLayoutMgr = recyclerView.layoutManager - val viewParams = RecyclerView.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - - val binding = LayoutDashAddButtonBinding.inflate(LayoutInflater.from(parent.context)) - - if (viewLayoutMgr is GridLayoutManager) { - val buttonSize = - parent.context.resources.getDimensionPixelSize(R.dimen.tile_action_button_size) - val horizPadding = runCatching { - val spanCount = viewLayoutMgr.spanCount - val viewWidth = parent.getMeasuredWidth() - parent.paddingStart - parent.paddingEnd - val colWidth = viewWidth / spanCount - colWidth - buttonSize - }.getOrNull() ?: 0 - val vertPadding = parent.getContext().dpToPx(6f).toInt() - - viewParams.setMargins(horizPadding / 2, vertPadding, horizPadding / 2, vertPadding) - - binding.root.layoutParams = viewParams - } - - return ViewHolder(binding) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.itemView.setOnClickListener { - onClickListener?.onClick(it) - } - } - - override fun getItemCount(): Int { - return 1 - } - - override fun getItemViewType(position: Int): Int { - return ITEM_TYPE - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/adapters/DashBattStatusItemAdapter.kt b/wear/src/main/java/com/thewizrd/simplewear/adapters/DashBattStatusItemAdapter.kt deleted file mode 100644 index 7ade4632..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/adapters/DashBattStatusItemAdapter.kt +++ /dev/null @@ -1,131 +0,0 @@ -package com.thewizrd.simplewear.adapters - -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import com.thewizrd.shared_resources.utils.ContextUtils.getAttrColorStateList -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.controls.WearChipButton - -class DashBattStatusItemAdapter : RecyclerView.Adapter() { - companion object { - const val ITEM_TYPE = R.drawable.ic_battery_std_white_24dp - } - - private var itemPosition = RecyclerView.NO_POSITION - private var recyclerView: RecyclerView? = null - - var isVisible: Boolean = true - set(value) { - val oldValue = field - field = value - - if (oldValue != value) { - notifyItemChanged(0) - } - } - - var isChecked: Boolean = false - set(value) { - val oldValue = field - field = value - - if (oldValue != value) { - notifyItemChanged(0) - } - } - - inner class ViewHolder(private val button: WearChipButton) : - RecyclerView.ViewHolder(button) { - fun bind(isChecked: Boolean, isVisible: Boolean) { - if (!isVisible) { - button.setIconResource(R.drawable.ic_add_white_24dp) - button.setIconTint(button.context.getAttrColorStateList(R.attr.colorSurface)) - button.setBackgroundColor(button.context.getAttrColorStateList(R.attr.colorOnSurface)) - button.findViewById(R.id.wear_chip_primary_text)?.let { - it.setTextColor(button.context.getAttrColorStateList(R.attr.colorSurface)) - it.setText(R.string.action_add_batt_state) - } - } else if (isChecked) { - button.setIconResource(R.drawable.ic_close_white_24dp) - button.setIconTint(button.context.getAttrColorStateList(R.attr.colorSurface)) - button.setBackgroundColor(button.context.getAttrColorStateList(R.attr.colorOnSurface)) - button.findViewById(R.id.wear_chip_primary_text)?.let { - it.setTextColor(button.context.getAttrColorStateList(R.attr.colorSurface)) - it.setText(R.string.action_remove_batt_state) - } - } else { - button.setIconTint(button.context.getAttrColorStateList(R.attr.colorOnSurface)) - button.setIconResource(R.drawable.ic_battery_std_white_24dp) - button.setBackgroundColor( - ContextCompat.getColor( - button.context, - R.color.buttonDisabled - ) - ) - button.findViewById(R.id.wear_chip_primary_text)?.let { - it.setTextColor( - ContextCompat.getColor( - it.context, - R.color.wear_chip_primary_text_color - ) - ) - it.setText(R.string.title_batt_state) - } - } - - button.requestFocus() - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(WearChipButton(parent.context).apply { - setIconResource(R.drawable.ic_battery_std_white_24dp) - setText(R.string.title_batt_state) - isCheckable = false - }) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - itemPosition = holder.bindingAdapterPosition - holder.bind(isChecked, isVisible) - - holder.itemView.setOnClickListener { - if (!isVisible) { - isVisible = true - isChecked = false - } else if (isChecked) { - isVisible = false - isChecked = false - } else { - isChecked = true - } - } - } - - override fun getItemCount(): Int { - return 1 - } - - override fun getItemViewType(position: Int): Int { - return ITEM_TYPE - } - - override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { - this.recyclerView = recyclerView - } - - override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { - this.recyclerView = null - } - - fun getSelection(): View? { - if (itemPosition >= 0) { - return recyclerView?.findViewHolderForLayoutPosition(itemPosition)?.itemView - } - - return null - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/adapters/TileActionAdapter.kt b/wear/src/main/java/com/thewizrd/simplewear/adapters/TileActionAdapter.kt deleted file mode 100644 index fd7e9455..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/adapters/TileActionAdapter.kt +++ /dev/null @@ -1,184 +0,0 @@ -package com.thewizrd.simplewear.adapters - -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.ViewCompat -import androidx.core.widget.ImageViewCompat -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.thewizrd.shared_resources.actions.Actions -import com.thewizrd.shared_resources.controls.ActionButtonViewModel -import com.thewizrd.shared_resources.utils.ContextUtils.dpToPx -import com.thewizrd.shared_resources.utils.ContextUtils.getAttrColorStateList -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.databinding.LayoutDashButtonBinding - -class TileActionAdapter : ListAdapter( - ActionButtonViewModel.DIFF_CALLBACK -) { - private var checkedPosition = RecyclerView.NO_POSITION - private var recyclerView: RecyclerView? = null - - init { - setHasStableIds(true) - } - - inner class ViewHolder(private val binding: LayoutDashButtonBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(model: ActionButtonViewModel, isChecked: Boolean) { - if (isChecked) { - binding.button.setImageResource(R.drawable.ic_close_white_24dp) - ImageViewCompat.setImageTintList( - binding.button, - itemView.context.getAttrColorStateList(R.attr.colorSurface) - ) - ViewCompat.setBackgroundTintList( - binding.button, - itemView.context.getAttrColorStateList(R.attr.colorOnSurface) - ) - itemView.requestFocus() - } else { - binding.button.setImageResource(model.drawableResId) - ImageViewCompat.setImageTintList( - binding.button, - itemView.context.getAttrColorStateList(R.attr.colorOnSurface) - ) - ViewCompat.setBackgroundTintList(binding.button, null) - itemView.clearFocus() - } - } - } - - var onLongClickListener: ((RecyclerView.ViewHolder) -> Unit)? = null - var onListChanged: ((List) -> Unit)? = null - - override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { - this.recyclerView = recyclerView - } - - override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { - this.recyclerView = null - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val recyclerView = parent as RecyclerView - val viewLayoutMgr = recyclerView.layoutManager - val viewParams = RecyclerView.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - - val binding = LayoutDashButtonBinding.inflate(LayoutInflater.from(parent.context)) - - if (viewLayoutMgr is GridLayoutManager) { - val buttonSize = - parent.context.resources.getDimensionPixelSize(R.dimen.tile_action_button_size) - val horizPadding = runCatching { - val spanCount = viewLayoutMgr.spanCount - val viewWidth = parent.getMeasuredWidth() - parent.paddingStart - parent.paddingEnd - val colWidth = viewWidth / spanCount - colWidth - buttonSize - }.getOrNull() ?: 0 - val vertPadding = parent.getContext().dpToPx(6f).toInt() - - viewParams.setMargins(horizPadding / 2, vertPadding, horizPadding / 2, vertPadding) - - binding.root.layoutParams = viewParams - } - - return ViewHolder(binding) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val isChecked = position == checkedPosition - holder.bind(getItem(position), isChecked) - - holder.itemView.setOnClickListener { - Log.d("TileAdapter", "onclick $position") - - if (isChecked) { - checkedPosition = RecyclerView.NO_POSITION - // remove item - removeAction(holder.bindingAdapterPosition) - } else { - val oldPosition = checkedPosition - checkedPosition = holder.bindingAdapterPosition - - if (oldPosition >= 0) { - notifyItemChanged(oldPosition) - } - notifyItemChanged(checkedPosition) - } - } - holder.itemView.setOnLongClickListener { - onLongClickListener?.invoke(holder) - true - } - } - - private fun removeAction(position: Int) { - val items = currentList.toMutableList() - if (position != RecyclerView.NO_POSITION) { - items.removeAt(position) - } - submitList(items) - } - - fun removeAction(action: Actions) { - val items = currentList.toMutableList() - items.removeIf { it.actionType == action } - submitList(items) - } - - fun addAction(action: Actions) { - val items = currentList.toMutableList() - items.add(ActionButtonViewModel.getViewModelFromAction(action)) - submitList(items) - } - - fun submitActions(actions: List?) { - submitList(actions?.map { - ActionButtonViewModel.getViewModelFromAction(it) - } ?: emptyList()) - } - - fun getActions(): List { - return currentList.map { it.actionType } - } - - override fun getItemViewType(position: Int): Int { - return R.layout.layout_dash_button - } - - override fun getItemId(position: Int): Long { - return getItem(position).actionType.value.toLong() - } - - override fun onCurrentListChanged( - previousList: MutableList, - currentList: MutableList - ) { - super.onCurrentListChanged(previousList, currentList) - onListChanged?.invoke(currentList) - } - - fun clearSelection() { - val oldPosition = checkedPosition - checkedPosition = RecyclerView.NO_POSITION - - if (oldPosition >= 0) { - notifyItemChanged(oldPosition) - } - } - - fun getSelection(): View? { - if (checkedPosition >= 0) { - return recyclerView?.findViewHolderForLayoutPosition(checkedPosition)?.itemView - } - - return null - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/controls/WearChipButton.kt b/wear/src/main/java/com/thewizrd/simplewear/controls/WearChipButton.kt deleted file mode 100644 index f032f9ed..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/controls/WearChipButton.kt +++ /dev/null @@ -1,420 +0,0 @@ -package com.thewizrd.simplewear.controls - -import android.annotation.SuppressLint -import android.content.Context -import android.content.res.ColorStateList -import android.graphics.drawable.Drawable -import android.graphics.drawable.LayerDrawable -import android.util.AttributeSet -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.* -import androidx.annotation.ColorInt -import androidx.annotation.ColorRes -import androidx.annotation.DrawableRes -import androidx.annotation.IntDef -import androidx.annotation.StringRes -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.DrawableCompat -import androidx.core.view.ViewCompat -import com.thewizrd.simplewear.R - -@SuppressLint("RestrictedApi") -class WearChipButton @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = R.attr.wearChipButtonStyle, - defStyleRes: Int = DEF_STYLE_RES -) : ConstraintLayout(context, attrs, defStyleAttr, defStyleRes), Checkable { - companion object { - private const val DEF_STYLE_RES = R.style.Widget_Wear_WearChipButton - - private val ENABLED_STATE_SET = intArrayOf(android.R.attr.state_enabled) - private val CHECKABLE_STATE_SET = intArrayOf(android.R.attr.state_checkable) - private val CHECKED_STATE_SET = intArrayOf(android.R.attr.state_checked) - - const val CONTROLTYPE_NONE = 0 - const val CONTROLTYPE_CHECKBOX = 1 - const val CONTROLTYPE_RADIO = 2 - const val CONTROLTYPE_TOGGLE = 3 - } - - @Retention(AnnotationRetention.SOURCE) - @IntDef( - CONTROLTYPE_NONE, - CONTROLTYPE_CHECKBOX, - CONTROLTYPE_RADIO, - CONTROLTYPE_TOGGLE - ) - annotation class ControlType - - private val mIconView: ImageView - private val mPrimaryTextView: TextView - private val mSecondaryTextView: TextView - private val mSelectionControlContainer: ViewGroup - - private var buttonBackgroundTint: ColorStateList? = null - private var buttonControlTint: ColorStateList? = null - private var iconTint: ColorStateList? = null - - var isCheckable: Boolean = false - get() = field - set(value) { - field = value - refreshDrawableState() - } - - private var _isChecked = false - - init { - LayoutInflater.from(context).inflate(R.layout.wear_chip_button_layout, this, true) - mIconView = findViewById(R.id.wear_chip_icon) - mPrimaryTextView = findViewById(R.id.wear_chip_primary_text) - mSecondaryTextView = findViewById(R.id.wear_chip_secondary_text) - mSelectionControlContainer = findViewById(R.id.wear_chip_selection_control_container) - - mPrimaryTextView.maxLines = 2 - mSecondaryTextView.maxLines = 1 - - val a = context.obtainStyledAttributes( - attrs, - R.styleable.WearChipButton, - defStyleAttr, - defStyleRes - ) - ViewCompat.saveAttributeDataForStyleable( - this, - context, R.styleable.WearChipButton, - attrs, a, defStyleAttr, defStyleRes - ) - - try { - if (a.hasValue(R.styleable.WearChipButton_icon)) { - setIconDrawable(a.getDrawable(R.styleable.WearChipButton_icon)) - } - if (a.hasValue(R.styleable.WearChipButton_primaryText)) { - setPrimaryText(a.getString(R.styleable.WearChipButton_primaryText)) - } - if (a.hasValue(R.styleable.WearChipButton_primaryTextMaxLines)) { - setPrimaryTextMaxLines( - a.getInt( - R.styleable.WearChipButton_primaryTextMaxLines, - mPrimaryTextView.maxLines - ) - ) - } - if (a.hasValue(R.styleable.WearChipButton_secondaryText)) { - setSecondaryText(a.getString(R.styleable.WearChipButton_secondaryText)) - } - if (a.hasValue(R.styleable.WearChipButton_secondaryTextMaxLines)) { - setSecondaryTextMaxLines( - a.getInt( - R.styleable.WearChipButton_secondaryTextMaxLines, - mSecondaryTextView.maxLines - ) - ) - } - if (a.hasValue(R.styleable.WearChipButton_backgroundTint)) { - val colorResId = a.getResourceId(R.styleable.WearChipButton_backgroundTint, 0) - if (colorResId != 0) { - val tint = ContextCompat.getColorStateList(context, colorResId) - if (tint != null) { - buttonBackgroundTint = tint - } - } - - if (buttonBackgroundTint == null) { - buttonBackgroundTint = - a.getColorStateList(R.styleable.WearChipButton_backgroundTint) - } - } - if (a.hasValue(R.styleable.WearChipButton_buttonTint)) { - val colorResId = a.getResourceId(R.styleable.WearChipButton_buttonTint, 0) - if (colorResId != 0) { - val tint = ContextCompat.getColorStateList(context, colorResId) - if (tint != null) { - buttonControlTint = tint - } - } - - if (buttonControlTint == null) { - buttonControlTint = - a.getColorStateList(R.styleable.WearChipButton_buttonTint) - } - } - if (a.hasValue(R.styleable.WearChipButton_iconTint)) { - val colorResId = a.getResourceId(R.styleable.WearChipButton_iconTint, 0) - if (colorResId != 0) { - val tint = ContextCompat.getColorStateList(context, colorResId) - if (tint != null) { - iconTint = tint - } - } - - if (iconTint == null) { - iconTint = - a.getColorStateList(R.styleable.WearChipButton_iconTint) - } - - setIconTint(iconTint) - } - if (a.hasValue(R.styleable.WearChipButton_android_checkable)) { - isCheckable = a.getBoolean(R.styleable.WearChipButton_android_checkable, false) - } - if (a.hasValue(R.styleable.WearChipButton_android_checked)) { - isChecked = a.getBoolean(R.styleable.WearChipButton_android_checked, false) - } - if (a.hasValue(R.styleable.WearChipButton_controlType)) { - updateControlType(a.getInt(R.styleable.WearChipButton_controlType, 0)) - } - if (a.hasValue(R.styleable.WearChipButton_minHeight)) { - minHeight = a.getDimensionPixelSize(R.styleable.WearChipButton_minHeight, 0) - } - } finally { - a.recycle() - } - - updateBackgroundTint() - updateButtonControlTint() - } - - fun setIconResource(@DrawableRes resId: Int) { - mIconView.setImageResource(resId) - mIconView.visibility = if (resId == 0) View.GONE else View.VISIBLE - } - - fun setIconDrawable(drawable: Drawable?) { - mIconView.setImageDrawable(drawable) - mIconView.visibility = if (drawable == null) View.GONE else View.VISIBLE - } - - fun setIconTint(tint: ColorStateList?) { - mIconView.imageTintList = tint - } - - fun setIconTintResource(@ColorRes iconTintResId: Int) { - setIconTint(ContextCompat.getColorStateList(context, iconTintResId)) - } - - fun setPrimaryText(@StringRes resId: Int) { - if (resId == 0) { - setPrimaryText(null) - } else { - mPrimaryTextView.setText(resId) - mPrimaryTextView.visibility = if (resId == 0) View.GONE else View.VISIBLE - } - } - - fun setPrimaryText(text: CharSequence?) { - mPrimaryTextView.text = text - mPrimaryTextView.visibility = if (text == null) View.GONE else View.VISIBLE - } - - fun setPrimaryTextMaxLines(maxLines: Int) { - mPrimaryTextView.maxLines = maxLines - } - - fun setSecondaryText(@StringRes resId: Int) { - if (resId == 0) { - setSecondaryText(null) - } else { - mSecondaryTextView.setText(resId) - mSecondaryTextView.visibility = if (resId == 0) View.GONE else View.VISIBLE - if (resId == 0) { - mPrimaryTextView.maxLines = 2 - } else { - mPrimaryTextView.maxLines = 1 - } - } - } - - fun setSecondaryText(text: CharSequence?) { - mSecondaryTextView.text = text - mSecondaryTextView.visibility = if (text == null) View.GONE else View.VISIBLE - if (text == null) { - mPrimaryTextView.maxLines = 2 - } else { - mPrimaryTextView.maxLines = 1 - } - } - - fun setSecondaryTextMaxLines(maxLines: Int) { - mSecondaryTextView.maxLines = maxLines - } - - fun setText(@StringRes primaryResId: Int, @StringRes secondaryResId: Int = 0) { - setPrimaryText(primaryResId) - setSecondaryText(secondaryResId) - } - - fun setText(primaryText: CharSequence?, secondaryText: CharSequence? = null) { - setPrimaryText(primaryText) - setSecondaryText(secondaryText) - } - - fun setControlView(view: View?) { - mSelectionControlContainer.removeAllViews() - if (view != null) { - mSelectionControlContainer.addView(view) - mSelectionControlContainer.visibility = View.VISIBLE - } else { - mSelectionControlContainer.visibility = View.GONE - } - } - - fun getControlView(): View? { - return mSelectionControlContainer.getChildAt(0) - } - - fun setControlViewVisibility(visibility: Int) { - if (getControlView() != null) { - mSelectionControlContainer.visibility = visibility - } - } - - fun getBackgroundColor(): ColorStateList? { - return buttonBackgroundTint - } - - fun setBackgroundColor(tint: ColorStateList?) { - buttonBackgroundTint = tint - updateBackgroundTint() - } - - override fun setBackgroundColor(@ColorInt color: Int) { - buttonBackgroundTint = ColorStateList.valueOf(color) - updateBackgroundTint() - } - - fun getControlButtonColor(): ColorStateList? { - return buttonControlTint - } - - fun setControlButtonColor(tint: ColorStateList?) { - buttonControlTint = tint - updateButtonControlTint() - } - - fun updateControlType(@ControlType controlType: Int) { - when (controlType) { - CONTROLTYPE_CHECKBOX -> { - setControlView(CheckBox(context).apply { - layoutParams = FrameLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { - gravity = Gravity.CENTER - } - isClickable = false - isDuplicateParentStateEnabled = true - buttonDrawable = - ContextCompat.getDrawable(context, R.drawable.wear_checkbox_icon) - buttonTintList = buttonControlTint - }) - setControlViewVisibility(View.VISIBLE) - } - CONTROLTYPE_RADIO -> { - setControlView(RadioButton(context).apply { - layoutParams = FrameLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { - gravity = Gravity.CENTER - } - isClickable = false - isDuplicateParentStateEnabled = true - buttonDrawable = ContextCompat.getDrawable(context, R.drawable.wear_radio_icon) - buttonTintList = buttonControlTint - }) - setControlViewVisibility(View.VISIBLE) - } - CONTROLTYPE_TOGGLE -> { - setControlView(CheckBox(context).apply { - layoutParams = FrameLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { - gravity = Gravity.CENTER - } - isClickable = false - isDuplicateParentStateEnabled = true - buttonDrawable = ContextCompat.getDrawable(context, R.drawable.wear_switch_icon) - buttonTintList = buttonControlTint - }) - setControlViewVisibility(View.VISIBLE) - } - else -> { - setControlView(null) - } - } - } - - private fun updateBackgroundTint() { - val backgroundDrawable = background - if (backgroundDrawable != null) { - if (backgroundDrawable is LayerDrawable) { - val layerCount = backgroundDrawable.numberOfLayers - for (i in 1 until layerCount) { - val layer = backgroundDrawable.getDrawable(i) - val id = backgroundDrawable.getId(i) - if (id == R.id.start_accent) { - layer.alpha = 0xFF - backgroundDrawable.setDrawable(i, layer.setButtonBackgroundDrawableTint()) - } else { - layer.alpha = 0 - } - } - return - } - - val tintable = DrawableCompat.wrap(backgroundDrawable).mutate() - DrawableCompat.setTintList(tintable, buttonBackgroundTint) - background = tintable - } - } - - private fun updateButtonControlTint() { - val control = getControlView() as? CompoundButton - control?.buttonTintList = buttonControlTint - } - - private fun Drawable.setButtonBackgroundDrawableTint(): Drawable { - val tintable = DrawableCompat.wrap(this).mutate() - DrawableCompat.setTintList(tintable, buttonBackgroundTint) - return tintable - } - - override fun setChecked(checked: Boolean) { - _isChecked = checked - refreshDrawableState() - } - - override fun isChecked(): Boolean { - return _isChecked - } - - override fun toggle() { - isChecked = !isChecked - } - - override fun onCreateDrawableState(extraSpace: Int): IntArray { - val drawableState = super.onCreateDrawableState(extraSpace + 3) - - if (isCheckable) { - mergeDrawableStates(drawableState, CHECKABLE_STATE_SET) - } - - if (isChecked) { - mergeDrawableStates(drawableState, CHECKED_STATE_SET) - } - - if (isEnabled) { - mergeDrawableStates(drawableState, ENABLED_STATE_SET) - } - - return drawableState - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/helpers/AcceptDenyDialog.java b/wear/src/main/java/com/thewizrd/simplewear/helpers/AcceptDenyDialog.java deleted file mode 100644 index 49243001..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/helpers/AcceptDenyDialog.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.thewizrd.simplewear.helpers; - -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; - -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.annotation.StyleRes; - -import com.thewizrd.simplewear.databinding.AcceptDenyDialogBinding; - -public class AcceptDenyDialog extends Dialog { - private final AcceptDenyDialogBinding binding; - protected OnClickListener mPositiveButtonListener; - protected OnClickListener mNegativeButtonListener; - private final View.OnClickListener mButtonHandler; - - public AcceptDenyDialog(@NonNull Context context) { - this(context, 0); - } - - public AcceptDenyDialog(@NonNull Context context, @StyleRes int themeResId) { - super(context, themeResId); - mButtonHandler = new android.view.View.OnClickListener() { - public void onClick(View v) { - if (v == binding.buttonPositive && AcceptDenyDialog.this.mPositiveButtonListener != null) { - AcceptDenyDialog.this.mPositiveButtonListener.onClick(AcceptDenyDialog.this, DialogInterface.BUTTON_POSITIVE); - } else if (v == binding.buttonNegative && AcceptDenyDialog.this.mNegativeButtonListener != null) { - AcceptDenyDialog.this.mNegativeButtonListener.onClick(AcceptDenyDialog.this, DialogInterface.BUTTON_NEGATIVE); - } - - AcceptDenyDialog.this.dismiss(); - } - }; - binding = AcceptDenyDialogBinding.inflate(LayoutInflater.from(getContext())); - setContentView(binding.getRoot()); - binding.buttonPositive.setOnClickListener(mButtonHandler); - binding.buttonNegative.setOnClickListener(mButtonHandler); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding.title.getRootView().requestFocus(); - } - - @Nullable - public View getButton(int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - return binding.buttonPositive; - case DialogInterface.BUTTON_NEGATIVE: - return binding.buttonNegative; - default: - return null; - } - } - - public void setIcon(@Nullable Drawable icon) { - binding.icon.setVisibility(icon == null ? View.GONE : View.VISIBLE); - binding.icon.setImageDrawable(icon); - } - - public void setIcon(@DrawableRes int resId) { - binding.icon.setVisibility(resId == 0 ? View.GONE : View.VISIBLE); - binding.icon.setImageResource(resId); - } - - public void setMessage(@Nullable CharSequence message) { - binding.message.setText(message); - binding.message.setVisibility(message == null ? View.GONE : View.VISIBLE); - } - - public void setMessage(@StringRes int resId) { - binding.message.setText(resId); - binding.message.setVisibility(resId == 0 ? View.GONE : View.VISIBLE); - } - - public void setTitle(@Nullable CharSequence message) { - binding.title.setText(message); - } - - public void setTitle(@StringRes int resId) { - binding.title.setText(resId); - } - - public void setButton(int which, OnClickListener listener) { - switch (which) { - case DialogInterface.BUTTON_NEGATIVE: - this.mNegativeButtonListener = listener; - break; - case DialogInterface.BUTTON_POSITIVE: - this.mPositiveButtonListener = listener; - break; - default: - return; - } - - binding.spacer.setVisibility(this.mPositiveButtonListener != null && this.mNegativeButtonListener != null ? View.INVISIBLE : View.GONE); - binding.buttonPositive.setVisibility(this.mPositiveButtonListener == null ? View.GONE : View.VISIBLE); - binding.buttonNegative.setVisibility(this.mNegativeButtonListener == null ? View.GONE : View.VISIBLE); - binding.buttonPanel.setVisibility(this.mPositiveButtonListener == null && this.mNegativeButtonListener == null ? View.GONE : View.VISIBLE); - } - - public void setPositiveButton(OnClickListener listener) { - this.setButton(DialogInterface.BUTTON_POSITIVE, listener); - } - - public void setNegativeButton(OnClickListener listener) { - this.setButton(DialogInterface.BUTTON_NEGATIVE, listener); - } - - public static class Builder { - private final Context mContext; - private CharSequence message; - private final DialogInterface.OnClickListener onClickListener; - - public Builder(Context context, DialogInterface.OnClickListener onClickListener) { - mContext = context; - this.onClickListener = onClickListener; - } - - private void apply(AcceptDenyDialog dialog) { - dialog.setMessage(message); - dialog.setPositiveButton(onClickListener); - dialog.setNegativeButton(onClickListener); - } - - public Builder setMessage(@StringRes int resId) { - message = mContext.getString(resId); - return this; - } - - public Builder setMessage(CharSequence message) { - this.message = message; - return this; - } - - public AcceptDenyDialog create() { - AcceptDenyDialog dialog = new AcceptDenyDialog(mContext); - dialog.create(); - apply(dialog); - return dialog; - } - - public AcceptDenyDialog show() { - AcceptDenyDialog dialog = this.create(); - dialog.show(); - return dialog; - } - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/helpers/SpacerItemDecoration.kt b/wear/src/main/java/com/thewizrd/simplewear/helpers/SpacerItemDecoration.kt deleted file mode 100644 index 91367236..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/helpers/SpacerItemDecoration.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.thewizrd.simplewear.helpers - -import android.graphics.Rect -import android.view.View -import androidx.recyclerview.widget.RecyclerView - -class SpacerItemDecoration : RecyclerView.ItemDecoration { - private val horizontalSpace: Int? - private val verticalSpace: Int? - - constructor(space: Int) : super() { - horizontalSpace = space - verticalSpace = space - } - - constructor(horizontalSpace: Int? = null, verticalSpace: Int? = null) : super() { - this.horizontalSpace = horizontalSpace - this.verticalSpace = verticalSpace - } - - override fun getItemOffsets( - outRect: Rect, - view: View, - parent: RecyclerView, - state: RecyclerView.State - ) { - super.getItemOffsets(outRect, view, parent, state) - - verticalSpace?.let { - outRect.top = it / 2 - outRect.bottom = it / 2 - } - horizontalSpace?.let { - outRect.left = it / 2 - outRect.right = it / 2 - } - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/helpers/TileActionsItemTouchCallback.kt b/wear/src/main/java/com/thewizrd/simplewear/helpers/TileActionsItemTouchCallback.kt deleted file mode 100644 index 9e3fa4e4..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/helpers/TileActionsItemTouchCallback.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.thewizrd.simplewear.helpers - -import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.RecyclerView -import com.thewizrd.simplewear.adapters.AddButtonAdapter -import com.thewizrd.simplewear.adapters.TileActionAdapter -import java.util.* - -class TileActionsItemTouchCallback(private val adapter: TileActionAdapter) : - ItemTouchHelper.SimpleCallback( - ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END, - 0 - ) { - override fun onMove( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - return if (viewHolder is AddButtonAdapter.ViewHolder || target is AddButtonAdapter.ViewHolder) { - false - } else { - val from = viewHolder.bindingAdapterPosition - val to = target.bindingAdapterPosition - - val items = adapter.currentList.toMutableList() - Collections.swap(items, from, to) - adapter.submitList(items) - - true - } - } - - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} - - override fun isItemViewSwipeEnabled(): Boolean { - return false - } - - override fun isLongPressDragEnabled(): Boolean { - return false - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/preferences/AddActionDialogBuilder.kt b/wear/src/main/java/com/thewizrd/simplewear/preferences/AddActionDialogBuilder.kt deleted file mode 100644 index e5e5aefc..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/preferences/AddActionDialogBuilder.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.thewizrd.simplewear.preferences - -import android.app.AlertDialog -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.AsyncDifferConfig -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.thewizrd.shared_resources.actions.Actions -import com.thewizrd.shared_resources.controls.ActionButtonViewModel -import com.thewizrd.shared_resources.helpers.ListAdapterOnClickInterface -import com.thewizrd.shared_resources.utils.ContextUtils.dpToPx -import com.thewizrd.simplewear.controls.WearChipButton -import com.thewizrd.simplewear.databinding.DialogAddactionBinding -import com.thewizrd.simplewear.helpers.SpacerItemDecoration - -class AddActionDialogBuilder(private val context: Context, private val actionsList: List) { - private lateinit var adapter: ActionsListAdapter - private var onActionSelectedListener: OnActionSelectedListener? = null - private lateinit var binding: DialogAddactionBinding - - interface OnActionSelectedListener { - fun onActionSelected(action: Actions) - } - - private fun createView(): View { - binding = DialogAddactionBinding.inflate(LayoutInflater.from(context)) - - adapter = ActionsListAdapter(ActionButtonViewModel.DIFF_CALLBACK) - - binding.recyclerView.layoutManager = LinearLayoutManager(context) - binding.recyclerView.adapter = adapter - binding.recyclerView.addItemDecoration( - SpacerItemDecoration( - verticalSpace = context.dpToPx(4f).toInt() - ) - ) - - adapter.submitList(actionsList.map { - ActionButtonViewModel.getViewModelFromAction(it) - }) - - return binding.root - } - - fun setOnActionSelectedListener(listener: OnActionSelectedListener?): AddActionDialogBuilder { - this.onActionSelectedListener = listener - return this - } - - fun show() { - val dialog = AlertDialog.Builder(context) - .setCancelable(true) - .setView(createView()) - .create() - - adapter.setOnClickListener(object : ListAdapterOnClickInterface { - override fun onClick(view: View, item: ActionButtonViewModel) { - onActionSelectedListener?.onActionSelected(item.actionType) - dialog.dismiss() - } - }) - - dialog.show() - } - - private class ActionsListAdapter : - ListAdapter { - private var onClickListener: ListAdapterOnClickInterface? = null - - constructor(diffCallback: DiffUtil.ItemCallback) : super(diffCallback) - protected constructor(config: AsyncDifferConfig) : super(config) - - fun setOnClickListener(onClickListener: ListAdapterOnClickInterface?) { - this.onClickListener = onClickListener - } - - inner class ViewHolder(private val button: WearChipButton) : - RecyclerView.ViewHolder(button) { - fun bind(model: ActionButtonViewModel) { - button.setPrimaryText(model.actionLabelResId) - button.setIconResource(model.drawableResId) - itemView.setOnClickListener { - onClickListener?.onClick(it, model) - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - // create a new view - val v = WearChipButton(parent.context).apply { - layoutParams = RecyclerView.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - } - - return ViewHolder(v) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) - } - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardConfigActivity.kt b/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardConfigActivity.kt deleted file mode 100644 index 00a3b1bf..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardConfigActivity.kt +++ /dev/null @@ -1,187 +0,0 @@ -package com.thewizrd.simplewear.preferences - -import android.content.DialogInterface -import android.graphics.Rect -import android.os.Bundle -import android.view.MotionEvent -import android.view.ViewConfiguration -import androidx.core.view.InputDeviceCompat -import androidx.core.view.MotionEventCompat -import androidx.core.view.ViewConfigurationCompat -import androidx.recyclerview.widget.ConcatAdapter -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup -import androidx.recyclerview.widget.ItemTouchHelper -import com.thewizrd.shared_resources.actions.Actions -import com.thewizrd.shared_resources.utils.AnalyticsLogger -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.activities.AppCompatLiteActivity -import com.thewizrd.simplewear.adapters.AddButtonAdapter -import com.thewizrd.simplewear.adapters.DashBattStatusItemAdapter -import com.thewizrd.simplewear.adapters.TileActionAdapter -import com.thewizrd.simplewear.databinding.LayoutDashboardConfigBinding -import com.thewizrd.simplewear.helpers.AcceptDenyDialog -import com.thewizrd.simplewear.helpers.TileActionsItemTouchCallback -import com.thewizrd.simplewear.ui.navigation.Screen -import kotlin.math.roundToInt - -class DashboardConfigActivity : AppCompatLiteActivity() { - companion object { - private val MAX_BUTTONS = Actions.entries.size - private val DEFAULT_TILES = Actions.entries - } - - private lateinit var binding: LayoutDashboardConfigBinding - private lateinit var concatAdapter: ConcatAdapter - private lateinit var dashBattStatAdapter: DashBattStatusItemAdapter - private lateinit var actionAdapter: TileActionAdapter - private lateinit var addButtonAdapter: AddButtonAdapter - private lateinit var itemTouchHelper: ItemTouchHelper - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - binding = LayoutDashboardConfigBinding.inflate(layoutInflater) - setContentView(binding.root) - - binding.tileGridLayout.layoutManager = GridLayoutManager(this, 3).also { layoutMgr -> - layoutMgr.spanSizeLookup = object : SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (concatAdapter.getItemViewType(position) == DashBattStatusItemAdapter.ITEM_TYPE) { - 3 - } else { - 1 - } - } - } - } - - dashBattStatAdapter = DashBattStatusItemAdapter().apply { - isVisible = Settings.isShowBatStatus() - } - actionAdapter = TileActionAdapter() - addButtonAdapter = AddButtonAdapter() - - binding.tileGridLayout.adapter = ConcatAdapter( - ConcatAdapter.Config.Builder() - .setIsolateViewTypes(false) - .build(), - dashBattStatAdapter, - actionAdapter - ).also { - concatAdapter = it - } - - itemTouchHelper = ItemTouchHelper(TileActionsItemTouchCallback(actionAdapter)) - itemTouchHelper.attachToRecyclerView(binding.tileGridLayout) - - actionAdapter.onLongClickListener = { - itemTouchHelper.startDrag(it) - } - - actionAdapter.onListChanged = { - if (it.size >= MAX_BUTTONS) { - concatAdapter.removeAdapter(addButtonAdapter) - } else { - concatAdapter.addAdapter(addButtonAdapter) - } - } - - val config = Settings.getDashboardConfig() - - config?.let { - actionAdapter.submitActions(it) - } ?: run { - actionAdapter.submitActions(DEFAULT_TILES) - } - - addButtonAdapter.setOnClickListener { - val allowedActions = Actions.entries.toMutableList() - // Remove current actions - allowedActions.removeAll(actionAdapter.getActions()) - - AddActionDialogBuilder(this, allowedActions) - .setOnActionSelectedListener(object : - AddActionDialogBuilder.OnActionSelectedListener { - override fun onActionSelected(action: Actions) { - actionAdapter.addAction(action) - } - }) - .show() - } - - binding.resetButton.setOnClickListener { - AcceptDenyDialog.Builder(this) { _, which -> - when (which) { - DialogInterface.BUTTON_POSITIVE -> { - actionAdapter.submitActions(DEFAULT_TILES) - Settings.setDashboardConfig(null) - - dashBattStatAdapter.isVisible = true - Settings.setShowBatStatus(true) - } - } - } - .setMessage(R.string.message_reset_to_default) - .show() - } - - binding.saveButton.setOnClickListener { - val currentList = actionAdapter.getActions() - Settings.setDashboardConfig(currentList) - - Settings.setShowBatStatus(dashBattStatAdapter.isVisible) - - // Close activity - finish() - } - } - - override fun onStart() { - super.onStart() - - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.DashboardConfig.route) - }) - } - - override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { - if (ev?.action == MotionEvent.ACTION_DOWN) { - val currSelection = actionAdapter.getSelection() - if (currSelection != null) { - val r = Rect().also { - currSelection.getGlobalVisibleRect(it) - } - if (!r.contains(ev.rawX.toInt(), ev.rawY.toInt())) { - actionAdapter.clearSelection() - } - } else { - dashBattStatAdapter.getSelection()?.let { battView -> - val r = Rect().also { - battView.getGlobalVisibleRect(it) - } - if (!r.contains(ev.rawX.toInt(), ev.rawY.toInt())) { - dashBattStatAdapter.isChecked = false - } - } - } - } - return super.dispatchTouchEvent(ev) - } - - override fun onGenericMotionEvent(event: MotionEvent): Boolean { - if (event.action == MotionEvent.ACTION_SCROLL && event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)) { - // Don't forget the negation here - val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) * - ViewConfigurationCompat.getScaledVerticalScrollFactor( - ViewConfiguration.get(this), this - ) - - // Swap these axes if you want to do horizontal scrolling instead - binding.root.scrollBy(0, delta.roundToInt()) - - return true - } - return super.onGenericMotionEvent(event) - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardTileConfigActivity.kt b/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardTileConfigActivity.kt deleted file mode 100644 index 8d89e70d..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/preferences/DashboardTileConfigActivity.kt +++ /dev/null @@ -1,186 +0,0 @@ -package com.thewizrd.simplewear.preferences - -import android.content.DialogInterface -import android.graphics.Rect -import android.os.Bundle -import android.view.MotionEvent -import android.view.ViewConfiguration -import androidx.core.view.InputDeviceCompat -import androidx.core.view.MotionEventCompat -import androidx.core.view.ViewConfigurationCompat -import androidx.recyclerview.widget.ConcatAdapter -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.ItemTouchHelper -import com.thewizrd.shared_resources.actions.Actions -import com.thewizrd.shared_resources.utils.AnalyticsLogger -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.activities.AppCompatLiteActivity -import com.thewizrd.simplewear.adapters.AddButtonAdapter -import com.thewizrd.simplewear.adapters.DashBattStatusItemAdapter -import com.thewizrd.simplewear.adapters.TileActionAdapter -import com.thewizrd.simplewear.databinding.LayoutTileDashboardConfigBinding -import com.thewizrd.simplewear.helpers.AcceptDenyDialog -import com.thewizrd.simplewear.helpers.TileActionsItemTouchCallback -import com.thewizrd.simplewear.preferences.DashboardTileUtils.DEFAULT_TILES -import com.thewizrd.simplewear.preferences.DashboardTileUtils.MAX_BUTTONS -import com.thewizrd.simplewear.preferences.DashboardTileUtils.isActionAllowed -import com.thewizrd.simplewear.ui.navigation.Screen -import kotlin.math.roundToInt - -class DashboardTileConfigActivity : AppCompatLiteActivity() { - private lateinit var binding: LayoutTileDashboardConfigBinding - private lateinit var concatAdapter: ConcatAdapter - private lateinit var dashBattStatAdapter: DashBattStatusItemAdapter - private lateinit var actionAdapter: TileActionAdapter - private lateinit var addButtonAdapter: AddButtonAdapter - private lateinit var itemTouchHelper: ItemTouchHelper - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - binding = LayoutTileDashboardConfigBinding.inflate(layoutInflater) - setContentView(binding.root) - - binding.tileGridLayout.layoutManager = GridLayoutManager(this, 3).also { layoutMgr -> - layoutMgr.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (concatAdapter.getItemViewType(position) == DashBattStatusItemAdapter.ITEM_TYPE) { - 3 - } else { - 1 - } - } - } - } - - dashBattStatAdapter = DashBattStatusItemAdapter().apply { - isVisible = Settings.isShowTileBatStatus() - } - actionAdapter = TileActionAdapter() - addButtonAdapter = AddButtonAdapter() - - binding.tileGridLayout.adapter = ConcatAdapter( - ConcatAdapter.Config.Builder() - .setIsolateViewTypes(false) - .build(), - dashBattStatAdapter, - actionAdapter - ).also { - concatAdapter = it - } - - itemTouchHelper = ItemTouchHelper(TileActionsItemTouchCallback(actionAdapter)) - itemTouchHelper.attachToRecyclerView(binding.tileGridLayout) - - actionAdapter.onLongClickListener = { - itemTouchHelper.startDrag(it) - } - - actionAdapter.onListChanged = { - if (it.size >= MAX_BUTTONS) { - concatAdapter.removeAdapter(addButtonAdapter) - } else { - concatAdapter.addAdapter(addButtonAdapter) - } - } - - val config = Settings.getDashboardTileConfig() - - config?.let { - actionAdapter.submitActions(it) - } ?: run { - actionAdapter.submitActions(DEFAULT_TILES) - } - - addButtonAdapter.setOnClickListener { - val allowedActions = Actions.entries.toMutableList() - // Remove current actions - allowedActions.removeAll(actionAdapter.getActions()) - // Remove other actions which need an activity - allowedActions.removeIf { !isActionAllowed(it) } - - AddActionDialogBuilder(this, allowedActions) - .setOnActionSelectedListener(object : - AddActionDialogBuilder.OnActionSelectedListener { - override fun onActionSelected(action: Actions) { - actionAdapter.addAction(action) - } - }) - .show() - } - - binding.resetButton.setOnClickListener { - AcceptDenyDialog.Builder(this) { _, which -> - when (which) { - DialogInterface.BUTTON_POSITIVE -> { - actionAdapter.submitActions(DEFAULT_TILES) - Settings.setDashboardTileConfig(null) - - dashBattStatAdapter.isVisible = true - Settings.setShowTileBatStatus(true) - } - } - } - .setMessage(R.string.message_reset_to_default) - .show() - } - - binding.saveButton.setOnClickListener { - val currentList = actionAdapter.getActions() - Settings.setDashboardTileConfig(currentList) - - Settings.setShowTileBatStatus(dashBattStatAdapter.isVisible) - - // Close activity - finish() - } - } - - override fun onStart() { - super.onStart() - - AnalyticsLogger.logEvent("nav_route", Bundle().apply { - putString("screen", Screen.DashboardTileConfig.route) - }) - } - - override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { - if (ev?.action == MotionEvent.ACTION_DOWN) { - val currSelection = actionAdapter.getSelection() - if (currSelection != null) { - val r = Rect().also { - currSelection.getGlobalVisibleRect(it) - } - if (!r.contains(ev.rawX.toInt(), ev.rawY.toInt())) { - actionAdapter.clearSelection() - } - } else { - dashBattStatAdapter.getSelection()?.let { battView -> - val r = Rect().also { - battView.getGlobalVisibleRect(it) - } - if (!r.contains(ev.rawX.toInt(), ev.rawY.toInt())) { - dashBattStatAdapter.isChecked = false - } - } - } - } - return super.dispatchTouchEvent(ev) - } - - override fun onGenericMotionEvent(event: MotionEvent): Boolean { - if (event.action == MotionEvent.ACTION_SCROLL && event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)) { - // Don't forget the negation here - val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) * - ViewConfigurationCompat.getScaledVerticalScrollFactor( - ViewConfiguration.get(this), this - ) - - // Swap these axes if you want to do horizontal scrolling instead - binding.root.scrollBy(0, delta.roundToInt()) - - return true - } - return super.onGenericMotionEvent(event) - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/preferences/Settings.kt b/wear/src/main/java/com/thewizrd/simplewear/preferences/Settings.kt index f0e1d156..782601d3 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/preferences/Settings.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/preferences/Settings.kt @@ -1,10 +1,15 @@ package com.thewizrd.simplewear.preferences +import android.content.SharedPreferences import androidx.core.content.edit import com.google.gson.reflect.TypeToken import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.appLib import com.thewizrd.shared_resources.utils.JSONParser +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.buffer +import kotlinx.coroutines.flow.callbackFlow import java.time.Instant object Settings { @@ -68,6 +73,18 @@ object Settings { } } + fun getDashboardTileConfigFlow() = callbackFlow { + val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + when (key) { + KEY_DASHTILECONFIG -> trySend(getDashboardTileConfig()) + } + } + + appLib.preferences.registerOnSharedPreferenceChangeListener(listener) + + awaitClose { appLib.preferences.unregisterOnSharedPreferenceChangeListener(listener) } + }.buffer(Channel.UNLIMITED) + fun setDashboardTileConfig(actions: List?) { appLib.preferences.edit { putString(KEY_DASHTILECONFIG, actions?.let { @@ -85,6 +102,18 @@ object Settings { } } + fun getDashboardConfigFlow() = callbackFlow { + val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + when (key) { + KEY_DASHCONFIG -> trySend(getDashboardConfig()) + } + } + + appLib.preferences.registerOnSharedPreferenceChangeListener(listener) + + awaitClose { appLib.preferences.unregisterOnSharedPreferenceChangeListener(listener) } + }.buffer(Channel.UNLIMITED) + fun setDashboardConfig(actions: List?) { appLib.preferences.edit { putString(KEY_DASHCONFIG, actions?.let { @@ -98,6 +127,18 @@ object Settings { return appLib.preferences.getBoolean(KEY_SHOWBATSTATUS, true) } + fun isShowBatStatusFlow() = callbackFlow { + val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + when (key) { + KEY_SHOWBATSTATUS -> trySend(isShowBatStatus()) + } + } + + appLib.preferences.registerOnSharedPreferenceChangeListener(listener) + + awaitClose { appLib.preferences.unregisterOnSharedPreferenceChangeListener(listener) } + }.buffer(Channel.UNLIMITED) + fun setShowBatStatus(value: Boolean) { appLib.preferences.edit { putBoolean(KEY_SHOWBATSTATUS, value) diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridScrollIndicator.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridScrollIndicator.kt new file mode 100644 index 00000000..9fba2b90 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridScrollIndicator.kt @@ -0,0 +1,23 @@ +package com.thewizrd.simplewear.ui.compose + +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.foundation.lazy.grid.LazyGridState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.wear.compose.material3.ScrollIndicatorColors +import androidx.wear.compose.material3.ScrollIndicatorDefaults + +@Composable +fun LazyGridScrollIndicator( + lazyGridState: LazyGridState, + modifier: Modifier = Modifier, + colors: ScrollIndicatorColors = ScrollIndicatorDefaults.colors(), + reverseDirection: Boolean = false, + positionAnimationSpec: AnimationSpec = ScrollIndicatorDefaults.PositionAnimationSpec, +) = androidx.wear.compose.material3.ScrollIndicator( + state = rememberLazyGridScrollState(lazyGridState), + modifier = modifier, + colors = colors, + reverseDirection = reverseDirection, + positionAnimationSpec = positionAnimationSpec +) \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridStateAdapter.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridStateAdapter.kt new file mode 100644 index 00000000..5bb4b2ce --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/LazyGridStateAdapter.kt @@ -0,0 +1,176 @@ +package com.thewizrd.simplewear.ui.compose + +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.lazy.grid.LazyGridState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import androidx.wear.compose.foundation.ScrollInfoProvider +import com.thewizrd.shared_resources.utils.Logger + +internal class LazyGridScrollInfoProvider(val state: LazyGridState) : ScrollInfoProvider { + override val isScrollAwayValid: Boolean + get() = state.layoutInfo.totalItemsCount > 0 + override val isScrollable: Boolean + get() = state.layoutInfo.totalItemsCount > 0 + override val isScrollInProgress: Boolean + get() = state.isScrollInProgress + override val anchorItemOffset: Float + get() = + state.layoutInfo.visibleItemsInfo.firstOrNull()?.let { + if (it.index != 0) { + return@let Float.NaN + } + -it.offset.toOffset(state.layoutInfo.orientation).toFloat() + } ?: Float.NaN + override val lastItemOffset: Float + get() { + val layoutInfo = state.layoutInfo + val lazyColumnHeightPx = layoutInfo.viewportSize.height + val reverseLayout = state.layoutInfo.reverseLayout + return if (reverseLayout) { + layoutInfo.visibleItemsInfo.firstOrNull()?.let { + if (it.index != 0) { + return@let 0f + } + val bottomEdge = + -it.offset.toOffset(state.layoutInfo.orientation) + lazyColumnHeightPx + layoutInfo.viewportStartOffset + (lazyColumnHeightPx - bottomEdge).toFloat().coerceAtLeast(0f) + } ?: 0f + } else { + layoutInfo.visibleItemsInfo.lastOrNull()?.let { + if (it.index != layoutInfo.totalItemsCount - 1) { + return@let 0f + } + val bottomEdge = + it.offset.toOffset(state.layoutInfo.orientation) + it.size.toSize(state.layoutInfo.orientation) - layoutInfo.viewportStartOffset + (lazyColumnHeightPx - bottomEdge).toFloat().coerceAtLeast(0f) + } ?: 0f + } + } +} + +@Composable +fun rememberLazyGridScrollState(lazyGridState: LazyGridState): ScrollState { + val scrollState = rememberScrollState() + + LaunchedEffect(lazyGridState) { + snapshotFlow { lazyGridState.layoutInfo } + .collect { layoutInfo -> + val positionFraction = lazyGridState.positionFraction + + val viewportSize = if (layoutInfo.orientation == Orientation.Vertical) { + layoutInfo.viewportSize.height + } else { + layoutInfo.viewportSize.width + } + + val sizeFraction = lazyGridState.sizeFraction(viewportSize.toFloat()) + + @Suppress("UNCHECKED_CAST") + runCatching { + ScrollState::class.java.getDeclaredField("_maxValueState").run { + isAccessible = true + (get(scrollState) as MutableState).run { + value = (100 / sizeFraction).toInt() + } + } + + ScrollState::class.java.getDeclaredField("value\$delegate").run { + isAccessible = true + (get(scrollState) as MutableState).run { + value = (positionFraction * 100f / sizeFraction).toInt() + } + } + + ScrollState::class.java.getDeclaredField("viewportSize\$delegate").run { + isAccessible = true + (get(scrollState) as MutableState).run { + value = (viewportSize * sizeFraction).toInt() + } + } + }.onFailure { + Logger.debug("LazyGridScrollState", it) + } + + scrollState.scrollTo(scrollState.value) + } + } + + return scrollState +} + +internal fun IntOffset.toOffset(orientation: Orientation): Int { + return if (orientation == Orientation.Vertical) { + this.y + } else { + this.x + } +} + +internal fun IntSize.toSize(orientation: Orientation): Int { + return if (orientation == Orientation.Vertical) { + this.height + } else { + this.width + } +} + +internal val LazyGridState.positionFraction: Float + get() { + return if (layoutInfo.visibleItemsInfo.isEmpty()) { + 0.0f + } else { + val decimalFirstItemIndex = decimalFirstItemIndex() + val decimalLastItemIndex = decimalLastItemIndex() + + val decimalLastItemIndexDistanceFromEnd = layoutInfo.totalItemsCount - + decimalLastItemIndex + + if (decimalFirstItemIndex + decimalLastItemIndexDistanceFromEnd == 0.0f) { + 0.0f + } else { + decimalFirstItemIndex / + (decimalFirstItemIndex + decimalLastItemIndexDistanceFromEnd) + } + } + } + +internal fun LazyGridState.decimalLastItemIndex(): Float { + if (layoutInfo.visibleItemsInfo.isEmpty()) return 0f + val lastItem = layoutInfo.visibleItemsInfo.last() + // Coerce item sizes to at least 1 to avoid divide by zero for zero height items + val lastItemVisibleSize = + (layoutInfo.viewportEndOffset - lastItem.offset.toOffset(layoutInfo.orientation)) + .coerceAtMost(lastItem.size.toSize(layoutInfo.orientation)).coerceAtLeast(1) + return lastItem.index.toFloat() + + lastItemVisibleSize.toFloat() / lastItem.size.toSize(layoutInfo.orientation) + .coerceAtLeast(1).toFloat() +} + +internal fun LazyGridState.decimalFirstItemIndex(): Float { + if (layoutInfo.visibleItemsInfo.isEmpty()) return 0f + val firstItem = layoutInfo.visibleItemsInfo.first() + val firstItemOffset = + firstItem.offset.toOffset(layoutInfo.orientation) - layoutInfo.viewportStartOffset + // Coerce item size to at least 1 to avoid divide by zero for zero height items + return firstItem.index.toFloat() - + firstItemOffset.coerceAtMost(0).toFloat() / + firstItem.size.toSize(layoutInfo.orientation).coerceAtLeast(1).toFloat() +} + +internal fun LazyGridState.sizeFraction(scrollableContainerSizePx: Float) = + if (layoutInfo.totalItemsCount == 0) { + 1.0f + } else { + val decimalFirstItemIndex = decimalFirstItemIndex() + val decimalLastItemIndex = decimalLastItemIndex() + + (decimalLastItemIndex - decimalFirstItemIndex) / + layoutInfo.totalItemsCount.toFloat() + } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt index d0f6e322..f7127b0a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt @@ -218,26 +218,6 @@ fun Dashboard( } } } - - Settings.KEY_DASHCONFIG -> { - lifecycleOwner.lifecycleScope.launch { - runCatching { - lifecycleOwner.withStarted { - dashboardViewModel.resetDashboard() - } - } - } - } - - Settings.KEY_SHOWBATSTATUS -> { - lifecycleOwner.lifecycleScope.launch { - runCatching { - lifecycleOwner.withStarted { - dashboardViewModel.showBatteryState(Settings.isShowBatStatus()) - } - } - } - } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt new file mode 100644 index 00000000..24f5666c --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt @@ -0,0 +1,482 @@ +package com.thewizrd.simplewear.ui.simplewear + +import android.view.MotionEvent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.GridItemSpan +import androidx.compose.foundation.lazy.grid.LazyGridState +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.itemsIndexed +import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.runtime.toMutableStateList +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.motionEventSpy +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.NavController +import androidx.wear.compose.foundation.lazy.items +import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults +import androidx.wear.compose.foundation.rotary.rotaryScrollable +import androidx.wear.compose.material3.AlertDialog +import androidx.wear.compose.material3.AlertDialogDefaults +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.EdgeButton +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding +import com.thewizrd.shared_resources.actions.Actions +import com.thewizrd.shared_resources.controls.ActionButtonViewModel +import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.preferences.Settings +import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator +import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider +import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback +import sh.calvin.reorderable.ReorderableItem +import sh.calvin.reorderable.rememberReorderableLazyGridState +import java.util.Collections + +private val MAX_BUTTONS = Actions.entries.size +private val DEFAULT_TILES = Actions.entries + +@Composable +fun DashboardConfigUi( + modifier: Modifier = Modifier, + navController: NavController +) { + val lifecycleOwner = LocalLifecycleOwner.current + + var tileConfig by remember { + mutableStateOf(Settings.getDashboardConfig() ?: DEFAULT_TILES) + } + + DashboardConfigUi( + modifier = modifier, + tileConfig = tileConfig, + onSaveItems = { items, isBatteryVisible -> + if (items.isEmpty()) { + Settings.setDashboardConfig(null) + } else { + Settings.setDashboardConfig(items) + } + + Settings.setShowBatStatus(isBatteryVisible) + + navController.popBackStack() + } + ) + + LaunchedEffect(lifecycleOwner) { + Settings.getDashboardConfigFlow().collect { + tileConfig = it ?: DEFAULT_TILES + } + } +} + +@Composable +private fun DashboardConfigUi( + modifier: Modifier = Modifier, + lazyGridState: LazyGridState = rememberLazyGridState(), + focusRequester: FocusRequester = rememberFocusRequester(), + tileConfig: List = DEFAULT_TILES, + onSaveItems: (actions: List, showBatteryStatus: Boolean) -> Unit = { _, _ -> } +) { + val lifecycleOwner = LocalLifecycleOwner.current + val haptic = rememberReorderHapticFeedback() + + var showConfirmation by remember { mutableStateOf(false) } + var showAddTileDialog by remember { mutableStateOf(false) } + + val userTileConfigList: MutableList = + remember(tileConfig) { tileConfig.toMutableStateList() } + val selectionList = + remember { MutableList(MAX_BUTTONS) { false }.toMutableStateList() } + + var isBatteryVisible by remember { mutableStateOf(Settings.isShowBatStatus()) } + var batterySelected by remember { mutableStateOf(false) } + + val reorderableGridState = rememberReorderableLazyGridState( + lazyGridState = lazyGridState + ) { from, to -> + // Offset index by 2 to account for header & battery state + Collections.swap(userTileConfigList, from.index - 2, to.index - 2) + haptic.performHapticFeedback(ReorderHapticFeedbackType.MOVE) + } + + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button + ) + + ScreenScaffold( + scrollInfoProvider = LazyGridScrollInfoProvider(lazyGridState), + scrollIndicator = { + LazyGridScrollIndicator(lazyGridState = lazyGridState) + }, + contentPadding = contentPadding + ) { contentPadding -> + LazyVerticalGrid( + modifier = modifier + .fillMaxSize() + .rotaryScrollable(RotaryScrollableDefaults.behavior(lazyGridState), focusRequester) + .motionEventSpy { event -> + if (event.action == MotionEvent.ACTION_DOWN) { + selectionList.replaceAll { false } + batterySelected = false + } + }, + columns = GridCells.Fixed(3), + state = lazyGridState, + contentPadding = contentPadding, + horizontalArrangement = Arrangement.Center, + verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically), + userScrollEnabled = true + ) { + item(span = { GridItemSpan(3) }) { + ListHeader(modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(id = R.string.title_dash_config)) + } + } + + // Battery State + item(span = { GridItemSpan(3) }) { + AnimatedVisibility( + visible = batterySelected, + enter = fadeIn(), + exit = fadeOut() + ) { + Button( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.action_remove_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(id = R.string.action_remove_batt_state) + ) + }, + onClick = { + isBatteryVisible = false + batterySelected = false + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer, + iconColor = MaterialTheme.colorScheme.primaryContainer, + ) + ) + } + + AnimatedVisibility( + visible = !batterySelected && isBatteryVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.title_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_battery_std_white_24dp), + contentDescription = stringResource(id = R.string.title_batt_state) + ) + }, + onClick = { + batterySelected = true + } + ) + } + + AnimatedVisibility( + visible = !batterySelected && !isBatteryVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + Button( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.action_add_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_add_white_24dp), + contentDescription = stringResource(id = R.string.action_add_batt_state) + ) + }, + onClick = { + isBatteryVisible = true + batterySelected = false + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer, + iconColor = MaterialTheme.colorScheme.primaryContainer, + ) + ) + } + } + + itemsIndexed( + items = userTileConfigList, + key = { index, item -> (item as? Actions) ?: index }, + span = { index, _ -> + GridItemSpan(1) + } + ) { index, item -> + if (item is Actions) { + val model = remember(item) { + ActionButtonViewModel.getViewModelFromAction(item) + } + + ReorderableItem( + modifier = Modifier.wrapContentSize(), + state = reorderableGridState, + key = item + ) { _ -> + Box( + modifier = Modifier + .padding(4.dp) + .draggableHandle( + onDragStarted = { + haptic.performHapticFeedback(ReorderHapticFeedbackType.START) + }, + onDragStopped = { + haptic.performHapticFeedback(ReorderHapticFeedbackType.END) + }, + ), + contentAlignment = Alignment.Center + ) { + AnimatedVisibility( + visible = selectionList[index], + enter = fadeIn(), + exit = fadeOut() + ) { + FilledIconButton( + onClick = { + userTileConfigList.removeAt(index) + if (!userTileConfigList.contains("")) { + userTileConfigList.add("") + } + }, + colors = IconButtonDefaults.filledIconButtonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(id = android.R.string.cancel), + ) + } + } + + AnimatedVisibility( + visible = !selectionList[index], + enter = fadeIn(), + exit = fadeOut() + ) { + FilledTonalButton( + onClick = { selectionList[index] = true } + ) { + Icon( + painter = painterResource(id = model.drawableResId), + contentDescription = stringResource(id = model.actionLabelResId) + ) + } + } + } + } + } else { + Box( + modifier = Modifier + .padding(4.dp) + .wrapContentSize(), + contentAlignment = Alignment.Center + ) { + FilledIconButton( + onClick = { + showAddTileDialog = true + }, + colors = IconButtonDefaults.filledIconButtonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_add_white_24dp), + contentDescription = stringResource(id = R.string.action_add_batt_state) + ) + } + } + } + } + + item(span = { GridItemSpan(3) }) { + Row( + horizontalArrangement = Arrangement.spacedBy( + 12.dp, + Alignment.CenterHorizontally + ) + ) { + AlertDialogDefaults.DismissButton( + modifier = Modifier.align(Alignment.CenterVertically), + onClick = { + showConfirmation = true + }, + content = { + Icon( + modifier = Modifier.size(28.dp), + painter = painterResource(id = R.drawable.ic_baseline_restart_alt_24), + contentDescription = stringResource(R.string.message_reset_to_default), + ) + } + ) + AlertDialogDefaults.ConfirmButton( + modifier = Modifier.align(Alignment.CenterVertically), + onClick = { + onSaveItems( + userTileConfigList.filterIsInstance(), + isBatteryVisible + ) + } + ) + } + } + } + + LaunchedEffect(lifecycleOwner) { + lifecycleOwner.repeatOnLifecycle(state = Lifecycle.State.RESUMED) { + focusRequester.requestFocus() + } + } + } + + AlertDialog( + visible = showConfirmation, + onDismissRequest = { + showConfirmation = false + }, + confirmButton = { + AlertDialogDefaults.ConfirmButton( + onClick = { + // Reset state + userTileConfigList.clear() + userTileConfigList.addAll(DEFAULT_TILES) + batterySelected = false + isBatteryVisible = true + + // Reset settings + Settings.setDashboardConfig(null) + Settings.setShowBatStatus(true) + + showConfirmation = false + } + ) + }, + dismissButton = { + AlertDialogDefaults.DismissButton( + onClick = { + showConfirmation = false + } + ) + }, + title = { + Text(text = stringResource(id = R.string.message_reset_to_default)) + } + ) + + if (showAddTileDialog) { + val allowedActions = Actions.entries.toMutableList() + // Remove current actions + allowedActions.removeAll(userTileConfigList.filterIsInstance()) + + AlertDialog( + modifier = Modifier.fillMaxSize(), + visible = showAddTileDialog, + onDismissRequest = { showAddTileDialog = false }, + title = { Text(text = stringResource(id = R.string.title_actions)) }, + edgeButton = { + EdgeButton( + onClick = { showAddTileDialog = false } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(android.R.string.cancel) + ) + } + } + ) { + items(allowedActions) { action -> + val model = remember(action) { + ActionButtonViewModel.getViewModelFromAction(action) + } + + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = model.actionLabelResId)) + }, + icon = { + Icon( + painter = painterResource(id = model.drawableResId), + contentDescription = stringResource(id = model.actionLabelResId) + ) + }, + onClick = { + val index = userTileConfigList.indexOfFirst { it !is Actions } + if (index >= 0) { + userTileConfigList[index] = action + } + addAddButtonIfNeeded(userTileConfigList) + showAddTileDialog = false + } + ) + } + } + } + + LaunchedEffect(tileConfig) { + addAddButtonIfNeeded(userTileConfigList) + } +} + +private fun addAddButtonIfNeeded(userTileConfigList: MutableList) { + if (userTileConfigList.size < MAX_BUTTONS && !userTileConfigList.contains("")) { + userTileConfigList.add("") + } +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt index 4cca2721..c02c8674 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt @@ -11,7 +11,6 @@ import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -344,7 +343,6 @@ private fun BatteryStatusChip( } } -@OptIn(ExperimentalLayoutApi::class) @Composable private fun ActionsList( actions: List, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt new file mode 100644 index 00000000..423d34af --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt @@ -0,0 +1,500 @@ +package com.thewizrd.simplewear.ui.simplewear + +import android.view.MotionEvent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.GridItemSpan +import androidx.compose.foundation.lazy.grid.LazyGridState +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.itemsIndexed +import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.runtime.toMutableStateList +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.motionEventSpy +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.NavController +import androidx.wear.compose.foundation.lazy.items +import androidx.wear.compose.foundation.rotary.RotaryScrollableDefaults +import androidx.wear.compose.foundation.rotary.rotaryScrollable +import androidx.wear.compose.material3.AlertDialog +import androidx.wear.compose.material3.AlertDialogDefaults +import androidx.wear.compose.material3.Button +import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.EdgeButton +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.FilledTonalButton +import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.Text +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding +import com.thewizrd.shared_resources.actions.Actions +import com.thewizrd.shared_resources.controls.ActionButtonViewModel +import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.preferences.DashboardTileUtils +import com.thewizrd.simplewear.preferences.DashboardTileUtils.DEFAULT_TILES +import com.thewizrd.simplewear.preferences.DashboardTileUtils.isActionAllowed +import com.thewizrd.simplewear.preferences.Settings +import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator +import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider +import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester +import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback +import com.thewizrd.simplewear.wearable.tiles.DashboardTileProviderService +import sh.calvin.reorderable.ReorderableItem +import sh.calvin.reorderable.rememberReorderableLazyGridState +import java.util.Collections + +@Composable +fun DashboardTileConfigUi( + modifier: Modifier = Modifier, + navController: NavController +) { + val context = LocalContext.current + val lifecycleOwner = LocalLifecycleOwner.current + + var isConfigChanged by remember { mutableStateOf(false) } + + var tileConfig by remember { + mutableStateOf(Settings.getDashboardTileConfig() ?: DEFAULT_TILES) + } + + DashboardTileConfigUi( + modifier = modifier, + tileConfig = tileConfig, + onSaveItems = { items, isBatteryVisible -> + if (items.isEmpty()) { + Settings.setDashboardTileConfig(null) + } else { + Settings.setDashboardTileConfig(items) + } + + Settings.setShowTileBatStatus(isBatteryVisible) + + navController.popBackStack() + } + ) + + LaunchedEffect(lifecycleOwner) { + Settings.getDashboardTileConfigFlow().collect { + tileConfig = it ?: DEFAULT_TILES + isConfigChanged = true + } + } + + DisposableEffect(Unit) { + onDispose { + if (isConfigChanged) { + // Trigger tile update + DashboardTileProviderService.requestTileUpdate(context) + } + } + } +} + +@Composable +private fun DashboardTileConfigUi( + modifier: Modifier = Modifier, + lazyGridState: LazyGridState = rememberLazyGridState(), + focusRequester: FocusRequester = rememberFocusRequester(), + tileConfig: List = DEFAULT_TILES, + onSaveItems: (actions: List, showBatteryStatus: Boolean) -> Unit = { _, _ -> } +) { + val lifecycleOwner = LocalLifecycleOwner.current + val haptic = rememberReorderHapticFeedback() + + var showConfirmation by remember { mutableStateOf(false) } + var showAddTileDialog by remember { mutableStateOf(false) } + + val userTileConfigList: MutableList = + remember(tileConfig) { tileConfig.toMutableStateList() } + val selectionList = + remember { MutableList(DashboardTileUtils.MAX_BUTTONS) { false }.toMutableStateList() } + + var isBatteryVisible by remember { mutableStateOf(Settings.isShowTileBatStatus()) } + var batterySelected by remember { mutableStateOf(false) } + + val reorderableGridState = rememberReorderableLazyGridState( + lazyGridState = lazyGridState + ) { from, to -> + // Offset index by 2 to account for header & battery state + Collections.swap(userTileConfigList, from.index - 2, to.index - 2) + haptic.performHapticFeedback(ReorderHapticFeedbackType.MOVE) + } + + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button + ) + + ScreenScaffold( + scrollInfoProvider = LazyGridScrollInfoProvider(lazyGridState), + scrollIndicator = { + LazyGridScrollIndicator(lazyGridState = lazyGridState) + }, + contentPadding = contentPadding + ) { contentPadding -> + LazyVerticalGrid( + modifier = modifier + .fillMaxSize() + .rotaryScrollable(RotaryScrollableDefaults.behavior(lazyGridState), focusRequester) + .motionEventSpy { event -> + if (event.action == MotionEvent.ACTION_DOWN) { + selectionList.replaceAll { false } + batterySelected = false + } + }, + columns = GridCells.Fixed(3), + state = lazyGridState, + contentPadding = contentPadding, + horizontalArrangement = Arrangement.Center, + verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically), + userScrollEnabled = true + ) { + item(span = { GridItemSpan(3) }) { + ListHeader(modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(id = R.string.title_dashtile_config)) + } + } + + // Battery State + item(span = { GridItemSpan(3) }) { + AnimatedVisibility( + visible = batterySelected, + enter = fadeIn(), + exit = fadeOut() + ) { + Button( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.action_remove_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(id = R.string.action_remove_batt_state) + ) + }, + onClick = { + isBatteryVisible = false + batterySelected = false + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer, + iconColor = MaterialTheme.colorScheme.primaryContainer, + ) + ) + } + + AnimatedVisibility( + visible = !batterySelected && isBatteryVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.title_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_battery_std_white_24dp), + contentDescription = stringResource(id = R.string.title_batt_state) + ) + }, + onClick = { + batterySelected = true + } + ) + } + + AnimatedVisibility( + visible = !batterySelected && !isBatteryVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + Button( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = R.string.action_add_batt_state)) + }, + icon = { + Icon( + painter = painterResource(id = R.drawable.ic_add_white_24dp), + contentDescription = stringResource(id = R.string.action_add_batt_state) + ) + }, + onClick = { + isBatteryVisible = true + batterySelected = false + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer, + iconColor = MaterialTheme.colorScheme.primaryContainer, + ) + ) + } + } + + itemsIndexed( + items = userTileConfigList, + key = { index, item -> (item as? Actions) ?: index }, + span = { index, _ -> + GridItemSpan(1) + } + ) { index, item -> + if (item is Actions) { + val model = remember(item) { + ActionButtonViewModel.getViewModelFromAction(item) + } + + ReorderableItem( + modifier = Modifier.wrapContentSize(), + state = reorderableGridState, + key = item + ) { _ -> + Box( + modifier = Modifier + .padding(4.dp) + .draggableHandle( + onDragStarted = { + haptic.performHapticFeedback(ReorderHapticFeedbackType.START) + }, + onDragStopped = { + haptic.performHapticFeedback(ReorderHapticFeedbackType.END) + }, + ), + contentAlignment = Alignment.Center + ) { + AnimatedVisibility( + visible = selectionList[index], + enter = fadeIn(), + exit = fadeOut() + ) { + FilledIconButton( + onClick = { + userTileConfigList.removeAt(index) + if (!userTileConfigList.contains("")) { + userTileConfigList.add("") + } + }, + colors = IconButtonDefaults.filledIconButtonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(id = android.R.string.cancel), + ) + } + } + + AnimatedVisibility( + visible = !selectionList[index], + enter = fadeIn(), + exit = fadeOut() + ) { + FilledTonalButton( + onClick = { selectionList[index] = true } + ) { + Icon( + painter = painterResource(id = model.drawableResId), + contentDescription = stringResource(id = model.actionLabelResId) + ) + } + } + } + } + } else { + Box( + modifier = Modifier + .padding(4.dp) + .wrapContentSize(), + contentAlignment = Alignment.Center + ) { + FilledIconButton( + onClick = { + showAddTileDialog = true + }, + colors = IconButtonDefaults.filledIconButtonColors( + containerColor = Color.White, + contentColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_add_white_24dp), + contentDescription = stringResource(id = R.string.action_add_batt_state) + ) + } + } + } + } + + item(span = { GridItemSpan(3) }) { + Row( + horizontalArrangement = Arrangement.spacedBy( + 12.dp, + Alignment.CenterHorizontally + ) + ) { + AlertDialogDefaults.DismissButton( + modifier = Modifier.align(Alignment.CenterVertically), + onClick = { + showConfirmation = true + }, + content = { + Icon( + modifier = Modifier.size(28.dp), + painter = painterResource(id = R.drawable.ic_baseline_restart_alt_24), + contentDescription = stringResource(R.string.message_reset_to_default), + ) + } + ) + AlertDialogDefaults.ConfirmButton( + modifier = Modifier.align(Alignment.CenterVertically), + onClick = { + onSaveItems( + userTileConfigList.filterIsInstance(), + isBatteryVisible + ) + } + ) + } + } + } + + LaunchedEffect(lifecycleOwner) { + lifecycleOwner.repeatOnLifecycle(state = Lifecycle.State.RESUMED) { + focusRequester.requestFocus() + } + } + } + + AlertDialog( + visible = showConfirmation, + onDismissRequest = { + showConfirmation = false + }, + confirmButton = { + AlertDialogDefaults.ConfirmButton( + onClick = { + // Reset state + userTileConfigList.clear() + userTileConfigList.addAll(DEFAULT_TILES) + batterySelected = false + isBatteryVisible = true + + // Reset settings + Settings.setDashboardTileConfig(null) + Settings.setShowTileBatStatus(true) + + showConfirmation = false + } + ) + }, + dismissButton = { + AlertDialogDefaults.DismissButton( + onClick = { + showConfirmation = false + } + ) + }, + title = { + Text(text = stringResource(id = R.string.message_reset_to_default)) + } + ) + + if (showAddTileDialog) { + val allowedActions = Actions.entries.toMutableList() + // Remove current actions + allowedActions.removeAll(userTileConfigList.filterIsInstance()) + // Remove other actions which need an activity + allowedActions.removeIf { !isActionAllowed(it) } + + AlertDialog( + modifier = Modifier.fillMaxSize(), + visible = showAddTileDialog, + onDismissRequest = { showAddTileDialog = false }, + title = { Text(text = stringResource(id = R.string.title_actions)) }, + edgeButton = { + EdgeButton( + onClick = { showAddTileDialog = false } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close_white_24dp), + contentDescription = stringResource(android.R.string.cancel) + ) + } + } + ) { + items(allowedActions) { action -> + val model = remember(action) { + ActionButtonViewModel.getViewModelFromAction(action) + } + + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + label = { + Text(text = stringResource(id = model.actionLabelResId)) + }, + icon = { + Icon( + painter = painterResource(id = model.drawableResId), + contentDescription = stringResource(id = model.actionLabelResId) + ) + }, + onClick = { + val index = userTileConfigList.indexOfFirst { it !is Actions } + if (index >= 0) { + userTileConfigList[index] = action + } + addAddButtonIfNeeded(userTileConfigList) + showAddTileDialog = false + } + ) + } + } + } + + LaunchedEffect(tileConfig) { + addAddButtonIfNeeded(userTileConfigList) + } +} + +private fun addAddButtonIfNeeded(userTileConfigList: MutableList) { + if (userTileConfigList.size < DashboardTileUtils.MAX_BUTTONS && !userTileConfigList.contains("")) { + userTileConfigList.add("") + } +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt index fcfb5de2..701c0477 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt @@ -21,8 +21,6 @@ import com.thewizrd.shared_resources.actions.TimedAction import com.thewizrd.shared_resources.utils.AnalyticsLogger import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.media.MediaPlayerActivity -import com.thewizrd.simplewear.preferences.DashboardConfigActivity -import com.thewizrd.simplewear.preferences.DashboardTileConfigActivity import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.WearAppTheme @@ -178,14 +176,24 @@ fun SimpleWearApp( } } - activity(route = Screen.DashboardConfig.route) { - targetPackage = context.packageName - activityClass = DashboardConfigActivity::class + composable(Screen.DashboardConfig.route) { + DashboardConfigUi(navController = navController) + + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.DashboardConfig.route) + }) + } } - activity(route = Screen.DashboardTileConfig.route) { - targetPackage = context.packageName - activityClass = DashboardTileConfigActivity::class + composable(Screen.DashboardTileConfig.route) { + DashboardTileConfigUi(navController = navController) + + LaunchedEffect(navController) { + AnalyticsLogger.logEvent("nav_route", Bundle().apply { + putString("screen", Screen.DashboardTileConfig.route) + }) + } } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Reorderable.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Reorderable.kt new file mode 100644 index 00000000..c6af0eaa --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Reorderable.kt @@ -0,0 +1,52 @@ +package com.thewizrd.simplewear.ui.utils + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalView +import androidx.core.view.HapticFeedbackConstantsCompat +import androidx.core.view.ViewCompat + +enum class ReorderHapticFeedbackType { + START, + MOVE, + END, +} + +open class ReorderHapticFeedback { + open fun performHapticFeedback(type: ReorderHapticFeedbackType) { + // no-op + } +} + +@Composable +fun rememberReorderHapticFeedback(): ReorderHapticFeedback { + val view = LocalView.current + + val reorderHapticFeedback = remember { + object : ReorderHapticFeedback() { + override fun performHapticFeedback(type: ReorderHapticFeedbackType) { + when (type) { + ReorderHapticFeedbackType.START -> + ViewCompat.performHapticFeedback( + view, + HapticFeedbackConstantsCompat.DRAG_START + ) + + ReorderHapticFeedbackType.MOVE -> + ViewCompat.performHapticFeedback( + view, + HapticFeedbackConstantsCompat.SEGMENT_FREQUENT_TICK + ) + + ReorderHapticFeedbackType.END -> + ViewCompat.performHapticFeedback( + view, + HapticFeedbackConstantsCompat.GESTURE_END + ) + } + } + } + } + + return reorderHapticFeedback +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/utils/ResourcesUtils.kt b/wear/src/main/java/com/thewizrd/simplewear/utils/ResourcesUtils.kt deleted file mode 100644 index a4340e03..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/utils/ResourcesUtils.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2017 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 - * - * http://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. - */ -/* - * ResourcesUtil.java - * platform/frameworks/support - * branch: pie-release - */ -package com.thewizrd.simplewear.utils - -import android.content.Context -import androidx.annotation.FractionRes - -/** - * Utility methods to help with resource calculations. - * - * @hide - */ -object ResourcesUtils { - /** - * Returns the screen width in pixels. - */ - fun getScreenWidthPx(context: Context): Int { - return context.resources.displayMetrics.widthPixels - } - - /** - * Returns the screen height in pixels. - */ - fun getScreenHeightPx(context: Context): Int { - return context.resources.displayMetrics.heightPixels - } - - /** - * Returns the number of pixels equivalent to the percentage of `resId` to the current - * screen. - */ - fun getFractionOfScreenPx(context: Context, screenPx: Int, @FractionRes resId: Int): Int { - val marginPercent = context.resources.getFraction(resId, 1, 1) - return (marginPercent * screenPx).toInt() - } -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt index 94fbbd36..228549b0 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/DashboardViewModel.kt @@ -158,6 +158,18 @@ class DashboardViewModel(app: Application) : WearableListenerViewModel(app) { } } + viewModelScope.launch { + Settings.getDashboardConfigFlow().collect { + updateActions(it) + } + } + + viewModelScope.launch { + Settings.isShowBatStatusFlow().collect { + showBatteryState(it) + } + } + resetDashboard() } From b98e31c7ec6afa9c0aa2b69480c74ad22de8bebb Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 19 Oct 2025 16:02:27 -0400 Subject: [PATCH 06/40] FirebaseConfigurator: add support for remote config real-time updates --- .../simplewear/FirebaseConfigurator.kt | 44 +++++++++++++++---- .../shared_resources/utils/AnalyticsProps.kt | 1 + .../simplewear/FirebaseConfigurator.kt | 27 +++++++++++- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/mobile/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt b/mobile/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt index 1de9676d..a061b0c1 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt @@ -4,6 +4,10 @@ import android.annotation.SuppressLint import android.content.Context import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.google.firebase.remoteconfig.ConfigUpdate +import com.google.firebase.remoteconfig.ConfigUpdateListener +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.FirebaseRemoteConfigException import com.thewizrd.shared_resources.utils.AnalyticsProps import com.thewizrd.shared_resources.utils.ContextUtils.isLargeTablet import com.thewizrd.shared_resources.utils.ContextUtils.isSmallestWidth @@ -14,15 +18,19 @@ import com.thewizrd.shared_resources.utils.Logger object FirebaseConfigurator { @SuppressLint("MissingPermission") fun initialize(context: Context) { - FirebaseAnalytics.getInstance(context).setUserProperty( - AnalyticsProps.DEVICE_TYPE, if (context.isTv()) { - "tv" - } else if (context.isLargeTablet() || context.isSmallestWidth(600)) { - "tablet" - } else { - "mobile" - } - ) + FirebaseAnalytics.getInstance(context).run { + setUserProperty( + AnalyticsProps.DEVICE_TYPE, if (context.isTv()) { + "tv" + } else if (context.isLargeTablet() || context.isSmallestWidth(600)) { + "tablet" + } else { + "mobile" + } + ) + + setUserProperty(AnalyticsProps.PLATFORM, "Android") + } FirebaseCrashlytics.getInstance().apply { isCrashlyticsCollectionEnabled = true @@ -32,5 +40,23 @@ object FirebaseConfigurator { if (!BuildConfig.DEBUG) { Logger.registerLogger(CrashlyticsLoggingTree()) } + + // Add Firebase RemoteConfig real-time listener + FirebaseRemoteConfig.getInstance().run { + addOnConfigUpdateListener(object : ConfigUpdateListener { + override fun onUpdate(configUpdate: ConfigUpdate) { + Logger.verbose("FirebaseConfigurator", "Remote update received") + this@run.activate() + } + + override fun onError(error: FirebaseRemoteConfigException) { + Logger.error( + "FirebaseConfigurator", + message = "Error on real-time update", + t = error + ) + } + }) + } } } \ No newline at end of file diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/AnalyticsProps.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/AnalyticsProps.kt index 19c56c86..0e91b44d 100644 --- a/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/AnalyticsProps.kt +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/AnalyticsProps.kt @@ -2,4 +2,5 @@ package com.thewizrd.shared_resources.utils object AnalyticsProps { const val DEVICE_TYPE = "device_type" + const val PLATFORM = "platform" } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt b/wear/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt index 647439fd..4a691315 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/FirebaseConfigurator.kt @@ -4,6 +4,10 @@ import android.annotation.SuppressLint import android.content.Context import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.google.firebase.remoteconfig.ConfigUpdate +import com.google.firebase.remoteconfig.ConfigUpdateListener +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.FirebaseRemoteConfigException import com.thewizrd.shared_resources.utils.AnalyticsProps import com.thewizrd.shared_resources.utils.CrashlyticsLoggingTree import com.thewizrd.shared_resources.utils.Logger @@ -11,7 +15,10 @@ import com.thewizrd.shared_resources.utils.Logger object FirebaseConfigurator { @SuppressLint("MissingPermission") fun initialize(context: Context) { - FirebaseAnalytics.getInstance(context).setUserProperty(AnalyticsProps.DEVICE_TYPE, "watch") + FirebaseAnalytics.getInstance(context).run { + setUserProperty(AnalyticsProps.DEVICE_TYPE, "watch") + setUserProperty(AnalyticsProps.PLATFORM, "Android") + } FirebaseCrashlytics.getInstance().apply { isCrashlyticsCollectionEnabled = true @@ -21,5 +28,23 @@ object FirebaseConfigurator { if (!BuildConfig.DEBUG) { Logger.registerLogger(CrashlyticsLoggingTree()) } + + // Add Firebase RemoteConfig real-time listener + FirebaseRemoteConfig.getInstance().run { + addOnConfigUpdateListener(object : ConfigUpdateListener { + override fun onUpdate(configUpdate: ConfigUpdate) { + Logger.verbose("FirebaseConfigurator", "Remote update received") + this@run.activate() + } + + override fun onError(error: FirebaseRemoteConfigException) { + Logger.error( + "FirebaseConfigurator", + message = "Error on real-time update", + t = error + ) + } + }) + } } } \ No newline at end of file From e93e5f49349689df9f3bc483f685d2f14c10f4da Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 19 Oct 2025 16:36:48 -0400 Subject: [PATCH 07/40] MediaPlayerListUi: update layout --- .../ui/simplewear/MediaPlayerListUi.kt | 78 +++++++------------ 1 file changed, 26 insertions(+), 52 deletions(-) diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index f1436cc3..e1cd5571 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -38,18 +38,20 @@ import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.items import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.foundation.pager.rememberPagerState +import androidx.wear.compose.material3.AlertDialogContent import androidx.wear.compose.material3.AnimatedPage import androidx.wear.compose.material3.Button import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.CheckboxButton import androidx.wear.compose.material3.CompactButton import androidx.wear.compose.material3.Dialog +import androidx.wear.compose.material3.EdgeButton import androidx.wear.compose.material3.FilledTonalButton import androidx.wear.compose.material3.Icon import androidx.wear.compose.material3.ListHeader import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.SurfaceTransformation import androidx.wear.compose.material3.Text -import androidx.wear.compose.material3.TextToggleButton import androidx.wear.compose.material3.lazy.rememberTransformationSpec import androidx.wear.compose.material3.lazy.transformedHeight import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales @@ -267,6 +269,7 @@ private fun MediaPlayerListScreen( ScreenScaffold( modifier = Modifier.fillMaxSize(), + scrollState = columnState, contentPadding = contentPadding ) { contentPadding -> LoadingContent( @@ -459,35 +462,30 @@ private fun MediaPlayerFilterScreen( onSelectedItemsChanged: (Set) -> Unit = {}, onDismissRequest: () -> Unit = {} ) { - val columnState = rememberTransformingLazyColumnState() - val contentPadding = rememberResponsiveColumnPadding( - first = ColumnItemType.ListHeader, - last = ColumnItemType.Button, - ) - val transformationSpec = rememberTransformationSpec() - - TransformingLazyColumn( - state = columnState, - contentPadding = contentPadding - ) { - item { - ListHeader( - modifier = Modifier - .fillMaxWidth() - .transformedHeight(this, transformationSpec), - transformation = SurfaceTransformation(transformationSpec) - ) { - Text(text = stringResource(id = R.string.title_filter_apps)) - } + AlertDialogContent( + modifier = Modifier.fillMaxSize(), + title = { + Text(text = stringResource(id = R.string.title_filter_apps)) + }, + edgeButton = { + EdgeButton( + content = { + Icon( + painter = painterResource(id = R.drawable.ic_check_white_24dp), + contentDescription = stringResource(id = android.R.string.ok) + ) + }, + onClick = { + onDismissRequest.invoke() + } + ) } - + ) { items(uiState.allMediaAppsSet.toList()) { val isChecked = selectedItems.contains(it.packageName!!) - TextToggleButton( - modifier = Modifier - .fillMaxWidth() - .transformedHeight(this, transformationSpec), + CheckboxButton( + modifier = Modifier.fillMaxWidth(), checked = isChecked, onCheckedChange = { checked -> onSelectedItemsChanged.invoke( @@ -498,7 +496,7 @@ private fun MediaPlayerFilterScreen( } ) }, - content = { + label = { Text( text = it.appLabel!! ) @@ -512,10 +510,7 @@ private fun MediaPlayerFilterScreen( item { FilledTonalButton( - modifier = Modifier - .fillMaxWidth() - .transformedHeight(this, transformationSpec), - transformation = SurfaceTransformation(transformationSpec), + modifier = Modifier.fillMaxWidth(), label = { Text(text = stringResource(id = R.string.clear_all)) }, @@ -530,27 +525,6 @@ private fun MediaPlayerFilterScreen( } ) } - - item { - Button( - modifier = Modifier - .fillMaxWidth() - .transformedHeight(this, transformationSpec), - transformation = SurfaceTransformation(transformationSpec), - label = { - Text(text = stringResource(id = android.R.string.ok)) - }, - icon = { - Icon( - painter = painterResource(id = R.drawable.ic_check_white_24dp), - contentDescription = stringResource(id = android.R.string.ok) - ) - }, - onClick = { - onDismissRequest.invoke() - } - ) - } } } From 9cc2a226fe0a71a314bd4705c0eb2fe4da7fc435 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 19 Oct 2025 16:37:02 -0400 Subject: [PATCH 08/40] DashboardConfigUi: add previews --- .../simplewear/ui/simplewear/DashboardConfigUi.kt | 14 +++++++++++++- .../ui/simplewear/DashboardTileConfigUi.kt | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt index 24f5666c..b96acc9a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt @@ -53,6 +53,7 @@ import androidx.wear.compose.material3.ListHeader import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text +import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.android.horologist.compose.layout.ColumnItemType import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.Actions @@ -61,6 +62,7 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback @@ -111,6 +113,7 @@ private fun DashboardConfigUi( lazyGridState: LazyGridState = rememberLazyGridState(), focusRequester: FocusRequester = rememberFocusRequester(), tileConfig: List = DEFAULT_TILES, + initialBatteryStatusShown: Boolean = Settings.isShowBatStatus(), onSaveItems: (actions: List, showBatteryStatus: Boolean) -> Unit = { _, _ -> } ) { val lifecycleOwner = LocalLifecycleOwner.current @@ -124,7 +127,7 @@ private fun DashboardConfigUi( val selectionList = remember { MutableList(MAX_BUTTONS) { false }.toMutableStateList() } - var isBatteryVisible by remember { mutableStateOf(Settings.isShowBatStatus()) } + var isBatteryVisible by remember { mutableStateOf(initialBatteryStatusShown) } var batterySelected by remember { mutableStateOf(false) } val reorderableGridState = rememberReorderableLazyGridState( @@ -479,4 +482,13 @@ private fun addAddButtonIfNeeded(userTileConfigList: MutableList) { if (userTileConfigList.size < MAX_BUTTONS && !userTileConfigList.contains("")) { userTileConfigList.add("") } +} + +@WearPreviewDevices +@WearPreviewFontScales +@Composable +private fun PreviewDashboardConfigUi() { + DashboardConfigUi( + initialBatteryStatusShown = true + ) } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt index 423d34af..84e8a0bd 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt @@ -55,6 +55,7 @@ import androidx.wear.compose.material3.ListHeader import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text +import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.android.horologist.compose.layout.ColumnItemType import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.Actions @@ -66,6 +67,7 @@ import com.thewizrd.simplewear.preferences.DashboardTileUtils.isActionAllowed import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider +import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback @@ -127,6 +129,7 @@ private fun DashboardTileConfigUi( lazyGridState: LazyGridState = rememberLazyGridState(), focusRequester: FocusRequester = rememberFocusRequester(), tileConfig: List = DEFAULT_TILES, + initialTileBatteryStatusShown: Boolean = Settings.isShowTileBatStatus(), onSaveItems: (actions: List, showBatteryStatus: Boolean) -> Unit = { _, _ -> } ) { val lifecycleOwner = LocalLifecycleOwner.current @@ -140,7 +143,7 @@ private fun DashboardTileConfigUi( val selectionList = remember { MutableList(DashboardTileUtils.MAX_BUTTONS) { false }.toMutableStateList() } - var isBatteryVisible by remember { mutableStateOf(Settings.isShowTileBatStatus()) } + var isBatteryVisible by remember { mutableStateOf(initialTileBatteryStatusShown) } var batterySelected by remember { mutableStateOf(false) } val reorderableGridState = rememberReorderableLazyGridState( @@ -497,4 +500,13 @@ private fun addAddButtonIfNeeded(userTileConfigList: MutableList) { if (userTileConfigList.size < DashboardTileUtils.MAX_BUTTONS && !userTileConfigList.contains("")) { userTileConfigList.add("") } +} + +@WearPreviewDevices +@WearPreviewFontScales +@Composable +private fun PreviewDashboardTileConfigUi() { + DashboardTileConfigUi( + initialTileBatteryStatusShown = true + ) } \ No newline at end of file From 872388e3c31e1cc3dcfc9e72e7ae5a899df689c4 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Wed, 22 Oct 2025 00:59:55 -0400 Subject: [PATCH 09/40] CallManagerUi: update in call ui * Fix contact name display * Add call timer if supported * Update bridge notification * Update ongoing activity icons --- mobile/src/main/AndroidManifest.xml | 1 + .../services/CallControllerService.kt | 58 +- .../services/InCallManagerService.kt | 97 +++- .../shared_resources/data/CallState.kt | 3 + .../drawable/ic_play_circle_simpleblue.xml | 23 +- wear/build.gradle | 2 +- .../simplewear/ui/components/TimerSource.kt | 69 +++ .../simplewear/ui/simplewear/CallManagerUi.kt | 517 +++++++++++++----- .../ui/simplewear/DashboardScreen.kt | 25 +- .../ui/simplewear/ValueActionScreen.kt | 3 - .../com/thewizrd/simplewear/ui/utils/Utils.kt | 30 + .../viewmodels/CallManagerViewModel.kt | 3 + .../viewmodels/WearableListenerViewModel.kt | 26 + .../wearable/WearableDataListenerService.kt | 34 +- .../main/res/drawable/ic_phone_simpleblue.xml | 32 +- 15 files changed, 708 insertions(+), 215 deletions(-) create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/TimerSource.kt diff --git a/mobile/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml index 917340b6..a38fe4ca 100644 --- a/mobile/src/main/AndroidManifest.xml +++ b/mobile/src/main/AndroidManifest.xml @@ -32,6 +32,7 @@ + diff --git a/mobile/src/main/java/com/thewizrd/simplewear/services/CallControllerService.kt b/mobile/src/main/java/com/thewizrd/simplewear/services/CallControllerService.kt index b865c321..1a2ce809 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/services/CallControllerService.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/services/CallControllerService.kt @@ -23,6 +23,7 @@ import android.util.Log import android.view.KeyEvent import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat +import androidx.core.app.ServiceCompat import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleService import com.google.android.gms.wearable.MessageClient @@ -253,6 +254,17 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive registerMediaControllerListener() registerPhoneStateListener() + OngoingCall.callLiveData.observe(this) { + scope.launch { + sendCallState( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + it?.details?.state + } else { + it?.state + } + ) + } + } OngoingCall.callState.observe(this) { scope.launch { onCallStateChanged(it) @@ -298,7 +310,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive } // Send call state - sendCallState(mTelephonyManager.callState, "") + sendCallState(mTelephonyManager.callStateCompat) mWearableManager.sendMessage( null, InCallUIHelper.MuteMicStatusPath, @@ -358,7 +370,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive mMessageClient.removeListener(this) mWearableManager.unregister() - stopForeground(true) + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) scope.cancel() super.onDestroy() } @@ -374,13 +386,14 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive } } + @Suppress("DEPRECATION") private fun registerPhoneStateListener() { mTelephonyManager?.let { tm -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { mTelephonyCallback = object : TelephonyCallback(), TelephonyCallback.CallStateListener { override fun onCallStateChanged(state: Int) { - this@CallControllerService.onCallStateChanged(state, "") + this@CallControllerService.onCallStateChanged(state) } } @@ -432,6 +445,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive } } + @Suppress("DEPRECATION") private fun unregisterPhoneStateListener() { mTelephonyManager?.let { tm -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -491,7 +505,13 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive OngoingCall.call?.details?.contactDisplayName } else { null - } ?: OngoingCall.call?.details?.callerDisplayName ?: phoneNo ?: "" + } ?: OngoingCall.call?.details?.callerDisplayName ?: getContactName(phoneNo) ?: "" + + val callStartTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + OngoingCall.call?.details?.creationTimeMillis + } else { + OngoingCall.call?.details?.connectTimeMillis + } ?: -1L val callState = state ?: OngoingCall.call?.let { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -501,7 +521,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive } } ?: TelephonyManager.CALL_STATE_IDLE - val callActive = callState != TelephonyManager.CALL_STATE_IDLE + val callActive = callState != TelephonyManager.CALL_STATE_IDLE || isInCall() var supportedFeatures = 0 if (supportsSpeakerToggle()) { @@ -514,15 +534,18 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive val callStateData = CallState( callerName = callerName, callActive = callActive, + callStartTime = callStartTime, supportedFeatures = supportedFeatures ) sendCallState(nodeID = null, callStateData) if (Settings.isBridgeCallsEnabled()) { + val callStateJson = JSONParser.serializer(callStateData, CallState::class.java) + mWearableManager.sendMessage( null, InCallUIHelper.CallStateBridgePath, - callActive.booleanToBytes() + callActive.booleanToBytes() + callStateJson.stringToBytes() ) } } @@ -539,7 +562,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive when (messageEvent.path) { InCallUIHelper.CallStatePath -> { scope.launch { - sendCallState(mTelephonyManager.callState, "") + sendCallState(mTelephonyManager.callStateCompat) } } InCallUIHelper.EndCallPath -> { @@ -634,7 +657,6 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive } } - @RequiresApi(Build.VERSION_CODES.S) private fun toggleSpeakerphone(nodeID: String? = null, on: Boolean) { mInCallManagerAdapter.setSpeakerPhoneEnabled(on) scope.launch { @@ -647,7 +669,6 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive updateNotification(this, isInCall()) } - @RequiresApi(Build.VERSION_CODES.S) private fun isSpeakerPhoneEnabled(): Boolean { return mInCallManagerAdapter.getAudioState()?.route == CallAudioState.ROUTE_SPEAKER } @@ -662,7 +683,7 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive private fun isInCall(): Boolean { return runCatching { mTelecomManager.isInCall - }.getOrDefault(mTelephonyManager.callState != TelephonyManager.CALL_STATE_IDLE) + }.getOrDefault(mTelephonyManager.callStateCompat != TelephonyManager.CALL_STATE_IDLE) } @SuppressLint("MissingPermission") @@ -671,4 +692,21 @@ class CallControllerService : LifecycleService(), MessageClient.OnMessageReceive Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && mInCallManagerAdapter.isInCallServiceAvailable() }.getOrDefault(false) } + + private fun getContactName(phoneNo: String? = null): String? { + Logger.debug(TAG, "Contact name: $phoneNo") + + return phoneNo + } + + @Suppress("DEPRECATION") + @get:SuppressLint("MissingPermission") + private val TelephonyManager.callStateCompat: Int + get() { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + this.callStateForSubscription + } else { + this.callState + } + } } \ No newline at end of file diff --git a/mobile/src/main/java/com/thewizrd/simplewear/services/InCallManagerService.kt b/mobile/src/main/java/com/thewizrd/simplewear/services/InCallManagerService.kt index b1d5d43d..b928447e 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/services/InCallManagerService.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/services/InCallManagerService.kt @@ -8,15 +8,17 @@ import android.os.IBinder import android.os.Looper import android.telecom.Call import android.telecom.CallAudioState +import android.telecom.CallEndpoint import android.telecom.InCallService import android.telecom.TelecomManager import android.telephony.TelephonyManager +import androidx.annotation.DeprecatedSinceApi import androidx.annotation.MainThread import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import com.thewizrd.shared_resources.utils.Logger +import java.util.concurrent.Executors -@RequiresApi(Build.VERSION_CODES.S) class InCallManagerService : InCallService() { companion object { @RequiresApi(Build.VERSION_CODES.S) @@ -27,6 +29,9 @@ class InCallManagerService : InCallService() { } private var previousAudioRoute: Int? = null + private var previousCallEndpoint: CallEndpoint? = null + private val availableCallEndpoints: MutableList = mutableListOf() + private var isMuted = false override fun onCallAdded(call: Call?) { OngoingCall.call = call @@ -37,6 +42,8 @@ class InCallManagerService : InCallService() { OngoingCall.call = null } + @Deprecated("Deprecated in Java") + @DeprecatedSinceApi(api = 34) override fun onCallAudioStateChanged(audioState: CallAudioState?) { if (audioState?.route != CallAudioState.ROUTE_SPEAKER) { previousAudioRoute = audioState?.route @@ -44,14 +51,61 @@ class InCallManagerService : InCallService() { OngoingCall.callAudioState.postValue(audioState) } + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + override fun onCallEndpointChanged(callEndpoint: CallEndpoint) { + if (callEndpoint.endpointType != CallEndpoint.TYPE_SPEAKER) { + previousAudioRoute = CallAudioState.ROUTE_SPEAKER + previousCallEndpoint = callEndpoint + } + OngoingCall.callAudioState.postValue(createAudioState()) + } + + override fun onMuteStateChanged(isMuted: Boolean) { + this.isMuted = isMuted + } + + override fun onAvailableCallEndpointsChanged(availableEndpoints: List) { + availableCallEndpoints.clear() + availableCallEndpoints.addAll(availableEndpoints) + } + + @Suppress("DEPRECATION") fun setSpeakerPhoneEnabled(enabled: Boolean) { - setAudioRoute( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { if (enabled) { - CallAudioState.ROUTE_SPEAKER + val speakerEndpoint = + availableCallEndpoints.firstOrNull { it.endpointType == CallEndpoint.TYPE_SPEAKER } + + if (speakerEndpoint != null) { + requestCallEndpointChange( + speakerEndpoint, + Executors.newSingleThreadExecutor() + ) {} + } else { + setAudioRoute(CallAudioState.ROUTE_SPEAKER) + } } else { - previousAudioRoute ?: CallAudioState.ROUTE_EARPIECE + val targetEndpoint = previousCallEndpoint + ?: availableCallEndpoints.firstOrNull { it.endpointType == CallEndpoint.TYPE_EARPIECE } + + if (targetEndpoint != null) { + requestCallEndpointChange( + targetEndpoint, + Executors.newSingleThreadExecutor() + ) {} + } else { + setAudioRoute(previousAudioRoute ?: CallAudioState.ROUTE_EARPIECE) + } } - ) + } else { + setAudioRoute( + if (enabled) { + CallAudioState.ROUTE_SPEAKER + } else { + previousAudioRoute ?: CallAudioState.ROUTE_EARPIECE + } + ) + } } override fun onBind(intent: Intent?): IBinder? { @@ -66,9 +120,36 @@ class InCallManagerService : InCallService() { return result } + + @Suppress("DEPRECATION") + internal fun createAudioState(): CallAudioState? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + currentCallEndpoint?.let { endpoint -> + CallAudioState( + isMuted, + endpoint.getAudioRoute(), + availableCallEndpoints.map { it.getAudioRoute() } + .reduceOrNull { acc, i -> acc or i } ?: 0 + ) + } + } else { + callAudioState + } + } + + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + private fun CallEndpoint.getAudioRoute(): Int { + return when (this.endpointType) { + CallEndpoint.TYPE_BLUETOOTH -> CallAudioState.ROUTE_BLUETOOTH + CallEndpoint.TYPE_EARPIECE -> CallAudioState.ROUTE_EARPIECE + CallEndpoint.TYPE_SPEAKER -> CallAudioState.ROUTE_SPEAKER + CallEndpoint.TYPE_STREAMING -> CallAudioState.ROUTE_STREAMING + CallEndpoint.TYPE_WIRED_HEADSET -> CallAudioState.ROUTE_WIRED_HEADSET + else -> -1 + } + } } -@RequiresApi(Build.VERSION_CODES.S) class InCallManagerAdapter private constructor() { private var mInCallService: InCallManagerService? = null @@ -121,11 +202,10 @@ class InCallManagerAdapter private constructor() { } fun getAudioState(): CallAudioState? { - return mInCallService?.callAudioState + return mInCallService?.createAudioState() } } -@RequiresApi(Build.VERSION_CODES.S) object OngoingCall { val callLiveData = MutableLiveData() val callState = MutableLiveData() @@ -138,6 +218,7 @@ object OngoingCall { } } + @Suppress("DEPRECATION") var call: Call? = null internal set(value) { field?.unregisterCallback(callback) diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/data/CallState.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/data/CallState.kt index 01e7eca4..2e71b8d4 100644 --- a/shared_resources/src/main/java/com/thewizrd/shared_resources/data/CallState.kt +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/data/CallState.kt @@ -4,6 +4,7 @@ data class CallState( val callerName: String? = null, val callerBitmap: ByteArray? = null, val callActive: Boolean = false, + val callStartTime: Long = -1L, val supportedFeatures: Int = 0, ) { override fun equals(other: Any?): Boolean { @@ -16,6 +17,7 @@ data class CallState( if (!callerBitmap.contentEquals(other.callerBitmap)) return false } else if (other.callerBitmap != null) return false if (callActive != other.callActive) return false + if (callStartTime != other.callStartTime) return false if (supportedFeatures != other.supportedFeatures) return false return true @@ -25,6 +27,7 @@ data class CallState( var result = callerName?.hashCode() ?: 0 result = 31 * result + (callerBitmap?.contentHashCode() ?: 0) result = 31 * result + callActive.hashCode() + result = 31 * result + callStartTime.hashCode() result = 31 * result + supportedFeatures return result } diff --git a/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml b/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml index 1fa60989..dfb47443 100644 --- a/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml +++ b/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml @@ -1,13 +1,14 @@ - - - + android:height="108dp" + android:viewportWidth="2160" + android:viewportHeight="2160"> + + diff --git a/wear/build.gradle b/wear/build.gradle index cb8757c6..db9b5eb3 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -116,7 +116,7 @@ dependencies { implementation "androidx.compose.ui:ui-tooling-preview" implementation "androidx.compose.animation:animation-graphics" implementation "androidx.compose.runtime:runtime-livedata" - implementation "androidx.compose.material:material-icons-core" + implementation "androidx.compose.material:material-icons-extended-android" implementation "androidx.compose.material3:material3:$material_compose_version" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" implementation "androidx.wear.compose:compose-foundation:$wear_compose_version" diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/TimerSource.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/TimerSource.kt new file mode 100644 index 00000000..2121c5c3 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/components/TimerSource.kt @@ -0,0 +1,69 @@ +package com.thewizrd.simplewear.ui.components + +import android.text.format.DateUtils +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.wear.compose.material3.TimeSource +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import java.util.concurrent.TimeUnit +import kotlin.math.abs + +/** + * Based on [androidx.wear.compose.material3.DefaultTimeSource] + */ +class ElapsedTimeSource(private val startTimeMillis: Long) : TimeSource { + @Composable + override fun currentTime(): String = + elapsedTimeDuration({ System.currentTimeMillis() }, startTimeMillis).value +} + +@Composable +private fun elapsedTimeDuration(time: () -> Long, startTimeMillis: Long): State { + val composableScope = rememberCoroutineScope() + var currentTime by remember { mutableLongStateOf(time()) } + + val timeText = remember { + derivedStateOf { formatDuration(currentTime - startTimeMillis) } + } + + val context = LocalContext.current + val updatedTimeLambda by rememberUpdatedState(time) + + DisposableEffect(context, updatedTimeLambda) { + currentTime = updatedTimeLambda() + + val timerJob = composableScope.launch { + while (isActive) { + currentTime = updatedTimeLambda() + + val nowMillis = currentTime + var delayMillis = 1000 - (abs(nowMillis - startTimeMillis) % 1000) + + delayMillis++ + delay(delayMillis) + } + } + + onDispose { + timerJob.cancel() + } + } + return timeText +} + +private fun formatDuration(elapsedMillis: Long): String { + return DateUtils.formatElapsedTime( + TimeUnit.MILLISECONDS.toSeconds(elapsedMillis) + ) +} diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index d9f57b65..b07af8f4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -2,31 +2,32 @@ package com.thewizrd.simplewear.ui.simplewear import android.content.Intent import android.graphics.Bitmap -import androidx.annotation.DrawableRes import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee -import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.FlowRowOverflow -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeightIn import androidx.compose.foundation.layout.requiredSize -import androidx.compose.foundation.layout.requiredSizeIn +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.VolumeUp +import androidx.compose.material.icons.outlined.MicOff +import androidx.compose.material.icons.rounded.Dialpad +import androidx.compose.material.icons.rounded.MoreHoriz +import androidx.compose.material.icons.rounded.SpeakerPhone import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -38,54 +39,80 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.wear.compose.material3.Button +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.foundation.requestFocusOnHierarchyActive +import androidx.wear.compose.foundation.rotary.rotaryScrollable import androidx.wear.compose.material3.ButtonDefaults import androidx.wear.compose.material3.Dialog +import androidx.wear.compose.material3.FilledIconButton +import androidx.wear.compose.material3.FilledTonalButton import androidx.wear.compose.material3.Icon +import androidx.wear.compose.material3.IconButtonDefaults +import androidx.wear.compose.material3.ListHeader +import androidx.wear.compose.material3.ListHeaderDefaults import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold +import androidx.wear.compose.material3.SurfaceTransformation import androidx.wear.compose.material3.Text import androidx.wear.compose.material3.TimeText +import androidx.wear.compose.material3.lazy.rememberTransformationSpec +import androidx.wear.compose.material3.lazy.transformedHeight import androidx.wear.compose.material3.ripple +import androidx.wear.compose.material3.touchTargetAwareSize import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales +import com.google.android.horologist.audio.ui.material3.VolumeLevelIndicator +import com.google.android.horologist.audio.ui.material3.volumeRotaryBehavior +import com.google.android.horologist.compose.layout.ColumnItemType +import com.google.android.horologist.compose.layout.rememberResponsiveColumnPadding import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.helpers.InCallUIHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.components.ElapsedTimeSource import com.thewizrd.simplewear.ui.components.LoadingContent import com.thewizrd.simplewear.ui.navigation.Screen -import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.CallManagerUiState import com.thewizrd.simplewear.viewmodels.CallManagerViewModel import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel +import com.thewizrd.simplewear.viewmodels.ValueActionViewModel +import com.thewizrd.simplewear.viewmodels.ValueActionVolumeViewModel import com.thewizrd.simplewear.viewmodels.WearableListenerViewModel import kotlinx.coroutines.launch +import java.util.concurrent.TimeUnit +import kotlin.math.sqrt +import kotlin.random.Random @Composable fun CallManagerUi( @@ -96,13 +123,27 @@ fun CallManagerUi( val activity = context.findActivity() val lifecycleOwner = LocalLifecycleOwner.current - val callManagerViewModel = activityViewModel() + val callManagerViewModel = viewModel() val uiState by callManagerViewModel.uiState.collectAsState() + val valueActionViewModel = viewModel() + val volumeViewModel = remember(context, valueActionViewModel) { + ValueActionVolumeViewModel(context, valueActionViewModel) + } + val volumeUiState by volumeViewModel.volumeUiState.collectAsState() + val confirmationViewModel = viewModel() val confirmationData by confirmationViewModel.confirmationEventsFlow.collectAsState() - ScreenScaffold { contentPadding -> + ScreenScaffold( + modifier = modifier, + scrollIndicator = { + VolumeLevelIndicator( + volumeUiState = { volumeUiState }, + displayIndicatorEvents = volumeViewModel.displayIndicatorEvents + ) + } + ) { contentPadding -> LoadingContent( empty = !uiState.isCallActive, emptyContent = { @@ -115,6 +156,7 @@ fun CallManagerUi( CallManagerUi( modifier = Modifier.padding(contentPadding), callManagerViewModel = callManagerViewModel, + volumeViewModel = volumeViewModel, navController = navController ) } @@ -182,6 +224,25 @@ fun CallManagerUi( } } + WearableHelper.AudioVolumePath, WearableHelper.ValueStatusSetPath -> { + val status = + event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + + when (status) { + ActionStatus.UNKNOWN, ActionStatus.FAILURE -> { + confirmationViewModel.showFailure(message = context.getString(R.string.error_actionfailed)) + } + + ActionStatus.PERMISSION_DENIED -> { + confirmationViewModel.showFailure(message = context.getString(R.string.error_permissiondenied)) + + valueActionViewModel.openAppOnPhone(false) + } + + else -> {} + } + } + WearableListenerViewModel.ACTION_SHOWCONFIRMATION -> { val jsonData = event.data.getString(WearableListenerViewModel.EXTRA_ACTIONDATA) @@ -195,9 +256,12 @@ fun CallManagerUi( } } - LaunchedEffect(Unit) { + LaunchedEffect(lifecycleOwner) { // Update statuses + valueActionViewModel.onActionUpdated(Actions.VOLUME, AudioStreamType.VOICE_CALL) + callManagerViewModel.refreshCallState() + valueActionViewModel.refreshState() } } @@ -205,17 +269,24 @@ fun CallManagerUi( fun CallManagerUi( modifier: Modifier = Modifier, callManagerViewModel: CallManagerViewModel, + volumeViewModel: ValueActionVolumeViewModel, navController: NavController ) { - val context = LocalContext.current - val activity = context.findActivity() - val uiState by callManagerViewModel.uiState.collectAsState() + val volumeUiState by volumeViewModel.volumeUiState.collectAsState() var showKeyPadUi by remember { mutableStateOf(false) } CallManagerUi( - modifier = modifier, + modifier = modifier + .requestFocusOnHierarchyActive() + .rotaryScrollable( + focusRequester = rememberFocusRequester(), + behavior = volumeRotaryBehavior( + volumeUiStateProvider = { volumeUiState }, + onRotaryVolumeInput = { newValue -> volumeViewModel.setVolume(newValue) } + ) + ), uiState = uiState, onShowKeypadUi = { showKeyPadUi = true @@ -263,55 +334,103 @@ private fun CallManagerUi( val isPreview = LocalInspectionMode.current val isRound = LocalConfiguration.current.isScreenRound - Box( - modifier = modifier.fillMaxSize() - ) { - if (isPreview) { - TimeText() - } + val isLargeHeight = LocalConfiguration.current.screenHeightDp >= 225 + val isLargeWidth = LocalConfiguration.current.screenWidthDp >= 225 + val buttonSize = if (isLargeWidth || isLargeHeight) { + IconButtonDefaults.SmallButtonSize + } else { + 40.dp + } + + val buttonRowPadding = if (isRound) 16.dp else 8.dp + + var showMenuDialog by remember { mutableStateOf(false) } + + Box(modifier = modifier.fillMaxSize()) { if (uiState.callerBitmap != null) { + val colorScheme = MaterialTheme.colorScheme Image( - modifier = Modifier.fillMaxSize(), bitmap = uiState.callerBitmap.asImageBitmap(), - contentDescription = stringResource(R.string.desc_contact_photo) + contentDescription = stringResource(R.string.desc_contact_photo), + contentScale = ContentScale.Crop, + alpha = 0.6f, + modifier = + modifier + .fillMaxSize() + .drawWithCache { + val gradientBrush = + Brush.radialGradient( + 0.65f to Color.Transparent, + 1f to colorScheme.background, + ) + onDrawWithContent { + drawRect(colorScheme.background) + drawContent() + drawRect(color = colorScheme.primaryContainer, alpha = 0.3f) + drawRect(color = colorScheme.onPrimary, alpha = 0.6f) + drawRect(gradientBrush) + } + }, ) } - Column( - modifier = Modifier - .fillMaxSize() - .padding(5.dp) - ) { - Spacer(modifier = Modifier.height(16.dp)) + if (isPreview) { + TimeText() + } + Column(modifier = Modifier.fillMaxSize()) { Box( modifier = Modifier .weight(1f, fill = true) .fillMaxWidth() - .padding(horizontal = if (isRound) 32.dp else 8.dp), - contentAlignment = Alignment.Center + .padding(ListHeaderDefaults.ContentPadding), + contentAlignment = Alignment.BottomCenter ) { Text( modifier = Modifier .wrapContentHeight() .basicMarquee(iterations = Int.MAX_VALUE), text = uiState.callerName ?: stringResource(id = R.string.message_callactive), + style = if (isLargeWidth || isLargeHeight) { + MaterialTheme.typography.labelLarge + } else { + MaterialTheme.typography.labelMedium + }, maxLines = 1, overflow = TextOverflow.Visible, textAlign = TextAlign.Center ) } - FlowRow( + if (uiState.callStartTime > -1L) { + val timerSource = remember(uiState.callStartTime) { + ElapsedTimeSource(uiState.callStartTime) + } + + Text( + modifier = Modifier.fillMaxWidth(), + text = timerSource.currentTime(), + style = if (isLargeWidth || isLargeHeight) { + MaterialTheme.typography.bodyMedium + } else { + MaterialTheme.typography.bodySmall + }, + textAlign = TextAlign.Center + ) + } + + Row( modifier = Modifier - .fillMaxWidth(), - maxItemsInEachRow = 2, - horizontalArrangement = Arrangement.SpaceEvenly, - verticalArrangement = Arrangement.spacedBy(4.dp) + .fillMaxWidth() + .padding(start = buttonRowPadding, end = buttonRowPadding, top = 8.dp) + .weight(1f, fill = true), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.Top ) { CallUiButton( - iconResourceId = R.drawable.ic_mic_off_24dp, + imageVector = Icons.Outlined.MicOff, + buttonSize = buttonSize, isChecked = uiState.isMuted, onClick = onMute, contentDescription = if (uiState.isMuted) { @@ -320,49 +439,160 @@ private fun CallManagerUi( stringResource(R.string.label_mute) } ) - if (uiState.canSendDTMFKeys) { + + if (uiState.canSendDTMFKeys || uiState.supportsSpeaker) { CallUiButton( - iconResourceId = R.drawable.ic_dialpad_24dp, - onClick = onShowKeypadUi, - contentDescription = stringResource(R.string.label_keypad) + imageVector = Icons.Rounded.MoreHoriz, + buttonSize = buttonSize, + onClick = { showMenuDialog = true }, + contentDescription = stringResource(R.string.action_volume) ) - } - if (uiState.supportsSpeaker) { + } else { CallUiButton( - iconResourceId = R.drawable.ic_baseline_speaker_phone_24, - isChecked = uiState.isSpeakerPhoneOn, - onClick = onSpeakerPhone, - contentDescription = if (uiState.isSpeakerPhoneOn) { - stringResource(R.string.desc_speakerphone_on) - } else { - stringResource(R.string.desc_speakerphone_off) - } + imageVector = Icons.AutoMirrored.Rounded.VolumeUp, + buttonSize = buttonSize, + onClick = onVolume, + contentDescription = stringResource(R.string.action_volume) ) } - CallUiButton( - iconResourceId = R.drawable.ic_volume_up_white_24dp, - onClick = onVolume, - contentDescription = stringResource(R.string.action_volume) - ) } + } - Button( - modifier = Modifier - .requiredSize(40.dp) - .align(Alignment.CenterHorizontally), - colors = ButtonDefaults.buttonColors( + Box( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = if (buttonSize > 40.dp) 4.dp else 0.dp), + ) { + FilledIconButton( + modifier = Modifier.touchTargetAwareSize(buttonSize), + colors = IconButtonDefaults.filledIconButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer ), onClick = onEndCall ) { Icon( + modifier = Modifier.size(IconButtonDefaults.iconSizeFor(buttonSize)), painter = painterResource(id = R.drawable.ic_call_end_24dp), contentDescription = stringResource(id = R.string.action_hangup) ) } + } + } + + Dialog( + visible = showMenuDialog, + onDismissRequest = { showMenuDialog = false } + ) { + val columnState = rememberTransformingLazyColumnState() + val contentPadding = rememberResponsiveColumnPadding( + first = ColumnItemType.ListHeader, + last = ColumnItemType.Button, + ) + val transformationSpec = rememberTransformationSpec() + + ScreenScaffold( + modifier = Modifier.fillMaxSize(), + contentPadding = contentPadding + ) { contentPadding -> + TransformingLazyColumn( + modifier = Modifier.fillMaxSize(), + state = columnState, + contentPadding = contentPadding + ) { + item { + ListHeader( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec) + ) { + Text(text = stringResource(R.string.title_callcontroller)) + } + } + + if (uiState.canSendDTMFKeys) { + item { + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = stringResource(R.string.label_keypad)) + }, + icon = { + Icon( + imageVector = Icons.Rounded.Dialpad, + contentDescription = stringResource(R.string.label_keypad) + ) + }, + onClick = { + onShowKeypadUi() + showMenuDialog = false + } + ) + } + } - Spacer(modifier = Modifier.height(4.dp)) + if (uiState.supportsSpeaker) { + item { + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text( + text = if (uiState.isSpeakerPhoneOn) { + stringResource(R.string.desc_speakerphone_on) + } else { + stringResource(R.string.desc_speakerphone_off) + } + ) + }, + icon = { + Icon( + imageVector = Icons.Rounded.SpeakerPhone, + contentDescription = if (uiState.isSpeakerPhoneOn) { + stringResource(R.string.desc_speakerphone_on) + } else { + stringResource(R.string.desc_speakerphone_off) + } + ) + }, + colors = if (uiState.isSpeakerPhoneOn) { + ButtonDefaults.buttonColors() + } else { + ButtonDefaults.filledTonalButtonColors() + }, + onClick = onSpeakerPhone + ) + } + } + + item { + FilledTonalButton( + modifier = Modifier + .fillMaxWidth() + .transformedHeight(this, transformationSpec), + transformation = SurfaceTransformation(transformationSpec), + label = { + Text(text = stringResource(R.string.action_volume)) + }, + icon = { + Icon( + imageVector = Icons.AutoMirrored.Rounded.VolumeUp, + contentDescription = stringResource(R.string.action_volume) + ) + }, + onClick = { + onVolume() + showMenuDialog = false + } + ) + } + } } } } @@ -370,41 +600,26 @@ private fun CallManagerUi( @Composable private fun CallUiButton( modifier: Modifier = Modifier, + buttonSize: Dp = IconButtonDefaults.DefaultButtonSize, isChecked: Boolean = false, - @DrawableRes iconResourceId: Int, + imageVector: ImageVector, contentDescription: String?, onClick: () -> Unit = {} ) { - Box( - modifier = modifier - .requiredSizeIn(40.dp, 40.dp) - .clickable( - onClick = onClick, - role = Role.Button, - interactionSource = remember { MutableInteractionSource() }, - indication = ripple( - color = MaterialTheme.colorScheme.onSurface, - radius = 20.dp - ) - ) - .border( - width = 1.dp, - brush = SolidColor(if (isChecked) Color.White else Color.Transparent), - shape = MaterialTheme.shapes.small - ), - contentAlignment = Alignment.Center, - ) { - Box( - modifier = Modifier.padding( - horizontal = 12.dp - ) - ) { - Icon( - modifier = Modifier.requiredSize(24.dp), - painter = painterResource(id = iconResourceId), - contentDescription = contentDescription - ) + FilledIconButton( + modifier = modifier.touchTargetAwareSize(buttonSize), + onClick = onClick, + colors = if (isChecked) { + IconButtonDefaults.filledIconButtonColors() + } else { + IconButtonDefaults.filledTonalIconButtonColors() } + ) { + Icon( + modifier = Modifier.requiredSize(IconButtonDefaults.iconSizeFor(buttonSize)), + imageVector = imageVector, + contentDescription = contentDescription + ) } } @@ -432,10 +647,26 @@ private fun NoCallActiveScreen( private fun KeypadScreen( onKeyPressed: (Char) -> Unit = {} ) { + val config = LocalConfiguration.current + val isPreview = LocalInspectionMode.current - val context = LocalContext.current - val isRound = LocalConfiguration.current.isScreenRound - val screenHeightDp = LocalConfiguration.current.screenHeightDp + val isRound = config.isScreenRound + val isLargeWidth = config.screenWidthDp >= 225 + + val headerPadding: PaddingValues = remember(config) { + if (isRound) { + val screenHeightDp = config.screenHeightDp + val screenWidthDp = config.smallestScreenWidthDp + val maxSquareEdge = (sqrt(((screenHeightDp * screenWidthDp) / 2).toDouble())) + val inset = Dp(((screenHeightDp - maxSquareEdge) / 2).toFloat()) + PaddingValues( + start = inset, top = inset, end = inset, + bottom = ListHeaderDefaults.ContentPadding.calculateBottomPadding() + ) + } else { + ListHeaderDefaults.ContentPadding + } + } var keypadText by remember { mutableStateOf("") } val digits by remember { @@ -450,64 +681,74 @@ private fun KeypadScreen( } Column( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally ) { - Box( + Row( modifier = Modifier .fillMaxWidth() - .fillMaxHeight(0.2f) - .background(Color(0xFF444444)) - .padding( - start = if (isRound) 48.dp else 8.dp, - end = if (isRound) 48.dp else 8.dp, - bottom = 4.dp - ) - .clipToBounds(), - contentAlignment = Alignment.BottomCenter + .padding(headerPadding) ) { - Text( - modifier = Modifier.wrapContentWidth( - align = Alignment.End, - unbounded = true - ), - text = if (isPreview) "01234567891110" else keypadText, - fontWeight = FontWeight.Light, - fontSize = 18.sp, - maxLines = 1, - textAlign = TextAlign.Center, - overflow = TextOverflow.Visible - ) + Box( + modifier = Modifier + .fillMaxWidth() + .clipToBounds(), + contentAlignment = Alignment.Center + ) { + Text( + modifier = Modifier.wrapContentWidth(align = Alignment.End, unbounded = true), + text = if (isPreview) "01234567891110123" else keypadText, + style = MaterialTheme.typography.bodyMedium, + letterSpacing = 1.5.sp, + fontSize = if (isLargeWidth) 14.sp else 12.sp, + maxLines = 1, + textAlign = TextAlign.Center, + overflow = TextOverflow.Visible, + softWrap = true + ) + } } - BoxWithConstraints { + Row( + modifier = Modifier.fillMaxWidth(0.65f) + ) { FlowRow( modifier = Modifier .fillMaxSize() .padding( - start = if (isRound) 32.dp else 8.dp, - end = if (isRound) 32.dp else 8.dp, - bottom = if (isRound) 32.dp else 8.dp + bottom = 8.dp ), maxItemsInEachRow = 3, - horizontalArrangement = Arrangement.Center, - verticalArrangement = Arrangement.Center, - overflow = FlowRowOverflow.Visible + maxLines = 4, + verticalArrangement = Arrangement.SpaceBetween, + horizontalArrangement = Arrangement.SpaceBetween ) { digits.forEach { Box( modifier = Modifier + .requiredHeightIn(max = 32.dp) .weight(1f, fill = true) - .height((this@BoxWithConstraints.maxHeight - if (isRound) 32.dp else 8.dp) / 4) - .clickable { + .clickable( + role = Role.Button, + interactionSource = remember { MutableInteractionSource() }, + indication = ripple( + color = MaterialTheme.colorScheme.onSurface, + radius = 20.dp, + bounded = false + ) + ) { keypadText += it onKeyPressed.invoke(it) }, contentAlignment = Alignment.Center ) { Text( - text = it + "", + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center), + text = "$it", maxLines = 1, textAlign = TextAlign.Center, - fontSize = 16.sp + style = MaterialTheme.typography.labelLarge ) } } @@ -527,7 +768,13 @@ private fun PreviewCallManagerUi() { val uiState = remember { CallManagerUiState( connectionStatus = WearConnectionStatus.CONNECTED, + callerName = if (Random.nextInt(0, 2) == 1) { + "(123) 456-7890" + } else { + null + }, callerBitmap = bmp, + callStartTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(60), isSpeakerPhoneOn = true, isCallActive = true, isMuted = true, @@ -537,4 +784,4 @@ private fun PreviewCallManagerUi() { } CallManagerUi(uiState = uiState) -} \ No newline at end of file +} diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt index c02c8674..6027cf3e 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt @@ -29,7 +29,6 @@ import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.Stable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -39,7 +38,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.composed import androidx.compose.ui.geometry.Size import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalConfiguration @@ -85,6 +83,7 @@ import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.components.WearDivider import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.fillDashboard import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.DashboardState import com.thewizrd.simplewear.viewmodels.DashboardViewModel @@ -92,7 +91,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.isActive import kotlinx.coroutines.launch -import kotlin.math.sqrt @Composable fun DashboardScreen( @@ -721,27 +719,6 @@ private fun indeterminateActionButtonColors(): ButtonColors { ) } -@Stable -private fun Modifier.fillDashboard(): Modifier = composed { - val isRound = LocalConfiguration.current.isScreenRound - val screenHeightDp = LocalConfiguration.current.screenHeightDp - - var bottomInset = Dp(screenHeightDp - (screenHeightDp * 0.8733032f)) - - if (isRound) { - val screenWidthDp = LocalConfiguration.current.smallestScreenWidthDp - val maxSquareEdge = (sqrt(((screenHeightDp * screenWidthDp) / 2).toFloat())) - bottomInset = Dp((screenHeightDp - (maxSquareEdge * 0.8733032f)) / 2) - } - - fillMaxSize().padding( - start = if (isRound) 14.dp else 8.dp, - end = if (isRound) 14.dp else 8.dp, - top = if (isRound) 36.dp else 8.dp, - bottom = bottomInset - ) -} - @WearPreviewDevices @Composable private fun PreviewDashboardScreen() { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index a3a1916c..677b83bf 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -220,9 +220,6 @@ fun ValueActionScreen( valueActionViewModel: ValueActionViewModel, volumeViewModel: ValueActionVolumeViewModel ) { - val lifecycleOwner = LocalLifecycleOwner.current - val activityCtx = LocalContext.current.findActivity() - val uiState by valueActionViewModel.uiState.collectAsState() val progressUiState by volumeViewModel.volumeUiState.collectAsState() diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Utils.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Utils.kt index 1eb4bae4..561f6666 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Utils.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Utils.kt @@ -1,10 +1,40 @@ package com.thewizrd.simplewear.ui.utils +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import kotlin.math.sqrt @Composable fun rememberFocusRequester(): FocusRequester { return remember { FocusRequester() } +} + +@Stable +fun Modifier.fillDashboard(): Modifier = composed { + val isRound = LocalConfiguration.current.isScreenRound + val screenHeightDp = LocalConfiguration.current.screenHeightDp + + var bottomInset = Dp(screenHeightDp - (screenHeightDp * 0.8733032f)) + + if (isRound) { + val screenWidthDp = LocalConfiguration.current.smallestScreenWidthDp + val maxSquareEdge = (sqrt(((screenHeightDp * screenWidthDp) / 2).toFloat())) + bottomInset = Dp((screenHeightDp - (maxSquareEdge * 0.8733032f)) / 2) + } + + fillMaxSize().padding( + start = if (isRound) 14.dp else 8.dp, + end = if (isRound) 14.dp else 8.dp, + top = if (isRound) 36.dp else 8.dp, + bottom = bottomInset + ) } \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/CallManagerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/CallManagerViewModel.kt index e37b631d..b9d210f2 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/CallManagerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/CallManagerViewModel.kt @@ -32,6 +32,7 @@ data class CallManagerUiState( // InCallUi val callerName: String? = null, val callerBitmap: Bitmap? = null, + val callStartTime: Long = -1L, val supportsSpeaker: Boolean = false, val canSendDTMFKeys: Boolean = false, val isCallActive: Boolean = false, @@ -152,6 +153,7 @@ class CallManagerViewModel(app: Application) : WearableListenerViewModel(app) { val callActive = callState?.callActive ?: false val callerName = callState?.callerName val callerBmp = callState?.callerBitmap?.toBitmap() + val callStartTime = callState?.callStartTime ?: -1L val inCallFeatures = callState?.supportedFeatures ?: 0 val supportsSpeakerToggle = inCallFeatures and InCallUIHelper.INCALL_FEATURE_SPEAKERPHONE != 0 @@ -163,6 +165,7 @@ class CallManagerViewModel(app: Application) : WearableListenerViewModel(app) { callerName = callerName?.takeIf { name -> name.isNotBlank() } ?: appContext.getString(R.string.message_callactive), callerBitmap = if (callActive) callerBmp else null, + callStartTime = callStartTime, supportsSpeaker = callActive && supportsSpeakerToggle, canSendDTMFKeys = callActive && canSendDTMFKey, isCallActive = callActive diff --git a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt index cf9a8745..2c6b99e8 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/viewmodels/WearableListenerViewModel.kt @@ -469,6 +469,32 @@ abstract class WearableListenerViewModel(private val app: Application) : Android return -1 } + protected suspend fun sendRequest(nodeID: String, path: String, data: ByteArray?): ByteArray { + try { + return Wearable.getMessageClient(appContext) + .sendRequest(nodeID, path, data).await() + } catch (e: Exception) { + if (e is ApiException || e.cause is ApiException) { + val apiException = e.cause as? ApiException ?: e as? ApiException + if (apiException?.statusCode == WearableStatusCodes.TARGET_NODE_NOT_CONNECTED) { + mConnectionStatus = WearConnectionStatus.DISCONNECTED + + _eventsFlow.tryEmit( + WearableEvent( + ACTION_UPDATECONNECTIONSTATUS, + Bundle().apply { + putInt(EXTRA_CONNECTIONSTATUS, mConnectionStatus.value) + }) + ) + } + } + + Logger.writeLine(Log.ERROR, e) + } + + return byteArrayOf() + } + @Throws(ApiException::class) protected suspend fun sendPing(nodeID: String) { try { diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt index 6ae2c467..cc44a29a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt @@ -37,6 +37,7 @@ import com.thewizrd.shared_resources.actions.BatteryStatus import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.appLib import com.thewizrd.shared_resources.data.AppItemData +import com.thewizrd.shared_resources.data.CallState import com.thewizrd.shared_resources.helpers.InCallUIHelper import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearableHelper @@ -126,9 +127,15 @@ class WearableDataListenerService : WearableListenerService() { messageEvent.path == InCallUIHelper.CallStateBridgePath -> { val enable = messageEvent.data.bytesToBool() + val callState = messageEvent.data.takeIf { it.size > 1 }?.let { + JSONParser.deserializer( + it.copyOfRange(1, it.size).bytesToString(), + CallState::class.java + ) + } if (enable) { - createCallOngoingActivity() + createCallOngoingActivity(callState) } else { dismissCallOngoingActivity() } @@ -447,6 +454,17 @@ class WearableDataListenerService : WearableListenerService() { } } + protected suspend fun sendRequest(nodeID: String, path: String, data: ByteArray?): ByteArray { + try { + return Wearable.getMessageClient(this@WearableDataListenerService) + .sendRequest(nodeID, path, data).await() + } catch (e: Exception) { + Logger.writeLine(Log.ERROR, e) + } + + return byteArrayOf() + } + override fun onDataChanged(dataEventBuffer: DataEventBuffer) { super.onDataChanged(dataEventBuffer) @@ -466,12 +484,13 @@ class WearableDataListenerService : WearableListenerService() { } } - private fun createCallOngoingActivity() { + private fun createCallOngoingActivity(callState: CallState? = null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { initCallControllerNotifChannel() } - val notifTitle = getString(R.string.message_callactive) + val notifTitle: String = callState?.callerName?.takeIf { it.isNotEmpty() } + ?: getString(R.string.message_callactive) val notifBuilder = NotificationCompat.Builder(this, CALLS_NOT_CHANNEL_ID) .setStyle( @@ -493,9 +512,16 @@ class WearableDataListenerService : WearableListenerService() { getCallControllerIntent() ) .setLocusId(LocusIdCompat(CALLS_LOCUS_ID)) + .apply { + callState?.callStartTime?.takeIf { it > 0 }?.let { callStartTime -> + this.setUsesChronometer(true) + .setWhen(callStartTime) + .setShowWhen(false) + } + } val ongoingActivityStatus = Status.Builder() - .addTemplate(getString(R.string.message_callactive)) + .addTemplate(notifTitle) .build() val ongoingActivity = OngoingActivity.Builder(applicationContext, 1000, notifBuilder) diff --git a/wear/src/main/res/drawable/ic_phone_simpleblue.xml b/wear/src/main/res/drawable/ic_phone_simpleblue.xml index e3caa7b7..c9432ec1 100644 --- a/wear/src/main/res/drawable/ic_phone_simpleblue.xml +++ b/wear/src/main/res/drawable/ic_phone_simpleblue.xml @@ -1,19 +1,13 @@ - - - - - - - - - - - \ No newline at end of file + + + + From e5465993453d3fb27b3cc9113933970a401c3184 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Wed, 22 Oct 2025 01:13:39 -0400 Subject: [PATCH 10/40] utils: add bundle serializable compat extension --- .../thewizrd/shared_resources/utils/BundleUtils.kt | 9 +++++++++ .../simplewear/ui/simplewear/AppLauncherScreen.kt | 6 +++++- .../simplewear/ui/simplewear/CallManagerUi.kt | 11 +++++++++-- .../simplewear/ui/simplewear/GesturesUi.kt | 6 +++++- .../simplewear/ui/simplewear/MediaPlayer.kt | 14 +++++--------- .../simplewear/ui/simplewear/MediaPlayerListUi.kt | 11 +++++++++-- .../simplewear/ui/simplewear/MediaPlayerUi.kt | 11 +++++++++-- .../simplewear/ui/simplewear/SimpleWearApp.kt | 14 +++++--------- .../simplewear/ui/simplewear/TimedActionSetupUi.kt | 4 +++- .../simplewear/ui/simplewear/TimedActionUi.kt | 7 +++++-- .../simplewear/ui/simplewear/ValueActionScreen.kt | 6 +++++- 11 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 shared_resources/src/main/java/com/thewizrd/shared_resources/utils/BundleUtils.kt diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/BundleUtils.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/BundleUtils.kt new file mode 100644 index 00000000..a541643a --- /dev/null +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/utils/BundleUtils.kt @@ -0,0 +1,9 @@ +package com.thewizrd.shared_resources.utils + +import android.os.Bundle +import androidx.core.os.BundleCompat +import java.io.Serializable + +fun Bundle.getSerializableCompat(key: String?, clazz: Class): T? where T : Serializable { + return BundleCompat.getSerializable(this, key, clazz) +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt index d9a88a6d..706443b6 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt @@ -51,6 +51,7 @@ import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel @@ -157,7 +158,10 @@ fun AppLauncherScreen( WearableHelper.LaunchAppPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) when (status) { ActionStatus.SUCCESS -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index b07af8f4..28134d08 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -93,6 +93,7 @@ import com.thewizrd.shared_resources.helpers.InCallUIHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay @@ -211,7 +212,10 @@ fun CallManagerUi( InCallUIHelper.ConnectPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (status == ActionStatus.PERMISSION_DENIED) { confirmationViewModel.showOpenOnPhoneForFailure( @@ -226,7 +230,10 @@ fun CallManagerUi( WearableHelper.AudioVolumePath, WearableHelper.ValueStatusSetPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) when (status) { ActionStatus.UNKNOWN, ActionStatus.FAILURE -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt index 07c99094..b27ce369 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt @@ -67,6 +67,7 @@ import com.thewizrd.shared_resources.actions.GestureActionState import com.thewizrd.shared_resources.helpers.GestureUIHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay @@ -230,7 +231,10 @@ fun GesturesUi( GestureUIHelper.GestureStatusPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (status == ActionStatus.PERMISSION_DENIED) { confirmationViewModel.showOpenOnPhoneForFailure( diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt index 9778846c..ad53f538 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayer.kt @@ -1,6 +1,5 @@ package com.thewizrd.simplewear.ui.simplewear -import android.os.Build import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -17,6 +16,7 @@ import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.utils.AnalyticsLogger import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.controls.AppItemViewModel import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.WearAppTheme @@ -99,14 +99,10 @@ fun MediaPlayer( val actionType = backstackEntry.arguments?.getInt("actionId")?.let { Actions.valueOf(it) } - val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - backstackEntry.arguments?.getSerializable( - "streamType", - AudioStreamType::class.java - ) - } else { - backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType - } + val streamType = backstackEntry.arguments?.getSerializableCompat( + "streamType", + AudioStreamType::class.java + ) ValueActionScreen( actionType = actionType ?: Actions.VOLUME, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index e1cd5571..6c1667dd 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -62,6 +62,7 @@ import com.thewizrd.shared_resources.actions.ActionStatus import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel @@ -171,7 +172,10 @@ fun MediaPlayerListUi( MediaHelper.MusicPlayersPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (status == ActionStatus.PERMISSION_DENIED) { confirmationViewModel.showOpenOnPhoneForFailure( @@ -186,7 +190,10 @@ fun MediaPlayerListUi( MediaHelper.MediaPlayerAutoLaunchPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (status == ActionStatus.SUCCESS) { navController.navigate( diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index ac8e0397..51c6132e 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -109,6 +109,7 @@ import com.thewizrd.shared_resources.helpers.MediaHelper import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.media.PlaybackState import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.AppItemViewModel @@ -314,7 +315,10 @@ fun MediaPlayerUi( MediaHelper.MediaPlayerConnectPath, MediaHelper.MediaPlayerAutoLaunchPath -> { val actionStatus = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (actionStatus == ActionStatus.PERMISSION_DENIED) { confirmationViewModel.showOpenOnPhoneForFailure( @@ -329,7 +333,10 @@ fun MediaPlayerUi( MediaHelper.MediaPlayPath -> { val actionStatus = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) if (actionStatus == ActionStatus.TIMEOUT) { confirmationViewModel.showFailure(message = context.getString(R.string.error_playback_failed)) diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt index 701c0477..9c108a4a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/SimpleWearApp.kt @@ -1,6 +1,5 @@ package com.thewizrd.simplewear.ui.simplewear -import android.os.Build import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -20,6 +19,7 @@ import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.actions.TimedAction import com.thewizrd.shared_resources.utils.AnalyticsLogger import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.media.MediaPlayerActivity import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.WearAppTheme @@ -68,14 +68,10 @@ fun SimpleWearApp( val actionType = backstackEntry.arguments?.getInt("actionId")?.let { Actions.valueOf(it) } - val streamType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - backstackEntry.arguments?.getSerializable( - "streamType", - AudioStreamType::class.java - ) - } else { - backstackEntry.arguments?.getSerializable("streamType") as AudioStreamType - } + val streamType = backstackEntry.arguments?.getSerializableCompat( + "streamType", + AudioStreamType::class.java + ) ValueActionScreen( actionType = actionType ?: Actions.VOLUME, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt index 1cf084ae..4f9585e6 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt @@ -57,6 +57,7 @@ import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen @@ -127,7 +128,8 @@ fun TimedActionSetupUi( timedActionUiViewModel.eventFlow.collect { event -> when (event.eventType) { WearableHelper.TimedActionAddPath -> { - val status = event.data.getSerializable(EXTRA_STATUS) as ActionStatus + val status = + event.data.getSerializableCompat(EXTRA_STATUS, ActionStatus::class.java) when (status) { ActionStatus.SUCCESS -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt index 3f85490b..42bf5bda 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt @@ -72,6 +72,7 @@ import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.LoadingContent @@ -153,7 +154,8 @@ fun TimedActionUi( when (event.eventType) { WearableHelper.TimedActionAddPath, WearableHelper.TimedActionDeletePath -> { - val status = event.data.getSerializable(EXTRA_STATUS) as ActionStatus + val status = + event.data.getSerializableCompat(EXTRA_STATUS, ActionStatus::class.java) when (status) { ActionStatus.SUCCESS -> { @@ -436,7 +438,8 @@ fun TimedActionDetailUi( when (event.eventType) { WearableHelper.TimedActionUpdatePath, WearableHelper.TimedActionDeletePath -> { - val status = event.data.getSerializable(EXTRA_STATUS) as ActionStatus + val status = + event.data.getSerializableCompat(EXTRA_STATUS, ActionStatus::class.java) when (status) { ActionStatus.SUCCESS -> { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index 677b83bf..1bf12b3a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -36,6 +36,7 @@ import com.thewizrd.shared_resources.controls.ActionButtonViewModel import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.helpers.WearableHelper import com.thewizrd.shared_resources.utils.JSONParser +import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay @@ -178,7 +179,10 @@ fun ValueActionScreen( WearableHelper.AudioVolumePath, WearableHelper.ValueStatusSetPath -> { val status = - event.data.getSerializable(WearableListenerViewModel.EXTRA_STATUS) as ActionStatus + event.data.getSerializableCompat( + WearableListenerViewModel.EXTRA_STATUS, + ActionStatus::class.java + ) when (status) { ActionStatus.UNKNOWN, ActionStatus.FAILURE -> { From 26b19320eb2b5616d38e107c641e4408a343fa6b Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Fri, 24 Oct 2025 21:27:49 -0400 Subject: [PATCH 11/40] SimpleWear: update all icons * Cleanup unused resources --- .../media/MediaControllerService.kt | 4 +- .../src/main/res/drawable/ic_access_time.xml | 12 +- .../drawable/ic_baseline_music_note_24.xml | 10 -- .../ic_baseline_play_circle_filled_24.xml | 10 -- .../src/main/res/drawable/ic_select_all.xml | 8 +- .../res/drawable/ic_settings_phone_24dp.xml | 11 +- .../controls/ActionButtonViewModel.kt | 4 +- .../main/res/drawable/ic_add_white_24dp.xml | 10 -- .../main/res/drawable/ic_alarm_white_24dp.xml | 13 +- .../main/res/drawable/ic_apps_white_24dp.xml | 16 +- .../res/drawable/ic_baseline_android_24dp.xml | 10 -- .../drawable/ic_baseline_arrow_back_24.xml | 11 -- .../res/drawable/ic_baseline_call_24dp.xml | 10 -- .../main/res/drawable/ic_baseline_edit_24.xml | 10 -- .../drawable/ic_baseline_filter_list_24.xml | 10 -- .../drawable/ic_baseline_gps_fixed_24dp.xml | 13 +- .../res/drawable/ic_baseline_pause_24.xml | 11 +- .../res/drawable/ic_baseline_refresh_24.xml | 10 -- .../drawable/ic_baseline_restart_alt_24.xml | 13 -- .../drawable/ic_baseline_ring_volume_24dp.xml | 11 +- .../res/drawable/ic_baseline_skip_next_24.xml | 11 +- .../drawable/ic_baseline_skip_previous_24.xml | 11 +- .../drawable/ic_baseline_speaker_phone_24.xml | 11 +- .../drawable/ic_baseline_volume_down_24.xml | 12 +- .../ic_battery_charging_white_24dp.xml | 9 + .../main/res/drawable/ic_battery_saver.xml | 12 -- .../drawable/ic_battery_std_white_24dp.xml | 13 +- .../ic_bluetooth_disabled_white_24dp.xml | 16 +- .../res/drawable/ic_bluetooth_white_24dp.xml | 16 +- .../main/res/drawable/ic_brightness_auto.xml | 11 +- .../res/drawable/ic_brightness_medium.xml | 11 +- .../main/res/drawable/ic_call_end_24dp.xml | 10 -- .../res/drawable/ic_charging_station_24dp.xml | 9 +- .../main/res/drawable/ic_check_white_24dp.xml | 16 +- .../main/res/drawable/ic_clear_all_24dp.xml | 10 -- .../main/res/drawable/ic_close_white_24dp.xml | 16 +- .../main/res/drawable/ic_delete_outline.xml | 6 +- .../src/main/res/drawable/ic_dialpad_24dp.xml | 10 -- .../ic_do_not_disturb_off_white_24dp.xml | 13 +- .../ic_do_not_disturb_silence_white_24dp.xml | 9 + .../main/res/drawable/ic_error_white_24dp.xml | 13 +- .../src/main/res/drawable/ic_icon.xml | 13 +- .../ic_lightbulb_outline_white_24dp.xml | 13 +- .../drawable/ic_location_off_white_24dp.xml | 13 +- .../drawable/ic_location_on_white_24dp.xml | 13 +- .../drawable/ic_lock_outline_white_24dp.xml | 10 -- .../main/res/drawable/ic_lock_white_24dp.xml | 9 + .../src/main/res/drawable/ic_mic_off_24dp.xml | 10 -- .../src/main/res/drawable/ic_mode_edit.xml | 9 + .../res/drawable/ic_music_note_white_24dp.xml | 16 +- .../drawable/ic_network_cell_white_24dp.xml | 20 +-- .../drawable/ic_network_wifi_white_24dp.xml | 20 +-- .../ic_notifications_active_white_24dp.xml | 13 +- .../ic_notifications_off_white_24dp.xml | 10 -- .../drawable/ic_outline_location_on_24dp.xml | 17 +- .../main/res/drawable/ic_outline_pause_24.xml | 10 -- .../res/drawable/ic_outline_play_arrow_24.xml | 10 -- .../res/drawable/ic_outline_view_apps.xml | 12 -- .../src/main/res/drawable/ic_phone_24dp.xml | 11 +- .../ic_phonelink_erase_white_24dp.xml | 16 +- .../res/drawable/ic_play_arrow_white_24dp.xml | 16 +- .../ic_play_circle_filled_white_24dp.xml | 15 +- .../res/drawable/ic_remove_white_24dp.xml | 10 -- .../ic_signal_cellular_off_white_24dp.xml | 16 +- .../ic_signal_wifi_off_white_24dp.xml | 16 +- .../src/main/res/drawable/ic_sleep_timer.xml | 9 +- .../res/drawable/ic_smartphone_white_24dp.xml | 14 +- .../src/main/res/drawable/ic_sync_24dp.xml | 10 -- .../src/main/res/drawable/ic_timelapse.xml | 6 +- .../src/main/res/drawable/ic_touch_app.xml | 11 +- .../res/drawable/ic_vibration_white_24dp.xml | 13 +- .../main/res/drawable/ic_view_apps_filled.xml | 9 + .../res/drawable/ic_view_list_white_24dp.xml | 10 -- .../res/drawable/ic_volume_off_white_24dp.xml | 13 +- .../res/drawable/ic_volume_up_white_24dp.xml | 13 +- .../main/res/drawable/ic_wifi_tethering.xml | 14 +- .../src/main/res/drawable/icon_v3.xml | 15 ++ .../ui/simplewear/AppLauncherScreen.kt | 4 +- .../simplewear/ui/simplewear/CallManagerUi.kt | 8 +- .../simplewear/ui/simplewear/Dashboard.kt | 4 +- .../ui/simplewear/DashboardConfigUi.kt | 9 +- .../ui/simplewear/DashboardScreen.kt | 20 ++- .../ui/simplewear/DashboardTileConfigUi.kt | 9 +- .../simplewear/ui/simplewear/GesturesUi.kt | 29 ++-- .../ui/simplewear/MediaPlayerListUi.kt | 10 +- .../simplewear/ui/simplewear/MediaPlayerUi.kt | 8 +- .../simplewear/ui/simplewear/PhoneSyncUi.kt | 49 ++++-- .../simplewear/ui/simplewear/TimedActionUi.kt | 9 +- .../ui/simplewear/ValueActionScreen.kt | 9 +- .../wearable/tiles/DashboardTileRenderer.kt | 4 +- .../res/color/button_background_checkable.xml | 5 - .../color/wear_chip_primary_text_color.xml | 5 - .../color/wear_chip_seconary_text_color.xml | 5 - .../main/res/drawable-hdpi/ws_full_sad.png | Bin 1903 -> 0 bytes .../main/res/drawable-mdpi/ws_full_sad.png | Bin 1420 -> 0 bytes .../main/res/drawable-xhdpi/ws_full_sad.png | Bin 1677 -> 0 bytes .../main/res/drawable-xxhdpi/ws_full_sad.png | Bin 4590 -> 0 bytes .../main/res/drawable-xxxhdpi/ws_full_sad.png | Bin 6183 -> 0 bytes .../res/drawable/button_background_accent.xml | 16 -- .../button_background_accent_onsurface.xml | 16 -- .../button_background_gradient_end.xml | 9 - .../button_background_gradient_end_rtl.xml | 10 -- .../button_background_gradient_start.xml | 9 - .../button_background_gradient_start_rtl.xml | 10 -- .../drawable/button_background_onsurface.xml | 6 - .../res/drawable/ic_wear_checkbox_off.xml | 9 - .../main/res/drawable/ic_wear_checkbox_on.xml | 9 - .../main/res/drawable/ic_wear_radio_off.xml | 21 --- .../main/res/drawable/ic_wear_radio_on.xml | 18 -- .../main/res/drawable/ic_wear_switch_off.xml | 15 -- .../main/res/drawable/ic_wear_switch_on.xml | 15 -- .../main/res/drawable/playpause_button.xml | 6 - .../res/drawable/playpause_button_ambient.xml | 6 - wear/src/main/res/drawable/ring_progress.xml | 27 --- .../main/res/drawable/wear_checkbox_icon.xml | 5 - .../src/main/res/drawable/wear_radio_icon.xml | 5 - .../main/res/drawable/wear_switch_icon.xml | 5 - .../res/layout-round/accept_deny_dialog.xml | 157 ----------------- .../main/res/layout/accept_deny_dialog.xml | 158 ------------------ wear/src/main/res/layout/app_item.xml | 27 --- wear/src/main/res/layout/dialog_addaction.xml | 36 ---- .../res/layout/layout_dash_add_button.xml | 23 --- .../main/res/layout/layout_dash_button.xml | 20 --- .../res/layout/layout_dashboard_config.xml | 78 --------- .../layout/layout_tile_dashboard_config.xml | 78 --------- .../main/res/layout/tile_layout_dashboard.xml | 2 +- .../res/layout/wear_chip_button_layout.xml | 102 ----------- .../layout/ws_customoverlay_confirmation.xml | 39 ----- .../main/res/values/actionbutton_styles.xml | 17 -- wear/src/main/res/values/attrs.xml | 28 ---- wear/src/main/res/values/styles.xml | 3 - wear/src/main/res/values/wear_styles.xml | 14 -- 132 files changed, 475 insertions(+), 1618 deletions(-) delete mode 100644 mobile/src/main/res/drawable/ic_baseline_music_note_24.xml delete mode 100644 mobile/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_add_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_android_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_arrow_back_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_call_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_edit_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_filter_list_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_refresh_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_baseline_restart_alt_24.xml create mode 100644 shared_resources/src/main/res/drawable/ic_battery_charging_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_battery_saver.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_call_end_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_clear_all_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_dialpad_24dp.xml create mode 100644 shared_resources/src/main/res/drawable/ic_do_not_disturb_silence_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_lock_outline_white_24dp.xml create mode 100644 shared_resources/src/main/res/drawable/ic_lock_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_mic_off_24dp.xml create mode 100644 shared_resources/src/main/res/drawable/ic_mode_edit.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_notifications_off_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_outline_pause_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_outline_play_arrow_24.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_outline_view_apps.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_remove_white_24dp.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_sync_24dp.xml create mode 100644 shared_resources/src/main/res/drawable/ic_view_apps_filled.xml delete mode 100644 shared_resources/src/main/res/drawable/ic_view_list_white_24dp.xml create mode 100644 shared_resources/src/main/res/drawable/icon_v3.xml delete mode 100644 wear/src/main/res/color/button_background_checkable.xml delete mode 100644 wear/src/main/res/color/wear_chip_primary_text_color.xml delete mode 100644 wear/src/main/res/color/wear_chip_seconary_text_color.xml delete mode 100644 wear/src/main/res/drawable-hdpi/ws_full_sad.png delete mode 100644 wear/src/main/res/drawable-mdpi/ws_full_sad.png delete mode 100644 wear/src/main/res/drawable-xhdpi/ws_full_sad.png delete mode 100644 wear/src/main/res/drawable-xxhdpi/ws_full_sad.png delete mode 100644 wear/src/main/res/drawable-xxxhdpi/ws_full_sad.png delete mode 100644 wear/src/main/res/drawable/button_background_accent.xml delete mode 100644 wear/src/main/res/drawable/button_background_accent_onsurface.xml delete mode 100644 wear/src/main/res/drawable/button_background_gradient_end.xml delete mode 100644 wear/src/main/res/drawable/button_background_gradient_end_rtl.xml delete mode 100644 wear/src/main/res/drawable/button_background_gradient_start.xml delete mode 100644 wear/src/main/res/drawable/button_background_gradient_start_rtl.xml delete mode 100644 wear/src/main/res/drawable/button_background_onsurface.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_checkbox_off.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_checkbox_on.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_radio_off.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_radio_on.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_switch_off.xml delete mode 100644 wear/src/main/res/drawable/ic_wear_switch_on.xml delete mode 100644 wear/src/main/res/drawable/playpause_button.xml delete mode 100644 wear/src/main/res/drawable/playpause_button_ambient.xml delete mode 100644 wear/src/main/res/drawable/ring_progress.xml delete mode 100644 wear/src/main/res/drawable/wear_checkbox_icon.xml delete mode 100644 wear/src/main/res/drawable/wear_radio_icon.xml delete mode 100644 wear/src/main/res/drawable/wear_switch_icon.xml delete mode 100644 wear/src/main/res/layout-round/accept_deny_dialog.xml delete mode 100644 wear/src/main/res/layout/accept_deny_dialog.xml delete mode 100644 wear/src/main/res/layout/app_item.xml delete mode 100644 wear/src/main/res/layout/dialog_addaction.xml delete mode 100644 wear/src/main/res/layout/layout_dash_add_button.xml delete mode 100644 wear/src/main/res/layout/layout_dash_button.xml delete mode 100644 wear/src/main/res/layout/layout_dashboard_config.xml delete mode 100644 wear/src/main/res/layout/layout_tile_dashboard_config.xml delete mode 100644 wear/src/main/res/layout/wear_chip_button_layout.xml delete mode 100644 wear/src/main/res/layout/ws_customoverlay_confirmation.xml delete mode 100644 wear/src/main/res/values/actionbutton_styles.xml delete mode 100644 wear/src/main/res/values/attrs.xml delete mode 100644 wear/src/main/res/values/wear_styles.xml diff --git a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt index e20cdb96..edd5e4ae 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt @@ -188,7 +188,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene private fun createForegroundNotification(context: Context): Notification { val notif = NotificationCompat.Builder(context, NOT_CHANNEL_ID).apply { - setSmallIcon(R.drawable.ic_baseline_music_note_24) + setSmallIcon(R.drawable.ic_music_note_white_24dp) setContentTitle(context.getString(R.string.not_title_mediacontroller_running)) setOnlyAlertOnce(true) setSilent(true) @@ -1071,7 +1071,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene runCatching { val iconDrawable = ContextCompat.getDrawable( applicationContext, - R.drawable.ic_baseline_play_circle_filled_24 + R.drawable.ic_play_circle_filled_white_24dp ) actions.add( ActionItem( diff --git a/mobile/src/main/res/drawable/ic_access_time.xml b/mobile/src/main/res/drawable/ic_access_time.xml index 5ebbe0f5..48584475 100644 --- a/mobile/src/main/res/drawable/ic_access_time.xml +++ b/mobile/src/main/res/drawable/ic_access_time.xml @@ -1,16 +1,12 @@ + android:viewportWidth="960" + android:viewportHeight="960"> - - + android:pathData="M520,464L520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320L440,479Q440,487 443,494.5Q446,502 452,508L584,640Q595,651 612,651Q629,651 640,640Q651,629 651,612Q651,595 640,584L520,464ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM480,800Q613,800 706.5,706.5Q800,613 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,613 253.5,706.5Q347,800 480,800Z" /> diff --git a/mobile/src/main/res/drawable/ic_baseline_music_note_24.xml b/mobile/src/main/res/drawable/ic_baseline_music_note_24.xml deleted file mode 100644 index db31fb77..00000000 --- a/mobile/src/main/res/drawable/ic_baseline_music_note_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/mobile/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml b/mobile/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml deleted file mode 100644 index f0853519..00000000 --- a/mobile/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/mobile/src/main/res/drawable/ic_select_all.xml b/mobile/src/main/res/drawable/ic_select_all.xml index bdcfaf49..4c8c8447 100644 --- a/mobile/src/main/res/drawable/ic_select_all.xml +++ b/mobile/src/main/res/drawable/ic_select_all.xml @@ -1,12 +1,12 @@ + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M160,200Q143,200 131.5,188.5Q120,177 120,160Q120,143 131.5,131.5Q143,120 160,120Q177,120 188.5,131.5Q200,143 200,160Q200,177 188.5,188.5Q177,200 160,200ZM320,200Q303,200 291.5,188.5Q280,177 280,160Q280,143 291.5,131.5Q303,120 320,120Q337,120 348.5,131.5Q360,143 360,160Q360,177 348.5,188.5Q337,200 320,200ZM480,200Q463,200 451.5,188.5Q440,177 440,160Q440,143 451.5,131.5Q463,120 480,120Q497,120 508.5,131.5Q520,143 520,160Q520,177 508.5,188.5Q497,200 480,200ZM640,200Q623,200 611.5,188.5Q600,177 600,160Q600,143 611.5,131.5Q623,120 640,120Q657,120 668.5,131.5Q680,143 680,160Q680,177 668.5,188.5Q657,200 640,200ZM800,200Q783,200 771.5,188.5Q760,177 760,160Q760,143 771.5,131.5Q783,120 800,120Q817,120 828.5,131.5Q840,143 840,160Q840,177 828.5,188.5Q817,200 800,200ZM160,360Q143,360 131.5,348.5Q120,337 120,320Q120,303 131.5,291.5Q143,280 160,280Q177,280 188.5,291.5Q200,303 200,320Q200,337 188.5,348.5Q177,360 160,360ZM800,360Q783,360 771.5,348.5Q760,337 760,320Q760,303 771.5,291.5Q783,280 800,280Q817,280 828.5,291.5Q840,303 840,320Q840,337 828.5,348.5Q817,360 800,360ZM160,520Q143,520 131.5,508.5Q120,497 120,480Q120,463 131.5,451.5Q143,440 160,440Q177,440 188.5,451.5Q200,463 200,480Q200,497 188.5,508.5Q177,520 160,520ZM800,520Q783,520 771.5,508.5Q760,497 760,480Q760,463 771.5,451.5Q783,440 800,440Q817,440 828.5,451.5Q840,463 840,480Q840,497 828.5,508.5Q817,520 800,520ZM160,680Q143,680 131.5,668.5Q120,657 120,640Q120,623 131.5,611.5Q143,600 160,600Q177,600 188.5,611.5Q200,623 200,640Q200,657 188.5,668.5Q177,680 160,680ZM800,680Q783,680 771.5,668.5Q760,657 760,640Q760,623 771.5,611.5Q783,600 800,600Q817,600 828.5,611.5Q840,623 840,640Q840,657 828.5,668.5Q817,680 800,680ZM160,840Q143,840 131.5,828.5Q120,817 120,800Q120,783 131.5,771.5Q143,760 160,760Q177,760 188.5,771.5Q200,783 200,800Q200,817 188.5,828.5Q177,840 160,840ZM320,840Q303,840 291.5,828.5Q280,817 280,800Q280,783 291.5,771.5Q303,760 320,760Q337,760 348.5,771.5Q360,783 360,800Q360,817 348.5,828.5Q337,840 320,840ZM480,840Q463,840 451.5,828.5Q440,817 440,800Q440,783 451.5,771.5Q463,760 480,760Q497,760 508.5,771.5Q520,783 520,800Q520,817 508.5,828.5Q497,840 480,840ZM640,840Q623,840 611.5,828.5Q600,817 600,800Q600,783 611.5,771.5Q623,760 640,760Q657,760 668.5,771.5Q680,783 680,800Q680,817 668.5,828.5Q657,840 640,840ZM800,840Q783,840 771.5,828.5Q760,817 760,800Q760,783 771.5,771.5Q783,760 800,760Q817,760 828.5,771.5Q840,783 840,800Q840,817 828.5,828.5Q817,840 800,840ZM360,680Q327,680 303.5,656.5Q280,633 280,600L280,360Q280,327 303.5,303.5Q327,280 360,280L600,280Q633,280 656.5,303.5Q680,327 680,360L680,600Q680,633 656.5,656.5Q633,680 600,680L360,680ZM360,600L600,600Q600,600 600,600Q600,600 600,600L600,360Q600,360 600,360Q600,360 600,360L360,360Q360,360 360,360Q360,360 360,360L360,600Q360,600 360,600Q360,600 360,600Z" /> diff --git a/mobile/src/main/res/drawable/ic_settings_phone_24dp.xml b/mobile/src/main/res/drawable/ic_settings_phone_24dp.xml index cabe7a64..d16cb309 100644 --- a/mobile/src/main/res/drawable/ic_settings_phone_24dp.xml +++ b/mobile/src/main/res/drawable/ic_settings_phone_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,440Q463,440 451.5,428.5Q440,417 440,400Q440,383 451.5,371.5Q463,360 480,360Q497,360 508.5,371.5Q520,383 520,400Q520,417 508.5,428.5Q497,440 480,440ZM640,440Q623,440 611.5,428.5Q600,417 600,400Q600,383 611.5,371.5Q623,360 640,360Q657,360 668.5,371.5Q680,383 680,400Q680,417 668.5,428.5Q657,440 640,440ZM800,440Q783,440 771.5,428.5Q760,417 760,400Q760,383 771.5,371.5Q783,360 800,360Q817,360 828.5,371.5Q840,383 840,400Q840,417 828.5,428.5Q817,440 800,440ZM798,840Q673,840 551,785.5Q429,731 329,631Q229,531 174.5,409Q120,287 120,162Q120,144 132,132Q144,120 162,120L324,120Q338,120 349,129.5Q360,139 362,152L388,292Q390,308 387,319Q384,330 376,338L279,436Q299,473 326.5,507.5Q354,542 387,574Q418,605 452,631.5Q486,658 524,680L618,586Q627,577 641.5,572.5Q656,568 670,570L808,598Q822,602 831,612.5Q840,623 840,636L840,798Q840,816 828,828Q816,840 798,840ZM242,360L308,294Q308,294 308,294Q308,294 308,294L290,200Q290,200 290,200Q290,200 290,200L202,200Q202,200 202,200Q202,200 202,200Q207,241 216,281Q225,321 242,360ZM600,716.2Q639,733 679.17,743.87Q719.34,754.74 760,758Q760,758 760,758Q760,758 760,758L760,670Q760,670 760,670Q760,670 760,670L666,650Q666,650 666,650Q666,650 666,650L600,716.2ZM242,360Q225,321 216,281Q207,241 202,200Q202,200 202,200Q202,200 202,200L290,200Q290,200 290,200Q290,200 290,200L308,294Q308,294 308,294Q308,294 308,294L242,360ZM600,716L666,650Q666,650 666,650Q666,650 666,650L760,670Q760,670 760,670Q760,670 760,670L760,758Q760,758 760,758Q760,758 760,758Q719,755 679,744Q639,733 600,716Z" /> diff --git a/shared_resources/src/main/java/com/thewizrd/shared_resources/controls/ActionButtonViewModel.kt b/shared_resources/src/main/java/com/thewizrd/shared_resources/controls/ActionButtonViewModel.kt index 01215f33..fc5a4a0a 100644 --- a/shared_resources/src/main/java/com/thewizrd/shared_resources/controls/ActionButtonViewModel.kt +++ b/shared_resources/src/main/java/com/thewizrd/shared_resources/controls/ActionButtonViewModel.kt @@ -173,7 +173,7 @@ class ActionButtonViewModel(val action: Action) { } Actions.LOCKSCREEN -> { - drawableResId = R.drawable.ic_lock_outline_white_24dp + drawableResId = R.drawable.ic_lock_white_24dp actionLabelResId = R.string.action_lockscreen stateLabelResId = 0 } @@ -216,7 +216,7 @@ class ActionButtonViewModel(val action: Action) { DNDChoice.SILENCE -> { drawableResId = - R.drawable.ic_notifications_off_white_24dp + R.drawable.ic_do_not_disturb_silence_white_24dp stateLabelResId = R.string.dndstate_silence } } diff --git a/shared_resources/src/main/res/drawable/ic_add_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_add_white_24dp.xml deleted file mode 100644 index d270d5e8..00000000 --- a/shared_resources/src/main/res/drawable/ic_add_white_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_alarm_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_alarm_white_24dp.xml index b305c1d5..f296d2a0 100644 --- a/shared_resources/src/main/res/drawable/ic_alarm_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_alarm_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M520,504v-144q0,-17 -11.5,-28.5T480,320q-17,0 -28.5,11.5T440,360v159q0,8 3,15.5t9,13.5l112,112q11,11 28,11t28,-11q11,-11 11,-28t-11,-28L520,504ZM480,880q-75,0 -140.5,-28.5t-114,-77q-48.5,-48.5 -77,-114T120,520q0,-75 28.5,-140.5t77,-114q48.5,-48.5 114,-77T480,160q75,0 140.5,28.5t114,77q48.5,48.5 77,114T840,520q0,75 -28.5,140.5t-77,114q-48.5,48.5 -114,77T480,880ZM82,292q-11,-11 -11,-28t11,-28l114,-114q11,-11 28,-11t28,11q11,11 11,28t-11,28L138,292q-11,11 -28,11t-28,-11ZM878,292q-11,11 -28,11t-28,-11L708,178q-11,-11 -11,-28t11,-28q11,-11 28,-11t28,11l114,114q11,11 11,28t-11,28Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_apps_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_apps_white_24dp.xml index 2875b6d1..fb8c1c31 100644 --- a/shared_resources/src/main/res/drawable/ic_apps_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_apps_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M240,800Q207,800 183.5,776.5Q160,753 160,720Q160,687 183.5,663.5Q207,640 240,640Q273,640 296.5,663.5Q320,687 320,720Q320,753 296.5,776.5Q273,800 240,800ZM480,800Q447,800 423.5,776.5Q400,753 400,720Q400,687 423.5,663.5Q447,640 480,640Q513,640 536.5,663.5Q560,687 560,720Q560,753 536.5,776.5Q513,800 480,800ZM720,800Q687,800 663.5,776.5Q640,753 640,720Q640,687 663.5,663.5Q687,640 720,640Q753,640 776.5,663.5Q800,687 800,720Q800,753 776.5,776.5Q753,800 720,800ZM240,560Q207,560 183.5,536.5Q160,513 160,480Q160,447 183.5,423.5Q207,400 240,400Q273,400 296.5,423.5Q320,447 320,480Q320,513 296.5,536.5Q273,560 240,560ZM480,560Q447,560 423.5,536.5Q400,513 400,480Q400,447 423.5,423.5Q447,400 480,400Q513,400 536.5,423.5Q560,447 560,480Q560,513 536.5,536.5Q513,560 480,560ZM720,560Q687,560 663.5,536.5Q640,513 640,480Q640,447 663.5,423.5Q687,400 720,400Q753,400 776.5,423.5Q800,447 800,480Q800,513 776.5,536.5Q753,560 720,560ZM240,320Q207,320 183.5,296.5Q160,273 160,240Q160,207 183.5,183.5Q207,160 240,160Q273,160 296.5,183.5Q320,207 320,240Q320,273 296.5,296.5Q273,320 240,320ZM480,320Q447,320 423.5,296.5Q400,273 400,240Q400,207 423.5,183.5Q447,160 480,160Q513,160 536.5,183.5Q560,207 560,240Q560,273 536.5,296.5Q513,320 480,320ZM720,320Q687,320 663.5,296.5Q640,273 640,240Q640,207 663.5,183.5Q687,160 720,160Q753,160 776.5,183.5Q800,207 800,240Q800,273 776.5,296.5Q753,320 720,320Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_baseline_android_24dp.xml b/shared_resources/src/main/res/drawable/ic_baseline_android_24dp.xml deleted file mode 100644 index ab936171..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_android_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_arrow_back_24.xml deleted file mode 100644 index 8e8ac863..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_arrow_back_24.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_call_24dp.xml b/shared_resources/src/main/res/drawable/ic_baseline_call_24dp.xml deleted file mode 100644 index a8814ba6..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_call_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_edit_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_edit_24.xml deleted file mode 100644 index d4d0d9c7..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_edit_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_filter_list_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_filter_list_24.xml deleted file mode 100644 index e7059d11..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_filter_list_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_gps_fixed_24dp.xml b/shared_resources/src/main/res/drawable/ic_baseline_gps_fixed_24dp.xml index 804ca387..cfc3ca92 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_gps_fixed_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_gps_fixed_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M440,878v-40q-125,-14 -214.5,-103.5T122,520L82,520q-17,0 -28.5,-11.5T42,480q0,-17 11.5,-28.5T82,440h40q14,-125 103.5,-214.5T440,122v-40q0,-17 11.5,-28.5T480,42q17,0 28.5,11.5T520,82v40q125,14 214.5,103.5T838,440h40q17,0 28.5,11.5T918,480q0,17 -11.5,28.5T878,520h-40q-14,125 -103.5,214.5T520,838v40q0,17 -11.5,28.5T480,918q-17,0 -28.5,-11.5T440,878ZM480,760q116,0 198,-82t82,-198q0,-116 -82,-198t-198,-82q-116,0 -198,82t-82,198q0,116 82,198t198,82ZM480,640q-66,0 -113,-47t-47,-113q0,-66 47,-113t113,-47q66,0 113,47t47,113q0,66 -47,113t-113,47Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_pause_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_pause_24.xml index 93913e45..702f3133 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_pause_24.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_pause_24.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M640,760Q607,760 583.5,736.5Q560,713 560,680L560,280Q560,247 583.5,223.5Q607,200 640,200L640,200Q673,200 696.5,223.5Q720,247 720,280L720,680Q720,713 696.5,736.5Q673,760 640,760ZM320,760Q287,760 263.5,736.5Q240,713 240,680L240,280Q240,247 263.5,223.5Q287,200 320,200L320,200Q353,200 376.5,223.5Q400,247 400,280L400,680Q400,713 376.5,736.5Q353,760 320,760Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_refresh_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_refresh_24.xml deleted file mode 100644 index b7fcc3c9..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_refresh_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_restart_alt_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_restart_alt_24.xml deleted file mode 100644 index 91883461..00000000 --- a/shared_resources/src/main/res/drawable/ic_baseline_restart_alt_24.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/shared_resources/src/main/res/drawable/ic_baseline_ring_volume_24dp.xml b/shared_resources/src/main/res/drawable/ic_baseline_ring_volume_24dp.xml index d0cd4f2a..f19b113a 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_ring_volume_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_ring_volume_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,280Q463,280 451.5,268.5Q440,257 440,240L440,120Q440,103 451.5,91.5Q463,80 480,80Q497,80 508.5,91.5Q520,103 520,120L520,240Q520,257 508.5,268.5Q497,280 480,280ZM676,364Q665,352 664.5,336Q664,320 676,308L761,223Q773,211 789.5,211.5Q806,212 818,224Q829,236 829.5,252Q830,268 818,280L733,365Q721,377 704.5,376.5Q688,376 676,364ZM284,364Q272,376 255.5,376.5Q239,377 227,365L142,280Q130,268 130.5,252Q131,236 142,224Q154,212 170.5,211.5Q187,211 199,223L284,308Q296,320 295.5,336Q295,352 284,364ZM136,816L44,726Q32,714 32,698Q32,682 44,670Q132,575 247,527.5Q362,480 480,480Q598,480 712.5,527.5Q827,575 916,670Q928,682 928,698Q928,714 916,726L824,816Q813,827 798.5,828Q784,829 772,820L656,732Q648,726 644,718Q640,710 640,700L640,586Q602,574 562,567Q522,560 480,560Q438,560 398,567Q358,574 320,586L320,700Q320,710 316,718Q312,726 304,732L188,820Q176,829 161.5,828Q147,827 136,816Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_skip_next_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_skip_next_24.xml index 33b9a037..639facb2 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_skip_next_24.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_skip_next_24.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M660,680L660,280Q660,263 671.5,251.5Q683,240 700,240Q717,240 728.5,251.5Q740,263 740,280L740,680Q740,697 728.5,708.5Q717,720 700,720Q683,720 671.5,708.5Q660,697 660,680ZM220,645L220,315Q220,297 232,286Q244,275 260,275Q265,275 271,276Q277,277 282,281L530,447Q539,453 543.5,461.5Q548,470 548,480Q548,490 543.5,498.5Q539,507 530,513L282,679Q277,683 271,684Q265,685 260,685Q244,685 232,674Q220,663 220,645Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_skip_previous_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_skip_previous_24.xml index e72a2cc0..76e23dc1 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_skip_previous_24.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_skip_previous_24.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M220,680L220,280Q220,263 231.5,251.5Q243,240 260,240Q277,240 288.5,251.5Q300,263 300,280L300,680Q300,697 288.5,708.5Q277,720 260,720Q243,720 231.5,708.5Q220,697 220,680ZM678,679L430,513Q421,507 416.5,498.5Q412,490 412,480Q412,470 416.5,461.5Q421,453 430,447L678,281Q683,277 689,276Q695,275 700,275Q716,275 728,286Q740,297 740,315L740,645Q740,663 728,674Q716,685 700,685Q695,685 689,684Q683,683 678,679Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_speaker_phone_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_speaker_phone_24.xml index 19917435..5513e23c 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_speaker_phone_24.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_speaker_phone_24.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,280Q450,280 422,289Q394,298 369,315Q355,325 338,324Q321,323 309,311Q297,299 297,282.5Q297,266 311,256Q348,229 391,214.5Q434,200 480,200Q526,200 569,214.5Q612,229 649,256Q663,266 663,282.5Q663,299 651,311Q639,323 622,324Q605,325 591,315Q566,298 538.5,289Q511,280 480,280ZM480,120Q419,120 361.5,140Q304,160 256,198Q242,209 226,208.5Q210,208 198,196Q186,184 187,167.5Q188,151 201,140Q261,92 332,66Q403,40 480,40Q557,40 628,66Q699,92 759,140Q772,151 773,167.5Q774,184 762,196Q750,208 734,208.5Q718,209 704,198Q656,160 598.5,140Q541,120 480,120ZM400,880Q367,880 343.5,856.5Q320,833 320,800L320,480Q320,447 343.5,423.5Q367,400 400,400L560,400Q593,400 616.5,423.5Q640,447 640,480L640,800Q640,833 616.5,856.5Q593,880 560,880L400,880Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_baseline_volume_down_24.xml b/shared_resources/src/main/res/drawable/ic_baseline_volume_down_24.xml index e76d1b11..2266e273 100644 --- a/shared_resources/src/main/res/drawable/ic_baseline_volume_down_24.xml +++ b/shared_resources/src/main/res/drawable/ic_baseline_volume_down_24.xml @@ -1,10 +1,10 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960" + android:autoMirrored="true"> + android:pathData="M360,600L240,600Q223,600 211.5,588.5Q200,577 200,560L200,400Q200,383 211.5,371.5Q223,360 240,360L360,360L492,228Q511,209 535.5,219.5Q560,230 560,257L560,703Q560,730 535.5,740.5Q511,751 492,732L360,600ZM740,480Q740,522 721,559.5Q702,597 671,621Q661,627 650.5,621.5Q640,616 640,604L640,354Q640,342 650.5,336.5Q661,331 671,337Q702,362 721,400Q740,438 740,480Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_battery_charging_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_battery_charging_white_24dp.xml new file mode 100644 index 00000000..bade8bff --- /dev/null +++ b/shared_resources/src/main/res/drawable/ic_battery_charging_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared_resources/src/main/res/drawable/ic_battery_saver.xml b/shared_resources/src/main/res/drawable/ic_battery_saver.xml deleted file mode 100644 index c4fe5a13..00000000 --- a/shared_resources/src/main/res/drawable/ic_battery_saver.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/shared_resources/src/main/res/drawable/ic_battery_std_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_battery_std_white_24dp.xml index 7f1064a0..c000940c 100644 --- a/shared_resources/src/main/res/drawable/ic_battery_std_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_battery_std_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:fillColor="@android:color/white" + android:pathData="M320,880Q303,880 291.5,868.5Q280,857 280,840L280,200Q280,183 291.5,171.5Q303,160 320,160L400,160L400,120Q400,103 411.5,91.5Q423,80 440,80L520,80Q537,80 548.5,91.5Q560,103 560,120L560,160L640,160Q657,160 668.5,171.5Q680,183 680,200L680,840Q680,857 668.5,868.5Q657,880 640,880L320,880Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_bluetooth_disabled_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_bluetooth_disabled_white_24dp.xml index a1ad8ea5..d5f5f171 100644 --- a/shared_resources/src/main/res/drawable/ic_bluetooth_disabled_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_bluetooth_disabled_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M440,576L284,732Q273,743 256,743Q239,743 228,732Q217,721 217,704Q217,687 228,676L396,508L84,196Q73,185 73,168Q73,151 84,140Q95,129 112,129Q129,129 140,140L820,820Q831,831 831,848Q831,865 820,876Q809,887 792,887Q775,887 764,876L624,736L508,852Q502,858 495,861Q488,864 480,864Q464,864 452,852.5Q440,841 440,823L440,576ZM520,726L566,680L520,634L520,726ZM564,452L508,396L596,308L520,234L520,408L440,328L440,137Q440,119 452,107.5Q464,96 480,96Q488,96 495,99Q502,102 508,108L680,280Q686,286 688.5,293Q691,300 691,308Q691,316 688.5,323Q686,330 680,336L564,452Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_bluetooth_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_bluetooth_white_24dp.xml index 08cf89f8..d5b008de 100644 --- a/shared_resources/src/main/res/drawable/ic_bluetooth_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_bluetooth_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M440,823L440,576L284,732Q273,743 256,743Q239,743 228,732Q217,721 217,704Q217,687 228,676L424,480L228,284Q217,273 217,256Q217,239 228,228Q239,217 256,217Q273,217 284,228L440,384L440,137Q440,119 452,107.5Q464,96 480,96Q488,96 495,99Q502,102 508,108L680,280Q686,286 688.5,293Q691,300 691,308Q691,316 688.5,323Q686,330 680,336L536,480L680,624Q686,630 688.5,637Q691,644 691,652Q691,660 688.5,667Q686,674 680,680L508,852Q502,858 495,861Q488,864 480,864Q464,864 452,852.5Q440,841 440,823ZM520,384L596,308L520,234L520,384ZM520,726L596,652L520,576L520,726Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_brightness_auto.xml b/shared_resources/src/main/res/drawable/ic_brightness_auto.xml index 1d51ac09..4f6f8ee8 100644 --- a/shared_resources/src/main/res/drawable/ic_brightness_auto.xml +++ b/shared_resources/src/main/res/drawable/ic_brightness_auto.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M312,640L376,640L392,594Q400,573 423.5,560.5Q447,548 505,548Q527,548 544.5,560.5Q562,573 570,594L579,621Q582,629 589.5,634.5Q597,640 606,640L606,640Q621,640 629.5,627.5Q638,615 633,601L519,299Q516,290 505.5,285Q495,280 469,280Q460,280 452,285Q444,290 441,299L312,640ZM426,496L478,346L482,346L534,496L426,496ZM346,800L240,800Q207,800 183.5,776.5Q160,753 160,720L160,614L83,536Q72,524 66,509.5Q60,495 60,480Q60,465 66,450.5Q72,436 83,424L160,346L160,240Q160,207 183.5,183.5Q207,160 240,160L346,160L424,83Q436,72 450.5,66Q465,60 480,60Q495,60 509.5,66Q524,72 536,83L614,160L720,160Q753,160 776.5,183.5Q800,207 800,240L800,346L877,424Q888,436 894,450.5Q900,465 900,480Q900,495 894,509.5Q888,524 877,536L800,614L800,720Q800,753 776.5,776.5Q753,800 720,800L614,800L536,877Q524,888 509.5,894Q495,900 480,900Q465,900 450.5,894Q436,888 424,877L346,800Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_brightness_medium.xml b/shared_resources/src/main/res/drawable/ic_brightness_medium.xml index 844fffa1..21043f1b 100644 --- a/shared_resources/src/main/res/drawable/ic_brightness_medium.xml +++ b/shared_resources/src/main/res/drawable/ic_brightness_medium.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M346,800L240,800Q207,800 183.5,776.5Q160,753 160,720L160,614L83,536Q72,524 66,509.5Q60,495 60,480Q60,465 66,450.5Q72,436 83,424L160,346L160,240Q160,207 183.5,183.5Q207,160 240,160L346,160L424,83Q436,72 450.5,66Q465,60 480,60Q495,60 509.5,66Q524,72 536,83L614,160L720,160Q753,160 776.5,183.5Q800,207 800,240L800,346L877,424Q888,436 894,450.5Q900,465 900,480Q900,495 894,509.5Q888,524 877,536L800,614L800,720Q800,753 776.5,776.5Q753,800 720,800L614,800L536,877Q524,888 509.5,894Q495,900 480,900Q465,900 450.5,894Q436,888 424,877L346,800ZM480,680Q563,680 621.5,621.5Q680,563 680,480Q680,397 621.5,338.5Q563,280 480,280L480,680Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_call_end_24dp.xml b/shared_resources/src/main/res/drawable/ic_call_end_24dp.xml deleted file mode 100644 index fe817022..00000000 --- a/shared_resources/src/main/res/drawable/ic_call_end_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_charging_station_24dp.xml b/shared_resources/src/main/res/drawable/ic_charging_station_24dp.xml index f9c5dc9d..fe4fb6f2 100644 --- a/shared_resources/src/main/res/drawable/ic_charging_station_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_charging_station_24dp.xml @@ -1,12 +1,9 @@ - + android:viewportHeight="24"> - + android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,18H7V6h10V18zM12.5,11V9.12c0,-0.53 -0.71,-0.7 -0.95,-0.22l-1.69,3.38C9.7,12.61 9.94,13 10.31,13h1.19v1.88c0,0.53 0.71,0.7 0.95,0.22l1.69,-3.38C14.3,11.39 14.06,11 13.69,11H12.5z" /> diff --git a/shared_resources/src/main/res/drawable/ic_check_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_check_white_24dp.xml index 609f5657..d4f359f6 100644 --- a/shared_resources/src/main/res/drawable/ic_check_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_check_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M382,606L721,267Q733,255 749,255Q765,255 777,267Q789,279 789,295.5Q789,312 777,324L410,692Q398,704 382,704Q366,704 354,692L182,520Q170,508 170.5,491.5Q171,475 183,463Q195,451 211.5,451Q228,451 240,463L382,606Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_clear_all_24dp.xml b/shared_resources/src/main/res/drawable/ic_clear_all_24dp.xml deleted file mode 100644 index 9a48563c..00000000 --- a/shared_resources/src/main/res/drawable/ic_clear_all_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_close_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_close_white_24dp.xml index 6fde7c88..1323d563 100644 --- a/shared_resources/src/main/res/drawable/ic_close_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_close_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M480,536L284,732Q273,743 256,743Q239,743 228,732Q217,721 217,704Q217,687 228,676L424,480L228,284Q217,273 217,256Q217,239 228,228Q239,217 256,217Q273,217 284,228L480,424L676,228Q687,217 704,217Q721,217 732,228Q743,239 743,256Q743,273 732,284L536,480L732,676Q743,687 743,704Q743,721 732,732Q721,743 704,743Q687,743 676,732L480,536Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_delete_outline.xml b/shared_resources/src/main/res/drawable/ic_delete_outline.xml index 11dc7ad1..0eaef9b6 100644 --- a/shared_resources/src/main/res/drawable/ic_delete_outline.xml +++ b/shared_resources/src/main/res/drawable/ic_delete_outline.xml @@ -1,12 +1,12 @@ + android:pathData="M280,840Q247,840 223.5,816.5Q200,793 200,760L200,240L200,240Q183,240 171.5,228.5Q160,217 160,200Q160,183 171.5,171.5Q183,160 200,160L360,160L360,160Q360,143 371.5,131.5Q383,120 400,120L560,120Q577,120 588.5,131.5Q600,143 600,160L600,160L760,160Q777,160 788.5,171.5Q800,183 800,200Q800,217 788.5,228.5Q777,240 760,240L760,240L760,760Q760,793 736.5,816.5Q713,840 680,840L280,840ZM680,240L280,240L280,760Q280,760 280,760Q280,760 280,760L680,760Q680,760 680,760Q680,760 680,760L680,240ZM400,680Q417,680 428.5,668.5Q440,657 440,640L440,360Q440,343 428.5,331.5Q417,320 400,320Q383,320 371.5,331.5Q360,343 360,360L360,640Q360,657 371.5,668.5Q383,680 400,680ZM560,680Q577,680 588.5,668.5Q600,657 600,640L600,360Q600,343 588.5,331.5Q577,320 560,320Q543,320 531.5,331.5Q520,343 520,360L520,640Q520,657 531.5,668.5Q543,680 560,680ZM280,240L280,240L280,760Q280,760 280,760Q280,760 280,760L280,760Q280,760 280,760Q280,760 280,760L280,240Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_dialpad_24dp.xml b/shared_resources/src/main/res/drawable/ic_dialpad_24dp.xml deleted file mode 100644 index b22ee3b3..00000000 --- a/shared_resources/src/main/res/drawable/ic_dialpad_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_do_not_disturb_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_do_not_disturb_off_white_24dp.xml index 97c5a8ee..7d1c8a1d 100644 --- a/shared_resources/src/main/res/drawable/ic_do_not_disturb_off_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_do_not_disturb_off_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-60 17,-115.5T146,260l-63,-63q-12,-12 -12,-28.5T83,140q12,-12 28.5,-12t28.5,12l680,680q12,12 12,28t-12,28q-12,12 -28.5,12T763,876l-63,-62q-49,32 -104.5,49T480,880ZM326,440h-6q-17,0 -28.5,11.5T280,480q0,17 11,28.5t28,11.5h87l-80,-80ZM767,653L634,520h6q17,0 28.5,-11.5T680,480q0,-17 -11,-28.5T641,440h-87L307,193q-18,-18 -14.5,-43t26.5,-36q38,-17 78.5,-25.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,42 -8.5,82.5T846,641q-11,23 -35.5,27T767,653Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_do_not_disturb_silence_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_do_not_disturb_silence_white_24dp.xml new file mode 100644 index 00000000..aa8e36af --- /dev/null +++ b/shared_resources/src/main/res/drawable/ic_do_not_disturb_silence_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared_resources/src/main/res/drawable/ic_error_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_error_white_24dp.xml index 0253ade8..edc7a084 100644 --- a/shared_resources/src/main/res/drawable/ic_error_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_error_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,680q17,0 28.5,-11.5T520,640q0,-17 -11.5,-28.5T480,600q-17,0 -28.5,11.5T440,640q0,17 11.5,28.5T480,680ZM480,520q17,0 28.5,-11.5T520,480v-160q0,-17 -11.5,-28.5T480,280q-17,0 -28.5,11.5T440,320v160q0,17 11.5,28.5T480,520ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_icon.xml b/shared_resources/src/main/res/drawable/ic_icon.xml index 1ae2e5b3..ba93bc13 100644 --- a/shared_resources/src/main/res/drawable/ic_icon.xml +++ b/shared_resources/src/main/res/drawable/ic_icon.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:fillColor="@android:color/white" + android:pathData="M420,880Q394,880 372.5,864.5Q351,849 343,823L320,746Q314,726 301.5,705.5Q289,685 269,663Q235,626 217.5,579Q200,532 200,480Q200,429 217.5,382Q235,335 269,297Q289,274 301.5,254Q314,234 320,214L343,137Q351,111 372.5,95.5Q394,80 420,80L540,80Q566,80 587.5,95.5Q609,111 617,137L640,214Q646,234 658.5,254.5Q671,275 691,297Q725,334 742.5,381Q760,428 760,480Q760,531 742.5,578Q725,625 691,663Q671,686 658.5,706Q646,726 640,746L617,823Q609,849 587.5,864.5Q566,880 540,880L420,880ZM480,680Q563,680 621.5,621.5Q680,563 680,480Q680,397 621.5,338.5Q563,280 480,280Q397,280 338.5,338.5Q280,397 280,480Q280,563 338.5,621.5Q397,680 480,680Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_lightbulb_outline_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_lightbulb_outline_white_24dp.xml index b59d5814..713b33b3 100644 --- a/shared_resources/src/main/res/drawable/ic_lightbulb_outline_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_lightbulb_outline_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M240,200v-40q0,-33 23.5,-56.5T320,80h320q33,0 56.5,23.5T720,160v40L240,200ZM480,620q25,0 42.5,-17.5T540,560q0,-25 -17.5,-42.5T480,500q-25,0 -42.5,17.5T420,560q0,25 17.5,42.5T480,620ZM320,800v-360l-67,-100q-7,-10 -10,-21t-3,-23v-16h480v16q0,12 -3,23t-10,21l-67,100v360q0,33 -23.5,56.5T560,880L400,880q-33,0 -56.5,-23.5T320,800Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_location_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_location_off_white_24dp.xml index d713bc22..f21a961a 100644 --- a/shared_resources/src/main/res/drawable/ic_location_off_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_location_off_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,853q-14,0 -28,-5t-25,-15q-65,-60 -115,-117t-83.5,-110.5q-33.5,-53.5 -51,-103T160,408q0,-32 5,-61t14,-55L55,168q-12,-12 -12,-28.5T55,111q12,-12 28.5,-12t28.5,12l736,736q12,12 12,28.5T848,904q-12,12 -28.5,12T791,904L627,740q-25,26 -50,51.5T533,833q-11,10 -25,15t-28,5ZM480,80q127,0 223.5,89T800,408q0,35 -10,72.5T760,558q-11,22 -35.5,24.5T683,568L551,436q5,-8 7,-17t2,-19q0,-17 -6,-31.5T537,343q-11,-11 -25.5,-17t-31.5,-6q-10,0 -19,2t-17,7L315,200q-18,-18 -15.5,-42.5T323,120q35,-20 75,-30t82,-10Z" + android:fillColor="#fff" /> diff --git a/shared_resources/src/main/res/drawable/ic_location_on_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_location_on_white_24dp.xml index e364cc09..ada6a502 100644 --- a/shared_resources/src/main/res/drawable/ic_location_on_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_location_on_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M480,853q-14,0 -28,-5t-25,-15q-65,-60 -115,-117t-83.5,-110.5q-33.5,-53.5 -51,-103T160,408q0,-150 96.5,-239T480,80q127,0 223.5,89T800,408q0,45 -17.5,94.5t-51,103Q698,659 648,716T533,833q-11,10 -25,15t-28,5ZM480,480q33,0 56.5,-23.5T560,400q0,-33 -23.5,-56.5T480,320q-33,0 -56.5,23.5T400,400q0,33 23.5,56.5T480,480Z" + android:fillColor="#fff" /> diff --git a/shared_resources/src/main/res/drawable/ic_lock_outline_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_lock_outline_white_24dp.xml deleted file mode 100644 index a4c8109a..00000000 --- a/shared_resources/src/main/res/drawable/ic_lock_outline_white_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_lock_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_lock_white_24dp.xml new file mode 100644 index 00000000..1f299613 --- /dev/null +++ b/shared_resources/src/main/res/drawable/ic_lock_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared_resources/src/main/res/drawable/ic_mic_off_24dp.xml b/shared_resources/src/main/res/drawable/ic_mic_off_24dp.xml deleted file mode 100644 index 20366a91..00000000 --- a/shared_resources/src/main/res/drawable/ic_mic_off_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_mode_edit.xml b/shared_resources/src/main/res/drawable/ic_mode_edit.xml new file mode 100644 index 00000000..042d1167 --- /dev/null +++ b/shared_resources/src/main/res/drawable/ic_mode_edit.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml index 6779d3c8..f0512e8a 100644 --- a/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M400,840Q334,840 287,793Q240,746 240,680Q240,614 287,567Q334,520 400,520Q423,520 442.5,525.5Q462,531 480,542L480,160Q480,143 491.5,131.5Q503,120 520,120L680,120Q697,120 708.5,131.5Q720,143 720,160L720,240Q720,257 708.5,268.5Q697,280 680,280L560,280L560,680Q560,746 513,793Q466,840 400,840Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_network_cell_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_network_cell_white_24dp.xml index 71555504..e82c7a57 100644 --- a/shared_resources/src/main/res/drawable/ic_network_cell_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_network_cell_white_24dp.xml @@ -1,14 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + - + android:fillColor="@android:color/white" + android:pathData="M60,740L60,540Q60,515 77.5,497.5Q95,480 120,480Q145,480 162.5,497.5Q180,515 180,540L180,740Q180,765 162.5,782.5Q145,800 120,800Q95,800 77.5,782.5Q60,765 60,740ZM300,740L300,440Q300,415 317.5,397.5Q335,380 360,380Q385,380 402.5,397.5Q420,415 420,440L420,740Q420,765 402.5,782.5Q385,800 360,800Q335,800 317.5,782.5Q300,765 300,740ZM540,740L540,340Q540,315 557.5,297.5Q575,280 600,280Q625,280 642.5,297.5Q660,315 660,340L660,740Q660,765 642.5,782.5Q625,800 600,800Q575,800 557.5,782.5Q540,765 540,740ZM780,740L780,220Q780,195 797.5,177.5Q815,160 840,160Q865,160 882.5,177.5Q900,195 900,220L900,740Q900,765 882.5,782.5Q865,800 840,800Q815,800 797.5,782.5Q780,765 780,740Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_network_wifi_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_network_wifi_white_24dp.xml index 971c5f6b..5953cd45 100644 --- a/shared_resources/src/main/res/drawable/ic_network_wifi_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_network_wifi_white_24dp.xml @@ -1,14 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + - + android:fillColor="@android:color/white" + android:pathData="M480,280Q392,280 308.5,307.5Q225,335 155,389Q135,405 109.5,404.5Q84,404 66,386Q49,369 49,344Q49,319 69,304Q157,234 262.5,197Q368,160 480,160Q593,160 698,197Q803,234 891,304Q911,319 911,344Q911,369 894,386Q876,404 850.5,404.5Q825,405 805,389Q735,335 652,307.5Q569,280 480,280ZM480,520Q439,520 400.5,530.5Q362,541 327,562Q305,576 279.5,575Q254,574 236,556Q219,539 219.5,514.5Q220,490 240,476Q293,439 354,419.5Q415,400 480,400Q545,400 606,419.5Q667,439 720,476Q740,490 740.5,514.5Q741,539 724,556Q706,574 680.5,575Q655,576 633,562Q598,541 559.5,530.5Q521,520 480,520ZM480,800Q447,800 423.5,776.5Q400,753 400,720Q400,687 423.5,663.5Q447,640 480,640Q513,640 536.5,663.5Q560,687 560,720Q560,753 536.5,776.5Q513,800 480,800Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_notifications_active_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_notifications_active_white_24dp.xml index 529ab6df..790ebe2a 100644 --- a/shared_resources/src/main/res/drawable/ic_notifications_active_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_notifications_active_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M200,760q-17,0 -28.5,-11.5T160,720q0,-17 11.5,-28.5T200,680h40v-280q0,-83 50,-147.5T420,168v-28q0,-25 17.5,-42.5T480,80q25,0 42.5,17.5T540,140v28q80,20 130,84.5T720,400v280h40q17,0 28.5,11.5T800,720q0,17 -11.5,28.5T760,760L200,760ZM480,880q-33,0 -56.5,-23.5T400,800h160q0,33 -23.5,56.5T480,880ZM120,400q-17,0 -28.5,-13T82,357q8,-75 42,-139.5T211,105q13,-11 29.5,-10t26.5,15q10,14 8,30t-15,28q-39,37 -64,86t-33,106q-2,17 -14,28.5T120,400ZM840,400q-17,0 -29,-11.5T797,360q-8,-57 -33,-106t-64,-86q-13,-12 -15,-28t8,-30q10,-14 26.5,-15t29.5,10q53,48 87,112.5T878,357q2,17 -9.5,30T840,400Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_notifications_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_notifications_off_white_24dp.xml deleted file mode 100644 index 896ce6cc..00000000 --- a/shared_resources/src/main/res/drawable/ic_notifications_off_white_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_outline_location_on_24dp.xml b/shared_resources/src/main/res/drawable/ic_outline_location_on_24dp.xml index 1550c347..1b7d9a5d 100644 --- a/shared_resources/src/main/res/drawable/ic_outline_location_on_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_outline_location_on_24dp.xml @@ -1,13 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + - + android:pathData="M480,774Q602,662 661,570.5Q720,479 720,408Q720,299 650.5,229.5Q581,160 480,160Q379,160 309.5,229.5Q240,299 240,408Q240,479 299,570.5Q358,662 480,774ZM480,853Q466,853 452,848Q438,843 427,833Q362,773 312,716Q262,659 228.5,605.5Q195,552 177.5,502.5Q160,453 160,408Q160,258 256.5,169Q353,80 480,80Q607,80 703.5,169Q800,258 800,408Q800,453 782.5,502.5Q765,552 731.5,605.5Q698,659 648,716Q598,773 533,833Q522,843 508,848Q494,853 480,853ZM480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400ZM480,480Q513,480 536.5,456.5Q560,433 560,400Q560,367 536.5,343.5Q513,320 480,320Q447,320 423.5,343.5Q400,367 400,400Q400,433 423.5,456.5Q447,480 480,480Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_outline_pause_24.xml b/shared_resources/src/main/res/drawable/ic_outline_pause_24.xml deleted file mode 100644 index 1eb828ec..00000000 --- a/shared_resources/src/main/res/drawable/ic_outline_pause_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_outline_play_arrow_24.xml b/shared_resources/src/main/res/drawable/ic_outline_play_arrow_24.xml deleted file mode 100644 index c1f50ebd..00000000 --- a/shared_resources/src/main/res/drawable/ic_outline_play_arrow_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_outline_view_apps.xml b/shared_resources/src/main/res/drawable/ic_outline_view_apps.xml deleted file mode 100644 index d44bc66e..00000000 --- a/shared_resources/src/main/res/drawable/ic_outline_view_apps.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/shared_resources/src/main/res/drawable/ic_phone_24dp.xml b/shared_resources/src/main/res/drawable/ic_phone_24dp.xml index 0ebb796d..de0eef0e 100644 --- a/shared_resources/src/main/res/drawable/ic_phone_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_phone_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M798,840Q673,840 551,785.5Q429,731 329,631Q229,531 174.5,409Q120,287 120,162Q120,144 132,132Q144,120 162,120L324,120Q338,120 349,129.5Q360,139 362,152L388,292Q390,308 387,319Q384,330 376,338L279,436Q299,473 326.5,507.5Q354,542 387,574Q418,605 452,631.5Q486,658 524,680L618,586Q627,577 641.5,572.5Q656,568 670,570L808,598Q822,602 831,612.5Q840,623 840,636L840,798Q840,816 828,828Q816,840 798,840Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml index 16710bf6..ed14cc81 100644 --- a/shared_resources/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml @@ -1,10 +1,12 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24" + android:viewportHeight="24"> + + android:fillColor="@android:color/white" + android:pathData="M12.5,7.7c-0.28,-0.28 -0.72,-0.28 -1,0L8,11.2 4.5,7.7c-0.28,-0.28 -0.72,-0.28 -1,0s-0.28,0.72 0,1L7,12.2l-3.5,3.5c-0.28,0.28 -0.28,0.72 0,1s0.72,0.28 1,0L8,13.2l3.5,3.5c0.28,0.28 0.72,0.28 1,0s0.28,-0.72 0,-1L9,12.2l3.5,-3.5c0.28,-0.28 0.28,-0.72 0,-1zM19,1H9c-1.1,0 -2,0.9 -2,2v2c0,0.55 0.45,1 1,1s1,-0.45 1,-1V4h10v16H9v-1c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v2c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-2 -2,-2z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_play_arrow_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_play_arrow_white_24dp.xml index 8469b3a2..7e16914e 100644 --- a/shared_resources/src/main/res/drawable/ic_play_arrow_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_play_arrow_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M8,6.82v10.36c0,0.79 0.87,1.27 1.54,0.84l8.14,-5.18c0.62,-0.39 0.62,-1.29 0,-1.69L9.54,5.98C8.87,5.55 8,6.03 8,6.82z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml index 5e9f308d..95daa719 100644 --- a/shared_resources/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml @@ -1,10 +1,9 @@ - - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + diff --git a/shared_resources/src/main/res/drawable/ic_remove_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_remove_white_24dp.xml deleted file mode 100644 index f9d32fba..00000000 --- a/shared_resources/src/main/res/drawable/ic_remove_white_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_signal_cellular_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_signal_cellular_off_white_24dp.xml index e72b637c..7dfb0106 100644 --- a/shared_resources/src/main/res/drawable/ic_signal_cellular_off_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_signal_cellular_off_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M600,800Q575,800 557.5,782.5Q540,765 540,740L540,644L420,560L420,740Q420,765 402.5,782.5Q385,800 360,800Q335,800 317.5,782.5Q300,765 300,740L300,476L70,315Q53,303 49.5,283Q46,263 58,246Q70,229 90.5,225Q111,221 128,233L832,727Q849,739 853,759Q857,779 845,796Q833,813 812.5,816.5Q792,820 775,808L660,728L660,740Q660,765 642.5,782.5Q625,800 600,800ZM900,652L780,568L780,220Q780,195 797.5,177.5Q815,160 840,160Q865,160 882.5,177.5Q900,195 900,220L900,652ZM60,740L60,540Q60,515 77.5,497.5Q95,480 120,480Q145,480 162.5,497.5Q180,515 180,540L180,740Q180,765 162.5,782.5Q145,800 120,800Q95,800 77.5,782.5Q60,765 60,740ZM660,484L540,400L540,340Q540,315 557.5,297.5Q575,280 600,280Q625,280 642.5,297.5Q660,315 660,340L660,484Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_signal_wifi_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_signal_wifi_off_white_24dp.xml index 4282a6c7..2a62b5ba 100644 --- a/shared_resources/src/main/res/drawable/ic_signal_wifi_off_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_signal_wifi_off_white_24dp.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:fillColor="@android:color/white" + android:pathData="M480,800Q447,800 423.5,776.5Q400,753 400,720Q400,687 423.5,663.5Q447,640 480,640Q513,640 536.5,663.5Q560,687 560,720Q560,753 536.5,776.5Q513,800 480,800ZM302,440L192,363Q182,369 173,375.5Q164,382 155,389Q135,405 109.5,404.5Q84,404 66,386Q49,369 49,344Q49,319 69,304Q74,300 78.5,297Q83,294 88,290L70,278Q53,266 49.5,246Q46,226 58,209Q70,192 90.5,188Q111,184 128,196L832,690Q849,702 853,722Q857,742 845,759Q833,776 812.5,779.5Q792,783 775,771L424,525Q398,530 373.5,539.5Q349,549 326,563Q304,577 279,575.5Q254,574 236,556Q219,539 219.5,514.5Q220,490 240,476Q255,465 270.5,456.5Q286,448 302,440ZM425,283L290,188Q336,174 383.5,167Q431,160 480,160Q593,160 698,197Q803,234 891,304Q911,319 911,344Q911,369 894,386Q876,404 850.5,404.5Q825,405 805,389Q735,335 652,307.5Q569,280 480,280Q466,280 452.5,280.5Q439,281 425,283Z" /> + diff --git a/shared_resources/src/main/res/drawable/ic_sleep_timer.xml b/shared_resources/src/main/res/drawable/ic_sleep_timer.xml index 232848ab..32f8f05c 100644 --- a/shared_resources/src/main/res/drawable/ic_sleep_timer.xml +++ b/shared_resources/src/main/res/drawable/ic_sleep_timer.xml @@ -4,11 +4,12 @@ android:viewportWidth="6.35" android:viewportHeight="6.35"> + diff --git a/shared_resources/src/main/res/drawable/ic_smartphone_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_smartphone_white_24dp.xml index 842906fa..03a3fa40 100644 --- a/shared_resources/src/main/res/drawable/ic_smartphone_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_smartphone_white_24dp.xml @@ -1,10 +1,12 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24" + android:viewportHeight="24"> + + diff --git a/shared_resources/src/main/res/drawable/ic_sync_24dp.xml b/shared_resources/src/main/res/drawable/ic_sync_24dp.xml deleted file mode 100644 index 04c848ec..00000000 --- a/shared_resources/src/main/res/drawable/ic_sync_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_timelapse.xml b/shared_resources/src/main/res/drawable/ic_timelapse.xml index 77fc3e48..37f4cd81 100644 --- a/shared_resources/src/main/res/drawable/ic_timelapse.xml +++ b/shared_resources/src/main/res/drawable/ic_timelapse.xml @@ -1,12 +1,12 @@ + android:pathData="M480,720Q580,720 650,650Q720,580 720,480Q720,393 664.5,327Q609,261 524,244Q506,242 493,254Q480,266 480,284L480,480L342,618Q329,631 330,649Q331,667 345,678Q374,701 409,710.5Q444,720 480,720ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_touch_app.xml b/shared_resources/src/main/res/drawable/ic_touch_app.xml index c1e57eac..9b685eae 100644 --- a/shared_resources/src/main/res/drawable/ic_touch_app.xml +++ b/shared_resources/src/main/res/drawable/ic_touch_app.xml @@ -1,12 +1,9 @@ - + android:viewportWidth="960" + android:viewportHeight="960"> - + android:pathData="M419,880Q391,880 366.5,868Q342,856 325,834L124,579Q116,570 117,557.5Q118,545 126,537L126,537Q146,516 174,512Q202,508 226,523L300,568L300,240Q300,223 311.5,211.5Q323,200 340,200Q357,200 369,211.5Q381,223 381,240L381,440L680,440Q730,440 765,475Q800,510 800,560L800,720Q800,786 753,833Q706,880 640,880L419,880ZM479,360Q462,360 450.5,348.5Q439,337 439,320Q439,318 444,300Q452,286 456,271.5Q460,257 460,240Q460,190 425,155Q390,120 340,120Q290,120 255,155Q220,190 220,240Q220,257 224,271.5Q228,286 236,300Q239,305 240,310Q241,315 241,320Q241,337 230,348.5Q219,360 202,360Q191,360 181.5,354Q172,348 167,339Q154,317 147,292Q140,267 140,240Q140,157 198.5,98.5Q257,40 340,40Q423,40 481.5,98.5Q540,157 540,240Q540,267 533,292Q526,317 513,339Q508,348 499,354Q490,360 479,360Z" /> diff --git a/shared_resources/src/main/res/drawable/ic_vibration_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_vibration_white_24dp.xml index d4b68084..cb3465b8 100644 --- a/shared_resources/src/main/res/drawable/ic_vibration_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_vibration_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M320,840q-33,0 -56.5,-23.5T240,760v-560q0,-33 23.5,-56.5T320,120h320q33,0 56.5,23.5T720,200v560q0,33 -23.5,56.5T640,840L320,840ZM480,320q17,0 28.5,-11.5T520,280q0,-17 -11.5,-28.5T480,240q-17,0 -28.5,11.5T440,280q0,17 11.5,28.5T480,320ZM0,560v-160q0,-17 11.5,-28.5T40,360q17,0 28.5,11.5T80,400v160q0,17 -11.5,28.5T40,600q-17,0 -28.5,-11.5T0,560ZM120,640v-320q0,-17 11.5,-28.5T160,280q17,0 28.5,11.5T200,320v320q0,17 -11.5,28.5T160,680q-17,0 -28.5,-11.5T120,640ZM880,560v-160q0,-17 11.5,-28.5T920,360q17,0 28.5,11.5T960,400v160q0,17 -11.5,28.5T920,600q-17,0 -28.5,-11.5T880,560ZM760,640v-320q0,-17 11.5,-28.5T800,280q17,0 28.5,11.5T840,320v320q0,17 -11.5,28.5T800,680q-17,0 -28.5,-11.5T760,640Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_view_apps_filled.xml b/shared_resources/src/main/res/drawable/ic_view_apps_filled.xml new file mode 100644 index 00000000..28cac974 --- /dev/null +++ b/shared_resources/src/main/res/drawable/ic_view_apps_filled.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared_resources/src/main/res/drawable/ic_view_list_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_view_list_white_24dp.xml deleted file mode 100644 index 1bf43894..00000000 --- a/shared_resources/src/main/res/drawable/ic_view_list_white_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/shared_resources/src/main/res/drawable/ic_volume_off_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_volume_off_white_24dp.xml index a61e4b2e..10df1923 100644 --- a/shared_resources/src/main/res/drawable/ic_volume_off_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_volume_off_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M671,783q-11,7 -22,13t-23,11q-15,7 -30.5,0T574,784q-6,-15 1.5,-29.5T598,733q4,-2 7.5,-4t7.5,-4L480,592v111q0,27 -24.5,37.5T412,732L280,600L160,600q-17,0 -28.5,-11.5T120,560v-160q0,-17 11.5,-28.5T160,360h88L84,196q-11,-11 -11,-28t11,-28q11,-11 28,-11t28,11l680,680q11,11 11,28t-11,28q-11,11 -28,11t-28,-11l-93,-93ZM760,479q0,-83 -44,-151.5T598,225q-15,-7 -22,-21.5t-2,-29.5q6,-16 21.5,-23t31.5,0q97,43 155,131t58,197q0,33 -6,65.5T817,607q-8,22 -24.5,27.5t-30.5,0.5q-14,-5 -22.5,-18t-0.5,-30q11,-26 16,-52.5t5,-55.5ZM591,337q33,21 51,63t18,80v10q0,5 -1,10 -2,13 -14,17t-22,-6l-51,-51q-6,-6 -9,-13.5t-3,-15.5v-77q0,-12 10.5,-17.5t20.5,0.5ZM390,278q-6,-6 -6,-14t6,-14l22,-22q19,-19 43.5,-8.5T480,257v63q0,14 -12,19t-22,-5l-56,-56Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_volume_up_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_volume_up_white_24dp.xml index 7db33791..d23e05d0 100644 --- a/shared_resources/src/main/res/drawable/ic_volume_up_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_volume_up_white_24dp.xml @@ -1,10 +1,9 @@ - + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M760,479q0,-83 -44,-151.5T598,225q-15,-7 -22,-21.5t-2,-29.5q6,-16 21.5,-23t31.5,0q97,43 155,131.5T840,479q0,108 -58,196.5T627,807q-16,7 -31.5,0T574,784q-5,-15 2,-29.5t22,-21.5q74,-34 118,-102.5T760,479ZM280,600L160,600q-17,0 -28.5,-11.5T120,560v-160q0,-17 11.5,-28.5T160,360h120l132,-132q19,-19 43.5,-8.5T480,257v446q0,27 -24.5,37.5T412,732L280,600ZM660,480q0,42 -19,79.5T591,621q-10,6 -20.5,0.5T560,604v-250q0,-12 10.5,-17.5t20.5,0.5q31,25 50,63t19,80Z" + android:fillColor="#FFFFFF" /> diff --git a/shared_resources/src/main/res/drawable/ic_wifi_tethering.xml b/shared_resources/src/main/res/drawable/ic_wifi_tethering.xml index 086acb45..d34b8020 100644 --- a/shared_resources/src/main/res/drawable/ic_wifi_tethering.xml +++ b/shared_resources/src/main/res/drawable/ic_wifi_tethering.xml @@ -1,10 +1,12 @@ - + android:viewportHeight="960" + android:viewportWidth="960" + android:width="24dp"> + + android:pathData="M233,781Q221,793 204,793Q187,793 176,780Q131,727 105.5,661Q80,595 80,520Q80,437 111.5,364Q143,291 197,237Q251,183 324,151.5Q397,120 480,120Q563,120 636,151.5Q709,183 763,237Q817,291 848.5,364Q880,437 880,520Q880,595 854.5,661Q829,727 784,780Q773,793 756.5,793.5Q740,794 728,782Q717,771 717,754Q717,737 728,724Q762,682 781,630Q800,578 800,520Q800,386 707,293Q614,200 480,200Q346,200 253,293Q160,386 160,520Q160,578 179,629.5Q198,681 233,723Q244,736 244.5,752.5Q245,769 233,781ZM346,668Q334,680 317,680.5Q300,681 290,667Q267,636 253.5,599Q240,562 240,520Q240,420 310,350Q380,280 480,280Q580,280 650,350Q720,420 720,520Q720,562 706.5,599.5Q693,637 670,667Q660,680 643,680.5Q626,681 614,669Q603,658 602.5,641Q602,624 612,610Q625,590 632.5,567.5Q640,545 640,520Q640,454 593,407Q546,360 480,360Q414,360 367,407Q320,454 320,520Q320,546 327.5,568Q335,590 348,610Q358,624 357.5,640.5Q357,657 346,668ZM480,600Q447,600 423.5,576.5Q400,553 400,520Q400,487 423.5,463.5Q447,440 480,440Q513,440 536.5,463.5Q560,487 560,520Q560,553 536.5,576.5Q513,600 480,600Z" /> + diff --git a/shared_resources/src/main/res/drawable/icon_v3.xml b/shared_resources/src/main/res/drawable/icon_v3.xml new file mode 100644 index 00000000..cd9be45f --- /dev/null +++ b/shared_resources/src/main/res/drawable/icon_v3.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt index 706443b6..b8dc85b4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Refresh import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -271,7 +273,7 @@ private fun AppLauncherScreen( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + imageVector = Icons.Rounded.Refresh, contentDescription = stringResource(id = R.string.action_refresh) ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index 28134d08..5cbae0ec 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -24,8 +24,9 @@ import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.VolumeUp -import androidx.compose.material.icons.outlined.MicOff +import androidx.compose.material.icons.rounded.CallEnd import androidx.compose.material.icons.rounded.Dialpad +import androidx.compose.material.icons.rounded.MicOff import androidx.compose.material.icons.rounded.MoreHoriz import androidx.compose.material.icons.rounded.SpeakerPhone import androidx.compose.runtime.Composable @@ -48,7 +49,6 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.style.TextAlign @@ -436,7 +436,7 @@ private fun CallManagerUi( verticalAlignment = Alignment.Top ) { CallUiButton( - imageVector = Icons.Outlined.MicOff, + imageVector = Icons.Rounded.MicOff, buttonSize = buttonSize, isChecked = uiState.isMuted, onClick = onMute, @@ -480,7 +480,7 @@ private fun CallManagerUi( ) { Icon( modifier = Modifier.size(IconButtonDefaults.iconSizeFor(buttonSize)), - painter = painterResource(id = R.drawable.ic_call_end_24dp), + imageVector = Icons.Rounded.CallEnd, contentDescription = stringResource(id = R.string.action_hangup) ) } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt index f7127b0a..3e5d347a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/Dashboard.kt @@ -17,7 +17,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.rounded.Info import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect @@ -116,7 +116,7 @@ fun Dashboard( }, icon = { Icon( - painter = rememberVectorPainter(image = Icons.Default.Info), + painter = rememberVectorPainter(image = Icons.Rounded.Info), contentDescription = null ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt index b96acc9a..05e3441d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt @@ -18,6 +18,9 @@ import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.RestartAlt import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -237,7 +240,7 @@ private fun DashboardConfigUi( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.action_add_batt_state) ) }, @@ -341,7 +344,7 @@ private fun DashboardConfigUi( ) ) { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.action_add_batt_state) ) } @@ -364,7 +367,7 @@ private fun DashboardConfigUi( content = { Icon( modifier = Modifier.size(28.dp), - painter = painterResource(id = R.drawable.ic_baseline_restart_alt_24), + imageVector = Icons.Rounded.RestartAlt, contentDescription = stringResource(R.string.message_reset_to_default), ) } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt index 6027cf3e..1129e7e8 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt @@ -23,6 +23,11 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.ViewList +import androidx.compose.material.icons.rounded.Apps +import androidx.compose.material.icons.rounded.Edit +import androidx.compose.material.icons.rounded.ViewList import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults @@ -70,6 +75,7 @@ import androidx.wear.compose.material3.SwitchButton import androidx.wear.compose.material3.Text import androidx.wear.compose.material3.TimeText import androidx.wear.compose.material3.contentColorFor +import com.google.android.horologist.images.base.paintable.ImageVectorPaintable.Companion.asPaintable import com.thewizrd.shared_resources.actions.Actions import com.thewizrd.shared_resources.actions.BatteryStatus import com.thewizrd.shared_resources.controls.ActionButtonViewModel @@ -296,7 +302,13 @@ private fun BatteryStatusChip( modifier = Modifier.weight(1f, fill = true), icon = { Icon( - painter = painterResource(id = R.drawable.ic_battery_std_white_24dp), + painter = painterResource( + id = if (batteryStatus?.isCharging == true) { + R.drawable.ic_battery_charging_white_24dp + } else { + R.drawable.ic_battery_std_white_24dp + } + ), contentDescription = stringResource(R.string.title_batt_state) ) }, @@ -574,7 +586,7 @@ private fun LayoutPreferenceButton( painter = if (isGridLayout) { painterResource(id = R.drawable.ic_apps_white_24dp) } else { - painterResource(id = R.drawable.ic_view_list_white_24dp) + Icons.AutoMirrored.Rounded.ViewList.asPaintable().rememberPainter() }, contentDescription = if (isGridLayout) { stringResource(id = R.string.option_grid) @@ -608,7 +620,7 @@ private fun DashboardConfigButton( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_edit_24), + painter = painterResource(id = R.drawable.ic_mode_edit), contentDescription = stringResource(id = R.string.pref_title_dasheditor) ) }, @@ -627,7 +639,7 @@ private fun TileDashboardConfigButton( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_edit_24), + painter = painterResource(id = R.drawable.ic_mode_edit), contentDescription = stringResource(id = R.string.pref_title_tiledasheditor) ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt index 84e8a0bd..4ddbb3b7 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt @@ -18,6 +18,9 @@ import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.RestartAlt import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect @@ -253,7 +256,7 @@ private fun DashboardTileConfigUi( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.action_add_batt_state) ) }, @@ -357,7 +360,7 @@ private fun DashboardTileConfigUi( ) ) { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.action_add_batt_state) ) } @@ -380,7 +383,7 @@ private fun DashboardTileConfigUi( content = { Icon( modifier = Modifier.size(28.dp), - painter = painterResource(id = R.drawable.ic_baseline_restart_alt_24), + imageVector = Icons.Rounded.RestartAlt, contentDescription = stringResource(R.string.message_reset_to_default), ) } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt index b27ce369..32948132 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt @@ -24,12 +24,13 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft -import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight -import androidx.compose.material.icons.automirrored.outlined.ArrowBack -import androidx.compose.material.icons.filled.KeyboardArrowDown -import androidx.compose.material.icons.filled.KeyboardArrowUp -import androidx.compose.material.icons.outlined.Home +import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowLeft +import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowRight +import androidx.compose.material.icons.rounded.Home +import androidx.compose.material.icons.rounded.KeyboardArrowDown +import androidx.compose.material.icons.rounded.KeyboardArrowUp +import androidx.compose.material.icons.rounded.Refresh import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -394,7 +395,7 @@ private fun GestureScreen( .clickable(uiState.actionState.dpadSupported) { onDPadDirection(KeyEvent.KEYCODE_DPAD_UP) }, - imageVector = Icons.Filled.KeyboardArrowUp, + imageVector = Icons.Rounded.KeyboardArrowUp, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_up) ) @@ -406,7 +407,7 @@ private fun GestureScreen( .clickable(uiState.actionState.dpadSupported) { onDPadDirection(KeyEvent.KEYCODE_DPAD_DOWN) }, - imageVector = Icons.Filled.KeyboardArrowDown, + imageVector = Icons.Rounded.KeyboardArrowDown, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_down) ) @@ -418,7 +419,7 @@ private fun GestureScreen( .clickable(uiState.actionState.dpadSupported) { onDPadDirection(KeyEvent.KEYCODE_DPAD_LEFT) }, - imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft, + imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_left) ) @@ -430,7 +431,7 @@ private fun GestureScreen( .clickable(uiState.actionState.dpadSupported) { onDPadDirection(KeyEvent.KEYCODE_DPAD_RIGHT) }, - imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, + imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowRight, tint = MaterialTheme.colorScheme.primary, contentDescription = stringResource(R.string.label_arrow_right) ) @@ -476,7 +477,7 @@ private fun ButtonScreen( FilledIconButton( content = { Icon( - imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + imageVector = Icons.AutoMirrored.Rounded.ArrowBack, contentDescription = stringResource(id = R.string.label_back) ) }, @@ -487,7 +488,7 @@ private fun ButtonScreen( FilledIconButton( content = { Icon( - imageVector = Icons.Outlined.Home, + imageVector = Icons.Rounded.Home, contentDescription = stringResource(id = R.string.label_home), ) }, @@ -498,7 +499,7 @@ private fun ButtonScreen( FilledIconButton( content = { Icon( - painter = painterResource(R.drawable.ic_outline_view_apps), + painter = painterResource(R.drawable.ic_view_apps_filled), contentDescription = stringResource(id = R.string.label_recents), ) }, @@ -538,7 +539,7 @@ private fun NoAccessibilityScreen( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + imageVector = Icons.Rounded.Refresh, contentDescription = stringResource(id = R.string.action_refresh) ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index 6c1667dd..a3817f3f 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -11,6 +11,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ClearAll +import androidx.compose.material.icons.rounded.FilterList +import androidx.compose.material.icons.rounded.Refresh import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -304,7 +308,7 @@ private fun MediaPlayerListScreen( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + imageVector = Icons.Rounded.Refresh, contentDescription = stringResource(id = R.string.action_refresh) ) }, @@ -425,7 +429,7 @@ private fun MediaPlayerListSettings( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_filter_list_24), + imageVector = Icons.Rounded.FilterList, contentDescription = stringResource(id = R.string.title_filter_apps) ) } @@ -523,7 +527,7 @@ private fun MediaPlayerFilterScreen( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_clear_all_24dp), + imageVector = Icons.Rounded.ClearAll, contentDescription = stringResource(id = R.string.clear_all) ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index 51c6132e..2b0d6466 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -22,6 +22,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import androidx.compose.material.icons.rounded.ArrowBack +import androidx.compose.material.icons.rounded.Refresh import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect @@ -484,7 +488,7 @@ private fun MediaPlayerControlsPage( }, icon = { Icon( - painter = painterResource(id = R.drawable.ic_baseline_refresh_24), + imageVector = Icons.Rounded.Refresh, contentDescription = stringResource(id = R.string.action_retry) ) }, @@ -1055,7 +1059,7 @@ private fun MediaBrowserPage( if (item.id == MediaHelper.ACTIONITEM_BACK) { Icon( modifier = Modifier.size(ButtonDefaults.IconSize), - painter = painterResource(id = R.drawable.ic_baseline_arrow_back_24), + imageVector = Icons.AutoMirrored.Rounded.ArrowBack, contentDescription = stringResource(id = R.string.label_back) ) } else { diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt index 00623c10..a22fa43e 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt @@ -9,6 +9,11 @@ import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Arrangement @@ -20,15 +25,19 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Sync import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext @@ -56,6 +65,7 @@ import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales import com.google.accompanist.drawablepainter.rememberDrawablePainter +import com.google.android.horologist.images.base.paintable.ImageVectorPaintable.Companion.asPaintable import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.R @@ -315,30 +325,35 @@ private fun PhoneSyncUi( modifier = Modifier.requiredSize(IconButtonDefaults.ExtraSmallButtonSize), onClick = onSyncButtonClicked ) { + // Allow resume on rotation + var currentRotation by remember { mutableFloatStateOf(0f) } + val rotation = remember { Animatable(currentRotation) } + Icon( - modifier = Modifier.requiredSize(IconButtonDefaults.SmallIconSize - 4.dp), + modifier = Modifier + .requiredSize(IconButtonDefaults.SmallIconSize - 4.dp) + .rotate( + when (uiState.connectionStatus) { + WearConnectionStatus.DISCONNECTED, + WearConnectionStatus.APPNOTINSTALLED -> 0f + + else -> rotation.value + } + ), painter = when (uiState.connectionStatus) { WearConnectionStatus.DISCONNECTED -> { painterResource(id = R.drawable.ic_phonelink_erase_white_24dp) } WearConnectionStatus.CONNECTING, WearConnectionStatus.CONNECTED -> { - val drawable = remember(context) { - ContextCompat.getDrawable( - context, - android.R.drawable.ic_popup_sync - ) - } - rememberDrawablePainter( - drawable = drawable - ) + Icons.Rounded.Sync.asPaintable().rememberPainter() } WearConnectionStatus.APPNOTINSTALLED -> { painterResource(id = R.drawable.common_full_open_on_phone) } - null -> painterResource(id = R.drawable.ic_sync_24dp) + null -> Icons.Rounded.Sync.asPaintable().rememberPainter() }, contentDescription = when (uiState.connectionStatus) { WearConnectionStatus.DISCONNECTED -> stringResource(R.string.status_disconnected) @@ -348,6 +363,18 @@ private fun PhoneSyncUi( null -> null } ) + + LaunchedEffect(Unit) { + rotation.animateTo( + targetValue = currentRotation + 360f, + animationSpec = infiniteRepeatable( + animation = tween(1200, easing = LinearEasing), + repeatMode = RepeatMode.Restart + ) + ) { + currentRotation = value + } + } } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt index 42bf5bda..87b88387 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt @@ -13,7 +13,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.DeleteOutline import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -216,7 +217,7 @@ private fun TimedActionUi( edgeButton = { EdgeButton(onClick = onAddAction) { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.label_add_action) ) } @@ -286,7 +287,7 @@ private fun EmptyTimedActionUi( onClick = onAddAction ) { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(R.string.label_add_action) ) } @@ -324,7 +325,7 @@ private fun TimedActionChip( }, icon = { Icon( - imageVector = Icons.Outlined.Delete, + imageVector = Icons.Rounded.DeleteOutline, contentDescription = stringResource(id = R.string.action_delete) ) }, diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index 1bf12b3a..15cf7be6 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -4,6 +4,9 @@ import android.content.Intent import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.Remove import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -277,7 +280,7 @@ fun ValueActionScreen( ) } else { Icon( - painter = painterResource(id = R.drawable.ic_add_white_24dp), + imageVector = Icons.Rounded.Add, contentDescription = stringResource(id = R.string.wear_m3c_slider_increase_content_description) ) } @@ -290,7 +293,7 @@ fun ValueActionScreen( ) } else { Icon( - painter = painterResource(id = R.drawable.ic_remove_white_24dp), + imageVector = Icons.Rounded.Remove, contentDescription = stringResource(id = R.string.wear_m3c_slider_decrease_content_description) ) } @@ -332,7 +335,7 @@ fun ValueActionScreen( id = when (uiState.streamType) { AudioStreamType.MUSIC -> R.drawable.ic_music_note_white_24dp AudioStreamType.RINGTONE -> R.drawable.ic_baseline_ring_volume_24dp - AudioStreamType.VOICE_CALL -> R.drawable.ic_baseline_call_24dp + AudioStreamType.VOICE_CALL -> R.drawable.ic_phone_24dp AudioStreamType.ALARM -> R.drawable.ic_alarm_white_24dp null -> R.drawable.ic_volume_up_white_24dp } diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt index 267474b0..3d2607b4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt @@ -161,12 +161,12 @@ class DashboardTileRenderer(context: Context, debugResourceMode: Boolean = false ID_FLASHLIGHT to R.drawable.ic_lightbulb_outline_white_24dp, - ID_LOCK to R.drawable.ic_lock_outline_white_24dp, + ID_LOCK to R.drawable.ic_lock_white_24dp, ID_DND_OFF to R.drawable.ic_do_not_disturb_off_white_24dp, ID_DND_PRIORITY to R.drawable.ic_error_white_24dp, ID_DND_ALARMS to R.drawable.ic_alarm_white_24dp, - ID_DND_SILENCE to R.drawable.ic_notifications_off_white_24dp, + ID_DND_SILENCE to R.drawable.ic_do_not_disturb_silence_white_24dp, ID_RINGER_VIB to R.drawable.ic_vibration_white_24dp, ID_RINGER_SOUND to R.drawable.ic_notifications_active_white_24dp, diff --git a/wear/src/main/res/color/button_background_checkable.xml b/wear/src/main/res/color/button_background_checkable.xml deleted file mode 100644 index 7d21ddce..00000000 --- a/wear/src/main/res/color/button_background_checkable.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/color/wear_chip_primary_text_color.xml b/wear/src/main/res/color/wear_chip_primary_text_color.xml deleted file mode 100644 index a90edd6c..00000000 --- a/wear/src/main/res/color/wear_chip_primary_text_color.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/color/wear_chip_seconary_text_color.xml b/wear/src/main/res/color/wear_chip_seconary_text_color.xml deleted file mode 100644 index 42578d63..00000000 --- a/wear/src/main/res/color/wear_chip_seconary_text_color.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable-hdpi/ws_full_sad.png b/wear/src/main/res/drawable-hdpi/ws_full_sad.png deleted file mode 100644 index 5b6eeeebd0e3be064b6d96fd066f5390d52144e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 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 diff --git a/wear/src/main/res/drawable-xhdpi/ws_full_sad.png b/wear/src/main/res/drawable-xhdpi/ws_full_sad.png deleted file mode 100644 index 5cac306205abb31d869941edee618ef0f0330b87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 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 AFaQ7m diff --git a/wear/src/main/res/drawable-xxxhdpi/ws_full_sad.png b/wear/src/main/res/drawable-xxxhdpi/ws_full_sad.png deleted file mode 100644 index 9b3b20815439cadf91570fee05f159246d80a2b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6183 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%0A$~?e8{8)3EC=0E^>Ioy=@n z<{+KtjW}1(VAT&pX;b4r;cN849BajnCSRtW%efkpjY|x-ijqp&LM>+Q#>~ z(^|{?`%ALOEKH>}ji_5g<2JpyjcWndJ-dA9_1QTc=+ZuXsUe)UnXTtP^*RO#5{h=p zKqbVxnQ~N*!-cKz7>VyELgB4dAspz%csC1qY=9m8!vtO@uHH9K7mb&s`_`{Uk?ruj zmSl<9&s}ER$2k&D(Wz`fYko4IIc@e1G5TM+@E#@sr|^EyRW?CkR>8+ZSNzRlkTbow zsa0nYL|7ISFX4}oO6;>CeOU;({Vwx{$3C0qXCb+Epg?)vl5P88hd5*Zj@q`a)#y_b zs-A#T{rN-G(PdWRls*t5&1nY&W*807e?yHHHH=~yWqI}Lm(7HV&uSyjmC%V^-r;_E qAPw8{q1yZZDDC - - - - - - - diff --git a/wear/src/main/res/drawable/button_background_accent_onsurface.xml b/wear/src/main/res/drawable/button_background_accent_onsurface.xml deleted file mode 100644 index c4de6b6f..00000000 --- a/wear/src/main/res/drawable/button_background_accent_onsurface.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - diff --git a/wear/src/main/res/drawable/button_background_gradient_end.xml b/wear/src/main/res/drawable/button_background_gradient_end.xml deleted file mode 100644 index 6b2c0c7f..00000000 --- a/wear/src/main/res/drawable/button_background_gradient_end.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/button_background_gradient_end_rtl.xml b/wear/src/main/res/drawable/button_background_gradient_end_rtl.xml deleted file mode 100644 index 86e94e01..00000000 --- a/wear/src/main/res/drawable/button_background_gradient_end_rtl.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/button_background_gradient_start.xml b/wear/src/main/res/drawable/button_background_gradient_start.xml deleted file mode 100644 index 955888f3..00000000 --- a/wear/src/main/res/drawable/button_background_gradient_start.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/button_background_gradient_start_rtl.xml b/wear/src/main/res/drawable/button_background_gradient_start_rtl.xml deleted file mode 100644 index 551015a9..00000000 --- a/wear/src/main/res/drawable/button_background_gradient_start_rtl.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/button_background_onsurface.xml b/wear/src/main/res/drawable/button_background_onsurface.xml deleted file mode 100644 index 5f0e70dc..00000000 --- a/wear/src/main/res/drawable/button_background_onsurface.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/ic_wear_checkbox_off.xml b/wear/src/main/res/drawable/ic_wear_checkbox_off.xml deleted file mode 100644 index 32026c5b..00000000 --- a/wear/src/main/res/drawable/ic_wear_checkbox_off.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/wear/src/main/res/drawable/ic_wear_checkbox_on.xml b/wear/src/main/res/drawable/ic_wear_checkbox_on.xml deleted file mode 100644 index 3267018f..00000000 --- a/wear/src/main/res/drawable/ic_wear_checkbox_on.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/wear/src/main/res/drawable/ic_wear_radio_off.xml b/wear/src/main/res/drawable/ic_wear_radio_off.xml deleted file mode 100644 index d7ae129a..00000000 --- a/wear/src/main/res/drawable/ic_wear_radio_off.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/wear/src/main/res/drawable/ic_wear_radio_on.xml b/wear/src/main/res/drawable/ic_wear_radio_on.xml deleted file mode 100644 index fd1a56d6..00000000 --- a/wear/src/main/res/drawable/ic_wear_radio_on.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - diff --git a/wear/src/main/res/drawable/ic_wear_switch_off.xml b/wear/src/main/res/drawable/ic_wear_switch_off.xml deleted file mode 100644 index b6e47214..00000000 --- a/wear/src/main/res/drawable/ic_wear_switch_off.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/wear/src/main/res/drawable/ic_wear_switch_on.xml b/wear/src/main/res/drawable/ic_wear_switch_on.xml deleted file mode 100644 index adbd464d..00000000 --- a/wear/src/main/res/drawable/ic_wear_switch_on.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/wear/src/main/res/drawable/playpause_button.xml b/wear/src/main/res/drawable/playpause_button.xml deleted file mode 100644 index 93e2b5fe..00000000 --- a/wear/src/main/res/drawable/playpause_button.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/playpause_button_ambient.xml b/wear/src/main/res/drawable/playpause_button_ambient.xml deleted file mode 100644 index 830b87d4..00000000 --- a/wear/src/main/res/drawable/playpause_button_ambient.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/ring_progress.xml b/wear/src/main/res/drawable/ring_progress.xml deleted file mode 100644 index 6167e6f3..00000000 --- a/wear/src/main/res/drawable/ring_progress.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/wear_checkbox_icon.xml b/wear/src/main/res/drawable/wear_checkbox_icon.xml deleted file mode 100644 index 8c82672f..00000000 --- a/wear/src/main/res/drawable/wear_checkbox_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/wear_radio_icon.xml b/wear/src/main/res/drawable/wear_radio_icon.xml deleted file mode 100644 index 420dcbe1..00000000 --- a/wear/src/main/res/drawable/wear_radio_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/drawable/wear_switch_icon.xml b/wear/src/main/res/drawable/wear_switch_icon.xml deleted file mode 100644 index 8b30fab5..00000000 --- a/wear/src/main/res/drawable/wear_switch_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout-round/accept_deny_dialog.xml b/wear/src/main/res/layout-round/accept_deny_dialog.xml deleted file mode 100644 index 02e0ba4b..00000000 --- a/wear/src/main/res/layout-round/accept_deny_dialog.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wear/src/main/res/layout/accept_deny_dialog.xml b/wear/src/main/res/layout/accept_deny_dialog.xml deleted file mode 100644 index d96d2d8c..00000000 --- a/wear/src/main/res/layout/accept_deny_dialog.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wear/src/main/res/layout/app_item.xml b/wear/src/main/res/layout/app_item.xml deleted file mode 100644 index 63452ebd..00000000 --- a/wear/src/main/res/layout/app_item.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/wear/src/main/res/layout/dialog_addaction.xml b/wear/src/main/res/layout/dialog_addaction.xml deleted file mode 100644 index d911db67..00000000 --- a/wear/src/main/res/layout/dialog_addaction.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/layout_dash_add_button.xml b/wear/src/main/res/layout/layout_dash_add_button.xml deleted file mode 100644 index ae95ecc9..00000000 --- a/wear/src/main/res/layout/layout_dash_add_button.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/layout_dash_button.xml b/wear/src/main/res/layout/layout_dash_button.xml deleted file mode 100644 index cfdec29f..00000000 --- a/wear/src/main/res/layout/layout_dash_button.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/layout_dashboard_config.xml b/wear/src/main/res/layout/layout_dashboard_config.xml deleted file mode 100644 index 84e1578d..00000000 --- a/wear/src/main/res/layout/layout_dashboard_config.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/layout_tile_dashboard_config.xml b/wear/src/main/res/layout/layout_tile_dashboard_config.xml deleted file mode 100644 index 5e2f9643..00000000 --- a/wear/src/main/res/layout/layout_tile_dashboard_config.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/tile_layout_dashboard.xml b/wear/src/main/res/layout/tile_layout_dashboard.xml index d81c0c8e..86bf8bcc 100644 --- a/wear/src/main/res/layout/tile_layout_dashboard.xml +++ b/wear/src/main/res/layout/tile_layout_dashboard.xml @@ -131,7 +131,7 @@ android:foreground="?android:selectableItemBackgroundBorderless" android:padding="@dimen/tile_action_button_padding" android:scaleType="fitCenter" - tools:src="@drawable/ic_lock_outline_white_24dp" /> + tools:src="@drawable/ic_lock_white_24dp" /> diff --git a/wear/src/main/res/layout/wear_chip_button_layout.xml b/wear/src/main/res/layout/wear_chip_button_layout.xml deleted file mode 100644 index 83013c92..00000000 --- a/wear/src/main/res/layout/wear_chip_button_layout.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/layout/ws_customoverlay_confirmation.xml b/wear/src/main/res/layout/ws_customoverlay_confirmation.xml deleted file mode 100644 index 77b0535d..00000000 --- a/wear/src/main/res/layout/ws_customoverlay_confirmation.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - diff --git a/wear/src/main/res/values/actionbutton_styles.xml b/wear/src/main/res/values/actionbutton_styles.xml deleted file mode 100644 index 051d37f6..00000000 --- a/wear/src/main/res/values/actionbutton_styles.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/values/attrs.xml b/wear/src/main/res/values/attrs.xml deleted file mode 100644 index 583cdd48..00000000 --- a/wear/src/main/res/values/attrs.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wear/src/main/res/values/styles.xml b/wear/src/main/res/values/styles.xml index 1af9d000..43f8a10b 100644 --- a/wear/src/main/res/values/styles.xml +++ b/wear/src/main/res/values/styles.xml @@ -25,9 +25,6 @@ ?android:selectableItemBackgroundBorderless - - @style/Widget.Wear.WearChipButton - @style/Widget.Wear.ActionButton - - \ No newline at end of file From 749d1c785d7b3d82d526152a5b590bf7c09e00b4 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sat, 25 Oct 2025 12:13:43 -0400 Subject: [PATCH 12/40] MediaPlayerUi: add dynamic theming based on artwork --- .../src/main/res/animator/bar1_animator.xml | 13 ++ .../src/main/res/animator/bar2_animator.xml | 12 + .../src/main/res/animator/bar3_animator.xml | 12 + .../animator/music_note_bounce_animator.xml | 11 + .../main/res/drawable/equalizer_animated.xml | 13 ++ .../res/drawable/ic_music_note_white_24dp.xml | 18 +- .../drawable/music_note_bounce_animated.xml | 9 + .../res/drawable/rounded_equalizer_24.xml | 18 ++ wear/build.gradle | 1 + .../simplewear/media/MediaPlayerViewModel.kt | 2 + .../simplewear/ui/simplewear/MediaPlayerUi.kt | 216 ++++++++++++++---- .../thewizrd/simplewear/ui/utils/Colors.kt | 39 ++++ .../simplewear/ui/utils/DynamicTheming.kt | 214 +++++++++++++++++ .../wearable/WearableDataListenerService.kt | 1 + .../res/drawable/rounded_equalizer_24.xml | 12 - 15 files changed, 530 insertions(+), 61 deletions(-) create mode 100644 shared_resources/src/main/res/animator/bar1_animator.xml create mode 100644 shared_resources/src/main/res/animator/bar2_animator.xml create mode 100644 shared_resources/src/main/res/animator/bar3_animator.xml create mode 100644 shared_resources/src/main/res/animator/music_note_bounce_animator.xml create mode 100644 shared_resources/src/main/res/drawable/equalizer_animated.xml create mode 100644 shared_resources/src/main/res/drawable/music_note_bounce_animated.xml create mode 100644 shared_resources/src/main/res/drawable/rounded_equalizer_24.xml create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/utils/Colors.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/utils/DynamicTheming.kt delete mode 100644 wear/src/main/res/drawable/rounded_equalizer_24.xml diff --git a/shared_resources/src/main/res/animator/bar1_animator.xml b/shared_resources/src/main/res/animator/bar1_animator.xml new file mode 100644 index 00000000..28b08a20 --- /dev/null +++ b/shared_resources/src/main/res/animator/bar1_animator.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/shared_resources/src/main/res/animator/bar2_animator.xml b/shared_resources/src/main/res/animator/bar2_animator.xml new file mode 100644 index 00000000..06198fc4 --- /dev/null +++ b/shared_resources/src/main/res/animator/bar2_animator.xml @@ -0,0 +1,12 @@ + + + + diff --git a/shared_resources/src/main/res/animator/bar3_animator.xml b/shared_resources/src/main/res/animator/bar3_animator.xml new file mode 100644 index 00000000..10744626 --- /dev/null +++ b/shared_resources/src/main/res/animator/bar3_animator.xml @@ -0,0 +1,12 @@ + + + + diff --git a/shared_resources/src/main/res/animator/music_note_bounce_animator.xml b/shared_resources/src/main/res/animator/music_note_bounce_animator.xml new file mode 100644 index 00000000..0e8e2f68 --- /dev/null +++ b/shared_resources/src/main/res/animator/music_note_bounce_animator.xml @@ -0,0 +1,11 @@ + + + + diff --git a/shared_resources/src/main/res/drawable/equalizer_animated.xml b/shared_resources/src/main/res/drawable/equalizer_animated.xml new file mode 100644 index 00000000..d04c3ff0 --- /dev/null +++ b/shared_resources/src/main/res/drawable/equalizer_animated.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml b/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml index f0512e8a..37e8ff89 100644 --- a/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml +++ b/shared_resources/src/main/res/drawable/ic_music_note_white_24dp.xml @@ -1,12 +1,18 @@ + android:viewportHeight="960" + android:tint="#FFFFFF"> - + + + + diff --git a/shared_resources/src/main/res/drawable/music_note_bounce_animated.xml b/shared_resources/src/main/res/drawable/music_note_bounce_animated.xml new file mode 100644 index 00000000..46d4695a --- /dev/null +++ b/shared_resources/src/main/res/drawable/music_note_bounce_animated.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/shared_resources/src/main/res/drawable/rounded_equalizer_24.xml b/shared_resources/src/main/res/drawable/rounded_equalizer_24.xml new file mode 100644 index 00000000..b512d9a1 --- /dev/null +++ b/shared_resources/src/main/res/drawable/rounded_equalizer_24.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/wear/build.gradle b/wear/build.gradle index db9b5eb3..04cd1ad6 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -80,6 +80,7 @@ dependencies { implementation "androidx.core:core-splashscreen:$coresplash_version" implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version" implementation "androidx.datastore:datastore:$datastore_version" + implementation "androidx.palette:palette-ktx:1.0.0" implementation platform("com.google.firebase:firebase-bom:$firebase_version") implementation 'com.google.firebase:firebase-analytics' diff --git a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt index 9bd72078..98be623f 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt @@ -86,6 +86,8 @@ data class PlayerState( val positionState: PositionState? = null ) { fun isEmpty(): Boolean = title.isNullOrEmpty() && artist.isNullOrEmpty() + + val key = "${title}|${artist}" } data class MediaPagerState( diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index 2b0d6466..01514ffc 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -4,9 +4,14 @@ package com.thewizrd.simplewear.ui.simplewear import android.content.Intent import android.graphics.Bitmap +import android.widget.Toast +import androidx.compose.animation.graphics.res.animatedVectorResource +import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter +import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.focusable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints @@ -18,21 +23,25 @@ import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.ArrowBack -import androidx.compose.material.icons.rounded.ArrowBack import androidx.compose.material.icons.rounded.Refresh import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -65,12 +74,16 @@ import androidx.wear.compose.foundation.pager.rememberPagerState import androidx.wear.compose.foundation.rotary.rotaryScrollable import androidx.wear.compose.material3.Button import androidx.wear.compose.material3.ButtonDefaults +import androidx.wear.compose.material3.ButtonGroup +import androidx.wear.compose.material3.ButtonGroupDefaults import androidx.wear.compose.material3.CompactButton +import androidx.wear.compose.material3.FilledIconButton import androidx.wear.compose.material3.FilledTonalButton import androidx.wear.compose.material3.Icon import androidx.wear.compose.material3.IconButtonDefaults import androidx.wear.compose.material3.ListHeader import androidx.wear.compose.material3.ListHeaderDefaults +import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.PageIndicatorDefaults import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.SurfaceTransformation @@ -134,6 +147,10 @@ import com.thewizrd.simplewear.ui.components.LoadingContent import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.utils.DynamicThemePrimaryColorsFromImage +import com.thewizrd.simplewear.ui.utils.MinContrastOfPrimaryVsBackground +import com.thewizrd.simplewear.ui.utils.contrastAgainst +import com.thewizrd.simplewear.ui.utils.rememberDominantColorState import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel @@ -206,48 +223,52 @@ fun MediaPlayerUi( } } - HorizontalPagerScreen( - modifier = modifier, - pagerState = pagerState, - hidePagerIndicator = ambientState.isAmbient || uiState.isLoading || !uiState.isPlayerAvailable, - pagerKey = keyFunc, - pagerIndicatorBackgroundColor = PageIndicatorDefaults.backgroundColor.copy(alpha = 0.5f) - ) { pageIdx -> - val key = keyFunc(pageIdx) - - when (key) { - MediaPageType.Player -> { - MediaPlayerControlsPage( - mediaPlayerViewModel = mediaPlayerViewModel, - volumeViewModel = volumeViewModel, - navController = navController, - ambientState = ambientState - ) - } + PlayerDynamicTheme( + uiState = uiState + ) { + HorizontalPagerScreen( + modifier = modifier, + pagerState = pagerState, + hidePagerIndicator = ambientState.isAmbient || uiState.isLoading || !uiState.isPlayerAvailable, + pagerKey = keyFunc, + pagerIndicatorBackgroundColor = PageIndicatorDefaults.backgroundColor.copy(alpha = 0.5f) + ) { pageIdx -> + val key = keyFunc(pageIdx) + + when (key) { + MediaPageType.Player -> { + MediaPlayerControlsPage( + mediaPlayerViewModel = mediaPlayerViewModel, + volumeViewModel = volumeViewModel, + navController = navController, + ambientState = ambientState + ) + } - MediaPageType.CustomControls -> { - MediaCustomControlsPage( - mediaPlayerViewModel = mediaPlayerViewModel - ) - } + MediaPageType.CustomControls -> { + MediaCustomControlsPage( + mediaPlayerViewModel = mediaPlayerViewModel + ) + } - MediaPageType.Browser -> { - MediaBrowserPage( - mediaPlayerViewModel = mediaPlayerViewModel - ) - } + MediaPageType.Browser -> { + MediaBrowserPage( + mediaPlayerViewModel = mediaPlayerViewModel + ) + } - MediaPageType.Queue -> { - MediaQueuePage( - mediaPlayerViewModel = mediaPlayerViewModel - ) + MediaPageType.Queue -> { + MediaQueuePage( + mediaPlayerViewModel = mediaPlayerViewModel + ) + } } - } - LaunchedEffect(pagerState, pagerState.targetPage, pagerState.currentPage) { - val targetPageKey = keyFunc(pagerState.targetPage) - if (mediaPagerState.currentPageKey != targetPageKey) { - mediaPlayerViewModel.updateCurrentPage(targetPageKey) + LaunchedEffect(pagerState, pagerState.targetPage, pagerState.currentPage) { + val targetPageKey = keyFunc(pagerState.targetPage) + if (mediaPagerState.currentPageKey != targetPageKey) { + mediaPlayerViewModel.updateCurrentPage(targetPageKey) + } } } } @@ -882,6 +903,9 @@ private fun MediaCustomControlsPage( focusRequester: FocusRequester = rememberFocusRequester(), onItemClick: (MediaItemModel) -> Unit = {} ) { + val context = LocalContext.current + val compositionScope = rememberCoroutineScope() + LoadingContent( empty = false, emptyContent = {}, @@ -894,9 +918,22 @@ private fun MediaCustomControlsPage( ) val transformationSpec = rememberTransformationSpec() + val buttonGroupItems = remember(uiState.mediaCustomItems) { + if (uiState.mediaCustomItems.size > 3) { + uiState.mediaCustomItems.filter { it.id != MediaHelper.ACTIONITEM_PLAY && it.icon != null } + .take(3) + } else { + emptyList() + } + } + val listItems by remember(uiState.mediaCustomItems) { + derivedStateOf { uiState.mediaCustomItems.filterNot { buttonGroupItems.contains(it) } } + } + ScreenScaffold( modifier = Modifier.fillMaxSize(), - contentPadding = contentPadding + contentPadding = contentPadding, + scrollState = columnState ) { contentPadding -> TransformingLazyColumn( modifier = Modifier @@ -927,7 +964,53 @@ private fun MediaCustomControlsPage( } } - items(uiState.mediaCustomItems) { item -> + if (buttonGroupItems.isNotEmpty()) { + item { + Column { + ButtonGroup( + modifier = Modifier.fillMaxWidth(), + contentPadding = ButtonGroupDefaults.fullWidthPaddings() + ) { + buttonGroupItems.forEach { + val interactionSource = remember { MutableInteractionSource() } + + FilledIconButton( + modifier = Modifier.animateWidth(interactionSource), + onClick = { + onItemClick(it) + }, + interactionSource = interactionSource, + content = { + it.icon?.let { bmp -> + Icon( + modifier = Modifier.size(ButtonDefaults.IconSize), + bitmap = bmp.asImageBitmap(), + contentDescription = it.title + ) + } + }, + onLongClickLabel = it.title, + onLongClick = { + compositionScope.launch { + if (isActive && !it.title.isNullOrEmpty()) { + Toast.makeText( + context, + it.title, + Toast.LENGTH_SHORT + ).show() + } + } + } + ) + } + } + + Spacer(modifier = Modifier.height(4.dp)) + } + } + } + + items(listItems) { item -> FilledTonalButton( modifier = Modifier .fillMaxWidth() @@ -1004,7 +1087,8 @@ private fun MediaBrowserPage( ScreenScaffold( modifier = Modifier.fillMaxSize(), - contentPadding = contentPadding + contentPadding = contentPadding, + scrollState = columnState ) { contentPadding -> LoadingContent( empty = false, @@ -1136,7 +1220,8 @@ private fun MediaQueuePage( ScreenScaffold( modifier = Modifier.fillMaxSize(), - contentPadding = contentPadding + contentPadding = contentPadding, + scrollState = columnState ) { contentPadding -> LoadingContent( empty = false, @@ -1194,11 +1279,20 @@ private fun MediaQueuePage( } ?: run { if (item.id.toLong() == uiState.activeQueueItemId) { { + val image = + AnimatedImageVector.animatedVectorResource(R.drawable.equalizer_animated) + var atEnd by remember { mutableStateOf(false) } + Icon( modifier = Modifier.size(ButtonDefaults.IconSize), - painter = painterResource(id = R.drawable.rounded_equalizer_24), + painter = rememberAnimatedVectorPainter(image, atEnd), contentDescription = item.title ) + + LaunchedEffect(uiState.playerState) { + atEnd = + uiState.playerState.playbackState == PlaybackState.PLAYING + } } } else { null @@ -1234,6 +1328,42 @@ private fun MediaQueuePage( } } +/** + * Theme that updates the colors dynamically depending on the image + * Source: Jetcaster (https://github.com/android/compose-samples/blob/main/Jetcaster/app/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt) + */ +@Composable +private fun PlayerDynamicTheme( + uiState: MediaPlayerUiState, + content: @Composable () -> Unit +) { + val surfaceColor = MaterialTheme.colorScheme.background + val dominantColorState = rememberDominantColorState( + defaultColor = MaterialTheme.colorScheme.background, + defaultOnColor = MaterialTheme.colorScheme.onBackground + ) { color -> + // We want a color which has sufficient contrast against the surface color + color.contrastAgainst(surfaceColor) >= MinContrastOfPrimaryVsBackground + } + DynamicThemePrimaryColorsFromImage(dominantColorState) { + // Update the dominantColorState with colors coming from the image + LaunchedEffect(uiState.playerState.artworkBitmap) { + val key = uiState.playerState.key + + if (uiState.playerState.artworkBitmap != null) { + dominantColorState.updateColorsFromImage( + key, + uiState.playerState.artworkBitmap, + false + ) + } else { + dominantColorState.reset() + } + } + content() + } +} + @WearPreviewDevices @WearPreviewFontScales @Composable diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Colors.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Colors.kt new file mode 100644 index 00000000..f7c634fa --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/Colors.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2020 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.thewizrd.simplewear.ui.utils + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.graphics.luminance +import kotlin.math.max +import kotlin.math.min + +/** + * This is the minimum amount of calculated contrast for a color to be used on top of the + * surface color. These values are defined within the WCAG AA guidelines, and we use a value of + * 3:1 which is the minimum for user-interface components. + */ +const val MinContrastOfPrimaryVsBackground = 3f + +fun Color.contrastAgainst(background: Color): Float { + val fg = if (alpha < 1f) compositeOver(background) else this + + val fgLuminance = fg.luminance() + 0.05f + val bgLuminance = background.luminance() + 0.05f + + return max(fgLuminance, bgLuminance) / min(fgLuminance, bgLuminance) +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/utils/DynamicTheming.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/DynamicTheming.kt new file mode 100644 index 00000000..ed489d3e --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/utils/DynamicTheming.kt @@ -0,0 +1,214 @@ +/* + * Copyright 2020 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.thewizrd.simplewear.ui.utils + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import androidx.collection.LruCache +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.spring +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.palette.graphics.Palette +import androidx.wear.compose.material3.MaterialTheme +import com.google.android.material.color.utilities.Hct +import com.google.android.material.color.utilities.SchemeContent +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@Composable +fun rememberDominantColorState( + context: Context = LocalContext.current, + defaultColor: Color = MaterialTheme.colorScheme.primary, + defaultOnColor: Color = MaterialTheme.colorScheme.onPrimary, + cacheSize: Int = 12, + isColorValid: (Color) -> Boolean = { true } +): DominantColorState = remember { + DominantColorState(context, defaultColor, defaultOnColor, cacheSize, isColorValid) +} + +/** + * A composable which allows dynamic theming of the [androidx.compose.material.Colors.primary] + * color from an image. + */ +@SuppressLint("RestrictedApi") +@Composable +fun DynamicThemePrimaryColorsFromImage( + dominantColorState: DominantColorState = rememberDominantColorState(), + content: @Composable () -> Unit +) { + val color = animateColorAsState( + dominantColorState.color, + spring(stiffness = Spring.StiffnessLow), label = "primary" + ).value + + val scheme = remember(color) { + SchemeContent(Hct.fromInt(color.toArgb()), true, 0.0) + } + + val colors = MaterialTheme.colorScheme.copy( + primary = Color(scheme.primary), + onPrimary = Color(scheme.onPrimary), + primaryContainer = Color(scheme.primaryContainer), + onPrimaryContainer = Color(scheme.onPrimaryContainer), + primaryDim = Color(scheme.primaryFixedDim), + + secondary = Color(scheme.secondary), + onSecondary = Color(scheme.onSecondary), + secondaryContainer = Color(scheme.secondaryContainer), + onSecondaryContainer = Color(scheme.onSecondaryContainer), + secondaryDim = Color(scheme.secondaryFixedDim), + + tertiary = Color(scheme.tertiary), + onTertiary = Color(scheme.onTertiary), + tertiaryContainer = Color(scheme.tertiaryContainer), + onTertiaryContainer = Color(scheme.onTertiaryContainer), + tertiaryDim = Color(scheme.tertiaryFixedDim), + + surfaceContainer = Color(scheme.surfaceContainer), + surfaceContainerHigh = Color(scheme.surfaceContainerHigh), + surfaceContainerLow = Color(scheme.surfaceContainerLow), + onSurface = Color(scheme.onSurface), + onSurfaceVariant = Color(scheme.onSurfaceVariant), + + outline = Color(scheme.outline), + outlineVariant = Color(scheme.outlineVariant), + + error = Color(scheme.error), + errorContainer = Color(scheme.errorContainer), + onError = Color(scheme.onError), + onErrorContainer = Color(scheme.onErrorContainer), + + background = Color(scheme.background), + onBackground = Color(scheme.onBackground), + ) + + MaterialTheme(colorScheme = colors, content = content) +} + +/** + * A class which stores and caches the result of any calculated dominant colors + * from images. + * + * @param context Android context + * @param defaultColor The default color, which will be used if [calculateDominantColor] fails to + * calculate a dominant color + * @param defaultOnColor The default foreground 'on color' for [defaultColor]. + * @param cacheSize The size of the [LruCache] used to store recent results. Pass `0` to + * disable the cache. + * @param isColorValid A lambda which allows filtering of the calculated image colors. + */ +@Stable +class DominantColorState( + private val context: Context, + private val defaultColor: Color, + private val defaultOnColor: Color, + cacheSize: Int = 12, + private val isColorValid: (Color) -> Boolean = { true } +) { + var color by mutableStateOf(defaultColor) + private set + var onColor by mutableStateOf(defaultOnColor) + private set + + private val cache = when { + cacheSize > 0 -> LruCache(cacheSize) + else -> null + } + + suspend fun updateColorsFromImage(key: String, bitmap: Bitmap?, useCache: Boolean = true) { + val result = calculateDominantColor(key, bitmap, useCache) + color = result?.color ?: defaultColor + onColor = result?.onColor ?: defaultOnColor + } + + private suspend fun calculateDominantColor( + key: String, + bitmap: Bitmap?, + useCache: Boolean = true + ): DominantColors? { + if (useCache) { + val cached = cache?.get(key) + if (cached != null) { + // If we already have the result cached, return early now... + return cached + } + } + + // Otherwise we calculate the swatches in the image, and return the first valid color + return calculateSwatchesInImage(context, bitmap) + // First we want to sort the list by the color's population + .sortedByDescending { swatch -> swatch.population } + // Then we want to find the first valid color + .firstOrNull { swatch -> isColorValid(Color(swatch.rgb)) } + // If we found a valid swatch, wrap it in a [DominantColors] + ?.let { swatch -> + DominantColors( + color = Color(swatch.rgb), + onColor = Color(swatch.bodyTextColor).copy(alpha = 1f) + ) + } + // Cache the resulting [DominantColors] + ?.also { result -> cache?.put(key, result) } + } + + /** + * Reset the color values to [defaultColor]. + */ + fun reset() { + color = defaultColor + onColor = defaultColor + } +} + +@Immutable +private data class DominantColors(val color: Color, val onColor: Color) + +/** + * Uses [Palette] to calculate the dominant color. + */ +private suspend fun calculateSwatchesInImage( + context: Context, + bitmap: Bitmap? +): List { + return bitmap?.let { + withContext(Dispatchers.Default) { + val palette = Palette.Builder(bitmap) + // Disable any bitmap resizing in Palette. We've already loaded an appropriately + // sized bitmap through Coil + .resizeBitmapArea(0) + // Clear any built-in filters. We want the unfiltered dominant color + .clearFilters() + // We reduce the maximum color count down to 8 + .maximumColorCount(8) + .generate() + + palette.swatches + } + } ?: emptyList() +} + diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt index cc44a29a..47e1456d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/WearableDataListenerService.kt @@ -577,6 +577,7 @@ class WearableDataListenerService : WearableListenerService() { val ongoingActivity = OngoingActivity.Builder(applicationContext, 1001, notifBuilder) .setStaticIcon(R.drawable.ic_music_note_white_24dp) + .setAnimatedIcon(R.drawable.music_note_bounce_animated) .setTouchIntent(getMediaControllerIntent()) //.setStatus(ongoingActivityStatus) // Uses content text from notif .setTitle(notifTitle) diff --git a/wear/src/main/res/drawable/rounded_equalizer_24.xml b/wear/src/main/res/drawable/rounded_equalizer_24.xml deleted file mode 100644 index a940e053..00000000 --- a/wear/src/main/res/drawable/rounded_equalizer_24.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - From 604c3779effb7261b872f1142bda0caf35607d0f Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sat, 25 Oct 2025 22:23:54 -0400 Subject: [PATCH 13/40] MediaControllerService: update active session logic --- .../media/MediaControllerService.kt | 36 ++++++++++--------- .../drawable/ic_play_circle_simpleblue.xml | 4 +-- .../simplewear/media/MediaPlayerViewModel.kt | 2 +- .../CircularWavyProgressIndicator.kt | 23 ++++++++++++ 4 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/components/CircularWavyProgressIndicator.kt diff --git a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt index edd5e4ae..efa38353 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/media/MediaControllerService.kt @@ -271,18 +271,18 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene val isAutoLaunch = intent.getBooleanExtra(EXTRA_AUTOLAUNCH, false) val isSoftLaunch = intent.getBooleanExtra(EXTRA_SOFTLAUNCH, false) - scope.launch { - if ((isAutoLaunch || selectedPackageName == mSelectedMediaApp?.packageName) && mController != null) return@launch - - if (!selectedPackageName.isNullOrBlank()) { - mSelectedMediaApp = mAvailableMediaApps.find { - it.packageName == selectedPackageName + if (!(isAutoLaunch && mController != null && mSelectedMediaApp?.packageName != mController?.packageName) && !(selectedPackageName != null && selectedPackageName == mSelectedMediaApp?.packageName && mController?.packageName == selectedPackageName)) { + scope.launch { + if (!selectedPackageName.isNullOrBlank()) { + mSelectedMediaApp = mAvailableMediaApps.find { + it.packageName == selectedPackageName + } + mSelectedPackageName = mSelectedMediaApp?.packageName + connectMediaSession(isSoftLaunch) + } else { + mSelectedPackageName = null + findActiveMediaSession() } - mSelectedPackageName = mSelectedMediaApp?.packageName - connectMediaSession(isSoftLaunch) - } else { - mSelectedPackageName = null - findActiveMediaSession() } } } @@ -376,8 +376,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene // Check if active session has changed if (mSelectedPackageName == null) { // If so reset - disconnectMedia(invalidateData = true) - mSelectedPackageName = firstActiveCtrlr.packageName + mSelectedPackageName = null mSelectedMediaApp = null } } @@ -391,8 +390,11 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene activeSessions, packageManager, resources ) - val activeMediaApp = + val activeMediaApp = if (mSelectedPackageName != null) { actionSessionDetails.find { it.packageName == mSelectedPackageName } + } else { + actionSessionDetails.find { it.packageName == firstActiveCtrlr?.packageName } + } if (activeMediaApp?.sessionToken != null || mBrowser?.isConnected == true) { if (activeMediaApp != null) mSelectedMediaApp = activeMediaApp @@ -423,7 +425,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene if (!isActive) return@launch - if (!mediaBrowserServices.isNullOrEmpty()) { + if (mediaBrowserServices.isNotEmpty()) { mediaBrowserServices.forEach { s -> mAvailableMediaApps.add( MediaAppDetails( @@ -436,7 +438,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene } if (!mSelectedPackageName.isNullOrBlank()) { - mAvailableMediaApps.find { + mSelectedMediaApp = mAvailableMediaApps.find { it.packageName == mSelectedPackageName } @@ -632,7 +634,7 @@ class MediaControllerService : Service(), MessageClient.OnMessageReceivedListene private fun sendControllerUnavailable() { scope.launch { - sendMediaPlayerState() + disconnectMedia(invalidateData = true) } } diff --git a/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml b/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml index dfb47443..e15d948f 100644 --- a/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml +++ b/shared_resources/src/main/res/drawable/ic_play_circle_simpleblue.xml @@ -8,7 +8,7 @@ android:strokeWidth="25.7" android:fillColor="#0070c0" /> diff --git a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt index 98be623f..7c520be0 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/media/MediaPlayerViewModel.kt @@ -443,7 +443,7 @@ class MediaPlayerViewModel(app: Application) : WearableListenerViewModel(app) { sendMessage( mPhoneNodeWithApp!!.id, MediaHelper.MediaPlayerConnectPath, - if (state.isAutoLaunch) state.isAutoLaunch.booleanToBytes() else state.mediaPlayerDetails.packageName?.stringToBytes() + if (state.isAutoLaunch) true.booleanToBytes() else state.mediaPlayerDetails.packageName?.stringToBytes() ) } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/components/CircularWavyProgressIndicator.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/components/CircularWavyProgressIndicator.kt new file mode 100644 index 00000000..638c521a --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/components/CircularWavyProgressIndicator.kt @@ -0,0 +1,23 @@ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + +package com.thewizrd.simplewear.ui.components + +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.wear.compose.material3.MaterialTheme + +@Composable +fun CircularWavyProgressIndicator( + modifier: Modifier = Modifier, + color: Color = MaterialTheme.colorScheme.primary, + trackColor: Color = MaterialTheme.colorScheme.secondaryContainer +) { + CircularWavyProgressIndicator( + modifier = modifier, + color = color, + trackColor = trackColor + ) +} \ No newline at end of file From 07bbb35d3a148c2ae7d81a03a46f5bf8ef56ba46 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 26 Oct 2025 18:11:09 -0400 Subject: [PATCH 14/40] tiles: update layouts to Material 3 --- .../{ => compose}/tools/WearPreviewDevices.kt | 18 +- .../ui/simplewear/AppLauncherScreen.kt | 3 +- .../simplewear/ui/simplewear/CallManagerUi.kt | 2 +- .../ui/simplewear/DashboardConfigUi.kt | 2 +- .../ui/simplewear/DashboardScreen.kt | 5 +- .../ui/simplewear/DashboardTileConfigUi.kt | 2 +- .../simplewear/ui/simplewear/GesturesUi.kt | 2 +- .../ui/simplewear/MediaPlayerListUi.kt | 2 +- .../simplewear/ui/simplewear/MediaPlayerUi.kt | 3 +- .../simplewear/ui/simplewear/PhoneSyncUi.kt | 4 +- .../ui/simplewear/TimedActionSetupUi.kt | 2 +- .../simplewear/ui/simplewear/TimedActionUi.kt | 2 +- .../ui/simplewear/ValueActionScreen.kt | 2 +- .../com/thewizrd/simplewear/ui/theme/Color.kt | 38 + .../ui/tiles/tools/WearTilePreviewDevices.kt | 22 + .../ui/tools/WearTilePreviewDevices.kt | 41 - .../wearable/tiles/DashboardTileRenderer.kt | 37 +- .../simplewear/wearable/tiles/TilePreviews.kt | 169 --- .../tiles/layouts/DashboardTileLayout.kt | 382 ++++--- .../tiles/layouts/LoadingTileLayout.kt | 51 + .../tiles/layouts/MediaPlayerTileLayout.kt | 1012 ++++++++++------- 21 files changed, 962 insertions(+), 839 deletions(-) rename wear/src/main/java/com/thewizrd/simplewear/ui/{ => compose}/tools/WearPreviewDevices.kt (69%) create mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/tiles/tools/WearTilePreviewDevices.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearTilePreviewDevices.kt delete mode 100644 wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/tools/WearPreviewDevices.kt similarity index 69% rename from wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt rename to wear/src/main/java/com/thewizrd/simplewear/ui/compose/tools/WearPreviewDevices.kt index e3adaa28..5d45949e 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearPreviewDevices.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/compose/tools/WearPreviewDevices.kt @@ -1,20 +1,4 @@ -/* - * Copyright 2022 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.thewizrd.simplewear.ui.tools +package com.thewizrd.simplewear.ui.compose.tools import androidx.compose.ui.tooling.preview.Preview import androidx.wear.tooling.preview.devices.WearDevices diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt index b8dc85b4..eb1583c4 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/AppLauncherScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -60,8 +59,8 @@ import com.thewizrd.simplewear.controls.AppItemViewModel import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.AppLauncherUiState import com.thewizrd.simplewear.viewmodels.AppLauncherViewModel import com.thewizrd.simplewear.viewmodels.ConfirmationData diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt index 5cbae0ec..48cdf755 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/CallManagerUi.kt @@ -99,9 +99,9 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.ElapsedTimeSource import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.CallManagerUiState import com.thewizrd.simplewear.viewmodels.CallManagerViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt index 05e3441d..cfc1db6d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardConfigUi.kt @@ -65,7 +65,7 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt index 1129e7e8..1543107a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardScreen.kt @@ -25,9 +25,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.ViewList -import androidx.compose.material.icons.rounded.Apps -import androidx.compose.material.icons.rounded.Edit -import androidx.compose.material.icons.rounded.ViewList import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults @@ -87,8 +84,8 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.controls.onClick import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.components.WearDivider +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.navigation.Screen -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.fillDashboard import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.DashboardState diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt index 4ddbb3b7..84627da7 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/DashboardTileConfigUi.kt @@ -70,7 +70,7 @@ import com.thewizrd.simplewear.preferences.DashboardTileUtils.isActionAllowed import com.thewizrd.simplewear.preferences.Settings import com.thewizrd.simplewear.ui.compose.LazyGridScrollIndicator import com.thewizrd.simplewear.ui.compose.LazyGridScrollInfoProvider -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.ReorderHapticFeedbackType import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.ui.utils.rememberReorderHapticFeedback diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt index 32948132..da7e3501 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/GesturesUi.kt @@ -74,9 +74,9 @@ import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt index a3817f3f..9b8d2157 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerListUi.kt @@ -73,9 +73,9 @@ import com.thewizrd.simplewear.controls.AppItemViewModel import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.MediaPlayerListUiState diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt index 01514ffc..2eb62f00 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/MediaPlayerUi.kt @@ -144,9 +144,9 @@ import com.thewizrd.simplewear.ui.ambient.ambientMode import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.DynamicThemePrimaryColorsFromImage import com.thewizrd.simplewear.ui.utils.MinContrastOfPrimaryVsBackground import com.thewizrd.simplewear.ui.utils.contrastAgainst @@ -1202,7 +1202,6 @@ private fun MediaQueuePage( focusRequester: FocusRequester = rememberFocusRequester(), onItemClick: (MediaItemModel) -> Unit = {} ) { - val context = LocalContext.current val activeQueueItemIndex = remember(uiState.activeQueueItemId, uiState.mediaQueueItems) { (uiState.activeQueueItemId.takeIf { it > -1L }?.let { activeId -> uiState.mediaQueueItems.indexOfFirst { it.id.toLong() == activeId }.takeIf { it > 0 } diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt index a22fa43e..b9de976d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/PhoneSyncUi.kt @@ -46,7 +46,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.core.content.ContextCompat import androidx.core.content.PermissionChecker import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope @@ -64,16 +63,15 @@ import androidx.wear.compose.material3.ProgressIndicatorDefaults import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales -import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.google.android.horologist.images.base.paintable.ImageVectorPaintable.Companion.asPaintable import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.utils.JSONParser import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.utils.ErrorMessage import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt index 4f9585e6..6efe925d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionSetupUi.kt @@ -61,9 +61,9 @@ import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.HorizontalPagerScreen +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt index 87b88387..7c9ed091 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/TimedActionUi.kt @@ -77,11 +77,11 @@ import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay import com.thewizrd.simplewear.ui.components.LoadingContent +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.navigation.Screen import com.thewizrd.simplewear.ui.theme.WearAppTheme import com.thewizrd.simplewear.ui.theme.activityViewModel import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel import com.thewizrd.simplewear.viewmodels.TimedActionUiViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt index 15cf7be6..524a6462 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/simplewear/ValueActionScreen.kt @@ -43,8 +43,8 @@ import com.thewizrd.shared_resources.utils.getSerializableCompat import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.ui.components.ConfirmationOverlay +import com.thewizrd.simplewear.ui.compose.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.theme.findActivity -import com.thewizrd.simplewear.ui.tools.WearPreviewDevices import com.thewizrd.simplewear.ui.utils.rememberFocusRequester import com.thewizrd.simplewear.viewmodels.ConfirmationData import com.thewizrd.simplewear.viewmodels.ConfirmationViewModel diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt index bdfd2e8a..ff97d84d 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/theme/Color.kt @@ -1,7 +1,9 @@ package com.thewizrd.simplewear.ui.theme import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.wear.compose.material3.ColorScheme +import androidx.wear.protolayout.types.LayoutColor internal val wearColorScheme: ColorScheme = ColorScheme( primary = Color(0xFFA2C9FD), @@ -39,4 +41,40 @@ internal val wearColorScheme: ColorScheme = ColorScheme( outline = Color(0xFF8D9199), outlineVariant = Color(0xFF43474E), +) + +val wearTileColorScheme = androidx.wear.protolayout.material3.ColorScheme( + primary = LayoutColor(wearColorScheme.primary.toArgb()), + onPrimary = LayoutColor(wearColorScheme.onPrimary.toArgb()), + primaryContainer = LayoutColor(wearColorScheme.primaryContainer.toArgb()), + onPrimaryContainer = LayoutColor(wearColorScheme.onPrimaryContainer.toArgb()), + primaryDim = LayoutColor(wearColorScheme.primaryDim.toArgb()), + + secondary = LayoutColor(wearColorScheme.secondary.toArgb()), + onSecondary = LayoutColor(wearColorScheme.onSecondary.toArgb()), + secondaryContainer = LayoutColor(wearColorScheme.secondaryContainer.toArgb()), + onSecondaryContainer = LayoutColor(wearColorScheme.onSecondaryContainer.toArgb()), + secondaryDim = LayoutColor(wearColorScheme.secondaryDim.toArgb()), + + tertiary = LayoutColor(wearColorScheme.tertiary.toArgb()), + onTertiary = LayoutColor(wearColorScheme.onTertiary.toArgb()), + tertiaryContainer = LayoutColor(wearColorScheme.tertiaryContainer.toArgb()), + onTertiaryContainer = LayoutColor(wearColorScheme.onTertiaryContainer.toArgb()), + tertiaryDim = LayoutColor(wearColorScheme.tertiaryDim.toArgb()), + + surfaceContainer = LayoutColor(wearColorScheme.surfaceContainer.toArgb()), + surfaceContainerHigh = LayoutColor(wearColorScheme.surfaceContainerHigh.toArgb()), + surfaceContainerLow = LayoutColor(wearColorScheme.surfaceContainerLow.toArgb()), + onSurface = LayoutColor(wearColorScheme.onSurface.toArgb()), + onSurfaceVariant = LayoutColor(wearColorScheme.onSurfaceVariant.toArgb()), + + outline = LayoutColor(wearColorScheme.outline.toArgb()), + outlineVariant = LayoutColor(wearColorScheme.outlineVariant.toArgb()), + + error = LayoutColor(wearColorScheme.error.toArgb()), + onError = LayoutColor(wearColorScheme.onError.toArgb()), + errorContainer = LayoutColor(wearColorScheme.errorContainer.toArgb()), + onErrorContainer = LayoutColor(wearColorScheme.onErrorContainer.toArgb()), + + errorDim = LayoutColor(wearColorScheme.errorDim.toArgb()), ) \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/tiles/tools/WearTilePreviewDevices.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/tiles/tools/WearTilePreviewDevices.kt new file mode 100644 index 00000000..af2a0803 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/ui/tiles/tools/WearTilePreviewDevices.kt @@ -0,0 +1,22 @@ +package com.thewizrd.simplewear.ui.tiles.tools + +import androidx.wear.tiles.tooling.preview.Preview +import androidx.wear.tooling.preview.devices.WearDevices + +@Preview( + device = WearDevices.LARGE_ROUND, + name = "Wear - Large Round" +) +@Preview( + device = WearDevices.SMALL_ROUND, + name = "Wear - Small Round" +) +@Preview( + device = WearDevices.SQUARE, + name = "Wear - Square" +) +@Preview( + device = WearDevices.RECT, + name = "Wear - Rect" +) +annotation class WearPreviewDevices \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearTilePreviewDevices.kt b/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearTilePreviewDevices.kt deleted file mode 100644 index b6fb3a84..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/ui/tools/WearTilePreviewDevices.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.thewizrd.simplewear.ui.tools - -import androidx.wear.tiles.tooling.preview.Preview -import androidx.wear.tooling.preview.devices.WearDevices - -@Preview( - device = WearDevices.LARGE_ROUND, - group = "Devices - Large Round" -) -@Preview( - device = WearDevices.SMALL_ROUND, - group = "Devices - Small Round" -) -@Preview( - device = WearDevices.SQUARE, - group = "Devices - Square" -) -@Preview( - device = WearDevices.SMALL_ROUND, - group = "Devices - Small Round", - fontScale = 1.5f -) -public annotation class WearTilePreviewDevices - -@Preview( - device = WearDevices.SMALL_ROUND, - group = "Devices - Small Round" -) -public annotation class WearSmallRoundDeviceTilePreview - -@Preview( - device = WearDevices.LARGE_ROUND, - group = "Devices - Large Round" -) -public annotation class WearLargeRoundDeviceTilePreview - -@Preview( - device = WearDevices.SQUARE, - group = "Devices - Square" -) -public annotation class WearSquareDeviceTilePreview \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt index 3d2607b4..4937e2c0 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/DashboardTileRenderer.kt @@ -2,9 +2,7 @@ package com.thewizrd.simplewear.wearable.tiles import android.content.ComponentName import android.content.Context -import androidx.core.content.ContextCompat import androidx.wear.protolayout.ActionBuilders -import androidx.wear.protolayout.ColorBuilders import androidx.wear.protolayout.DeviceParametersBuilders import androidx.wear.protolayout.DimensionBuilders.expand import androidx.wear.protolayout.LayoutElementBuilders @@ -15,10 +13,6 @@ import androidx.wear.protolayout.ResourceBuilders import androidx.wear.protolayout.StateBuilders import androidx.wear.protolayout.expression.AppDataKey import androidx.wear.protolayout.expression.DynamicDataBuilders -import androidx.wear.protolayout.material.CompactChip -import androidx.wear.protolayout.material.Text -import androidx.wear.protolayout.material.Typography -import androidx.wear.protolayout.material.layouts.PrimaryLayout import com.google.android.horologist.annotations.ExperimentalHorologistApi import com.google.android.horologist.tiles.images.drawableResToImageResource import com.google.android.horologist.tiles.render.SingleTileLayoutRendererWithState @@ -26,6 +20,7 @@ import com.thewizrd.shared_resources.utils.Logger import com.thewizrd.simplewear.PhoneSyncActivity import com.thewizrd.simplewear.R import com.thewizrd.simplewear.wearable.tiles.layouts.DashboardTileLayout +import com.thewizrd.simplewear.wearable.tiles.layouts.LoadingTileLayout @OptIn(ExperimentalHorologistApi::class) class DashboardTileRenderer(context: Context, debugResourceMode: Boolean = false) : @@ -35,6 +30,7 @@ class DashboardTileRenderer(context: Context, debugResourceMode: Boolean = false internal const val ID_OPENONPHONE = "open_on_phone" internal const val ID_PHONEDISCONNECTED = "phone_disconn" internal const val ID_BATTERY = "batt" + internal const val ID_BATTERY_CHARGING = "batt_chg" // Actions // VOLUME, MUSIC, SLEEPTIMER, APPS, PHONE, BRIGHTNESS unavailable @@ -99,33 +95,7 @@ class DashboardTileRenderer(context: Context, debugResourceMode: Boolean = false ) .addContent( if (state.isEmpty) { - PrimaryLayout.Builder(deviceParameters) - .setContent( - Text.Builder(context, context.getString(R.string.state_loading)) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) - ) - .setMultilineAlignment(LayoutElementBuilders.TEXT_ALIGN_CENTER) - .setMaxLines(1) - .build() - ) - .setPrimaryChipContent( - CompactChip.Builder( - context, - context.getString(R.string.action_refresh), - Clickable.Builder() - .setOnClick( - ActionBuilders.LoadAction.Builder().build() - ) - .build(), - deviceParameters - ) - .build() - ) - .build() + LoadingTileLayout(context, deviceParameters) } else { DashboardTileLayout(context, deviceParameters, state) } @@ -144,6 +114,7 @@ class DashboardTileRenderer(context: Context, debugResourceMode: Boolean = false ID_OPENONPHONE to R.drawable.common_full_open_on_phone, ID_PHONEDISCONNECTED to R.drawable.ic_phonelink_erase_white_24dp, ID_BATTERY to R.drawable.ic_battery_std_white_24dp, + ID_BATTERY_CHARGING to R.drawable.ic_battery_charging_white_24dp, ID_WIFI_ON to R.drawable.ic_network_wifi_white_24dp, ID_WIFI_OFF to R.drawable.ic_signal_wifi_off_white_24dp, diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt deleted file mode 100644 index e9418f21..00000000 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/TilePreviews.kt +++ /dev/null @@ -1,169 +0,0 @@ -@file:OptIn(ExperimentalHorologistApi::class) -@file:Suppress("FunctionName") - -package com.thewizrd.simplewear.wearable.tiles - -import android.content.Context -import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.toBitmapOrNull -import androidx.wear.tiles.tooling.preview.TilePreviewData -import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.compose.tools.tileRendererPreviewData -import com.thewizrd.shared_resources.actions.Actions -import com.thewizrd.shared_resources.actions.AudioStreamState -import com.thewizrd.shared_resources.actions.AudioStreamType -import com.thewizrd.shared_resources.actions.BatteryStatus -import com.thewizrd.shared_resources.actions.DNDChoice -import com.thewizrd.shared_resources.actions.MultiChoiceAction -import com.thewizrd.shared_resources.actions.NormalAction -import com.thewizrd.shared_resources.actions.RingerChoice -import com.thewizrd.shared_resources.actions.ToggleAction -import com.thewizrd.shared_resources.helpers.WearConnectionStatus -import com.thewizrd.shared_resources.media.PlaybackState -import com.thewizrd.shared_resources.media.PositionState -import com.thewizrd.shared_resources.utils.ImageUtils.toByteArray -import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.ui.tools.WearTilePreviewDevices -import kotlinx.coroutines.runBlocking - -@WearTilePreviewDevices -private fun DashboardTilePreview(context: Context) = tileRendererPreviewData( - renderer = DashboardTileRenderer(context, debugResourceMode = true), - tileState = DashboardTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) - ), - resourceState = Unit -) - -@WearTilePreviewDevices -private fun DashboardLoadingTilePreview(context: Context) = tileRendererPreviewData( - renderer = DashboardTileRenderer(context, debugResourceMode = true), - tileState = DashboardTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - batteryStatus = null, - actions = emptyMap() - ), - resourceState = Unit -) - -@WearTilePreviewDevices -private fun DashboardDisconnectTilePreview(context: Context) = tileRendererPreviewData( - renderer = DashboardTileRenderer(context, debugResourceMode = true), - tileState = DashboardTileState( - connectionStatus = WearConnectionStatus.DISCONNECTED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) - ), - resourceState = Unit -) - -@WearTilePreviewDevices -private fun DashboardNotInstalledTilePreview(context: Context) = tileRendererPreviewData( - renderer = DashboardTileRenderer(context, debugResourceMode = true), - tileState = DashboardTileState( - connectionStatus = WearConnectionStatus.APPNOTINSTALLED, - batteryStatus = BatteryStatus(100, true), - actions = mapOf( - Actions.WIFI to ToggleAction(Actions.WIFI, true), - Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), - Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), - Actions.DONOTDISTURB to MultiChoiceAction( - Actions.DONOTDISTURB, - DNDChoice.OFF.value - ), - Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), - Actions.TORCH to NormalAction(Actions.TORCH) - ) - ), - resourceState = Unit -) - -@WearTilePreviewDevices -private fun MediaPlayerTilePreview(context: Context): TilePreviewData { - val state = MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = "Title", - artist = "Artist", - playbackState = PlaybackState.PAUSED, - audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), - positionState = PositionState(100, 50), - artwork = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ws_full_sad)?.toBitmapOrNull() - ?.toByteArray() - }, - appIcon = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) - ?.toBitmapOrNull() - ?.toByteArray() - } - ) - - return tileRendererPreviewData( - renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), - tileState = state, - resourceState = state - ) -} - -@WearTilePreviewDevices -private fun MediaPlayerEmptyTilePreview(context: Context): TilePreviewData { - val state = MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = null, - artist = null, - playbackState = null, - audioStreamState = null, - artwork = null - ) - - return tileRendererPreviewData( - renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), - tileState = state, - resourceState = state - ) -} - -@WearTilePreviewDevices -private fun MediaPlayerNotPlayingTilePreview(context: Context): TilePreviewData { - val state = MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, - title = null, - artist = null, - playbackState = PlaybackState.NONE, - audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), - artwork = null, - appIcon = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) - ?.toBitmapOrNull() - ?.toByteArray() - } - ) - - return tileRendererPreviewData( - renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), - tileState = state, - resourceState = state, - ) -} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt index 74210b39..6b1b952a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt @@ -1,21 +1,22 @@ +@file:OptIn(ProtoLayoutExperimental::class) +@file:kotlin.OptIn(ExperimentalHorologistApi::class) +@file:Suppress("FunctionName") + package com.thewizrd.simplewear.wearable.tiles.layouts import android.content.Context -import android.graphics.Color import androidx.annotation.OptIn -import androidx.core.content.ContextCompat import androidx.wear.protolayout.ActionBuilders -import androidx.wear.protolayout.ColorBuilders import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters -import androidx.wear.protolayout.DimensionBuilders import androidx.wear.protolayout.DimensionBuilders.dp +import androidx.wear.protolayout.DimensionBuilders.expand import androidx.wear.protolayout.DimensionBuilders.sp +import androidx.wear.protolayout.LayoutElementBuilders.Column import androidx.wear.protolayout.LayoutElementBuilders.FONT_VARIANT_BODY import androidx.wear.protolayout.LayoutElementBuilders.FONT_WEIGHT_MEDIUM import androidx.wear.protolayout.LayoutElementBuilders.FontStyle import androidx.wear.protolayout.LayoutElementBuilders.HORIZONTAL_ALIGN_CENTER import androidx.wear.protolayout.LayoutElementBuilders.LayoutElement -import androidx.wear.protolayout.LayoutElementBuilders.Spacer import androidx.wear.protolayout.LayoutElementBuilders.SpanImage import androidx.wear.protolayout.LayoutElementBuilders.SpanText import androidx.wear.protolayout.LayoutElementBuilders.Spannable @@ -27,25 +28,38 @@ import androidx.wear.protolayout.expression.AppDataKey import androidx.wear.protolayout.expression.DynamicBuilders import androidx.wear.protolayout.expression.DynamicDataBuilders import androidx.wear.protolayout.expression.ProtoLayoutExperimental -import androidx.wear.protolayout.material.Button -import androidx.wear.protolayout.material.ButtonColors -import androidx.wear.protolayout.material.ChipColors -import androidx.wear.protolayout.material.Colors -import androidx.wear.protolayout.material.CompactChip -import androidx.wear.protolayout.material.Text -import androidx.wear.protolayout.material.Typography -import androidx.wear.protolayout.material.layouts.MultiButtonLayout -import androidx.wear.protolayout.material.layouts.MultiButtonLayout.FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY -import androidx.wear.protolayout.material.layouts.PrimaryLayout +import androidx.wear.protolayout.material3.ButtonDefaults.filledTonalButtonColors +import androidx.wear.protolayout.material3.ButtonGroupDefaults.DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS +import androidx.wear.protolayout.material3.MaterialScope +import androidx.wear.protolayout.material3.buttonGroup +import androidx.wear.protolayout.material3.icon +import androidx.wear.protolayout.material3.iconButton +import androidx.wear.protolayout.material3.iconEdgeButton +import androidx.wear.protolayout.material3.materialScope +import androidx.wear.protolayout.material3.primaryLayout +import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.modifiers.LayoutModifier +import androidx.wear.protolayout.modifiers.clickable +import androidx.wear.protolayout.modifiers.contentDescription +import androidx.wear.protolayout.types.LayoutColor +import androidx.wear.protolayout.types.layoutString +import com.google.android.horologist.annotations.ExperimentalHorologistApi +import com.google.android.horologist.compose.tools.tileRendererPreviewData import com.thewizrd.shared_resources.actions.Actions +import com.thewizrd.shared_resources.actions.BatteryStatus import com.thewizrd.shared_resources.actions.DNDChoice import com.thewizrd.shared_resources.actions.LocationState import com.thewizrd.shared_resources.actions.MultiChoiceAction +import com.thewizrd.shared_resources.actions.NormalAction import com.thewizrd.shared_resources.actions.RingerChoice import com.thewizrd.shared_resources.actions.ToggleAction import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.ui.theme.wearTileColorScheme +import com.thewizrd.simplewear.ui.tiles.tools.WearPreviewDevices +import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID_BATTERY +import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID_BATTERY_CHARGING import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID_BT_OFF import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID_BT_ON import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID_DATA_OFF @@ -71,94 +85,76 @@ import com.thewizrd.simplewear.wearable.tiles.DashboardTileRenderer.Companion.ID import com.thewizrd.simplewear.wearable.tiles.DashboardTileState import java.util.Locale -private val CIRCLE_SIZE = dp(48f) -private val SMALL_CIRCLE_SIZE = dp(40f) - -private val ICON_SIZE = dp(24f) -private val SMALL_ICON_SIZE = dp(20f) - -private val COLORS = Colors( - 0xff91cfff.toInt(), 0xff000000.toInt(), - 0xff202124.toInt(), 0xffffffff.toInt() -) - -@OptIn(ProtoLayoutExperimental::class) internal fun DashboardTileLayout( context: Context, deviceParameters: DeviceParameters, state: DashboardTileState -): LayoutElement { - return if (state.connectionStatus != WearConnectionStatus.CONNECTED) { - PrimaryLayout.Builder(deviceParameters) - .apply { - when (state.connectionStatus) { - WearConnectionStatus.APPNOTINSTALLED -> { - setContent( - Text.Builder(context, context.getString(R.string.error_notinstalled)) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) - ) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setMaxLines(3) - .build() - ) - - setPrimaryChipContent( - IconButton( - context, - ID_OPENONPHONE, - context.getString(R.string.common_open_on_phone), - Clickable.Builder() +): LayoutElement = + materialScope(context, deviceParameters, defaultColorScheme = wearTileColorScheme) { + if (state.connectionStatus != WearConnectionStatus.CONNECTED) { + when (state.connectionStatus) { + WearConnectionStatus.APPNOTINSTALLED -> { + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.error_notinstalled).layoutString, + color = colorScheme.secondary, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 + ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.common_open_on_phone)), + onClick = Clickable.Builder() .setId(ID_OPENONPHONE) .setOnClick( ActionBuilders.LoadAction.Builder() .build() ) .build(), - size = SMALL_CIRCLE_SIZE, - iconSize = SMALL_ICON_SIZE + iconContent = { + icon(ID_OPENONPHONE) + } ) - ) - } - - else -> { - setContent( - Text.Builder(context, context.getString(R.string.status_disconnected)) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) - ) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setMaxLines(3) - .build() - ) + } + ) + } - setPrimaryChipContent( - IconButton( - context, - resourceId = ID_PHONEDISCONNECTED, - contentDescription = context.getString(R.string.status_disconnected), - size = SMALL_CIRCLE_SIZE, - iconSize = SMALL_ICON_SIZE + else -> { + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.status_disconnected).layoutString, + color = colorScheme.secondary, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.status_disconnected)), + onClick = Clickable.Builder().build(), + iconContent = { + icon(ID_PHONEDISCONNECTED) + } ) } + ) } } - .build() } else { - return PrimaryLayout.Builder(deviceParameters) - .setPrimaryLabelTextContent( - if (state.showBatteryStatus) { + primaryLayout( + titleSlot = state.takeIf { it.showBatteryStatus }?.let { state -> + { Spannable.Builder() .addSpan( SpanImage.Builder() - .setResourceId(ID_BATTERY) + .setResourceId( + state.batteryStatus?.let { status -> + if (status.isCharging) ID_BATTERY_CHARGING else ID_BATTERY + } ?: ID_BATTERY + ) .setWidth(dp(16f)) .setHeight(dp(16f)) .build() @@ -192,55 +188,46 @@ internal fun DashboardTileLayout( .setMultilineAlignment(HORIZONTAL_ALIGN_CENTER) .setOverflow(TEXT_OVERFLOW_MARQUEE) .build() - } else { - Spacer.Builder().build() } - ) - .setContent( - MultiButtonLayout.Builder() - .setFiveButtonDistribution(FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY) + }, + mainSlot = { + Column.Builder() + .setWidth(expand()) + .setHeight(expand()) .apply { - state.actions.forEach { (actionType, _) -> - addButtonContent( - ActionButton(context, deviceParameters, state, actionType) + val chunks = state.actions.toList().chunked(3) + chunks.forEachIndexed { index, chunk -> + addContent( + buttonGroup { + chunk.forEach { (actionType, _) -> + buttonGroupItem { + ActionButton(state, actionType) + } + } + } ) + + if (index < chunks.size - 1) { + addContent(DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS) + } } } - .build() + .build() + } ) - .build() - } -} - -private fun IconButton( - context: Context, - resourceId: String, - contentDescription: String = "", - clickable: Clickable = Clickable.Builder().build(), - size: DimensionBuilders.DpProp? = CIRCLE_SIZE, - iconSize: DimensionBuilders.DpProp = ICON_SIZE -) = Button.Builder(context, clickable) - .setContentDescription(contentDescription) - .setButtonColors(ButtonColors.primaryButtonColors(COLORS)) - .setIconContent(resourceId, iconSize) - .apply { - if (size != null) { - setSize(size) } } - .build() -private fun ActionButton( - context: Context, - deviceParameters: DeviceParameters, +private fun MaterialScope.ActionButton( state: DashboardTileState, action: Actions -) = Button.Builder( - context, - Clickable.Builder() - .setId(action.name) - .setOnClick( - ActionBuilders.LoadAction.Builder() +): LayoutElement { + val isEnabled = state.isActionEnabled(action) + + return iconButton( + onClick = clickable( + id = action.name, + action = ActionBuilders.LoadAction.Builder() .setRequestState( StateBuilders.State.Builder() .addKeyToValueMapping( @@ -252,53 +239,44 @@ private fun ActionButton( .build() ) .build() - ) - .build() -) - .setButtonColors( - ButtonColors( - ColorBuilders.ColorProp.Builder( - ContextCompat.getColor(context, R.color.buttonDisabled) + ), + width = expand(), + height = expand(), + iconContent = { + icon(protoLayoutResourceId = getResourceIdForAction(state, action)) + }, + colors = filledTonalButtonColors().copy( + containerColor = LayoutColor( + staticArgb = if (isEnabled) { + colorScheme.primaryContainer.staticArgb + } else { + colorScheme.surfaceContainer.staticArgb + }, + dynamicArgb = DynamicBuilders.DynamicColor + .onCondition( + DynamicBuilders.DynamicBool.from(AppDataKey(action.name)) + ) + .use(colorScheme.primaryContainer.staticArgb) + .elseUse(colorScheme.surfaceContainer.staticArgb) + .animate() + ), + iconColor = LayoutColor( + staticArgb = if (isEnabled) { + colorScheme.onPrimaryContainer.staticArgb + } else { + colorScheme.onSurface.staticArgb + }, + dynamicArgb = DynamicBuilders.DynamicColor + .onCondition( + DynamicBuilders.DynamicBool.from(AppDataKey(action.name)) + ) + .use(colorScheme.onPrimaryContainer.staticArgb) + .elseUse(colorScheme.onSurface.staticArgb) + .animate() ) - .setDynamicValue( - DynamicBuilders.DynamicColor - .onCondition( - DynamicBuilders.DynamicBool.from(AppDataKey(action.name)) - ) - .use(ContextCompat.getColor(context, R.color.colorPrimary)) - .elseUse(ContextCompat.getColor(context, R.color.buttonDisabled)) - .animate() - ) - .build(), - ColorBuilders.argb(Color.WHITE) ) ) - .apply { - val isSmol = - minOf(deviceParameters.screenHeightDp, deviceParameters.screenWidthDp) <= 192f - setIconContent( - getResourceIdForAction(state, action), - if (isSmol) SMALL_ICON_SIZE else ICON_SIZE - ) - setSize(if (isSmol) SMALL_CIRCLE_SIZE else CIRCLE_SIZE) - } - .build() - -private fun CompactChipButton( - context: Context, - deviceParameters: DeviceParameters, - text: String, - iconResourceId: String? = null, - clickable: Clickable = Clickable.Builder().build() -) = CompactChip.Builder( - context, text, clickable, deviceParameters -).setChipColors( - ChipColors.primaryChipColors(COLORS) -).apply { - if (iconResourceId != null) { - setIconContent(iconResourceId) - } -}.build() +} private fun getResourceIdForAction(state: DashboardTileState, action: Actions): String { return when (action) { @@ -370,4 +348,78 @@ private fun getResourceIdForAction(state: DashboardTileState, action: Actions): Actions.HOTSPOT -> ID_HOTSPOT else -> "" } -} \ No newline at end of file +} + +@WearPreviewDevices +private fun DashboardTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) + ) + ), + resourceState = Unit +) + +@WearPreviewDevices +private fun DashboardLoadingTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + batteryStatus = null, + actions = emptyMap() + ), + resourceState = Unit +) + +@WearPreviewDevices +private fun DashboardDisconnectTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.DISCONNECTED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) + ) + ), + resourceState = Unit +) + +@WearPreviewDevices +private fun DashboardNotInstalledTilePreview(context: Context) = tileRendererPreviewData( + renderer = DashboardTileRenderer(context, debugResourceMode = true), + tileState = DashboardTileState( + connectionStatus = WearConnectionStatus.APPNOTINSTALLED, + batteryStatus = BatteryStatus(100, true), + actions = mapOf( + Actions.WIFI to ToggleAction(Actions.WIFI, true), + Actions.BLUETOOTH to ToggleAction(Actions.BLUETOOTH, true), + Actions.LOCKSCREEN to NormalAction(Actions.LOCKSCREEN), + Actions.DONOTDISTURB to MultiChoiceAction( + Actions.DONOTDISTURB, + DNDChoice.OFF.value + ), + Actions.RINGER to MultiChoiceAction(Actions.RINGER, RingerChoice.VIBRATION.value), + Actions.TORCH to NormalAction(Actions.TORCH) + ) + ), + resourceState = Unit +) \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt new file mode 100644 index 00000000..8e6c31af --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt @@ -0,0 +1,51 @@ +package com.thewizrd.simplewear.wearable.tiles.layouts + +import android.content.Context +import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters +import androidx.wear.protolayout.LayoutElementBuilders.LayoutElement +import androidx.wear.protolayout.LayoutElementBuilders.TEXT_ALIGN_CENTER +import androidx.wear.protolayout.material3.materialScope +import androidx.wear.protolayout.material3.primaryLayout +import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textEdgeButton +import androidx.wear.protolayout.modifiers.clickable +import androidx.wear.protolayout.modifiers.loadAction +import androidx.wear.protolayout.types.layoutString +import androidx.wear.tiles.tooling.preview.TilePreviewData +import androidx.wear.tiles.tooling.preview.TilePreviewHelper +import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.ui.theme.wearTileColorScheme +import com.thewizrd.simplewear.ui.tiles.tools.WearPreviewDevices + +internal fun LoadingTileLayout( + context: Context, + deviceParameters: DeviceParameters +): LayoutElement = + materialScope(context, deviceParameters, defaultColorScheme = wearTileColorScheme) { + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.state_loading).layoutString, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 + ) + }, + bottomSlot = { + textEdgeButton( + onClick = clickable(loadAction()), + labelContent = { + text(context.getString(R.string.action_refresh).layoutString) + } + ) + } + ) + } + +@WearPreviewDevices +private fun LoadingTilePreview(context: Context) = TilePreviewData( + onTileRequest = { request -> + TilePreviewHelper.singleTimelineEntryTileBuilder( + LoadingTileLayout(context, request.deviceConfiguration) + ).build() + } +) \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt index d47d14d8..068c0401 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt @@ -1,19 +1,24 @@ +@file:OptIn(ProtoLayoutExperimental::class) +@file:kotlin.OptIn(ExperimentalHorologistApi::class) +@file:Suppress("FunctionName") + package com.thewizrd.simplewear.wearable.tiles.layouts +import android.annotation.SuppressLint import android.content.Context -import android.graphics.Color import androidx.annotation.OptIn import androidx.core.content.ContextCompat +import androidx.core.graphics.ColorUtils import androidx.core.graphics.drawable.toBitmapOrNull import androidx.wear.protolayout.ActionBuilders -import androidx.wear.protolayout.ColorBuilders import androidx.wear.protolayout.ColorBuilders.ColorProp import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters import androidx.wear.protolayout.DeviceParametersBuilders.SCREEN_SHAPE_ROUND import androidx.wear.protolayout.DimensionBuilders +import androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp import androidx.wear.protolayout.DimensionBuilders.dp import androidx.wear.protolayout.DimensionBuilders.expand -import androidx.wear.protolayout.DimensionBuilders.wrap +import androidx.wear.protolayout.DimensionBuilders.weight import androidx.wear.protolayout.LayoutElementBuilders.Box import androidx.wear.protolayout.LayoutElementBuilders.CONTENT_SCALE_MODE_FIT import androidx.wear.protolayout.LayoutElementBuilders.Column @@ -24,34 +29,47 @@ import androidx.wear.protolayout.LayoutElementBuilders.Row import androidx.wear.protolayout.LayoutElementBuilders.Spacer import androidx.wear.protolayout.LayoutElementBuilders.TEXT_ALIGN_CENTER import androidx.wear.protolayout.LayoutElementBuilders.TEXT_OVERFLOW_MARQUEE +import androidx.wear.protolayout.LayoutElementBuilders.VERTICAL_ALIGN_BOTTOM import androidx.wear.protolayout.LayoutElementBuilders.VERTICAL_ALIGN_CENTER +import androidx.wear.protolayout.LayoutElementBuilders.VERTICAL_ALIGN_TOP import androidx.wear.protolayout.ModifiersBuilders.Background import androidx.wear.protolayout.ModifiersBuilders.Clickable import androidx.wear.protolayout.ModifiersBuilders.Corner import androidx.wear.protolayout.ModifiersBuilders.Modifiers import androidx.wear.protolayout.ModifiersBuilders.Padding -import androidx.wear.protolayout.TypeBuilders.FloatProp import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant import androidx.wear.protolayout.expression.ProtoLayoutExperimental -import androidx.wear.protolayout.material.Button -import androidx.wear.protolayout.material.ButtonColors -import androidx.wear.protolayout.material.CircularProgressIndicator -import androidx.wear.protolayout.material.Colors -import androidx.wear.protolayout.material.CompactChip -import androidx.wear.protolayout.material.ProgressIndicatorColors -import androidx.wear.protolayout.material.Text -import androidx.wear.protolayout.material.Typography -import androidx.wear.protolayout.material.layouts.MultiSlotLayout -import androidx.wear.protolayout.material.layouts.PrimaryLayout +import androidx.wear.protolayout.material3.MaterialScope +import androidx.wear.protolayout.material3.ProgressIndicatorColors +import androidx.wear.protolayout.material3.Typography.BODY_MEDIUM +import androidx.wear.protolayout.material3.Typography.TITLE_MEDIUM +import androidx.wear.protolayout.material3.buttonGroup +import androidx.wear.protolayout.material3.circularProgressIndicator +import androidx.wear.protolayout.material3.icon +import androidx.wear.protolayout.material3.iconButton +import androidx.wear.protolayout.material3.iconEdgeButton +import androidx.wear.protolayout.material3.materialScope +import androidx.wear.protolayout.material3.primaryLayout +import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textEdgeButton +import androidx.wear.protolayout.modifiers.LayoutModifier +import androidx.wear.protolayout.modifiers.clickable +import androidx.wear.protolayout.modifiers.contentDescription +import androidx.wear.protolayout.modifiers.padding +import androidx.wear.protolayout.types.layoutString import androidx.wear.tiles.tooling.preview.TilePreviewData +import com.google.android.horologist.annotations.ExperimentalHorologistApi +import com.google.android.horologist.compose.tools.tileRendererPreviewData import com.thewizrd.shared_resources.actions.AudioStreamState import com.thewizrd.shared_resources.actions.AudioStreamType import com.thewizrd.shared_resources.helpers.WearConnectionStatus import com.thewizrd.shared_resources.media.PlaybackState +import com.thewizrd.shared_resources.media.PositionState import com.thewizrd.shared_resources.utils.ImageUtils.toByteArray import com.thewizrd.simplewear.R -import com.thewizrd.simplewear.ui.tools.WearTilePreviewDevices +import com.thewizrd.simplewear.ui.theme.wearTileColorScheme +import com.thewizrd.simplewear.ui.tiles.tools.WearPreviewDevices import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileMessenger.PlayerAction import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileRenderer import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileRenderer.Companion.ID_APPICON @@ -67,120 +85,90 @@ import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileRenderer.Companion. import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileState import kotlinx.coroutines.runBlocking import java.time.Instant +import kotlin.math.ceil +import kotlin.math.max -private val CIRCLE_SIZE = dp(48f) -private val SMALL_CIRCLE_SIZE = dp(40f) - -private val ICON_SIZE = dp(24f) -private val SMALL_ICON_SIZE = dp(20f) - -private val COLORS = Colors( - 0xff91cfff.toInt(), 0xff000000.toInt(), - 0xff202124.toInt(), 0xffffffff.toInt() -) - +@SuppressLint("ProtoLayoutPrimaryLayoutResponsive") @OptIn(ProtoLayoutExperimental::class) internal fun MediaPlayerTileLayout( context: Context, deviceParameters: DeviceParameters, state: MediaPlayerTileState -): LayoutElement { - return if (state.connectionStatus != WearConnectionStatus.CONNECTED) { - PrimaryLayout.Builder(deviceParameters) - .apply { - when (state.connectionStatus) { - WearConnectionStatus.APPNOTINSTALLED -> { - setContent( - Text.Builder(context, context.getString(R.string.error_notinstalled)) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) - ) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setMaxLines(3) - .build() - ) - - setPrimaryChipContent( - IconButton( - context, - ID_OPENONPHONE, - context.getString(R.string.common_open_on_phone), - Clickable.Builder() +): LayoutElement = + materialScope(context, deviceParameters, defaultColorScheme = wearTileColorScheme) { + if (state.connectionStatus != WearConnectionStatus.CONNECTED) { + when (state.connectionStatus) { + WearConnectionStatus.APPNOTINSTALLED -> { + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.error_notinstalled).layoutString, + color = colorScheme.secondary, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 + ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.common_open_on_phone)), + onClick = Clickable.Builder() .setId(ID_OPENONPHONE) .setOnClick( ActionBuilders.LoadAction.Builder() .build() ) .build(), - size = SMALL_CIRCLE_SIZE, - iconSize = SMALL_ICON_SIZE + iconContent = { + icon(ID_OPENONPHONE) + } ) - ) - } - - else -> { - setContent( - Text.Builder(context, context.getString(R.string.status_disconnected)) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) - ) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setMaxLines(3) - .build() - ) + } + ) + } - setPrimaryChipContent( - IconButton( - context, - resourceId = ID_PHONEDISCONNECTED, - contentDescription = context.getString(R.string.status_disconnected), - size = SMALL_CIRCLE_SIZE, - iconSize = SMALL_ICON_SIZE + else -> { + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.status_disconnected).layoutString, + color = colorScheme.secondary, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.status_disconnected)), + onClick = Clickable.Builder().build(), + iconContent = { + icon(ID_PHONEDISCONNECTED) + } ) } + ) } } - .build() } else if (state.isEmpty || state.playbackState == null || state.playbackState == PlaybackState.NONE) { - return PrimaryLayout.Builder(deviceParameters) - .setContent( - Text.Builder(context, context.getString(R.string.message_playback_stopped)) - .setMaxLines(1) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setOverflow(TEXT_OVERFLOW_MARQUEE) - .setTypography(Typography.TYPOGRAPHY_CAPTION1) - .setColor( - ColorBuilders.argb( - ContextCompat.getColor(context, R.color.colorSecondary) - ) + primaryLayout( + mainSlot = { + text( + text = context.getString(R.string.message_playback_stopped).layoutString, + color = colorScheme.secondary, + alignment = TEXT_ALIGN_CENTER, + maxLines = 3 ) - .build() - ) - .setPrimaryChipContent( - CompactChip.Builder( - context, - context.getString(R.string.action_play), - Clickable.Builder() - .setId(PlayerAction.PLAY.name) - .setOnClick( - ActionBuilders.LoadAction.Builder() - .build() - ) - .build(), - deviceParameters - ) - .build() + }, + bottomSlot = { + textEdgeButton( + onClick = clickable(id = PlayerAction.PLAY.name), + labelContent = { + text(context.getString(R.string.action_play).layoutString) + } + ) + } ) - .build() } else { - return Box.Builder() + Box.Builder() .setWidth(expand()) .setHeight(expand()) .addContent( @@ -208,228 +196,243 @@ internal fun MediaPlayerTileLayout( .build() ) .addContent( - PrimaryLayout.Builder(deviceParameters) - .setPrimaryLabelTextContent( - Column.Builder() + Column.Builder() + .setWidth(expand()) + .setHeight(expand()) + .addContent( + Box.Builder() .setWidth(expand()) + .setHeight( + WrappedDimensionProp.Builder() + .apply { + if (deviceParameters.isLargeHeight()) { + setMinimumSize(dp(0f)) + } else { + setMinimumSize(dp(68f)) + } + } + .build() + ) .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) - .apply { - val isRound = - deviceParameters.screenShape == SCREEN_SHAPE_ROUND - - if (!state.title.isNullOrBlank()) { - addContent( - Text.Builder(context, state.title) - .setTypography(Typography.TYPOGRAPHY_BUTTON) - .setColor( - ColorProp.Builder(Color.WHITE) - .build() - ) - .setMaxLines(1) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setOverflow(TEXT_OVERFLOW_MARQUEE) - .setModifiers( - Modifiers.Builder() - .setPadding( - Padding.Builder() - .setTop(dp(2f)) - .setBottom(dp(0.8f)) - .setStart( - if (isRound) dp(32f) else dp( - 8f - ) - ) - .setEnd( - if (isRound) dp(32f) else dp( - 8f - ) - ) - .build() - ) - .build() - ) - .build() + .setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) + .setModifiers( + Modifiers.Builder() + .setPadding( + padding( + top = deviceParameters.getScreenSizeInDpFromPercentage( + if (deviceParameters.isLargeHeight()) { + 13.2f + } else { + 12f + } + ), + bottom = deviceParameters.getScreenSizeInDpFromPercentage( + if (deviceParameters.isLargeHeight()) { + 6f + } else { + 2f + } + ), + ) ) - } - - if (!state.artist.isNullOrBlank()) { - addContent( - Text.Builder(context, state.artist) - .setTypography(Typography.TYPOGRAPHY_BODY2) - .setColor( - ColorProp.Builder(Color.WHITE).build() - ) - .setMaxLines(1) - .setMultilineAlignment(TEXT_ALIGN_CENTER) - .setOverflow(TEXT_OVERFLOW_MARQUEE) - .setModifiers( - Modifiers.Builder() - .setPadding( - Padding.Builder() - .setTop(dp(2f)) - .setBottom(dp(0.6f)) - .setStart( - if (isRound) dp(32f) else dp( - 8f - ) - ) - .setEnd( - if (isRound) dp(32f) else dp( - 8f - ) + .build() + ) + .addContent( + Column.Builder() + .setHeight(dp(38f)) + .apply { + if (!state.title.isNullOrBlank()) { + addContent( + Box.Builder() + .setWidth( + dp( + deviceParameters.getScreenWidthInDpFromPercentage( + 66.72f ) - .build() + ) + ) + .setHeight(dp(20f)) + .setHorizontalAlignment( + HORIZONTAL_ALIGN_CENTER + ) + .addContent( + text( + text = state.title.layoutString, + maxLines = 1, + alignment = TEXT_ALIGN_CENTER, + overflow = TEXT_OVERFLOW_MARQUEE, + typography = TITLE_MEDIUM, + color = colorScheme.onSurface + ) ) .build() ) - .build() - ) - } - } - .build() - ) - .setContent( - MultiSlotLayout.Builder() - .addSlotContent( - PlayerButton(deviceParameters, PlayerAction.PREVIOUS) - ) - .apply { - val playerButtonContent = - if (state.playbackState != PlaybackState.PLAYING) { - PlayerButton(deviceParameters, PlayerAction.PLAY) - } else { - PlayerButton(deviceParameters, PlayerAction.PAUSE) - } + } - addSlotContent( - if (deviceParameters.supportsDynamicValue() && state.positionState != null) { - val actualPercent = - state.positionState.currentPositionMs.toFloat() / state.positionState.durationMs.toFloat() - - Box.Builder() - .setWidth(dp(56f)) - .setHeight(dp(56f)) - .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) - .setVerticalAlignment(VERTICAL_ALIGN_CENTER) - .addContent(playerButtonContent) - .addContent( - CircularProgressIndicator.Builder() - .setStartAngle(0f) - .setEndAngle(360f) - .setCircularProgressIndicatorColors( - ProgressIndicatorColors( - Colors.DEFAULT.primary, - 0x25FFFFFF.toInt() + if (!state.artist.isNullOrBlank()) { + addContent( + Box.Builder() + .setWidth( + dp( + deviceConfiguration.getScreenWidthInDpFromPercentage( + if (deviceConfiguration.isLargeWidth()) { + 71f + } else { + 75f + } + ) ) ) - .setStrokeWidth(dp(3f)) - .setOuterMarginApplied(false) - .setProgress( - FloatProp.Builder(actualPercent) - .apply { - if (state.playbackState == PlaybackState.PLAYING) { - val durationFloat = - state.positionState.durationMs.toFloat() / 1000f - - val positionFractional = - DynamicInstant.withSecondsPrecision( - Instant.ofEpochMilli( - state.positionState.currentTimeMs - ) - ).durationUntil( - DynamicInstant.platformTimeWithSecondsPrecision() - ) - .toIntSeconds() - .asFloat() - .times(state.positionState.playbackSpeed) - .plus(state.positionState.currentPositionMs.toFloat() / 1000f) - - val predictedPercent = - DynamicFloat.onCondition( - positionFractional.gt( - durationFloat - ) - ) - .use( - durationFloat - ) - .elseUse( - positionFractional - ) - .div( - durationFloat - ) - - setDynamicValue( - DynamicFloat.onCondition( - predictedPercent.gt( - 0f - ) - ) - .use( - predictedPercent - ) - .elseUse(0f) - .animate() - ) - } - } - .build() + .setHeight(dp(18f)) + .setHorizontalAlignment( + HORIZONTAL_ALIGN_CENTER + ) + .addContent( + text( + text = state.artist.layoutString, + maxLines = 1, + alignment = TEXT_ALIGN_CENTER, + overflow = TEXT_OVERFLOW_MARQUEE, + typography = BODY_MEDIUM, + color = colorScheme.onSurface + ) ) .build() ) - .build() - } else { - playerButtonContent + } } - ) - } - .addSlotContent( - PlayerButton(deviceParameters, PlayerAction.NEXT) + .build() ) .build() ) - .setPrimaryChipContent( - Row.Builder() - .setWidth(wrap()) - .setHeight(wrap()) - .setVerticalAlignment(VERTICAL_ALIGN_CENTER) - .addContent( - VolumeButton(PlayerAction.VOL_DOWN) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight( + WrappedDimensionProp.Builder() + .apply { + if (deviceParameters.isLargeHeight()) { + setMinimumSize(dp(80f)) + } else { + setMinimumSize(dp(64f)) + } + } + .build() ) - .apply { - if (state.appIcon != null) { - addContent( - Spacer.Builder() - .setWidth(dp(12f)) - .build() - ) - addContent( - Image.Builder() - .setResourceId(ID_APPICON) - .setWidth(dp(24f)) - .setHeight(dp(24f)) - .setContentScaleMode(CONTENT_SCALE_MODE_FIT) - .build() - ) - addContent( - Spacer.Builder() - .setWidth(dp(12f)) - .build() - ) - } else { - addContent( - Spacer.Builder() - .setWidth(dp(24f)) - .build() - ) - } - } .addContent( - VolumeButton(PlayerAction.VOL_UP) + buttonGroup( + height = middleButtonSize(), + width = expand(), + spacing = 0f + ) { + buttonGroupItem { + PlayerButton(action = PlayerAction.PREVIOUS) + } + + buttonGroupItem { + PlayPauseButton(state) + } + + buttonGroupItem { + PlayerButton(action = PlayerAction.NEXT) + } + } ) .build() ) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight(weight(1f)) + .addContent(SettingsButtonLayout(state)) + .build() + ) + .build() + ) + .build() + ) + .build() + } + } + +private fun MaterialScope.SettingsButtonLayout( + state: MediaPlayerTileState +): LayoutElement { + return if (deviceConfiguration.screenShape == SCREEN_SHAPE_ROUND) { + val isLargeWidth = deviceConfiguration.isLargeWidth() + val horizontalSpacerPercentage = if (isLargeWidth) 11f else 14.5f + + Box.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) + .addContent( + Row.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .setModifiers( + Modifiers.Builder() + .setPadding( + padding( + bottom = deviceConfiguration.getScreenSizeInDpFromPercentage( + 1.2f + ) + ) + ) + .build() + ) + .addContent( + Spacer.Builder() + .setWidth( + dp( + deviceConfiguration.getScreenWidthInDpFromPercentage( + horizontalSpacerPercentage + ) + ) + ) + .build() + ) + .addContent(VolumeButton(PlayerAction.VOL_DOWN)) + .addContent(BrandIcon(ID_APPICON)) + .addContent(VolumeButton(PlayerAction.VOL_UP)) + .addContent( + Spacer.Builder() + .setWidth( + dp( + deviceConfiguration.getScreenWidthInDpFromPercentage( + horizontalSpacerPercentage + ) + ) + ) + .build() + ) + .build() + ) + .build() + } else { + Box.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) + .addContent( + Row.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .addContent( + Spacer.Builder() + .setWidth(dp(deviceConfiguration.getScreenWidthInDpFromPercentage(11f))) + .build() + ) + .addContent(VolumeButton(PlayerAction.VOL_DOWN)) + .addContent(BrandIcon(ID_APPICON)) + .addContent(VolumeButton(PlayerAction.VOL_UP)) + .addContent( + Spacer.Builder() + .setWidth(dp(deviceConfiguration.getScreenWidthInDpFromPercentage(11f))) .build() ) .build() @@ -438,117 +441,294 @@ internal fun MediaPlayerTileLayout( } } -private fun PlayerButton( - deviceParameters: DeviceParameters, +private fun MaterialScope.middleButtonSize(): DimensionBuilders.DpProp = + if (deviceConfiguration.isLargeHeight()) { + dp(80f) + } else { + dp(64f) + } + +private fun MaterialScope.getSideButtonsPadding( + isLeftButton: Boolean +): Padding { + val isLargeScreen = deviceConfiguration.isLargeHeight() + + val buttonGroupSpacingPct = if (isLargeScreen) { + 3f + } else { + 5.2f + } + + val adj = if (deviceConfiguration.screenShape == SCREEN_SHAPE_ROUND) { + 0f + } else { + if (deviceConfiguration.isLargeWidth()) 2f else 4f + } + + return padding( + start = max( + if (isLeftButton) { + deviceConfiguration.getScreenSizeInDpFromPercentage(7.1f) + } else { + deviceConfiguration.getScreenSizeInDpFromPercentage(buttonGroupSpacingPct) + } - adj, + 0f + ), + end = max( + if (!isLeftButton) { + deviceConfiguration.getScreenSizeInDpFromPercentage(7.1f) + } else { + deviceConfiguration.getScreenSizeInDpFromPercentage(buttonGroupSpacingPct) + } - adj, + 0f + ), + top = deviceConfiguration.getScreenSizeInDpFromPercentage( + if (isLargeScreen) { + 5.2f + } else { + 4.16f + } + ), + bottom = deviceConfiguration.getScreenSizeInDpFromPercentage( + if (isLargeScreen) { + 5.2f + } else { + 4.16f + } + ), + rtlAware = false + ) +} + +private fun DeviceParameters.getScreenSizeInDpFromPercentage( + percent: Float +): Float { + return ceil(screenHeightDp * percent / 100f) +} + +private fun DeviceParameters.getScreenWidthInDpFromPercentage( + percent: Float +): Float { + return ceil(screenWidthDp * percent / 100f) +} + +private fun MaterialScope.PlayerButton( action: PlayerAction ): LayoutElement { - val isPlayPause = action == PlayerAction.PAUSE || action == PlayerAction.PLAY - val size = dp(50f) + val buttonPadding = getSideButtonsPadding( + isLeftButton = action == PlayerAction.PREVIOUS + ) + return Box.Builder() - .setHeight(size) - .setWidth(size) .setModifiers( Modifiers.Builder() - .setBackground( - Background.Builder() - .setColor( - ColorProp.Builder( - if (isPlayPause) { - 0x19FFFFFF - } else { - Color.TRANSPARENT - } - ).build() - ) - .setCorner( - Corner.Builder() - .setRadius(size) - .build() - ) - .build() - ) - .setClickable( - Clickable.Builder() - .setId(action.name) - .setOnClick( - ActionBuilders.LoadAction.Builder() - .build() - ) - .build() - ) + .setPadding(buttonPadding) .build() ) - .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) - .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .setWidth(expand()) + .setHeight(expand()) .addContent( - Image.Builder() - .setWidth(dp(32f)) - .setHeight(dp(32f)) - .setResourceId(getResourceIdForPlayerAction(action)) - .setContentScaleMode(CONTENT_SCALE_MODE_FIT) + iconButton( + onClick = clickable(id = action.name), + width = expand(), + height = expand(), + iconContent = { + icon(getResourceIdForPlayerAction(action)) + } + ) + ) + .build() +} + +private fun MaterialScope.PlayPauseButton( + state: MediaPlayerTileState +): LayoutElement { + val middleButtonSize = middleButtonSize() + + val action = if (state.playbackState != PlaybackState.PLAYING) { + PlayerAction.PLAY + } else { + PlayerAction.PAUSE + } + + val contentSize = if (deviceConfiguration.isLargeHeight()) { + 80f + } else { + 64f + } + + val playerButtonContent = Box.Builder() + .setModifiers( + Modifiers.Builder() .build() ) + .addContent( + iconButton( + onClick = clickable(id = action.name), + width = dp(middleButtonSize.value - 14f), + height = dp(middleButtonSize.value - 14f), + iconContent = { + icon(getResourceIdForPlayerAction(action)) + } + ) + ) .build() + + return if (deviceConfiguration.supportsDynamicValue() && state.positionState != null) { + val actualPercent = + state.positionState.currentPositionMs.toFloat() / state.positionState.durationMs.toFloat() + + Box.Builder() + .setWidth(WrappedDimensionProp.Builder().setMinimumSize(middleButtonSize).build()) + .setHeight(WrappedDimensionProp.Builder().setMinimumSize(middleButtonSize).build()) + .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) + .setVerticalAlignment(VERTICAL_ALIGN_CENTER) + .addContent(playerButtonContent) + .addContent( + circularProgressIndicator( + staticProgress = actualPercent, + dynamicProgress = if (state.playbackState == PlaybackState.PLAYING) { + val durationFloat = + state.positionState.durationMs.toFloat() / 1000f + + val positionFractional = + DynamicInstant.withSecondsPrecision( + Instant.ofEpochMilli( + state.positionState.currentTimeMs + ) + ).durationUntil( + DynamicInstant.platformTimeWithSecondsPrecision() + ) + .toIntSeconds() + .asFloat() + .times(state.positionState.playbackSpeed) + .plus(state.positionState.currentPositionMs.toFloat() / 1000f) + + val predictedPercent = + DynamicFloat.onCondition( + positionFractional.gt( + durationFloat + ) + ) + .use( + durationFloat + ) + .elseUse( + positionFractional + ) + .div( + durationFloat + ) + + DynamicFloat.onCondition( + predictedPercent.gt( + 0f + ) + ) + .use( + predictedPercent + ) + .elseUse(0f) + .animate() + } else { + null + }, + startAngleDegrees = 0f, + endAngleDegrees = 360f, + strokeWidth = 4f, + colors = ProgressIndicatorColors( + colorScheme.onSecondaryContainer, + colorScheme.outline + ) + ) + ) + .build() + } else { + playerButtonContent + } } -private fun VolumeButton( +private fun MaterialScope.VolumeButton( action: PlayerAction ): LayoutElement = Box.Builder() - .setHeight(dp(26f)) - .setWidth(dp(26f)) - .setModifiers( - Modifiers.Builder() - .setBackground( - Background.Builder() - .setColor( - ColorProp.Builder(Color.TRANSPARENT).build() - ) - .setCorner( - Corner.Builder() - .setRadius(dp(26f)) + .setWidth(weight(1f)) + .setHeight(expand()) + .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) + .setVerticalAlignment( + if (deviceConfiguration.screenShape == SCREEN_SHAPE_ROUND) { + VERTICAL_ALIGN_TOP + } else { + VERTICAL_ALIGN_CENTER + } + ) + .addContent( + Box.Builder() + .setWidth(dp(40f)) + .setHeight(dp(32f)) + .setModifiers( + Modifiers.Builder() + .setBackground( + Background.Builder() + .setColor( + ColorProp.Builder( + ColorUtils.setAlphaComponent( + colorScheme.onSurface.staticArgb, + (0xFF * 0.24f).toInt() + ) + ).build() + ) + .setCorner( + Corner.Builder() + .setRadius(dp(22f)) + .build() + ) .build() ) - .build() - ) - .setClickable( - Clickable.Builder() - .setId(action.name) - .setOnClick( - ActionBuilders.LoadAction.Builder() + .setClickable( + Clickable.Builder() + .setId(action.name) + .setOnClick( + ActionBuilders.LoadAction.Builder() + .build() + ) .build() ) .build() ) - .build() - ) - .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) - .setVerticalAlignment(VERTICAL_ALIGN_CENTER) - .addContent( - Image.Builder() - .setWidth(dp(26f)) - .setHeight(dp(26f)) - .setResourceId(getResourceIdForPlayerAction(action)) - .setContentScaleMode(CONTENT_SCALE_MODE_FIT) + .addContent( + icon( + protoLayoutResourceId = getResourceIdForPlayerAction(action), + width = dp(20f), + height = dp(20f), + tintColor = colorScheme.onSurface + ) + ) .build() ) .build() -private fun IconButton( - context: Context, - resourceId: String, - contentDescription: String = "", - clickable: Clickable = Clickable.Builder().build(), - size: DimensionBuilders.DpProp? = CIRCLE_SIZE, - iconSize: DimensionBuilders.DpProp = ICON_SIZE -) = Button.Builder(context, clickable) - .setContentDescription(contentDescription) - .setButtonColors(ButtonColors.primaryButtonColors(COLORS)) - .setIconContent(resourceId, iconSize) +private fun MaterialScope.BrandIcon( + resourceId: String +): LayoutElement = Box.Builder() + .setWidth(weight(1f)) + .setHeight(expand()) .apply { - if (size != null) { - setSize(size) + if (deviceConfiguration.screenShape == SCREEN_SHAPE_ROUND) { + setModifiers( + Modifiers.Builder() + .setPadding(padding(bottom = deviceConfiguration.screenHeightDp * 0.03f)) + .build() + ) + setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) } } + .addContent( + icon( + protoLayoutResourceId = resourceId, + width = dp(32f), + height = dp(32f) + ) + ) .build() private fun getResourceIdForPlayerAction(action: PlayerAction): String { @@ -562,7 +742,7 @@ private fun getResourceIdForPlayerAction(action: PlayerAction): String { } } -@WearTilePreviewDevices +@WearPreviewDevices private fun MediaPlayerTilePreview(context: Context): TilePreviewData { val state = MediaPlayerTileState( connectionStatus = WearConnectionStatus.CONNECTED, @@ -570,8 +750,9 @@ private fun MediaPlayerTilePreview(context: Context): TilePreviewData { artist = "Artist", playbackState = PlaybackState.PAUSED, audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + positionState = PositionState(100, 50), artwork = runBlocking { - ContextCompat.getDrawable(context, R.drawable.ws_full_sad)?.toBitmapOrNull() + ContextCompat.getDrawable(context, R.drawable.sample_image)?.toBitmapOrNull() ?.toByteArray() }, appIcon = runBlocking { @@ -580,10 +761,51 @@ private fun MediaPlayerTilePreview(context: Context): TilePreviewData { ?.toByteArray() } ) - val renderer = MediaPlayerTileRenderer(context, debugResourceMode = true) - return TilePreviewData( - onTileRequest = { renderer.renderTimeline(state, it) }, - onTileResourceRequest = { renderer.produceRequestedResources(state, it) } + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state + ) +} + +@WearPreviewDevices +private fun MediaPlayerEmptyTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = null, + artist = null, + playbackState = null, + audioStreamState = null, + artwork = null + ) + + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state + ) +} + +@WearPreviewDevices +private fun MediaPlayerNotPlayingTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = null, + artist = null, + playbackState = PlaybackState.NONE, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + artwork = null, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } + ) + + return tileRendererPreviewData( + renderer = MediaPlayerTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state, ) } \ No newline at end of file From cb7cdf1636d01c7489f12e37ccbaa9fc0e25d67d Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 26 Oct 2025 21:25:06 -0400 Subject: [PATCH 15/40] tiles: add new Now Playing tile --- wear/src/main/AndroidManifest.xml | 16 + .../wearable/WearableDataListenerService.kt | 4 + .../wearable/tiles/DashboardTileRenderer.kt | 18 +- .../wearable/tiles/MediaPlayerTileRenderer.kt | 16 +- .../tiles/NowPlayingTileProviderService.kt | 268 +++++++++++ .../wearable/tiles/NowPlayingTileRenderer.kt | 162 +++++++ .../tiles/layouts/DashboardTileLayout.kt | 70 ++- .../tiles/layouts/LoadingTileLayout.kt | 31 +- .../tiles/layouts/MediaPlayerTileLayout.kt | 430 ++++++++++-------- .../tiles/layouts/NowPlayingTileLayout.kt | 313 +++++++++++++ 10 files changed, 1088 insertions(+), 240 deletions(-) create mode 100644 wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/NowPlayingTileProviderService.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/NowPlayingTileRenderer.kt create mode 100644 wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/NowPlayingTileLayout.kt diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 8d556b82..3f8fd687 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -237,6 +237,22 @@ android:resource="@drawable/mediatile_preview" /> + + + + + + + + + private lateinit var tileRenderer: NowPlayingTileRenderer + + override fun onCreate() { + super.onCreate() + Logger.debug(TAG, "creating service...") + + tileMessenger = MediaPlayerTileMessenger(this) + tileRenderer = NowPlayingTileRenderer(this) + + tileMessenger.register() + tileStateFlow = combine( + this.mediaDataStore.data, + this.artworkDataStore.data, + this.appInfoDataStore.data, + tileMessenger.connectionState + ) { mediaCache, artwork, appInfo, connectionStatus -> + MediaPlayerTileState( + connectionStatus = connectionStatus, + title = mediaCache.mediaPlayerState?.mediaMetaData?.title, + artist = mediaCache.mediaPlayerState?.mediaMetaData?.artist, + artwork = artwork, + playbackState = mediaCache.mediaPlayerState?.playbackState, + positionState = mediaCache.mediaPlayerState?.mediaMetaData?.positionState, + audioStreamState = mediaCache.audioStreamState, + appIcon = appInfo.iconBitmap + ) + } + .stateIn( + lifecycleScope, + started = SharingStarted.WhileSubscribed(2000), + initialValue = null + ) + } + + override fun onDestroy() { + isUpdating = false + Logger.debug(TAG, "destroying service...") + tileMessenger.unregister() + super.onDestroy() + } + + private fun onTileInteractionEnterEvent(requestParams: TileInteractionEvent) { + Logger.debug(TAG, "onTileEnterEvent called with: tileId = ${requestParams.tileId}") + AnalyticsLogger.logEvent("on_tile_enter", Bundle().apply { + putString("tile", TAG) + }) + isInFocus = true + + appLib.appScope.launch { + tileMessenger.checkConnectionStatus() + tileMessenger.requestPlayerConnect() + tileMessenger.requestUpdatePlayerState() + }.invokeOnCompletion { + if (it is CancellationException || !isUpdating) { + // If update timed out + requestTileUpdate(this) + } + } + } + + private fun onTileInteractionLeaveEvent(requestParams: TileInteractionEvent) { + Logger.debug(TAG, "onTileLeaveEvent called with: tileId = ${requestParams.tileId}") + isInFocus = false + + appLib.appScope.launch { + tileMessenger.requestPlayerDisconnect() + } + } + + override fun onRecentInteractionEventsAsync(events: List): ListenableFuture { + return SuspendToFutureAdapter.launchFuture { + val lastEvent = events.lastOrNull() + + when (lastEvent?.eventType) { + TileInteractionEvent.ENTER -> { + onTileInteractionEnterEvent(lastEvent) + } + + TileInteractionEvent.LEAVE -> { + onTileInteractionLeaveEvent(lastEvent) + } + + TileInteractionEvent.UNKNOWN -> { /* no-op */ + } + } + + null + } + } + + override suspend fun tileRequest(requestParams: RequestBuilders.TileRequest): TileBuilders.Tile { + Logger.debug(TAG, "tileRequest: ${requestParams.currentState}") + val startTime = SystemClock.elapsedRealtimeNanos() + isUpdating = true + + tileMessenger.checkConnectionStatus() + + if (requestParams.currentState.lastClickableId.isNotEmpty()) { + if (ID_OPENONPHONE == requestParams.currentState.lastClickableId || ID_PHONEDISCONNECTED == requestParams.currentState.lastClickableId) { + runCatching { + startActivity(Intent(applicationContext, PhoneSyncActivity::class.java)) + } + } else { + // Process action + runCatching { + Logger.debug( + TAG, + "lastClickableId = ${requestParams.currentState.lastClickableId}" + ) + val action = PlayerAction.valueOf(requestParams.currentState.lastClickableId) + + val state = latestTileState() + + withTimeoutOrNull(5000) { + val ret = tileMessenger.requestPlayerActionAsync(action) + Logger.debug(TAG, "requestPlayerActionAsync = $ret") + } + + // Try to await for full metadata change + withTimeoutOrNull(5000) { + supervisorScope { + var songChanged = false + tileStateFlow.collectLatest { newState -> + if (!songChanged && newState?.title != state.title && newState?.artist != state.artist) { + // new song; wait for artwork + songChanged = true + } else if (songChanged && !newState?.artwork.contentEquals(state.artwork)) { + coroutineContext.cancel() + } else if (newState?.playbackState != state.playbackState) { + // only playstate change + coroutineContext.cancel() + } + } + } + } + } + } + } + + isUpdating = false + val tileState = latestTileState() + + if (tileState.isEmpty) { + AnalyticsLogger.logEvent("mediatile_state_empty", Bundle().apply { + putBoolean("isCoroutineActive", coroutineContext.isActive) + }) + } + + val endTime = SystemClock.elapsedRealtimeNanos() + Logger.debug(TAG, "Current State - ${tileState.title}:${tileState.artist}") + Logger.debug(TAG, "Duration - ${Duration.ofNanos(endTime - startTime)}") + Logger.debug(TAG, "Rendering timeline...") + return tileRenderer.renderTimeline(tileState, requestParams) + } + + private suspend fun latestTileState(): MediaPlayerTileState { + var tileState = tileStateFlow.filterNotNull().first() + + if (tileState.isEmpty) { + Logger.debug(TAG, "No tile state available. loading from remote...") + tileMessenger.updatePlayerStateFromRemote() + + // Try to await for full metadata change + runCatching { + withTimeoutOrNull(5000) { + supervisorScope { + var songChanged = false + + tileStateFlow.filterNotNull().collectLatest { newState -> + if (!songChanged && newState.title != tileState.title && newState.artist != tileState.artist) { + // new song; wait for artwork + tileState = newState + songChanged = true + } else if (songChanged && !newState.artwork.contentEquals(tileState.artwork)) { + tileState = newState + coroutineContext.cancel() + } + } + } + } + } + } + + return tileState + } + + override suspend fun resourcesRequest(requestParams: RequestBuilders.ResourcesRequest): ResourceBuilders.Resources { + val tileState = latestTileState() + return tileRenderer.produceRequestedResources(tileState, requestParams) + } +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/NowPlayingTileRenderer.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/NowPlayingTileRenderer.kt new file mode 100644 index 00000000..4b18a271 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/NowPlayingTileRenderer.kt @@ -0,0 +1,162 @@ +@file:OptIn(ExperimentalHorologistApi::class) + +package com.thewizrd.simplewear.wearable.tiles + +import android.content.ComponentName +import android.content.Context +import androidx.wear.protolayout.ActionBuilders +import androidx.wear.protolayout.DeviceParametersBuilders +import androidx.wear.protolayout.DimensionBuilders.expand +import androidx.wear.protolayout.LayoutElementBuilders +import androidx.wear.protolayout.LayoutElementBuilders.Box +import androidx.wear.protolayout.ModifiersBuilders +import androidx.wear.protolayout.ModifiersBuilders.Clickable +import androidx.wear.protolayout.ResourceBuilders +import androidx.wear.protolayout.ResourceBuilders.IMAGE_FORMAT_UNDEFINED +import androidx.wear.protolayout.ResourceBuilders.ImageResource +import androidx.wear.protolayout.ResourceBuilders.InlineImageResource +import androidx.wear.protolayout.expression.ProtoLayoutExperimental +import com.google.android.horologist.annotations.ExperimentalHorologistApi +import com.google.android.horologist.tiles.images.drawableResToImageResource +import com.google.android.horologist.tiles.render.SingleTileLayoutRendererWithState +import com.thewizrd.shared_resources.media.PlaybackState +import com.thewizrd.shared_resources.utils.ContextUtils.dpToPx +import com.thewizrd.shared_resources.utils.Logger +import com.thewizrd.simplewear.BuildConfig +import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.wearable.tiles.layouts.NowPlayingTileLayout +import kotlin.math.min + +class NowPlayingTileRenderer(context: Context, debugResourceMode: Boolean = false) : + SingleTileLayoutRendererWithState( + context, + debugResourceMode + ) { + companion object { + // Resource identifiers for images + internal const val ID_OPENONPHONE = "open_on_phone" + internal const val ID_PHONEDISCONNECTED = "phone_disconn" + + internal const val ID_ARTWORK = "artwork" + internal const val ID_APPICON = "app_icon" + internal const val ID_PLAYINGICON = "playing_icon" + + fun getTapAction(context: Context): ActionBuilders.Action { + return ActionBuilders.launchAction( + ComponentName(context.packageName, context.packageName.run { + if (BuildConfig.DEBUG) removeSuffix(".debug") else this + } + ".MediaControllerActivity") + ) + } + } + + override fun renderTile( + state: MediaPlayerTileState, + deviceParameters: DeviceParametersBuilders.DeviceParameters + ): LayoutElementBuilders.LayoutElement { + return Box.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setModifiers( + ModifiersBuilders.Modifiers.Builder() + .setClickable( + Clickable.Builder() + .setOnClick( + getTapAction(context) + ) + .build() + ) + .build() + ) + .addContent( + NowPlayingTileLayout(context, deviceParameters, state) + ) + .build() + } + + @androidx.annotation.OptIn(ProtoLayoutExperimental::class) + override fun ResourceBuilders.Resources.Builder.produceRequestedResources( + resourceState: MediaPlayerTileState, + deviceParameters: DeviceParametersBuilders.DeviceParameters, + resourceIds: List + ) { + Logger.debug(this::class.java.name, "produceRequestedResources: resIds = $resourceIds") + + val resources = mapOf( + ID_OPENONPHONE to R.drawable.common_full_open_on_phone, + ID_PHONEDISCONNECTED to R.drawable.ic_phonelink_erase_white_24dp + ) + + (resourceIds.takeIf { it.isNotEmpty() } ?: resources.keys).forEach { key -> + resources[key]?.let { resId -> + addIdToImageMapping(key, drawableResToImageResource(resId)) + } + } + + resourceState.artwork?.let { bitmap -> + if (resourceIds.isEmpty() || resourceIds.contains(ID_ARTWORK)) { + addIdToImageMapping( + ID_ARTWORK, + ImageResource.Builder() + .setInlineResource( + InlineImageResource.Builder() + .setData(bitmap) + .setWidthPx(300) + .setHeightPx(300) + .setFormat(IMAGE_FORMAT_UNDEFINED) + .build() + ) + .build() + ) + } + } + + resourceState.appIcon?.let { bitmap -> + if (resourceIds.isEmpty() || resourceIds.contains(ID_APPICON)) { + val size = context.dpToPx(24f).toInt() + + addIdToImageMapping( + ID_APPICON, + ImageResource.Builder() + .setInlineResource( + InlineImageResource.Builder() + .setData(bitmap) + .setWidthPx(size) + .setHeightPx(size) + .setFormat(IMAGE_FORMAT_UNDEFINED) + .build() + ) + .build() + ) + } + } + + if (resourceIds.isEmpty() || resourceIds.contains(ID_PLAYINGICON)) { + addIdToImageMapping( + ID_PLAYINGICON, + ImageResource.Builder() + .setAndroidResourceByResId( + ResourceBuilders.AndroidImageResourceByResId.Builder() + .setResourceId(R.drawable.equalizer_animated) + .build() + ) + .build() + ) + } + } + + override fun getResourcesVersionForTileState(state: MediaPlayerTileState): String { + return "${state.title}:${state.artist}:${state.artwork?.size}" + } + + override fun getFreshnessIntervalMillis(state: MediaPlayerTileState): Long { + return if (state.playbackState == PlaybackState.PLAYING && state.positionState != null) { + val elapsedTime = System.currentTimeMillis() - state.positionState.currentTimeMs + val estimatedPosition = + (state.positionState.currentPositionMs + (elapsedTime * state.positionState.playbackSpeed)).toLong() + state.positionState.durationMs - min(estimatedPosition, state.positionState.durationMs) + } else { + super.getFreshnessIntervalMillis(state) + } + } +} \ No newline at end of file diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt index 6b1b952a..31b32d2c 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/DashboardTileLayout.kt @@ -20,9 +20,7 @@ import androidx.wear.protolayout.LayoutElementBuilders.LayoutElement import androidx.wear.protolayout.LayoutElementBuilders.SpanImage import androidx.wear.protolayout.LayoutElementBuilders.SpanText import androidx.wear.protolayout.LayoutElementBuilders.Spannable -import androidx.wear.protolayout.LayoutElementBuilders.TEXT_ALIGN_CENTER import androidx.wear.protolayout.LayoutElementBuilders.TEXT_OVERFLOW_MARQUEE -import androidx.wear.protolayout.ModifiersBuilders.Clickable import androidx.wear.protolayout.StateBuilders import androidx.wear.protolayout.expression.AppDataKey import androidx.wear.protolayout.expression.DynamicBuilders @@ -30,7 +28,10 @@ import androidx.wear.protolayout.expression.DynamicDataBuilders import androidx.wear.protolayout.expression.ProtoLayoutExperimental import androidx.wear.protolayout.material3.ButtonDefaults.filledTonalButtonColors import androidx.wear.protolayout.material3.ButtonGroupDefaults.DEFAULT_SPACER_BETWEEN_BUTTON_GROUPS +import androidx.wear.protolayout.material3.CardDefaults.filledTonalCardColors +import androidx.wear.protolayout.material3.DataCardStyle import androidx.wear.protolayout.material3.MaterialScope +import androidx.wear.protolayout.material3.Typography.BODY_MEDIUM import androidx.wear.protolayout.material3.buttonGroup import androidx.wear.protolayout.material3.icon import androidx.wear.protolayout.material3.iconButton @@ -38,6 +39,7 @@ import androidx.wear.protolayout.material3.iconEdgeButton import androidx.wear.protolayout.material3.materialScope import androidx.wear.protolayout.material3.primaryLayout import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textDataCard import androidx.wear.protolayout.modifiers.LayoutModifier import androidx.wear.protolayout.modifiers.clickable import androidx.wear.protolayout.modifiers.contentDescription @@ -95,24 +97,33 @@ internal fun DashboardTileLayout( when (state.connectionStatus) { WearConnectionStatus.APPNOTINSTALLED -> { primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_activity_dashboard).layoutString) + }, mainSlot = { - text( - text = context.getString(R.string.error_notinstalled).layoutString, - color = colorScheme.secondary, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable( + action = DashboardTileRenderer.getTapAction( + context + ) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.error_notinstalled).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { iconEdgeButton( modifier = LayoutModifier.contentDescription(context.getString(R.string.common_open_on_phone)), - onClick = Clickable.Builder() - .setId(ID_OPENONPHONE) - .setOnClick( - ActionBuilders.LoadAction.Builder() - .build() - ) - .build(), + onClick = clickable(id = ID_OPENONPHONE), iconContent = { icon(ID_OPENONPHONE) } @@ -123,23 +134,38 @@ internal fun DashboardTileLayout( else -> { primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_activity_dashboard).layoutString) + }, mainSlot = { - text( - text = context.getString(R.string.status_disconnected).layoutString, - color = colorScheme.secondary, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable( + action = DashboardTileRenderer.getTapAction( + context + ) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.status_disconnected).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { iconEdgeButton( modifier = LayoutModifier.contentDescription(context.getString(R.string.status_disconnected)), - onClick = Clickable.Builder().build(), + onClick = clickable(id = ID_PHONEDISCONNECTED), iconContent = { icon(ID_PHONEDISCONNECTED) } - ) - } + ) + } ) } } diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt index 8e6c31af..18a8929a 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/LoadingTileLayout.kt @@ -2,11 +2,15 @@ package com.thewizrd.simplewear.wearable.tiles.layouts import android.content.Context import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters +import androidx.wear.protolayout.DimensionBuilders.expand import androidx.wear.protolayout.LayoutElementBuilders.LayoutElement -import androidx.wear.protolayout.LayoutElementBuilders.TEXT_ALIGN_CENTER +import androidx.wear.protolayout.material3.CardDefaults.filledTonalCardColors +import androidx.wear.protolayout.material3.DataCardStyle +import androidx.wear.protolayout.material3.Typography.BODY_MEDIUM import androidx.wear.protolayout.material3.materialScope import androidx.wear.protolayout.material3.primaryLayout import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textDataCard import androidx.wear.protolayout.material3.textEdgeButton import androidx.wear.protolayout.modifiers.clickable import androidx.wear.protolayout.modifiers.loadAction @@ -19,15 +23,30 @@ import com.thewizrd.simplewear.ui.tiles.tools.WearPreviewDevices internal fun LoadingTileLayout( context: Context, - deviceParameters: DeviceParameters + deviceParameters: DeviceParameters, + title: String? = null ): LayoutElement = materialScope(context, deviceParameters, defaultColorScheme = wearTileColorScheme) { primaryLayout( + titleSlot = title?.let { + { + text(text = it.layoutString) + } + }, mainSlot = { - text( - text = context.getString(R.string.state_loading).layoutString, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable(loadAction()), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.state_loading).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt index 068c0401..142266f9 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/MediaPlayerTileLayout.kt @@ -40,6 +40,8 @@ import androidx.wear.protolayout.ModifiersBuilders.Padding import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant import androidx.wear.protolayout.expression.ProtoLayoutExperimental +import androidx.wear.protolayout.material3.CardDefaults.filledTonalCardColors +import androidx.wear.protolayout.material3.DataCardStyle import androidx.wear.protolayout.material3.MaterialScope import androidx.wear.protolayout.material3.ProgressIndicatorColors import androidx.wear.protolayout.material3.Typography.BODY_MEDIUM @@ -52,6 +54,7 @@ import androidx.wear.protolayout.material3.iconEdgeButton import androidx.wear.protolayout.material3.materialScope import androidx.wear.protolayout.material3.primaryLayout import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textDataCard import androidx.wear.protolayout.material3.textEdgeButton import androidx.wear.protolayout.modifiers.LayoutModifier import androidx.wear.protolayout.modifiers.clickable @@ -100,24 +103,31 @@ internal fun MediaPlayerTileLayout( when (state.connectionStatus) { WearConnectionStatus.APPNOTINSTALLED -> { primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_media_controller).layoutString) + }, mainSlot = { - text( - text = context.getString(R.string.error_notinstalled).layoutString, - color = colorScheme.secondary, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable( + action = MediaPlayerTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.error_notinstalled).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { iconEdgeButton( modifier = LayoutModifier.contentDescription(context.getString(R.string.common_open_on_phone)), - onClick = Clickable.Builder() - .setId(ID_OPENONPHONE) - .setOnClick( - ActionBuilders.LoadAction.Builder() - .build() - ) - .build(), + onClick = clickable(id = ID_OPENONPHONE), iconContent = { icon(ID_OPENONPHONE) } @@ -128,34 +138,60 @@ internal fun MediaPlayerTileLayout( else -> { primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_media_controller).layoutString) + }, mainSlot = { - text( - text = context.getString(R.string.status_disconnected).layoutString, - color = colorScheme.secondary, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable( + action = MediaPlayerTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.status_disconnected).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { iconEdgeButton( modifier = LayoutModifier.contentDescription(context.getString(R.string.status_disconnected)), - onClick = Clickable.Builder().build(), + onClick = clickable(id = ID_PHONEDISCONNECTED), iconContent = { icon(ID_PHONEDISCONNECTED) } - ) - } + ) + } ) } } - } else if (state.isEmpty || state.playbackState == null || state.playbackState == PlaybackState.NONE) { + } else if (state.isEmpty || state.playbackState == null || state.playbackState == PlaybackState.NONE) { primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_media_controller).layoutString) + }, mainSlot = { - text( - text = context.getString(R.string.message_playback_stopped).layoutString, - color = colorScheme.secondary, - alignment = TEXT_ALIGN_CENTER, - maxLines = 3 + textDataCard( + onClick = clickable( + action = MediaPlayerTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.message_playback_stopped).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() ) }, bottomSlot = { @@ -167,190 +203,190 @@ internal fun MediaPlayerTileLayout( ) } ) - } else { + } else { Box.Builder() - .setWidth(expand()) - .setHeight(expand()) - .addContent( - Image.Builder() - .setResourceId(ID_ARTWORK) - .setWidth(expand()) - .setHeight(expand()) - .setContentScaleMode(CONTENT_SCALE_MODE_FIT) - .build() - ) - .addContent( - Box.Builder() - .setWidth(expand()) - .setHeight(expand()) - .setModifiers( - Modifiers.Builder() - .setBackground( - Background.Builder() - .setColor( - ColorProp.Builder(0xAA000000.toInt()) - .build() - ) - .build() - ) - .build() - ) - .addContent( - Column.Builder() - .setWidth(expand()) - .setHeight(expand()) - .addContent( - Box.Builder() - .setWidth(expand()) - .setHeight( - WrappedDimensionProp.Builder() - .apply { - if (deviceParameters.isLargeHeight()) { - setMinimumSize(dp(0f)) - } else { - setMinimumSize(dp(68f)) + .setWidth(expand()) + .setHeight(expand()) + .addContent( + Image.Builder() + .setResourceId(ID_ARTWORK) + .setWidth(expand()) + .setHeight(expand()) + .setContentScaleMode(CONTENT_SCALE_MODE_FIT) + .build() + ) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight(expand()) + .setModifiers( + Modifiers.Builder() + .setBackground( + Background.Builder() + .setColor( + ColorProp.Builder(0xAA000000.toInt()) + .build() + ) + .build() + ) + .build() + ) + .addContent( + Column.Builder() + .setWidth(expand()) + .setHeight(expand()) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight( + WrappedDimensionProp.Builder() + .apply { + if (deviceParameters.isLargeHeight()) { + setMinimumSize(dp(0f)) + } else { + setMinimumSize(dp(68f)) + } } - } - .build() - ) - .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) - .setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) - .setModifiers( - Modifiers.Builder() - .setPadding( - padding( - top = deviceParameters.getScreenSizeInDpFromPercentage( - if (deviceParameters.isLargeHeight()) { - 13.2f - } else { - 12f - } - ), - bottom = deviceParameters.getScreenSizeInDpFromPercentage( - if (deviceParameters.isLargeHeight()) { - 6f - } else { - 2f - } - ), + .build() + ) + .setHorizontalAlignment(HORIZONTAL_ALIGN_CENTER) + .setVerticalAlignment(VERTICAL_ALIGN_BOTTOM) + .setModifiers( + Modifiers.Builder() + .setPadding( + padding( + top = deviceParameters.getScreenSizeInDpFromPercentage( + if (deviceParameters.isLargeHeight()) { + 13.2f + } else { + 12f + } + ), + bottom = deviceParameters.getScreenSizeInDpFromPercentage( + if (deviceParameters.isLargeHeight()) { + 6f + } else { + 2f + } + ), + ) ) - ) - .build() - ) - .addContent( - Column.Builder() - .setHeight(dp(38f)) - .apply { - if (!state.title.isNullOrBlank()) { - addContent( - Box.Builder() - .setWidth( - dp( - deviceParameters.getScreenWidthInDpFromPercentage( - 66.72f + .build() + ) + .addContent( + Column.Builder() + .setHeight(dp(38f)) + .apply { + if (!state.title.isNullOrBlank()) { + addContent( + Box.Builder() + .setWidth( + dp( + deviceParameters.getScreenWidthInDpFromPercentage( + 66.72f + ) ) ) - ) - .setHeight(dp(20f)) - .setHorizontalAlignment( - HORIZONTAL_ALIGN_CENTER - ) - .addContent( - text( - text = state.title.layoutString, - maxLines = 1, - alignment = TEXT_ALIGN_CENTER, - overflow = TEXT_OVERFLOW_MARQUEE, - typography = TITLE_MEDIUM, - color = colorScheme.onSurface + .setHeight(dp(20f)) + .setHorizontalAlignment( + HORIZONTAL_ALIGN_CENTER ) - ) - .build() - ) - } - - if (!state.artist.isNullOrBlank()) { - addContent( - Box.Builder() - .setWidth( - dp( - deviceConfiguration.getScreenWidthInDpFromPercentage( - if (deviceConfiguration.isLargeWidth()) { - 71f - } else { - 75f - } + .addContent( + text( + text = state.title.layoutString, + maxLines = 1, + alignment = TEXT_ALIGN_CENTER, + overflow = TEXT_OVERFLOW_MARQUEE, + typography = TITLE_MEDIUM, + color = colorScheme.onSurface ) ) - ) - .setHeight(dp(18f)) - .setHorizontalAlignment( - HORIZONTAL_ALIGN_CENTER - ) - .addContent( - text( - text = state.artist.layoutString, - maxLines = 1, - alignment = TEXT_ALIGN_CENTER, - overflow = TEXT_OVERFLOW_MARQUEE, - typography = BODY_MEDIUM, - color = colorScheme.onSurface + .build() + ) + } + + if (!state.artist.isNullOrBlank()) { + addContent( + Box.Builder() + .setWidth( + dp( + deviceConfiguration.getScreenWidthInDpFromPercentage( + if (deviceConfiguration.isLargeWidth()) { + 71f + } else { + 75f + } + ) + ) ) - ) - .build() - ) + .setHeight(dp(18f)) + .setHorizontalAlignment( + HORIZONTAL_ALIGN_CENTER + ) + .addContent( + text( + text = state.artist.layoutString, + maxLines = 1, + alignment = TEXT_ALIGN_CENTER, + overflow = TEXT_OVERFLOW_MARQUEE, + typography = BODY_MEDIUM, + color = colorScheme.onSurface + ) + ) + .build() + ) + } } - } - .build() - ) - .build() - ) - .addContent( - Box.Builder() - .setWidth(expand()) - .setHeight( - WrappedDimensionProp.Builder() - .apply { - if (deviceParameters.isLargeHeight()) { - setMinimumSize(dp(80f)) - } else { - setMinimumSize(dp(64f)) + .build() + ) + .build() + ) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight( + WrappedDimensionProp.Builder() + .apply { + if (deviceParameters.isLargeHeight()) { + setMinimumSize(dp(80f)) + } else { + setMinimumSize(dp(64f)) + } + } + .build() + ) + .addContent( + buttonGroup( + height = middleButtonSize(), + width = expand(), + spacing = 0f + ) { + buttonGroupItem { + PlayerButton(action = PlayerAction.PREVIOUS) } - } - .build() - ) - .addContent( - buttonGroup( - height = middleButtonSize(), - width = expand(), - spacing = 0f - ) { - buttonGroupItem { - PlayerButton(action = PlayerAction.PREVIOUS) - } - buttonGroupItem { - PlayPauseButton(state) - } + buttonGroupItem { + PlayPauseButton(state) + } - buttonGroupItem { - PlayerButton(action = PlayerAction.NEXT) + buttonGroupItem { + PlayerButton(action = PlayerAction.NEXT) + } } - } - ) - .build() - ) - .addContent( - Box.Builder() - .setWidth(expand()) - .setHeight(weight(1f)) - .addContent(SettingsButtonLayout(state)) - .build() - ) - .build() - ) - .build() - ) + ) + .build() + ) + .addContent( + Box.Builder() + .setWidth(expand()) + .setHeight(weight(1f)) + .addContent(SettingsButtonLayout(state)) + .build() + ) + .build() + ) + .build() + ) .build() } } @@ -772,7 +808,7 @@ private fun MediaPlayerTilePreview(context: Context): TilePreviewData { @WearPreviewDevices private fun MediaPlayerEmptyTilePreview(context: Context): TilePreviewData { val state = MediaPlayerTileState( - connectionStatus = WearConnectionStatus.CONNECTED, + connectionStatus = WearConnectionStatus.DISCONNECTED, title = null, artist = null, playbackState = null, diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/NowPlayingTileLayout.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/NowPlayingTileLayout.kt new file mode 100644 index 00000000..057db0a6 --- /dev/null +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/NowPlayingTileLayout.kt @@ -0,0 +1,313 @@ +@file:kotlin.OptIn(ExperimentalHorologistApi::class) + +package com.thewizrd.simplewear.wearable.tiles.layouts + +import android.annotation.SuppressLint +import android.content.Context +import androidx.annotation.OptIn +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toBitmapOrNull +import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters +import androidx.wear.protolayout.DimensionBuilders.expand +import androidx.wear.protolayout.LayoutElementBuilders.CONTENT_SCALE_MODE_CROP +import androidx.wear.protolayout.LayoutElementBuilders.LayoutElement +import androidx.wear.protolayout.expression.ProtoLayoutExperimental +import androidx.wear.protolayout.material3.CardDefaults.filledTonalCardColors +import androidx.wear.protolayout.material3.DataCardStyle +import androidx.wear.protolayout.material3.TitleCardStyle +import androidx.wear.protolayout.material3.Typography.BODY_MEDIUM +import androidx.wear.protolayout.material3.backgroundImage +import androidx.wear.protolayout.material3.icon +import androidx.wear.protolayout.material3.iconEdgeButton +import androidx.wear.protolayout.material3.materialScope +import androidx.wear.protolayout.material3.primaryLayout +import androidx.wear.protolayout.material3.text +import androidx.wear.protolayout.material3.textDataCard +import androidx.wear.protolayout.material3.textEdgeButton +import androidx.wear.protolayout.material3.titleCard +import androidx.wear.protolayout.modifiers.LayoutModifier +import androidx.wear.protolayout.modifiers.clickable +import androidx.wear.protolayout.modifiers.contentDescription +import androidx.wear.protolayout.types.layoutString +import androidx.wear.tiles.tooling.preview.TilePreviewData +import com.google.android.horologist.annotations.ExperimentalHorologistApi +import com.google.android.horologist.compose.tools.tileRendererPreviewData +import com.thewizrd.shared_resources.actions.AudioStreamState +import com.thewizrd.shared_resources.actions.AudioStreamType +import com.thewizrd.shared_resources.helpers.WearConnectionStatus +import com.thewizrd.shared_resources.media.PlaybackState +import com.thewizrd.shared_resources.media.PositionState +import com.thewizrd.shared_resources.utils.ImageUtils.toByteArray +import com.thewizrd.simplewear.R +import com.thewizrd.simplewear.ui.theme.wearTileColorScheme +import com.thewizrd.simplewear.ui.tiles.tools.WearPreviewDevices +import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileMessenger.PlayerAction +import com.thewizrd.simplewear.wearable.tiles.MediaPlayerTileState +import com.thewizrd.simplewear.wearable.tiles.NowPlayingTileRenderer +import com.thewizrd.simplewear.wearable.tiles.NowPlayingTileRenderer.Companion.ID_ARTWORK +import com.thewizrd.simplewear.wearable.tiles.NowPlayingTileRenderer.Companion.ID_OPENONPHONE +import com.thewizrd.simplewear.wearable.tiles.NowPlayingTileRenderer.Companion.ID_PHONEDISCONNECTED +import com.thewizrd.simplewear.wearable.tiles.NowPlayingTileRenderer.Companion.ID_PLAYINGICON +import kotlinx.coroutines.runBlocking + +@SuppressLint("ProtoLayoutPrimaryLayoutResponsive") +@OptIn(ProtoLayoutExperimental::class) +internal fun NowPlayingTileLayout( + context: Context, + deviceParameters: DeviceParameters, + state: MediaPlayerTileState +): LayoutElement = + materialScope(context, deviceParameters, defaultColorScheme = wearTileColorScheme) { + if (state.connectionStatus != WearConnectionStatus.CONNECTED) { + when (state.connectionStatus) { + WearConnectionStatus.APPNOTINSTALLED -> { + primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_nowplaying).layoutString) + }, + mainSlot = { + textDataCard( + onClick = clickable( + action = NowPlayingTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.error_notinstalled).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() + ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.common_open_on_phone)), + onClick = clickable(id = ID_OPENONPHONE), + iconContent = { + icon(ID_OPENONPHONE) + } + ) + } + ) + } + + else -> { + primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_nowplaying).layoutString) + }, + mainSlot = { + textDataCard( + onClick = clickable( + action = NowPlayingTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.status_disconnected).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() + ) + }, + bottomSlot = { + iconEdgeButton( + modifier = LayoutModifier.contentDescription(context.getString(R.string.status_disconnected)), + onClick = clickable(id = ID_PHONEDISCONNECTED), + iconContent = { + icon(ID_PHONEDISCONNECTED) + } + ) + } + ) + } + } + } else if (state.isEmpty || state.playbackState == null || state.playbackState == PlaybackState.NONE) { + primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_nowplaying).layoutString) + }, + mainSlot = { + textDataCard( + onClick = clickable( + action = NowPlayingTileRenderer.getTapAction(context) + ), + width = expand(), + height = expand(), + title = { + text( + text = context.getString(R.string.message_playback_stopped).layoutString, + typography = BODY_MEDIUM, + maxLines = 3 + ) + }, + colors = filledTonalCardColors(), + style = DataCardStyle.smallDataCardStyle() + ) + }, + bottomSlot = { + textEdgeButton( + onClick = clickable(id = PlayerAction.PLAY.name), + labelContent = { + text(context.getString(R.string.action_play).layoutString) + } + ) + } + ) + } else { + primaryLayout( + titleSlot = { + text(text = context.getString(R.string.title_nowplaying).layoutString) + }, + mainSlot = { + titleCard( + onClick = clickable(NowPlayingTileRenderer.getTapAction(context)), + height = expand(), + backgroundContent = { + backgroundImage( + protoLayoutResourceId = ID_ARTWORK, + width = expand(), + height = expand(), + contentScaleMode = CONTENT_SCALE_MODE_CROP + ) + }, + title = { + text( + text = (state.title ?: "").layoutString, + color = colorScheme.onSurface + ) + }, + content = state.artist?.let { + { + text( + text = it.layoutString, + color = colorScheme.onSurfaceVariant + ) + } + }, + style = TitleCardStyle.largeTitleCardStyle() + ) + }, + bottomSlot = { + if (state.playbackState == PlaybackState.PLAYING) { + iconEdgeButton( + onClick = clickable(id = PlayerAction.PAUSE.name), + iconContent = { + icon(protoLayoutResourceId = ID_PLAYINGICON) + } + ) + } else { + textEdgeButton( + onClick = clickable(id = PlayerAction.PLAY.name), + labelContent = { + text(context.getString(R.string.action_play).layoutString) + } + ) + } + } + ) + } + } + +@WearPreviewDevices +private fun NowPlayingPausedTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = "Title", + artist = "Artist", + playbackState = PlaybackState.PAUSED, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + positionState = PositionState(100, 50), + artwork = runBlocking { + ContextCompat.getDrawable(context, R.drawable.sample_image)?.toBitmapOrNull() + ?.toByteArray() + }, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } + ) + + return tileRendererPreviewData( + renderer = NowPlayingTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state + ) +} + +@WearPreviewDevices +private fun NowPlayingTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = "Title", + artist = "Artist", + playbackState = PlaybackState.PLAYING, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + positionState = PositionState(100, 50), + artwork = runBlocking { + ContextCompat.getDrawable(context, R.drawable.sample_image)?.toBitmapOrNull() + ?.toByteArray() + }, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } + ) + + return tileRendererPreviewData( + renderer = NowPlayingTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state + ) +} + +@WearPreviewDevices +private fun NowPlayingEmptyTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.DISCONNECTED, + title = null, + artist = null, + playbackState = null, + audioStreamState = null, + artwork = null + ) + + return tileRendererPreviewData( + renderer = NowPlayingTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state + ) +} + +@WearPreviewDevices +private fun NotPlayingTilePreview(context: Context): TilePreviewData { + val state = MediaPlayerTileState( + connectionStatus = WearConnectionStatus.CONNECTED, + title = null, + artist = null, + playbackState = PlaybackState.NONE, + audioStreamState = AudioStreamState(3, 0, 5, AudioStreamType.MUSIC), + artwork = null, + appIcon = runBlocking { + ContextCompat.getDrawable(context, R.drawable.ic_play_circle_simpleblue) + ?.toBitmapOrNull() + ?.toByteArray() + } + ) + + return tileRendererPreviewData( + renderer = NowPlayingTileRenderer(context, debugResourceMode = true), + tileState = state, + resourceState = state, + ) +} \ No newline at end of file From ad9f37cd3a0221e67b4ac03f51298582d811719c Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 26 Oct 2025 22:01:08 -0400 Subject: [PATCH 16/40] tiles: update previews --- wear/src/main/AndroidManifest.xml | 2 +- .../tiles/layouts/MediaPlayerTileLayout.kt | 33 +++++++++++++----- .../wearable/tiles/layouts/TileUtils.kt | 9 +++++ .../res/drawable-nodpi/mediatile_preview.png | Bin 216096 -> 167742 bytes .../res/drawable-nodpi/nowplaying_preview.png | Bin 0 -> 113400 bytes .../main/res/drawable-nodpi/tile_preview.png | Bin 19795 -> 18223 bytes .../mediatile_preview.png | Bin 138501 -> 246033 bytes .../nowplaying_preview.png | Bin 0 -> 200469 bytes .../res/drawable-round-nodpi/tile_preview.png | Bin 29936 -> 25592 bytes 9 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 wear/src/main/res/drawable-nodpi/nowplaying_preview.png create mode 100644 wear/src/main/res/drawable-round-nodpi/nowplaying_preview.png diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 3f8fd687..ccedb882 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -250,7 +250,7 @@ + android:resource="@drawable/nowplaying_preview" /> ID_PLAY diff --git a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt index 3408f19d..588b9024 100644 --- a/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt +++ b/wear/src/main/java/com/thewizrd/simplewear/wearable/tiles/layouts/TileUtils.kt @@ -22,6 +22,15 @@ fun DeviceParameters.supportsDynamicValue(): Boolean { return this.rendererSchemaVersion >= supportedVersion } +fun DeviceParameters.squareNotSupported(): Boolean { + // @RequiresSchemaVersion(major = 1, minor = 400) + val supportedVersion = VersionInfo.Builder() + .setMajor(1).setMinor(400) + .build() + + return this.rendererSchemaVersion >= supportedVersion +} + fun DeviceParameters.isSmallWatch(): Boolean { return max(screenHeightDp, screenWidthDp) < 225 } diff --git a/wear/src/main/res/drawable-nodpi/mediatile_preview.png b/wear/src/main/res/drawable-nodpi/mediatile_preview.png index ca8849464f042bbd033bf6068cd4ad9002c838d3..7a0e08b0ec249db8035d3f2c3bde91e03f68ed4c 100644 GIT binary patch delta 166563 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

Mg|3Co0AeHM^=UlkLJ{SKp5xZHZ0NN+_ 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ÌX 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�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
h*nu^NQs`psm#vH$891Im*e_L(KWB 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 F{vRI)Ko9@` literal 0 HcmV?d00001 diff --git a/wear/src/main/res/drawable-nodpi/tile_preview.png b/wear/src/main/res/drawable-nodpi/tile_preview.png index 8f1e169b7892f0e7afd68c836fac8e222e7133c4..34e1ff78f85f7196be90779f1948f8995c380ca8 100644 GIT binary patch literal 18223 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%0Ar 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 a&$ubjR?yL=U=Hvg90pHUKbLh*2~7YYRt3`l literal 19795 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 diff --git a/wear/src/main/res/drawable-round-nodpi/mediatile_preview.png b/wear/src/main/res/drawable-round-nodpi/mediatile_preview.png index 49b0acb03a16d8781669bb3982ddb5d1c31bc41e..0f595766b68dd794eb128289a53925564ee42f2d 100644 GIT binary patch literal 246033 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ǖ^Q!@UgW1IJSMXQY|oBr5(swX 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

A?q<|$9I^3fr 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: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 z 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 z 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 y{U*rv%RC= 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

9S8xarfkQF{s)*o@N$Fdm4m( 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 X0=riJgBJuJ00000NkvXXu0mjfy9BtS diff --git a/wear/src/main/res/drawable-round-nodpi/nowplaying_preview.png b/wear/src/main/res/drawable-round-nodpi/nowplaying_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b9a0c3ea2c10b8ec94a52504513b6d2080d4c7 GIT binary patch literal 200469 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

CKb;FdtVlN}R^0w`bW z_FcnKk4uE3z_^TWTKjylfEODJ1mg949-2G!FF8#;csky$V z7xde$I$3(S-BX1wbzhgl_$i<5=jZmU=W6|xnzZ&Ej54h^%9R%JD#Sd5m*o`R)v`FN zXYsj_#kVHaVLON0l{{_#`gd}Iz7P5Or8RyD@^x3_mV z_OT(TD3WhratO4mD7ZY&KwAaG2kcosJJW`y$?WCDLAjnss(I0 zxE>&-7ESO|pIyWA^K*@QrR;(Pp5PThG8{sJN-r7oa`50F!oftTvr z7>TOGhU&e>Z9(*C#?(kvT~w32pDdwYm2MOPI$S_#$Xd{J+R&O~k?&I#5m|f&kr8#R zC=;AzqZ(DKbdYA!IRwV)I{K!$RiW_QqFsN?*!)CQvk8scR$r#gm*7QH5pbUYUCk79 z7a&c&RAYi%&6psm&KbS?5Bmj0^@CIyIi5%Njp@9Eejq%GakYYqXpPZEQVNWfo+~vS zz}fRMF5lO2{i%)a=Ph(U?Gui#Xq#r;uuBMb39Oq_LgyoZ$EmjCM5hi{S1>xajxYfkEHzPIdiIO4_m5ew??3P-8vk#7PcP=T zTV`wmz2F!XdJb?Dtf_(G+`qEwBwi4klSQ#hK<;Cw!Z zn?*vgohR_}xY?Y--LsOlorY4QsA*=s>fMeZO-FzyM@c04lZ^# z3CUf2J9v$YlM`HhI>%l2mda5@zi$X8g78jYym6p-g?qCeNxQo;kKf)Z-9m7C3dF}? z{6_@U@0sTfr_JVZEnP5HMNT>N}oR9%B! zs}lPKN2x?ANRK}Z9~Gq_6Cgz0fv^Fm0hsw5mABZB06`h!@v0{|9tt5vrIHASFzl!5 z^LsE6QdN}@N`zx!#E;aldN8^PMVHN&R8erHbPU?)RehG4=(uT8hEkS!f-yfFL0XZ3 zN~k6*GgO~x4oc~WU>iX>#Q`jtL1IL$rPA<4GNu=!m%#H3Pnqab7vVTCHjTb-^6N{21Y@faAnsukDB~)s`^jcJz zHXR#Op>LW%YpUg#bwdkRsXIMxyPebtNozh;vr*!{ii(eYe?7Tg{o@w4Qk}uf0zz`l z5{#;^YHVC!Ex{8>Aff(*LrN|1IzcyT|Ku^jHw)PzeB58c)fv^{*H^Rybk8~QJ3Fw- z@obr3q>}uwK=s%(Yl~(r(J0FfZnU=eiAwR4f^q~#Jx*2kfj~P|U=5*nGK2fKQ@DRk zwYZ-|_f?XBOyTw@&&Miejqz4)T*9~e-hrY3EHJ*B!PVXrZV1MkS3KuyDqF(w=5XGw zV;Z_m!w zOe?B#nQ$ym^ETl)P1QJ+MUilv%1bQ@j!EQ`5rQ#<<|x4!)BCFWu>q<@4`xDMPB1TX>b=irzg*q)eCd^X)eU<(jXCR$Z%l36K3=ebgePDwfU1V8_59l@y< zhG*B{DJ;N7rxL)u8my*ZdFi_m+HSSP%GlxpQjH!}&MBxkdEK~IC)+Q7G4}p36QBNe z)#&PbdLh5vz9;hwT5@j=!sqoPtdM=v)!nZB`~bDzXeJe4aKN}!Rh?sfGJ#_%$8U?1 zxLz*cYL(lyf@w{4vptROGZg@+Slg;tSL*7NwY6#9mvXG(YNJ8**uvG$Dz5i7Ol{S# zuV3KX@ms3Lb6kB>dyZCaG4YhC@h4y_~$LWSg25+w_k< zH7FJo2i%S)Kmjv?E|nwCAEla24^t6F!?rIT!B`+9RhDdu1Ju+A)zH{5s_6+7I58U? z9_RI@2*$Jpqo5d@f-6>l+kjC}ESvhM0;8f+1AIS%JWlzX{!sT66I| zi}#EQZd5()7T_TeJ+td3_-0V$-INBS7GDIMYMF)zzL4V*HDJ^l;F#d3!T?%7w5l;+ zRHMK+PXIba#d{#63AEpD^RbC}1PJCJ%{NguYnDAQngZuijHWJW09C4)nXm?O6%wbi ziTTl-9K**~o4Ee?novA4P`vv1hG2Y6;O&_RR7Ib5&z1;5MV|_UYq%K{w$W#N((>j$Sp-3Qh3AC=(44pN`TdKsX z=lq=#kaq;)?EwL3OfFSH(E{=29TlX3qShLzVyPD8YP~*O#OYoe&o`(R*Pmf!V;c+Y zHo>^)fN|poFqR&Hu~;ggP|TrJ%%d_rg=%>Uitum$6=-bR86sRtvTvGucKODdos@cK@+F`*1xU3rx)?tt?*DNT=28O z59-Y)C~E!akAqRJ+X2gcOXF-YkFV{53B>8jWx7?e=^JWM^^8Bl zZK*?U3B&GM2{#6eWrC42SHW?UGg~Uh>t}6T>@4Hk^A5hg+QFBjH#nzy{BrgY7w2Em zy}HIt_l^qk)+$7!6fYbTBn8XAcCG$*!Kn4d3#!Jms~hZpxWxSSTa4GX5X{@=#e$(N*QK_^+-u9~Pl-f@{Sj;F!MWdQj4$~x93HmORU#Rsx1N4z0(EtE| z07*naR7O*1Ifzkt3YcHBASTm|A=Bv4_5w27ER!MpbIex}g;0n6?VAQR8R}MpYyVq+|pn z&E9U9+cE*rKr*dfjSaIE7?pF`1EW7Njc_oIG$*7bzV}tyOgN00$Pj8AylZ^#np8v| z_IGgkfeP{SA+A5Y#?^-xgy9Q9@j323?{K?G=&f^0`@F&J7VmEpigy3)C)tl+yb&1R zmk2mQ@wkNhH+kH>Na1c@V4R@x%ix;(ZjZ_)1>^2L)#!T%j9NF;8Y3Zhd%)k^%aRSg zIkLewQj1;Lkrbm`r*>`eh9JE;ZW^U%)*lJj>w^Wn-)&(}Zq$t(EE_OVF)sEL<4<6e zJ5^vT7cor`PL~U)&XmxoRne$dF<0gOY#gQRQk?DY!aJxwsPHSZ-pVIB#+s2b8jr zF4Ia6X4e}ZgYn1cSPMqJH_NY{jI)2xw)+0YKgrYov+wCe{8q~(h2a7RIe%>_vQKq zZ$6x3Vfz5d`ZoN96$ChVn+CZ`6;Qh=Dl63xbrF7pp<%c~BeqHLP?E|cK}Zsc{s>%D zl5(Y*H9>ureJbhZL4>dz3D{s7)7X`_J# zDE|i)3rO4bMWYt^zfR1+tKg%!ihwJiW|~kG9H$9MsyNj=&9A^)+JtX<6aMTnRQx-f zs3St97#W#CBu0zd#=^>N^kk_Nvn_&a0mGSP#B(bM6J}alH0y^(6)K2Eu2Y+D*o!bV z&>XYp5*SS*X#tt)Gcd8ha}tca@8@mXi9>xF1;ZW?)lAtbMqt3m*BYHhBrsyYsK&uF zLwt{-BPb7#p*oV}dp3^wLILmiz5RCbiYjp**B|z%+@9g?gMdiI_?dt_Cm_%FaDTpQ z?ei`l+aUsZservh~zYPKpm)d8>x z$RTLuW>o?7+~mxYvGxy{IQ6%=QzLy(FW|S^Y@zJjwrodL>H*nIZggxZR>c zRBhFbvUQ`HARNKbD#x3R3T`(DNZvNxJ2s|qxmCrt?FF1|ws5?@f}^c1oV_~0)#op` zz0w-vt%(@DxxeQ2$^qjAY&)r^K>UYb{AczEmbWw&8o#{h;;MUvZubITudZo=V@l!UMJ z2n)uzlp^6LSE|4m^ZQK;sj%O}$Nc6oMVLx0x&}3g(dR|zDb*sRjvapZ6^z6CUPYCv zbQ{ktIJ)^A7*cu%!8pQg%&VH4REY5*LNSQqkP2ZBBE!!(OBI<)#1R`w*tOAUir~we z`lDU~!M$xRA~4MTF}YQ%1k575wLOGZ-Xhp~Lp8Vo57nbrs%}(8!%OD< zil}(_=&Wu1Bmfd#p>YCqOeQGKKZ2uGj3GiRJW(_4q2yi-^1fWHJus?av8iFpa|JW} ze5meyf}*2deN?2jf${uyiX{;#{C!C`77E>g7F3J1x>2PyN^7Us`36z zsTwOb@Wuqv%uoRqsrsgHe~`u9ODe_PG29A{uX4CM;P2{Snre{S*JVOX$^14qQBc&m zG%(>a$p0YN69^bGzt(aSXMwD8U#;b2x-L!KjAMHLArqf^jZ3 zj9R*Y5j0)OOWU7Iram~)zz#RS$^PR&dzW8r9zt3-G`~s6L*X7tFAX+H?YhaXG)Vcl{7$2LCmD+GApu>r9G${ofgo9Ka z>7Wm2l{9Wv)3{&fk9KVmcbzHR(r#7@=+bUF1*%8xTesHb{VtE| zu5+s@I-6BoY}E02qlvSPWt?qq;>+vT=zjc&yDLSkcF{F{hQu zwR%mpc+JoRhK|0n&kCoOu0M168TN8Vi6&NF(kLC$zhZgO)7>-m6#v|=k^fp93$9%19xSE zGwTJo72u*ij4Id0^Mn+ss&-wYRa+s47A44{e11fYpb0Ny3a%MYM0u)$ndv#qPR*j4D`TNp#rx-K(ES44_d8C$;u_T-!T9+(Zoj<2-Pc3h ze?1}`4+usA^7Bgr#(OHpdxG))lBsZ818lwxY;2X z_xbxeRKk80-Te~2?eRDCS}s>5`Rn;g|4=^U5^fKv80AWpVmz9+xs3v#KxlFpADNT7 zp=0i)B#-CNB^=+sBpA1-4hhC3g0a55N-!=HjOzsB=08x3MF)&EtPqNwiS77XwZhI)-<|s&k@eveN_f$|6>sjM;sRW?6%4Px#K`(Sf(si2V}q|(d!$x-k+Jr9y~tOi7zIVa zkmk?L6Nnt1ic|0GNQpT4Ir{#&g+J!`g7c#%lND8wJ^2^gQA<7bl+ z>{ZJ7`LVw;lP4)4%4KWZw$>CqDVJQ_??#C#qca)Do4FLuT4`J?XK=fk$L-1_jZiek zAMJ{Qc5>WOQFdfm-cI9sHD>^MLxA3`6>;4u;c|Tz-!>ZfLiPA%XA|FE@8k0Q39eN= zrzz;4o4~Se00)vVzeGv%Y9jH3Y>+?`iLS^(!ispqd~QC#dAq zvrfS{0WTFiO=>SLSW-3m{3;%x=ErWM79$)`VuV{FF@%wL1VKX56Ou(tP>`A<>w6GV zF#v*9W#N3B>;yf7NJi9=!S)8s@Og2B9~R7IW=YVJ~paC`=DbrbGF8(x7&!7{34IwH60lzEQ?#*l(@_}(cOF-mYn zjB@NLMXMHjV3cYcnQUS>*Pxo5vyFwd&iE+!#;h^&Jb}y-!jr3rSGEx$AcMJO__=zgXwo`)feVNLRlSxIN zzDQ6l#vL$@Q!xsdRouUwCfFGW+i2LM1$n9VV;`c)Z$?NNIRoZ6F(LAPOoNMWUQE+|$ zqfv@BO4ZBb{aMusCKxBG{Qg(5u>AbVSo?=ey!zwrRCP)I`GtSG_V1mf*V3f=a&f#tQ}xk@k!kcwg@9Ipw-%k?_GtrL!%sh+>s z#h15ladG|y*Ov;)xi#)p6S4XLHASiRaviObe3FjwgFSt&Oi(mnyy5m*V7$Y{ypf!v}ghHYG`2@c9iFHo<)QI$mFU`}Nu!1zK@({9Ru z@evgD{+f;&oQMcmQjH0k)SPOY`UOUx)E?nyz!-urV2cP0sz)N96P99(c##;5U}RKa zq)O!TT~v&NTGLcV50!>fB^7Tw4$jp_7`u@p7^g;~CXX>32qQpV*xwv1Zp91w(;SCO9hirkAc^Z64uF3qiFBqe=|r zSGiqwtZkH}+^crI(FwXC5Z#JK%}{M-lq$mW^IFFflbD*A#7uS?Gx;hi9N;Qr9QflI zG&4DzY;VSi$mNQFdpIVoQm<&K5f^i#XAAfxKIT}o7ZR) z^ydgQxko2)vplu7`#@`>0xg{j;r5a83n}&tsTY~tA+XL=9m^a7Vy_w~0rFE2W@n#0cdv!e9Tz;e& zEf^PjU|d`>U{oRTAHY}<80!{{%MKXpv#4aL7!y$g#umZYAQj_*3rTKd^tM5alk7Mx&-=+|Q5wY_?{m1*3Uw0aHb%2W(0}*fU_(r5fpB z>{QY?n4iLFtBlX>627&k2+B!ZsA3M`ctbeewK)qmVAT3#kw7d`MHbOr)p}%!HiN6q zENu?oIt`p}wDECw8y{c4!PnD|xH`Wiux`-3xxtNzSnXLaQdMh@0-XSOPk`P%G7Hs* zK94t2o-+Gf3&$IiGIB$8ctsd~y|}{}?c|%1{=3*ey}-`#IU4(?NH(7#$id&I!B}fz z28?r#*(l6ljIf9#;8CulV5W%C-Xz2MJoO%{K)8qS3R2yLeLm9`Do8cxmn+rpF<_M1 z8zvY7%9+$!<)F*1343*n8^Z)#G!}+GtaK5NQ=U$NKDKXT_z@Ug1Bz(vN60%s)#yiN zWC&yCI}wF9JVr1QifW-nHRyG~7z$4!5+M|$S%UD95sblMDo4W7Pc>-r3>86Y6rS9h zs$*K_dofKbIyP;=NGO`7!KTLPEQSfiXr^h_7JEti#*8AYnMySwLM$X8_Vy_yftb zX{>-+vWRM;gff-x3?~7z(F7KgaU8enxO%frusyTUrk`kE_Hg_4wQ-~Npm--Je%zx% z+_tq-4GfnF#$~%MXv(=Mh=yQ%Cs!#!_nctdilMtnFg{BXj%nQQ6O0E0prT9i>)$ADN#)hyM51|zeq7e>ap5N&P!Pp=e8?hMXGex9QoJ380uSR3iFC2Rc#_#sf zEkiEUDS=JtK>W>ue}6i#HD7fZp@})SSw}lsy>C2#c6zK74fMx zWgsa9sp>g*tCNmGBotMke651+3Zb}CCLnct1~;85t_jGC&OFZ7mvFkdhLi0boW3}~ zr{gnx`SJ}H*VnkF>g(Pqdeug-T3A}ecz=6Ovt{3`i}gDQ?+L&AE+6X(k~S|=Rd8cLmkpPgc=y^myL2jQanGpd_B2V+G;8ZZiy_O=RW zOG$YYsVXK^x^N;JQ_?oR5d7Mu({yV^W<|q;mOshb9O` z1r4R)HA;|RBpk!xJi$m1DxhdMiy$8}N&RxQnl;G0U1L=NZqwO9T`ttALQ1h@)#8Yh z;L2}Qmtg=C(9T{JFNwXW(5}-+ZTcfIc zS>isPM+$I{s!!|x>jm6xmvO(#WA|t;ss@6$vgbV44)<-#D!AX_^Y^BCOwqVt&-NPF z-&(;Yp}4%ciN>;mZ>SiTdSGm$HdiQ#gMKvm-CPhDvqg+g@H^wAQP`%#)~u>iexY;wXH#&Ef@}!3J{71hEFwC; zjd(-7RToS>Q$?v7Fg`kmQILvEb)r+XulJe{#%t++Fu}S9$Er>0SN>wwx!zuIk1F@5 zf27HQETgGn_)o^uKVst6A9JUM`<}kwZ?~*d7xmw<9^@YH6BHk}q5Apw$G87c@$rA% zEF4wmbC3hPhZY#@M?C1mL?nRe_z;@>5v)&Vurrg#>v{pl%_7dIBtOxP^5?T8GRA?5J|i4eu+6=bB)=y1B>Y&7G-o^Oev4e0hftUvF{zsf*WVm)NE< zTzYwm()t0iOD~a}-$iU@6OpN9qbhtEh5y@Ras$Q(n>Q9wg`D^lypd7s(sZfQi6T)2 z#;0jCwwp!2Nt5xoy#lm$3AxqD;cxw&0|ax`aMi>gsjTp|>?PdTVc*GSv`kgmx^ zxK(7Jsx_rGxJs+0sj`|LkHvDB9!?XAX;ecKmqhy(zO0vU&WYp4 zg%m!_jp0L$HkZU{J%!VS3{KmV_^?{QX(x|QYdM^+q;S@ZkSex8AnFXS@kz~VwF+4gAzq(NbA{f*fqmzp& z<@oSE_NjcEfY@(Ze|h>9j5A;YZ~PwRlv3e)J%|X5kq}j*pNi6F&etzf1hKk!$Zcxe zrz#$x#DCjzOzW3wO*O*j8ZZ)uZcbuUPEKywkY8?FwW|suKrlvP6SRy8yzvl%9>Fdu zcdAu}+UGZwZfwzTtrwbr8o5zrX8n-=x7Hg? zYl^vf49dM$YQtSyr)|Pj+lG6V>SCIoccP3W|JNcvziK3jN-%*+cofy47;2-#Xibje zU~Lg^x0g9tTfy6{WgM<8;i%KXVP^pcojMLyYdGKp?_g;fZx$!>*HapCqr1Ht~SJ<0EL(S_F5C$FK4{Yw0MDqh*J&mW`pqZHMPr%S5q}9>ykZo42=fQEcUh zuu+I$m)E%0n!(PRldiF0!8qTtQK|nP7#9r~TcsR2Qz@*bVg`)Oh)iG%JObmi14gMX zrB^7AP|5d><*Yq{l}uoC;MiMZG|{Mz85gV8A9apL&-)pSk01NtmXQT(A3w%E;MDIfE(nm6VmudSf6EelnK+ArrrT`=4a!|JC>O#eS>JP5tYMpFgX< z9vB}0H6Zuc-vvdhP|Yjjf&z}Fg@bs4()1WK1Fc{Ze4py3eGu^|-4Mo>$SVR15z z)nX2tg;*9F@-T5W`2AsicY+8KjPcPl;$t}s zjphifNqANAZMa}mqmN*8#dGkEOxc8f!LL`hlpygtZd18RAJifr3rx%rQVsa2(7a|l zk7Q*9LyF!TEW4wlhHNi1BE--QcqH;8WG`SWB zB)+CxsuPQLQbQ=ZGIb0Vn;5LLF*w`7;M@lKs~Z>~6kXM4@Ngm&_EwtMYd7$GiOOoRj@`yA_7-T35_aeF*qO`VSv7@cGh^5;$FW@^ zfQk`p<^tHtT3b&C2s9sBV?Hd>77{+xVqTQOE|fwpl#LCd5^?kOJt)OIye8U^kN16; zjRi0_66AAi$+~>NgOtyOG5-K2_`FK)n2ru&I_5%A&!<&rRi39h71ICqQtgJd< zG){GxDWg9uSULV3)>AmznteSmKA7OBh*!6> z{a&1)r!0-TkOO#tiYH9966XM&;%sp;F@{nqg?e@ZE9C;V=gQcbui$xO1}_$7u-}}) z>&02lzUOhU*u+75iL-J-a$^H;wzhG!_X6(^j`8X23%*_4;oH?6K7GBz@y9M+z59yo zS0AvneSn$eXGqPq5K8k492>^~2fhKSg8p!dTXm+FJ5Q03JZ8L2TPEz5r~(%;lyDNz z$5gV+0#bE71;!x`!cvRs5vXRpAvMX3<>6D3zki4-&Sxspm^IpdmHQh+Q03r4L5y*b z7^lVk9*iofKj1}_YR)sLH9-%7#`^@@sH)#Yg75{@&Pu5pT1%9vG@RR3)ah5nn?d*q zO|_*O2~sTv{H9od*EMK@eWXNVu{effN#jBta0L+x#gI&-kxETsBvqiIqY~r~+N&U< zXu)g;MknEpPs2TG+eZm<-n61SReam_T$C$RipxjX8EB5z;Ga;$CsiC_70R~|;{+s_ zR z$*oK`;Z8R&kk-IC4^OQFUt9H1ebG+^XHcAm}?zg`)#6xl4O#8&iD#loX`EsB`rqQ=h`_i8^%L zu20Mf+%bw#>x>x{8lNT%)s`&_*GQ7%N*sNh6!%9G7#N=5z8vbUy(eSpA2f07xBk8A zd-@{3-C~j9C;NW3$Lg>L!k+!7;AmWbigt9|btaJH!FmeP0dNSw16*&h$_EO;fzLykc>r<9wju#M^WOSG*`%CsWgS<@-#ZLRjfA}*y7A} zr?ZLO&1cx&+Qa(RK3295u}lay)?T2pxP^SJjj>`K(X?E5X}CH29|#ShKMz$tng@nlTeHg+;gtB2|u2 zizhV)7PL%4zaXh~K`HEUs_k)=XKR|S7V2(cih7$M8+9$I*@EK=Tyo%Of^SsWCTY84 z*y7;M8lzFFcI!6{iESNKpPCO7*1?Q@EmgenP%RE-Y)+eNW*M&fCI+i(7^qM&Rtd(^ zI$V>h9N^kKf5QY7C5KWdjZC0Ep2r;Di^?R`5Wjo1$`qQl8NAuu#QD)nT)*E(_w>0b z33q+EiSGLju20&ydb^0L!zQk2-NOZR4;tvcna9P88C>jFarJr@*R;$13ckK5;p_7f zKJ855aAks%!X!bN#EbbP4q7RkZ543-Vj7=c7V+^#o*>TRe18hx4l1}ftm5mz49;Jb zak!Skc69`udwRMef>A~q|IVjPJWFfI;7(4tyw z@%z6>FfQb&)YJTYGXkFgxImaavPo-y1x9O5xS`!Gyc4)ceUAS}m*hcPjlKyD&~ zLcWOUVio0b9n&)l$dwlmFU(;iUnK~q39vl;BMK%-U@$U*{$K=sJb$0o@_^h2*$U3B$08VvpMBQ{7jaBY|;<1MtweavJA2pjVxU%mRW` z9{$KEJid^rliKIxGfLG7P*R5Ky_kuHkWph|szP8|UA{MC>YT9v@3@M3Q`PbP3OE5vDmEU9^Sz8K@6ozaO;wzv?UE6Y>Xh{& zQ`KBpy%tT+MVixT!}L{5sn?>`fmPLJfhtggtSu1jsjp*Tb_4wtg0b9zyCNvAz>{9$ z@ryRPIFiK#Cp0r-Ig?vg<$F;omQk%$F;}mmy)ci{1Jy`XI>u{T>h04eu0M5bCk=Jg zI9Ik9b_8DSe`fyMr=rUr*z5FOSnzD#`^a%4QPpm&XaM zG`jmm+#Z%_MZ&d!t5-#yNBtU|a&M}2dRWId0`_oe0?(*CU(Al;{ZbNNIw@RjX3*Wr zbIa#%S8)4m1~=O!ToH;hOjs~ie|ooR7Q$l>w-=6)B0qSKbl=P zv@TV<{`e!@OdyP@X2Z{Xrp3>E&3x{IGpiUN9L@88a;ZL5oIMaaF4&(;ui?s2Ev8Cv z$FrPlkHZ%kLx2j=PcXVTu9!FgPWWA%aC(P01`H+m`}*6`HpH>t=1%qWJ$-@SZa=Os zT8LPCdaSJHK2>F$p=i{}V^afTTQpktZN-{L>wX55{T853l;Q(S{~HiBpzhuOB@`bW z`wM$embxB-(M2_*x}NH8Z@{5|5~|1n0#RSAK4&e>tfwhqorAo~P4&aU-5(5d5Q`zi zFI^-yj-hy(gKG){VJX5GXKhi=+QR6k5|s`3WdU<;wTDtaMb$F(21nqhS_~;7Q^m41 z(5BS8PXn=%zUPfH^qYQ+)(ikmR|mC5vg?dSMVcx&DzZHV|8N$5{b0f)gghrSZtG4p zu4VrJTIG4+Pnn<_pEtzk3XDl4xqoF>!x*-iRhf78l!qtwHyD0f@btS$*o-DWMa-F^6Nd4 zOH}K#az&dpS_4K}yl%m$GJAYqO$(`U1lP=R?}mu4OeLiu3Cp`kx-mjBN#bQmU-<(!ZEu#e z>wJy9Y23Y@GbQ5GtoS3rxWBiAt!Hak*`#7z?qGgt1+A4eY!Hk~4j2`DW5B37skGT@ z1q<_av%a{p*5P&;D}2vZ3C7KttO4VS0b|&}afy?`C4To?0^?*A6B(^ZOBJ@zU!cPK z*(L?HM+y7JHELCyRdNEOU1#j)M94e8j_CS6;+t;}Xv$^Y#(=IPR2c1ZOZ99fgaNZZ9p!Nw7Z}r)nIAi<58{C!4O&5IkWjM*^}j z+j=ri{y`JZe#>8_@9D{ZyUi9V&h5ug{A)PM)J4HZ^<=sy2ofq3EnqlnOaf$Y&8b(L z(*sU-edd5$3GWZrEWqpkuz)n?fY1h*e7Am&+cDjisTzzTGWkCe zekMIad42*PZIF{6jeehgHL~Y*b)CN#Ns61gSPuqRceH z?I{>%Yu$V{5#2_nDv!}oI|@uux&vpBp3t!A#pu?xsiCkFfFrf7)=^#s-cU8F@{Q`G zs{NF@ZO8>0P=y;F8{%iGbw{~b6Cpv;#bab{j0D|;s27O{!8v4GRSAGnhYGgoa zM|By#g-!UDcF@Ob?W#!-`V`?~b>o67LMhaU;s4@v(X;6IQq;%LQ^7V2!OZ9iS)PqAKew?dEaoYlqU#22lCQz3} zG1BG-aG7fK)QAgbi#}YLPT-m}9bcE4snfj9S)4yq!^TP(%L`O|a|kY zUcgwL!dN>Pb6I5q#&W5M=?1|#JEN3ijbNN280Yc{f-$JTSoOM4B^+z~-U=Kmp)e`~ zqe$>GboEzZOi!VU6RobHrpfKJbiCmAAT>$j_fM@kHUnxp)&ZOF8m_^`&pf_*9I3J14XYvB1g?r^opE)_^b5fCNe58DfG4TmA;n~mR@5NnvPyREvzMl3rQ`)u_)h(>G zj;PyE?E;EYQIhN}D$1@*C4loW*_u_}n^a6`1!#0ewC;YbC*I^Wb+C?7Px5~>{}(aU z;l9n3lH7(QpSKuQ5_>lXeF3CF6sIK7Z<|DD@_iv}#GRo)X_c)8qS+ZxZK7;m`Lgz@ zKnquR7#>2+t<)c37@t&0;>xH7odQ4^tix22?aAi?O5S%#61vf#+IXJ14>QMlbU>UP=eLAS}0t92i@5VsLjebAX zrPqeI$EM2j^|+-yl>{<5RMBxMF(NCBhdLKTZbraDsN64jG+M)axQ)7B*|ILnx$+O2cE9{6uL)e)ViIexCk@BC~hzV z)tjtEIwXBU1=vVhMg~raKvj8*5@;jI{CTyet0oj`eNn%+QY=C84kgt>+?=NVI!ptE zuB-(TW+o~}6P2WiD$hjQxj@+wQf1K^Tw#RNwFt)?7Y1>LypePZXa-D6^l*IKevth@!0olyulL-L9 zVkHD*D=t$7M2A;36t+?!O6LTdzYq36iUaYGPBfRwD@yrESBEALm0A=RsjQD_D5?g< zsxpftq02g$*a&dqh^9pl&tz+whP0z-g5z?R*e!AKhT}Ad>PsFw`vmoesE>3V0Axy%uc<*$GFdlMr>lFDChqQk2{+ zZc+!8sZ~K(I&K&YGU4DPitmlX9Z&&KR{1Vjo&4T};P%I1^~GTd^uZ8G!`Pcs4Oo?1 zDNC3L5UIqvay4ZJDo5jRoil3=BI&A%43$6`1;vn5ycr}22MI;#&><#|Wz=&j^+Tn3 z&Fi%Jmbi-7G!*jfz zIdqTAQYEgyO(;4RkHRo}7~M1z%~)GQ_m~WnGYXjA1w-}|m98gfau{lDp61s;n zxVlcb@%Hs&Qh1!Nd7^}yC#V>yB9Ao^SjYyjFyzItN)(qC`fz=WD%&ii zaIqT0iBTWUPDF5Jb^zD*OWC+dzE+*rT*pP;KDt`M>b@%G7G^Oy)u3veMs;TP(SdP# zx(UVx-@^*QnCoz*?ge86H3B8sUshnW@pE*JEyE_CQEoSG0?F+HJ7-R808zF|(DdO30QtFgrt2*VuZBs-ZykiU%(e-|;nX5Yjd zQe|4Hf!;y|f%FK%sg}3!NipHsPrc6Q?Am+cpSg8Lqju}Hwx%0VK=4QaYAMDROj@uI zcdCHV9|*xqI67TkPPc+m7;6`)3h6mW(~!rVl)v5R*xtl0itaE1fnd6$8=Q} z39bnassUM`sNp7VQOQY^&JL0yAPMNYFQBMFRjw@5DsiTB?UXWXrWbg)kE<1M6UeGM zsnX=vqQGcx`&)D5#F^$QpYH*u>vY|Ay zx;Rr;=@M~qI}>zL2tZ25shX-Zp3hFRg`|X>&XrV=uY{#ddOq?qQE(Kuv;^r$WT_Na zAPD{WWw>+8unZA|X{l5*4^w^-rjaF;huBqEK(|1W);+>)X$dYu(YbsamW89}njskH zkHR>+2}AV&x{J#&j4pEUl=IBNoS&iMt@8gILT`QyW0O@5>@!q~b10T-DCEi*87QKf zDdI#6jHmYF=IJ@ylw#mg_w=}|{S7HN%J$}QDeygxi>n2!j`g6{Yr{;x2eYZ5YU4Iw zlbl5hCL;1!2unjD94LfvtQMxKj1yK;2bECV7{O&KzH`e-oL%a}mGvyH9U0YdJT841 z#|X|LY}R6Eq_E#{!z=?qZV*}O3BY-iVRW@44qdY!NFcOHfbL#z*da1RM zEE<`FO4krD)(FLRFjm7mV05Rb^s*X^)=@oq5!I-`NY&U0#%2meGg?&VDQYlE1sw5g zbQ4y}hGgARj?+=8x3X<8%6Xe$Y`<+t$vSo#CQq2ZZ5Jou0a(H@Sg91TkAd?@52=mg^sC-j>t_DgsGW z@Q8aaz=7SR*WYe&oU&$M&9)1&2}W_BI$Unp9U6!>yO;+(lh|#7iPyj8_qEg$lJuTx=0do6)FskDdmET7C}woYG+(cBQA#gH)!VWK!!C)=ZN5*0 zT{ppKBINBHAf-Bu&n;_xZaAg*xVT>hVBI>J)X9AVv?%vYQY8-fMKyYrB_$V<@av&! zjBs)gp>hn%njyCexKyJOxoQ#@uDT9!%S$10JG@?>>g-}w?sun3-*5*7j41^!Q&=KW z3C08mg*3sKB^ZZmFy^LoFhiCD)u04KNCN#RXU{oZ{!Oal@IAMB`&1oP31_zi6Fi?- zA50-J$@@ww0IPxm3XYPBAw0&WP$W5e8L z`Phhp*XgA!>M0KaXhk*V!c?yx6VU+D4l4$oHjEJ#^}Y}mho~k;!#LT9;>v0gHwZgf zkG!~&#fjMj4%b51m<-^|Vn41PqG~)!pdB5dDlK4ZJ*~hvn+ae(cfzyYI*jN)V)(J)`X1))# z#@sEzn9tJ+!x$YYV4_$;y*`8K*?EF-7PZMTCbDT%Qaz~01DFnbQS%ENJqnC9uM;(b zu}UzCD^-a~}ncQdC^FlJX(zkE){1 zUMMOsD)qSo#tt}&D>XR+QzQwa(?^lvWb>qY}fnC058EKqHc{;8ZMVd4XQg}YzO4tYu~n}>J>E<5Wl=cpDIPwd|VWw zQl_2fRh>T6|1E2c;x@JGwL^iuP0}rVu(?98xuZ=GNx4y1{5U`>rK>!1*EvkLqa5L?IUdZ4<}i{9$zbr%Vjyl$%(qcka2U~ECL z6O3KPE~Of+(qf7;=YZEs^AV0zyPS*|4U%SIQ7IN)s|8+@5q_%6FhLjNfGQ~-;!;if zT}Vm}q^L&j8pK=RAEqoI0W-xgRk9yiDns` zfh9FfwWr-}R)R6S?>M5H=iyq_VC-&e!Zdpv-Q_iO@$>Bxl}T07HAdB0J3w`L1i|G^ z_$H>2uFa!ZUmy%-Fg9LAHeJL}w18nw5+(;SIJtirS5BRn^F&34|HdKcp8{z0hr8kTrmmLER3vxaOCVPEY%=QpyQJj-B4Jy3r z8$+t;@J6KvD`Q^l8*yPJ@5EZkhjaT&FRp&-AfOAra ze1XbysTVi*C2?~(g{w0OoTi#w&v`M^YsTh80$2BstTD=3 zaSM#wuGGg0#(}1ZYgHAB7q$4)fzcq}WsWx{n+Kj?jAM5ip6mpb;sPS2RfNh5h;f3I zoLokFl5pe%O~4o&n}IJ^L1S)x@3{EHnQ-lK|A`-V_X(d6D-Gt=pdap=vVQVX0$i_QOG?YUPhd6t}ocTWiR- z0%Mm!uQyt)Cb+5iyj1;e$*nY6RUV_0?{|yGUg%QSu+-ZW}TYFA7mVa$yfr zRE}|~zc9fVBp@ZiH7M(hd|cX3SxoZ&wyvW~RlyOJ>hpNuu**b=Ko-}tG%A+LJyQ8b z`Y0+FvZy#|!diln*4&KY;Gk0HMY0 zK#J-z1rzU^lLG`E;mcXLEs}ygvI9ny*e^u@q{gX4jS`GjDGn}?qyu%TS6XTcmZWsi zsKODist8kAD|D4OFs+|KXze6yi<>aaP%RRS<~jj6O0}3@)JB!rHNFgUV;%OzBXG?h zf^)Qvf$9RmxI{3{5sWqD2*w=2nCJCP4i4ee8o_w_Ag)~`951fm+PMW>S8b)lq}O5v z*G>|SCr5E%Bai)+1kzq3s(l1QpO=bJz!*TeH=_C!7D7%GBMwX@Jy;uy;JoA(9vZ}L z2h%v-h$%20YxLpV(h#9JfYmV%HVM58s{<+;^(Mh6AU)CO#r{!(F&DrgSwpOau{9gT zjrllkF81O2Tpun?MHLv2mm-)+STq<{r8gsies~f$s1~=5jpO2R0b`{J#;GP4=N}~) zXEhk7XHg*-i|Kxh6O2;?V?3UFmnGu90t3Ozi&VMkpw(_8Tf`LsTLOzEw7@7P)t-7 zkrG#GWgjxt{aP^=XW<{2!uQ+x?eLeMZuy8M**V(r0%{TuG7|5T&V5tR8fseLE77m3eX`YAoNi! zO2Ru~=m`;sA%uF82y%9B7iA{?l>>K0o|bt0@C4K+?>j-nIYu0 zIlTfd$uHF1=(PfDLatfoQ{1Ma5?wt7xFxMXidrl9WpvSO1xC5ua;dh!m{riUNymHX zM4?K-d77@`9S~_ZX4CDg+{!zq+C)hzg-zBPrSgqMRj`erz5!GHFifR27={-)(9UtdZ3gR<_9-x0 z<~Lwztim>0LtkYEBXy|}I)~AT26EXlf4ie7B!^KhjNs(qgSc|;D6U=FBp35I5HW)DFW>RmE%=Hc55wz&1!&P4B_lbKhT2sOOgo*xD##YqLzy5{$>k z2*yzyKT^ir5}_yw{?%F3_?|2*ETOgy#=L@~0%Kl-u{=J3X##P2Ruto`QjEpHew2EH z1fw6*A%fAn1IC)qiE1Q5Fpdz6MK~qpCS9dEtf8CMwQW`Cd`9i9*nwiFNhvwWbreOZ ztqDeXTq(xgKx~JhoVQtJr}a9`TC0*bDb;R_{uqqS@iGuiz}KHcAXi0Xd>--1edw($ zAz7tbqzzT~sdYvHW4Jhv;79{A`%mo|-=AO;zCEtL(_MQ{_Jo*jH6;V1Ku*>Ny{cM* zjf%%;^{B^pA0xKoMs2OdX=~2|6!j&2`V<_SfYh#4iBfeEYT{1SW)qVSx3#6&TVNFU zIRmQWf|J+fa`zwb`=e zC`Ne=UYlI2dN10*s3VWt)o^PaRj1-e#HiD1p}MoHlnq&16tnX@E}IozfgPb4A}D)Y z(#6C@#pp*N9>i!YfLwr}40wyb825yQFEzdS&bN%K1|S<8gv< zgJ9f`t+Tor@l65ai8^fx*N#Q z{1+OmJ+zQHb^ka8e^Vd?8n(g zRHb~(ru0T2UN}jE8pbS%5AUmnSsNg6O zsiWK0p%5iEx7o|Fd$9RhYJE~eSPBQ2`bJ>#$5l*&MF0CDF?fZLYasZHArMzsbgH8z`YG&kXBbGYF1hv0CE;?pqHw>1=%DKNId(IEf~ zs_=cggT}2x+?G_5cACxU=ksC$NuMf~EoxNODa|%1=_c+@tz36Zu2a@V<+?Q}yG6yc z)TODrE#lOo+9^pcqFJic$n{E6z5=2o=JzQG={88MwLd~mb%jX5qJlnTpMDj5BNa{T z+{)USM5jt`L8Tnk@vZg8A$^WE6QwB8l{T@aD^xv#b z0qIbw99eEhLmmus@R3S7vMwpdsGyte>O}I|GSTAsq%WhJ>M|TgfZt8GFRmsJGHH-b z8WJsPZFb9$c2YVjR|s0>(?na#V~Oj1x^T)~6SKhG6vU z0i&vXqrgZwHLXi5-LfXA6c}%%7-daRz*yFa`PrIEA<}D-dRjV~ zgXF&sRr%eZLLJg@lsdcZU{q;f{B1jYoS;kfsLUi4;{ui9in0O1FfCAQD#tj#Tahsh z#?i);y2dE>VAtbtr*h2MbD}5Aylzj2YjLN9o1`b`nf$G68;mU&w%aYh*n(pVjG`Dl z-hhIko#1o10|*48>UKLAm0MM|3XTH3fKrJXhyq6qMP+ik!~E)ThdT(bzXw6_zxyIe zS+-2vi#ni30P0i`rMhyB?k(75rNW}ZF-qfIC-;+bN-jUFJg1Gy+Cd;XJbems4sS{; zG`04Z(P~bCO8_>YyU;g5D9QYiTWAwEAz>+i)WDQANeR#yR3@MlrP(qS#VRQW{$>j% zwT}j&4k)Nbuq>WS>7_Zb+j^3#g z8jRO3oxlx(QG#%;oms@S(+jwEY97~4%wX$ig)r=+`txA5=);A5X{?qaC`N4xVO{ zBF@cYQg^k0t5lC?XA?L`#aN3wus9UPv2qNTrU^tU#8Z_dF3*o*YaeYTOE3=LL?xo! zsr!dLxV$XTl^U#4&Ta&k6&S}cufRB?)>|8mCjpESB=bnMQn$g_a&g|m#0^RS8mah9 z(x|vuJY2y~z(^RXTB}Wnb}J}ODi|7uYWzNkO~D{Q%?KbTH8i=uL|vQs8!_74YSL@- z24RY%;NZrhKyIjQ&@0*sI{af@20HqAD#it1w<)IA#n+W$*B|yNx&C4N|6Ie zr;r+@ZmCj3Fj@jBboZoS9OeKbHA$(wY#bDvQ_HYdc)Lsp5jI_U4qUmBZ9p2bInM04 zjc2rCjOile7H&;(G0xBhjxp)1pU zi?FSnhrM=`;MQR57BJF`62&UYabSuAU~@1`77)#ss1j=^$y%cV;|vPb28z`wm9&16 zV7%N^j5jVwG4cJletHpGrxs`g@xZh^k!NG0B}A zRZ*&&)hHG-eiTDi%%wv(T8iRgJ&Ns+{h7JIiACbBSnHyuQ8UTNpa(`xl*TR=1`lQBp8!wjjs9LFJz5TCiQlI1eWL^T!d$Md=Uvzj1_UCu3)gX z4+E2n=$9x}LNh`Ojn1NfVxeQ4f09f%_n7|Xy7r#r2{W@L^TKgJfn>%$!Ikr+a+SVG|Oa@A;L#*AUx&ugAdlVHUrXeVx)R2_t zw4#)v+-;_SD!0Xz8>JC)jvgAJ;n3jJ=Wo4+>>twm%NnOQ3Mb(xiRVr}=JE9?b1RF& z9Uv_IQ7W}K-2MdjPpS?HjyAJzn*gy_gORr#EjW55#bTfd$z7&guC4nTmZC029eSv! z!c;as0z}e6Br4V^=TooSgrlbiR)SvENLA~pTd2lXB(9{Z2*@1bK9)6F2bf}|W;k*e>K{;o+oD+!)bpDjNl ze>lPap^qxKA6CC4+)Lj@DnUX~dM{dKT~T1z+)C46aiuCS2Ag1v^uv_ppff_i6lY)< zpM`OJjz$GHK`T*_NfG5?D#vVrv+*1UBLQQ9U>t%WCf&~S3W!F|%#AWb=Rjs25Lc>p zp;{y=w$*}ayU=)11p}Gl5;a(YnS+mgb_4dcGcXa1=CyM$FPwy7VvS&&rzmUsTij*-UQ=`HZWd4e@KDx#;HZE7EjLN z>ShH;>Ip38TsT|~EPb=^8~GrCMAl_<0@&(k>I~ zJm(RD@zS(_F@)toH&(NR<#-I|>%D|yA1;WZO}jAPZ^x;rIAP0k9T_7S3%Kn>4kro5 zh2Ujt+_ea@|?^S<~h-m{K=ZS4r6LURYsD$Tcdb_C?H(nIBdPc zaAj)i|NV|QZ!j(>>)VAV{?d)&F&fNp9B-mJ*K}`ckMmN6K1+v zOy^^*@cBoAV=GWa+Aq1>%}B?`3C331Mk~K@FBm1kTfoTsd*HZZ0!EidLrN5)T5oJx zE234ITf0`B%0eoT$L)^7!>!jFfyWzy*B4YJ?YzE#y6^FX;qyfh48;(M#1W15A`*=u z9O*$1e?W;uFOtb5lKn~aCHv4n(2u?p?+>JSJB?)D03tno2uQ@QFGf%boZ`GLQJqpW zJKnV3CcOF-$edmQpSV|lob9Mf7Xji52q2rL68rlV7hm0;Rm18BTt7PM1$lT4)j|Ad$U#lBK_EX0!Bkl*x^#_K+%u z;0$uYKrl*+DRYF7BJ7RL{)=X5=On>4s=wkW?~kY+jH+;YP+X}Rj7CY($cx*wu3V~J zBic-3()yOs@hdb zWhk99L?wy~RROaFMhKT~lj_9QREC(ej#qJgqlZ2swFRYmArbQis)p16eONM*=uI8OFuw9$aW7us`F$e9D2%au04hAnTY?-?e}(g7FlA zyGSrfNjwe4x&Qyc*zB@#OWR(DY%>XAl zbnJi>rkC2h;|h!>3IOSr;f-=kNEYB8t`m&Q8jO`?m8v0%F*Bu=V_$h0QGzovHjk+M zE^aZ_KfxxPd(?ljAo--!N8PdA1D&iPb#Jd9?cIL|jyhe#&=GXA$DR5U!Kjn|ci?y{ zFlsm|FggW{tw>cdt?VS&CPanNn;e2K7;Cyw1&p$fmxD3~X18Ct={&v=e1Qo3!5$Uh z5e|h3yC{;0I8v!N1_rnt;QeG6iFlO8#|XMYK7+~fC?+TKs8sX(F%~dY9l`ue8Ow`x z+7uQRs#rZRiX4>^*t)G1qthd~j48rb+^XWfjj44~Sz8t8b$tGWq1oIl z;7t=~wbmSWo2pnN-xq;g^M0#}jmc!yxt&zi7E!5G(>9vX?u8UaPysjUd)7@=D!o0! z{Cqg$bw%-|kKd2~c=%tG{p*9@R@G~ylZKIM*eDfm5(H7A1bc!Y>K#+=O_TJj6i`w% zn+V1(QH%thDaV1Wz`>+2jjsH(>cG*RpVF|)%DT@40V;J@sT2uE;~>E}KtN^)w=o`9 znTKg+1*Z7}FwU>RII{`^2O6nnBlTEK930Il4pMS0DmZ6CZADc^YRg!-{8U{0rQg8O zXa6e3FWiB^fwQp99Yz-ir>?>r2gZhiVmG1K)mJ4brGo>nQ`7-x{?eJfkN?AHzKl|~ zjM1S<`}T_?=;O@uH?W!dL*AY!+o824g*EPzW5KW>}#;dGTiti)8+oAZ-FoGyE* z9OF1NLNz%g`I9{V0SWREFy;xyVVrIQ<3peRQrqwApB^U|13xtwTal`dWP6|}0W>XZ z!g0qc3W!}9`3`WRl+|m_hQVnVG6a~UiKMGdFixtrYNjA3fC`L$_~M)>Cr79l>j(-M zYpXf{XL3ocF=p%gk)2*ezoZXMEUU=W9+@oOVw``1?J?C&eNy@_c3QhzZ11|_k2RID zp=*k^px6ONmE_+E#?JLd9T_UYAS!CqCOM5_`nI@H?Jf;A9e~p^xvvvirFWr~DnrsG zB+cZvf8)3DsgHbI*@xcwr|<{-2>RSunVZ9B|LWt)KKIw3z*DYVMJgG`P=6G!d-*Hz zg}?m-zHsl~EBgnrkLvB`+f1JO(#Jl9FMjNk%KqW+?!*0m`*Ga=H`?yH{W`%KLN?or z;o$_n{@E|#|NhRuDf_pteHXJc17RbxH~Lacd>0;m7CP;<_dL+}d2+$K`E8R*d^Q-Mr8J98{~~ zDt_q;eg~iYi;vRo)!Pq$6rcLbkI_DkPt#=ksSp31dR*_TMPI(SYO4lgXILgQU(;At(%IjY?mLbrsz;Yo}TjN_7`!D}Aj^%wa+l`3^i%`M>M$&9{nG&xNrx=0ma9 zjUI~;g&tl*A&j$x^VR79F4lawJk8rPaa?IcaZWmTR3g|Y_y|S^R&pL(Tpq^tjZxe< zK8&r?LpXb449m+?s7=Yl^D7;{uj1G^VOUUL+^&_{1fwX+#@r$rGxG|JQu#(D_{aPN zqhCYO>%p|g!L3V`gqutW7>mt*jAaeS?KMTM>@*l<%}+Y2Xp{RIoI2HFk78^-Zjg1v zrfGmSVJkpYk*Io&Q3u~>Q_-nve_8V^t2{_m&57fnQBv(992X?_GCzw@Z4If#qeu{j zy@X{0h;Om*!&_~+P~xs1CMqqLQBdAzD5 zoB(n+7`Nf5N`CE>f)g0FmxB}cX$y?v0(E(1T~I2^wA7+lfM9GIpL_eCymkA>^3D6d zf>4M`(r3fwft8K{>bXyUI+F1q1`+}M<-6Y7@!aFJ=RfD!h{arpMcq`O9?oe0Vf(os zJ@g&^NTdAm#!(tiaXWy~!T`p{hcQ_hLAf-H>>!nDBE;(oQ@zHJ>`S0Om8NC+106!7 zCq=c}3ztveCoa*J+clw}>6Ep~W|XXrP_(;KN+oW)P~AJ$f}`CT#{1v$?mhp@@5;`s^IIf^l#CETwT}WBCxCW!iraca7A|`8-;%<$=?dwx6;RiqU!1j3+ z7&#DG2|(M}44mZ!c=;m_HP#Sp9DtWIVq0;(8LYqoB`u}43g}8^)f%Ee(Ks;+Q+Zyk zFB--KI(6NNqYaGRLq&qJ2y?Ll$J9Lh%j;BkCkV!quqqlV@=C{5f2^aFQlbsVhn?UR|HSMx__i12!Bi z^$>~?)caj1MXi|4__0!qDkx4S-BgDzj7GdD^1Is@4B+5IOsz$pTj(VedkLrnZXS)} z=7}gRf*U6Y!DAuZ*x>C$J-BUu0Jl*^-dOKd?$yg{37lN$!_sIJX`h8)bYeLd#%U_V zEAWEYYSczbj>NkX;YJ@I1)sZADsUj@HlDE5n zP<;jdiFx>>%FQ?-Sei$O<{zDfr!WoAa24Ln#4X15C&f}-kMi$Q*WQDFj*Wv_GXcK6 z9g_gj?UgPXj~0x&B%H3Bx?_?`(Nc>}kG}~F^PGm7XHGJ^gl_eFXLm)&2X{TDWd8F!1Gth@Hw2M+yFx5b{yL#~c zx4vi3|MGb3SxRBnDt3(t_Dvm=^Yp56{k5U>9OEYFOmA+IAl9GBVD%N0CMHw8t z7MB!P4-D=BqvU`22qgdXD*Q8R2rV2!m4lKa=?M1duW_WjmHdg241YeKD7kj(qZ^kPQW%##W;Hy zCcci5uVW}JtKNx*thhQGFi1CykwyIS3tqKHA&QAg{NdOB8UMxY?&ri_@!Ge;P!;#= zD!MEC(KSi%P7;>f8cRz`Aw&xmfijgD~dvRkkh8sty5|4&(?P!q7k+vyd6qOjk)@le_`+5IhT!Hb%<^aK* z!O`gfl=z(==^^a0L7bW-0H*|uUX|>>H6OvX`6#Z>_u_@ukKnzp`W@W;yD!0;e)~oE z&AYDQwzWK8Zy1+PWO4G?xK@nyp8|}{bPWwgUndwn8jSUDk8V^fomu)N0#sb7Er2ym z))yrZW>9LTN-b4Rz%q51vQj=yT%JwXwYy)NfYe}|Qq~Ser39N`)TTk$Zrc&Cs)`OL zb3Og&=2+P6^uQEJz?76FfpK2T1gxA$Su(UCPAs{#^ZRZent+YRS(78MC5GXM58YyH ze^N|%_o)8v@7jCt&#|?EQ7YfGQZ~%GOU13$825tFNiY(GR=2KNqbk?9xpiwWs-PQ5 z*AQ?DKpo1(>h$;s1PPGw!p&Kp+ao<7-FVw;UcdcgdFaz$BzSr;l#b%W;Z88#dGi|L zoEb+V9-KLL1b5y3RNVE{r{I~~KJ)gc@ILLSH}HuMex&2LH~#(~;@MAoDj`6-<0;DS zy8R}e$?eiyjjGOtXv~Wq0(UnU<8i05J`O;s{t%+vCluym2|r530nFEPsFzZh$VD(Z z6ht8%KsaE9&tpa;KmZ6ml3&^;2EOkcdT*NW@hTP`IZDfp81~&K!MV zS!2{-v=NF{Lec7`YV+v)NtHuMSRFZZ0=IA7fv0Re6;Gwze(h;^+Ks#L^c&B{$3Adx z$N&G@m;Dj;r6?J4UzJGIK~%| zUO$UFU-Syx_p$ps_7l77MXy5l^g(4^^)+-0g!%fWsRJ+!OFz9j3YBS;D-9G0#j(mf ziUi|$m0+wd;KZS0xN`CYw$2{G*10uYJG+l6YX&Fh2eDb>_kSjVGxI6TXGFDmaD1v4 z=NE=>g3wyZhfz=aF+CJQBOAdoRpoK+f8{_5*AFGB*y03Z4A&3$;M(C3ZrdQ#)&sbB zFo4Sk3AXhRt{-fHF^ubLaTTe0V>8X;vN*dqgjoV{G-|_Q#)p&T2rkuvN-^FxOSsO9 zg>iE+fj7P2IUVoIJ+Ju#TwTp!>qs6Kj~8(AXcD5V;mpqN9h)dai#@E zsg){V>=!VK+p?n8^%TGah*Azt1;|L`ut2e))&Py1DA}m?O)7e{RWhzkJ+?tl=P7Dc z*r^z`X^^&ounEIWA)0xMpZ2P`cY>+`xz$ajI zw}Ddf86`MJck58_rNWR-7^*j*s1uU`PN#_q&4qj}h4;K^$CdiP$3KJq{s?+|{isfi zbo}5hojC!2z($z5sBWE9D>lN`M%X&w4G^+oK?mO3c0RFRdge3G6C=YbeC?^Ef$H&J*Kox{wKBwlaW~nPKc}WU)9k zgrNZ+LIE?pE(0O~3kKpoWcxxG8Hi&tH-K5H&DFUQHulx9zORafMiGT!BI-8VRRV_}ABkAqgOu6j2bsKmN+99)LATI|mAxY23VJJC=flqzdFdQ{FY zu1=7$O+sc;jz8 zyW@R%?;pMr7x!gx`A{BbH%4)6vx>!~Ix5q3g7F`Bz9Rz0qJU8c-{f`$-#n6Hl(thd zJ^nT@I<+e`q+O}KRE%~7MZJ!=T`P4+2gh_}IKdi{ZX4R9FoW_WsNk9Qda64rQ>_s; zE7|M;<2DSNriu#e1!6lGjXeY%e@6zpo4=nZY`kxd4#FH8pdw81J2(JKjN7Ob#*f1h z;_o{Up1Qg?|KFzF~W-A3xwSS zqJY&7mx8LD$2k>P0|fPMFh-O@bR)ohe13tlm|avU?N+=Mq>q+H#V?!avfJsuV^ryn5Sy2(aN}StVE?ZLP!o{ zOOob~jHw*KlZ}3?j_GyA2G!gw)#S!h6c<;LxN(T8k5JUxeq5t^yzO8wF0ICKdND#Z z+JkdTQQWpB?$apMVgy$R#>>mH<|vhL(yET?rDf^95yW&_*Fim14pS`#akWl}iYt|1 z+#(>a&qnaN=ik-wp1kkXuf(O5VO(4v#i{ji9NDO2VR;IZ(^EedjJu;!+rg+4{B;rW zb}&x+cEDI~t}(X2*p(J91YtMW0%8-2(t=8gze~N_A!%SN_r)ZLstHHQMeQ(Ao7xl{ z9}gIt>QSoS7<&d`-~_bWN)Ix$ERxy@#U+wDRi;3a5$1dW>jlsq^KUi?3PZTrXaH}CrpUz5jKwEfpV{c!ua znMR$jVbNfeP7fZbxZA*#Y)#7i)GxsR7XbStRJu|8f) zKon!t*AaXpU_-;oYx)3$C0wjW|_kiV#fqc`+c? zA3!whL=Pd`6P8v?7Od}I#GC%$)%fB^KZ);t@ge;4m%fg#e)4{N@NIYFzdhv=>cw6h zoFB!;!Z<-WiG#}xEX*}9G&G20Dox93MJV8Frh7;fs7H#IH`gO|0RmZ%+zZA#MKMwV z%37wlVXaE-MYZDF1}eepq$)Ub1@Cs@oV`0m%ph(?EmsTAHaYAZ_h&{ zIS6Z@S0&?Hn^2UBHj=>K3C8bp5FmtP4UxbyjxWG4K93&4ri-+* zIIHh3@inI5Ufh6fiE41+C{8@*MIFa|>w$-1XdFg&eI4$l<9O+7-+`C@(cO3{|F7pi z|FK78pRbV z$qNf1DpG=UL%=wQD=R4+o{V6r;K!k2NJXArty5`EhgHqg+hzjz&}(0Y554B)_}a(+ zzT-XlUtjwUKKRDh-~(^^W4z%Nzm1LchN^rs*{IU z&}|E#%N3>dpj(zMC@#9(e!T|CZI{D~E-Fh=m)bns&$nlce-cf&_hbJ~b?rUq=hE6M z;Owk1J`xz4a5Uo z)o^t18mRpIF1%+K7@z$McM>A5rnw1o0i%bik@x+CB0=3lbs9~C)EZ~&I055qV~Ri4 zk9C}{-QMxq*CR|78KNST;2otbsY2Z@S!cB4^{@Ox{GVF{ceG4`Jl^+)H&H1LVr^jp zNA^!+ZK;MsYa9$JW2jDY5G|E?&Zx>4ROua(+Myy>wMm|%HVwyjzu{dSuW{$?cM*ai z9;Z97m{tCi?kpl@@tod1jEvOq(LepGJ=eF}zV?|1u>at3Sb}NQd{~NuTO)axdkTBN z*qtoHC_xQWhTZuF+~s|^_rss)IN$HR{PnO55?K93-JCc+2s0Ix0P+8{O^SA#yl-!R z`=7#BU4%_4;*_Z{%gg943mCa27!9MeqU0_v=mBv+`ta4@;K2C9hyJGB` zbwtNh`8esjCwY^WsTEk}55qKn6x}mN@$eTP?zooP#XG4I*U?>F!+jt9-1g)Di>i5M zY7xbuB1Q+sF;3tYv(i_vgh>vpFSzS@9p`z)3xA0)T*9?ev$%O~79YLmogEXy-6q%l zmv4J34pn<`dLfCegHi)kEQRlWVJCIw>!194-2IB@asQojJ^blU6QFV2Sc?;k5uBT) z8rteyNV~ zEx>s4*hzfhqo3MyT+2T2&i89DRw@dN6a0-%6O6M2<4ib!dw&15_^+Sv`?~wBe+Gwm z5Cn*lcrTWnZ`zzL*dWgd97S1*YRpJpVw>#&qfWulg#vB`Mw)6lwcDCy0MbA$zvuc! z&=nm-cTm<1d(j2VCPjH#_6tXyu0Ja@e5D6117>*%wo4t@!DZ`+F@0kEyOCl-|@o0b?x3fglA#B#C?8 z^?{E4#3V@O-yi;$J&(WdJs(o#<17-rIw7uFLXjo`H`dxgSgGVpl~tXpK{$64(u=2_ z(s7Qje&#E%#K%<~Re_?Eh?A-~#^i(w$guFdcB(?_+%XvHoA}@dIwwlc__deAFu~Ut zU%@ZF@Kqhpz2tc>M2YY3CacFRR*Nw7kE&=?Qy(oUxAlEXG6!>Vgtx^;VM&d_+&`vMI%slRp4&67K6xhGd&ECk zfc$^D_8#>U>IVa$l69(X4&w0!2}WHUVLCYj?=n zCa;Og)Itc`1aJzFP6bIjA!#G%-ub$n^bfILxOoSGXw_yD=$aH1t>TvDFm;l5Z(C%Cb1QL76|J-p8i+$sBU&d2z zyNXEEuY!M09zBdN-22IneV%#89f(GKh(z3o1RW@3;#g`FarD3(Huf)Kx>7}|ZxCJy zx*;H?>W(f^r%ThR$W_|AZUsikDV5G9_JCS1G)cs;bQ|%;@VhU3S;zi={k{)UosVem zfyIXLi7GySZ|AK3CBObM*rknBM7NK!5-7XZ7_G4qti4hjvW&OA`F$P7zmv0ggRK8Z zGub2o8Xe}0xF5g%tH0T?-`79?Rb09Axv&)`R0+6^OE>WOk9S6hKIJ*T3R8gtT7k3v zf<&-N68}C}ss~`HAEe?t0CQyp=7}X(2*~qK>r`qVql%R^MO%EQn7AoXQdLSMl2uYW zER$=nOmD(8br`RE(>)!>KmWJ>h;Uxy>n|YIID#L2Z3ja4eehnCsTjx8<4P@#4^N;- zo0**BWN*hC@u2|4>)d|4?+vf*IREz__$vP7CC{ar8^w`Y9KUq!3?BT%r#tp} z-HV@t8>03$`c>{?I~ZFgVEy9Xda%0#<_Y3=Ly8%Dpe@}0Du5VL_t)G)gUg>-txj<#9LnQTzu|N z-{0{%|Ma;p;O>{d2ycAZi}Aa^_RHA6I)}!>EXpb>bq9bKJV{CB_f4F$%rtOny8!T7pge?iAS-{vvDcH?$53X`1Zm2mvR)A>E={4L*n&Wi}f zd6@G{@J$?qV}ui^OcRI%que$Q&A>Rw`>j%L%C*{VJB8wnS-HJ8inW!lAz+jx0$qf> zO)V-gN>>gs-K9g;9d}IMH*#O&fPPH2EmQkQ|Hs|q>XT=}y+;hdc~V4@Q!+(|JQCX-uK~qkxa%_hkB<& z-U|zc(n-$nAL`g|VQ!}B&UGL?(1-7TdB@!*E~ACHX{tzZwYm@tI}r>yF*z}&lyGZ5 zaoM`P78T$V@Y&E8_n?^T#qvxMCpVUHq#3q1aMcyA`8N0$Ji^y!!V$Cn_I&&qv_S%t6X#$!xrvGi*aVj|jo>y)S=r zd%quj?VnLSc$Cj)(bb<(X6VnNu&|0BKJ?w~{XTu~XQ)Ue`cNVWWkxT#iX7xdq{7V- z%*qyE8JUA6KZB<~w{xBF!|(qa)uT~rrrP6DOne;X1XXN*MY&#OjY{BXEbfP~yoOi2 zy3-@^(pS6*68bOyj|{5szI#Urih?=1w1HA)lAmRbpIsHB!;|<`!o0PQDDvk&>*=_0 zegk*jIHS^pTF?E*H@=78xa*86v36nK5DrRyVsD;kyMS{ zVEq0AU%`v-TEh*=VLTjBZd47%2rkTraIzM{+36UzB!K5YziL3dIUd4+To8u{#$#ns zjX|8L1aQ70U<~0hw--x3{K>C8z2mh${DwbN5w&Lz7O}BX#`5wsrsoBWGacy~V)y^; zeW*`OBbU>GH~GRa78e%qy$8P0vEP*o7q`K9cr=S2wEe#RoxiWEGYw2hNw`6suHoco zmtQ=IAGCi@KKeNra{L|?meId(8iC1mn3{^wAol+;_ukR1o!6Q7y)5WN?~Ncxf}I2# z2!J37_FgZ0za;OK9aqV*#+EJ1O)heYi{c`8D|T$T$VIUw+md@tY{zMiQ@&)z@yyDX zNoMAc@9*b(_Im)5Ag?s`tXYz{)?Np|IXDLZf%o@5``txBu^$!ON?AA6MvPY8&=0A9 zDy_)m@iM|v6{e6bD(50s&zr14me+|%wVVt2jHl75XZ;;7n$+tpCrrx<1Af7LMp;5Wi&!i>R*bT zfl;6+bvLC$gA|iCz;2Zw5(}X~SXGv55WK3@W)&D}K$QF1V;5h~B|EPe3ns6#T&*oi z#|FIuqCikUDGiC`@ggh*jN%ThvP%&GvvRBIO?m~ztAzDKA1(#sOP>Ec0!s=Q=xMUm zqFE*7qsp!Y@aPN`3XZ=z2SypN2KzHqT6$Qk3~&&74q3i7Q59%JK^iRLN-YKB^KW}0^ir?ZECt9-D3bswDd8to zh^pL}o?4=U-NefLDi)^~PQ41U7ATFbpxo3r8(o4r2U)>V*jHjTh>Ba5;sWc+>tDpZm zftZAeKr{zB2*@Ns*@enT57jOeZMCdTO73G$4Xl4~e<|qykl-(mrg&@$m9)*nJ4*Jy z?+x!nl7nJ92hz4gFWNX*e(T|{o$mkZ@BJxm?ylp;?h5|sz3(Y`?zbO)2sf{F<9NOe zo5QsjZ+9V2F!m?h_{xK4-$D5dUVfOvjhXNzFv`Any<(GUQlO|M_urf;f{}`G(1UA) z-df6|T&O1#QS1$cs1#k8Xmn$y)q}-O9@Fi_TBj3RJ#GcYy>1tFk~Vzs6&JwxF@kZf z0ozo#3lm+)=hH|J2pDrEV3gtsTWeb?kMTShn_HXl$frv^40qk}(o-Kh4F<#H{SkP}6DwgxE^LS@CCkp)wIBoz$L zz^Jvh(zc>NE2U=Z#c}oNHR0ba{~E4bKKN;||D7wf6pR8PsxpZ(HJND^4vZ$=*DEk; za1`Yzoi=2xk>I0pGZ087Dm4>fWHFlvNFxk-oeHWc7gww*M6H>W2s?lK;_G=*D*#f9 zl)ZWyaHF|W^$L)ha^XHg-DuWasTBmEfsn2utc?O|lT=|5fJ$&rnTi-a|HFCd3!e{< zPlJ&tHHluesURGyQj3!IA#PQ<{i`3Htug)w6^p@CsZvMWE-PZy0o2uosUQP*|J%<} zOvHZg_=Xk)bPH%+-`Q5{k9LO?G%%?k9S>Eb$8Ex!@42Vs*qaBt1h1wV-EKXVp%IC= z6a77Pn8|lxc_NL~seY_Y=P<{ac&fb_u~3K;7dNV;xVhPXX^rvuH=hrkxK3$TC6LM> z>Y9pC(ri?@J|}@`(Y_D-uGGYNt;tzzu54g;Z5sz$2RPV0E?H~*i|_tib;K}xnql&` z!suBQ^)cYhoeJhoDfrx|&kzyH%S zm*HPN@naPrQ#Itd*fXMV+u#}9oWd% zVT`aEQebr9gKsQ#*MH#k&!b`t;bb;Y0>=OK|NMrJdo(aA6EFs-8htn+822QNgJ4`C z==SqL9FIo`%OHX1#CU@nQ!QT1C%stebmLl*%CgIY-5wA2x?I@qu;BxDT>#_9-^bUR z!1f%$IN41wW(dZ?OJJ0>_F}rmMKJ!+10O9p=j-o&4Z&EW!1&n5O7oQO-rhb3MoHJ` zI0fT9Z}`KKWA|S8YQk+$DaFbLDJVav1>Z zN%0H$(nSf5H`b2@|7i42y;a~SC9 zKwTsZhs6dfRp4ho@~M(@KJWNBYO)~#O;^MtAZqcnEtpN^D~7@`yzO=O;g>)B^Aean znf=9ge+HA2V01UZOfX8*-}7LUb6kun&CMK8i4j%=V`VL8;hhuEXXjDTJ+2~GAOFg? zFI`7mVI}sff8po$FP8$CUh>j=Rg+;|q>~U65OQz|38=bYAm}7FQG#p4U3z#_nvnh- zs#vqHjc{y-B_PVN07gFF!1EX*DW0c?_vLmUmF%ZWo`3Hf-^*(g#(YktK$Vk(``>h? z{N%IP9b7~QKd&Sw6L0zbGdJqL^F6)ba1S?j)^KBQ4S)5$(zQde|M3t1qD;~t{^Rd{ ztz4*L|LZ~^&Zpk_N&+xQF#0cpafU#gbt$_!D`1o&;$9q2dQZW)khD`NN^WBWI|SoY zixXo6<7BfBv+Z6iCOug0@L-+WZAth~Qa!fY@xVneKKMQyFEnCnrVVprJs2G9M>>~B zXWzgjFc!OOC@?lRqFIb!{Mh?GRC3NY5RB~&HRy?W@n?T>IWXzp`CIz;U&-h4FZk~? zakb0$eS~dR^<PsYVOZcAU-t|&!>r$=2D7XIfbKIZ&c9Jl&b{d$bGFFNSOj-rA{j8 zXc4dC=9Tr&Vv}7-1rc@YblC9l$4l3MUh$GU5Dq&F)oaA1DQOxS5G7qhfG8$#ya+~d zu}b7^H0q^V3{o}v2v;ZWzwhlO*AT@hD%Q-;^3NVG&5`?E>^>^UpvM9~)nv$DMa9V5 zUK9Kt1L9#T+UtB6NX9WY(2k9%EY>D-SRBn_a-f%hY)7`U4PW`=(rCSxzxX9or%n~T zBxx=V{NXsa~C3?oq6fKa?1{!mB(#BP&8*MaJg2enZj5*+kHZh}Gr zR4TN9nu;1&Cq-NddPgMXLk|xg3|lc*h;^d983djj-7au-e4sDS42^wMK27Q6f~&2j2)7 zjr=SmU?v=P6N*x*&Iz~2hIhaD0vJzj@>t39G~$PkezRoXcfR}>9)0Kwc=R)0z+<2J zBEI(7FXHQ;)9f2!pD)^%@Pd;=guND26XMaJjc~N`e`H3$E2`0g+MpG!F&8q;VZt$q z<zs7MafN+Gz?$cKuL|%|M^e<3VTx4kkY7V%AmY8hl&o~PYx5_c~zjm z+B*SD=cpRMBzgS&>zrJ_4Hdj*IR~|J4qlbA#^s9R2Y+(*J^05T|0O!?Va#`=OY&OZ zeCJDWygG&BjcLMh2EY2@PfO1IH{bga{`~Q8;%8s`27dC@NAZI%KZ5Un=@ESIi(lsU z%lPplU&hZK`zn6^wXfiT*F9IM#p7Fnaf)D^J`YAOw;CAt2*#Bji9QuD`cA<((d@u* zy&GdqeoVLd2~IEOTfMl}>cK`U)nc0++XUl>?k-(Z*T9&>#zZ$J2h+%9^GIb!k?a*P zp1GKdU~DRav8741bZcpCxdj+si;l)PdO1P;#n-=6vhSyld>!Ba?3eJp&pm?geBo>O z#=~F7qhI(2zQXT|e1HDrob5jU9tB2$qO2?43XHPWSd2ndAWUd*l&us2&|p^p-1*!_ zweEO6t)m#hT5!LfyRErn#WX-_j}`aHdHNI##T6^16^l)fi!NLh<$8;;|7o;a_GWy> zB2s@F)0z<%pjc&x-5Y=}5<^X*5p{_KV$m?X4uXOp@Vly1f5VREI9d`B_?%{#^aPQ> zisvd=|LH|9g2QekIHmfItW9bK0z};j%p`R~XQ)(Z9Dn=6 zQZSkykA1c@e0^$^YQw67P3p5c z3~*5m${M5BYb3A@@cZ=edUUGxYKZWQ_y|BM+*rs?m`OJgvwA!l;Nu}H8X|VI6OO|@ z3Cs_5VRa&l&FP#1ZNzPg37jYZ>;&yGz5~KlR~H zBGi?JFWCp9FM={D0&lfKXS0_K=x1O|5RBqZy$r_R{PjQMWp}-`1VZ9oUAsw$wT;4% zn#I*_$uS(pm6joVRLUA6 zZwnABs2t0~ozR6k3C2zs0v*u#+fW{CMOma>MG5}&V#>#zuZOOkicnHI(i6}R%)*eL zSEkF&LYI|%$Z_M+~F#h9jaAV4OW}+Ua1&%HpPx-N%_hX6YnQgaXXGp*pR<6`Z zf-z4pjyC!++3KfiBp6$~SZQ`+y+y$2z)sSM55MXn7(alM`7W%F_hKTKrD7aGFBPK{ zPrnF8RYaU%Y*vb~2`z+U>yv;n*;uQ<_=5`*zvqsQAZs^kYmBNNV+TyK#u(R%g{#DU zRq;mF5(fx2EfV!26lMQa1;+vy3nkVHrxgeX;b7@v4*HNxoNfD^TRlN>n1wbkVDG{rp6eU`=LQHN; z4?!t6rP?jbqu!{81npccRO0#N56=?a z1&juBC5)CzmnVl;V8n8}2K)#*3fx92K=H(WLKvOR1WC^Q-QGi$JtlE2vm2 zR34)$c;RWq|I2osEf z_7s5^##Jd6Zzh~;>Pn6iFiJ-aqpP0BNpxx{7zKb+YtMx)+K0Ej?ZYL{{V#v@PiR`a z4ue`>oWxbBO42lhw_ONox$Cv>LRqYjz@rM3z?M)q%+VBVwOJSmK!X(eCKQbk+1IJ= z>jjYEq;iYus1Eg_6loQ_eMO*HPk>P|zU2=~1EhXHwR)w7gHmG-VU7(s4fXz$fstZ=AUSKkC8>O2sZk z#8sWtLOD29_Dv#9r99wSwHuYHAq}Ss3bL$0GYzDKpfsNrAPU3;Zb~_doht$$RdDJA zfEi8E6(Ff#C}0$YDZnc###1n!nWhlW9zTD)dVb*?I=&tW>`@V}7suYG--LrDf3Cug zXQc_qDpliQJG}k?VzC%%V^M_McK8Sguhjq#m6KE4gp$ig#Z;++S2VY2xwtNs+fu6I zl&ZTYGdV_%RZ*>l=u)*tD1a3^rz9_$T0<qO0IGHbAJymm!x2rv9UN`vQJTxoI?|r#+4eUd2xfkmbDJ+kqFhS+m-CT!Qzyp`XgvTB#Rkw@FoA7oGz|o$C z-W%orL84bpc;%g?>gRt4Mu|$*)ugH52)639T3{BILP=7B|&bx|>@(ru%dIXNp0 zDE8;y{{{55{V?$Pm4#p!ClzFM&kP5?6z;wEex%1Y6%0ik%2oiWQ-IPUP$k$#>YfT1 zrS_@hJC-+Q5GCmT?OY0d2P5F@o}5D#Q%I-M@&d>3Ll3o5yqRc}Iy_l-tAC zZla9Wtq?d${-Xo{1)8CE)WGiu;Y;TNq5k&!KUdXWsx!++t|d7{au{wZ{uih z9dCJUX_WFm|Lm`^w=j$8ek!ldHe|aJ{J&Qt-5A7ZGK7cT^A^1Jc~iJSrFb&qp>p)# zXv%#_F`iH<9!=PBecVn!+E2lFIO)Tk`@?wg<_KP}I*2>AGPph#z)nsB;}8|&K)o0F zMh_+k!#RR+iC|o9bzzHYakqzHd`;;Z1k0NwGPS4}b6Wa_08x})W52Q@5EUF1AkTrZ zXmVd5snp#W=uRO=D?;+LFse{US}Rg9?mNE$UeUM&V$| zUsGYnv(99FQL4{WnGEoGTnGnz2>aadb0GE-4t~3lKUfpIQo@X2v=}Ot`jWgvmA_a~ zsd6MGk5PhJZdKN;2*DxS*!6-@pQWU^crGwQWRd}TKYX#o*##?}qpRvbHl}CX7*@bnG&wcch2!{g- z&^Gz(9cI+TLZ^9*qAXrn1)7`s$}RVG=FNvi+H{#g5-|Brw8H9qyu zyVTmDtR)`b0*psgiicx%Wdg{XgrdOma6;7O+5he5U;8S-7{qqYucA^1>pbYM^{`8dvEWL$qH!R$7$ek@tU? zk4Ff`R>Z113C3PHlVkW;A&>F@{kz}bj=SG}35-RRs1)TncWQ}ZELbJMrROBBQgUx^ z1;&CY_i6!pMF@)fQ{1DKa;~B>JZI%~lJ}T}fe@D4=T)MZfKk^Z)p>Z`nnLf#Ta5ot zvk3=F{$>k1o>eBmk~~8T2Yrv-f*@y6L6?;(kpnFikAk9IgQ8PfE=ftWVg(yMPwJr> zCAnV8u1N}nQj1z3kC=9iD}^Xf4S)hs*%ra5Kq*^Meiem)8nsp^0W_i{MG4A%LaE}a zGPy4`OjW5j+3MxolDjC%w_F9*2oQ}%QEMgzL|H48H9aXPu0c^MyEs&Zmy2K&Xj$d` z%G#pEs9dk-m7=O2%g;byc`^7#@*DLgsj*5p8>BLiq=X0<-&%4FaivP}Z~6c*vsi!LD@#&1rei(nM@YPpo3Bgo36VKE24hd+OoXkRn|;7`BzbA02` z@8L(^{we7DUYIM5o=3zyJQ_CdaRO z;a$jg=CC!jh~t%2oUE?mc>Nl#)9!uQotM&h{`qIW#Fsw)X?%*ncA6E`LWj4m9EUk2mhSO{AL;{?H&BN#Jr zH*)nZj5N71-QvYUt4HNCZb|i>&799cvVa#Vo z*lktm7*-DO77p+ZvmRCIb~(3HVI1(S;+ixF>@;wQl^5Ks0!4YeQg;T#A{2|M7z&O8 zOetGetXgxf{;9x6;3&WoH7fasI$l?lpPtv1HdH2p$Yd;6`GW#Mi*(blnE5!>p4mdh zrvQ8o>hbOiV0_VS&w-VyQq~x&39=;B*lX{6xhfKH{PIjhMxZ7PZ!`#3&;ys>iBQysXv|CH=_VlEXlwMNt1XOge7>}n=eu8f z4^?6pR>o3TBM`TzvjignIXy^7j^G=gDXlVcEBpL|pTQ3vJyXFl5H=_CgrX$*H^Cyc zQZInfBtbLP91yDI2Tn+~kKr8;l;&9e`fvUjiPaO7_s^lcZ$@>-*m~aGC8fNc%A`K) z;LKhDilt!GQ#I;~aHLg+Wc{xL6+Et7+@E#5s2N+qr$7D3rOCll*+ZXw4A#t?*3L=- zZ)!NOMLK!j4wb55@HG&Oe#C7K^f;{e`0Gk5?ff@Rh_dk{Mw@!DlOM$m4)QnWCUA3c z0w+t8I9?jXd*ARXPON^r?~ZiRc;ky^sT4hgnhX0Q&Jr;GPl9nb@4y}(-ye1H7$=U$ z?Kqhv*v5SLbqN?BRbbrA$-1Ibsl~n;H?nmu+KcOhe%zqK{OMOp zCu2qX#kYQlY`+G^j^5H*sRG81HiEGjeAC!KOQ;~6kG=O6U`!Bf*?(mCp-_w3t$v?W@E0P7$w!?N!+OgwI~oX5Q@&8 zN#!0DAf9)rmby|4fGhyDs5noL6<`*&>Uk>v@fnXw6%!7Y{C%Ua<5^+FbwE*5PCExy zDU(Kp7U00z5b>Zn=2uX3RS6U;QN@AY&TYtLQ)`U^(5TmnMASotX@-qJ(i;S5R|qfx zp{xNGAy!^+v!1O#o>z-XMV>-X+Er;u`lm&~rL3DlO3g`ua>+*|010Co)ts1}=8!-c zDqM%S9jOYfl4nT(8Vp8W-=Nk{EA@r?seI3R!cs@mOA!OB{ZjDFi*CD(a1#Z3RlOIT zblDKMt-x8*Jw%xj&SH|_UVNUG;4jKoT)KQNClQjqAxicB3sI?>E7c6AgOiYu6+NwS zjOH?U!O8F8yN^8nq^+lIW%JodR#Fuvigmm!_3!(_e_3zI3VO!i}Q zW*ED3W7wG;!#3@~ci)fS{AFp{hS)#->~C@JJ#R#X-H*4w>D?v!?xfliFj@m`@YeKQ zDhX$bWniSq8e_RYk_yWb88sgzK(lddmn!O?Vmj9 z^+etN;M;$S_1j;q+`m^Pl9mIdG{U`F-L2(5iXsh5%c=&L1&maSy_}$KcenHZ|F5U# zdiebxLtiL?i9`!_vnkvdP2uK57jDjU;bguCHx_zuLVNWKcJZS>dGtxYJOB2#|BNRd z`Z#Xi>csJk9|sd2?2Zsv!yf#X3t-&NyRkd$RkqJ#PN*7>3C7(KFaGV9XX^92pZ^pN zMnhQ3dNI=IK$=kOjk(YlcVaN%#8|?G*=843JEhx(561$=kpS-8=)qq-ah9K1v|oJd zN19^H4x+s`{ghyAG{w1y#3d|`OkRZ zL!Uvge+d;$c`a3=zEJJveDKXVSL$UjYHN*JLv6`tyag1Cd4_7eP)pqq6)37v16=7^ zqn4(j9joOnmMX~e`_%p-6rWvS6b_#LJ*#pUmHU)1vREw2q&1X@O3h=lAnLIr=CvUt zbvmiSEQDPZ6_AbQAQ-|<8{z>c;ps+W)Wu^>gk*&RqqcshQ_4&rSt(Gdl!`L~KY^fD zF-NPZDv9SD=Zr?1A1U zOb%r+H8O#zu^B8cF5|A>zY}kG)jfFko8E-izU)ri+}}owpSwh*N`$JUgm{B)c)|fV z!(q6h)$rFP5Nd8E0NP=%C4}M$IP03>Z)iuTu^oxd9`p|8FfuiY$=OllhI)}1N+GT4 zQ}$wDFoph1lGcvFfes80cVc;d92<)>*rM&y_7E zT3JmN<;{5*)AP{D+Fj>3u6B*1EJKx;ozu}I&$|b& zdCj}!|A2+E|sfjc8R< zieQvZ9FZih5{wnWMwn~?)HodI<%D#=Z9$sfm6XSezF-)=!D^&vqqQ~I?rX+zzLBb{ zj>@qP$MX#YV>52dw_ty&84LXhEDiSI^>^Hf_rLM2`1l{Z6YqZY-FW@&x8YzWNs#in z^VK+-31EN1i|tX`h#%WSK4n{jUaaTbYP(6>8uVai$c5{pvfk*#i`TnL)bi)w_g1P( z0i%y#v@0<7oCD)%g9gU+F6qnY!wrJ*W}a{y4&ZnsjJMsfgD<}S5AeuG-iMFA?LOSt z-a#%mif#d8Pa4Ud3^Lg~@`J4>}-}(SvaraxXdE3iiO^&KaSWKE#nN^D` zvssj-K#W_XKu#*P5P(K;nK}z*r$ThVVzYCGPPNGAs$Ppmqqa_3aM_Bh)?m~CE3d(z zAgzH>QZvTx2B%vr3bNHC_UbNe#IWa#c zDsQv75($E_KSeMO_hV*!0t4Bc`r!vd9yr|w1iVHBJqGw(I=CIOj%a|xT?J3b3x7=v zLBcSYXojz@kpL7ZCgCLn?R8CX)HlP^*nwbk7XsWir*p_oOk;d;5#tMU$P5o6mCvDf zh&I@d!HH1}PmW<^dK~#l&fIe;f;p=LLBS1(JjAo}mvJPffJqm{dzB4Suqg zS0U?p1t?0is+40BlfvH$js-9p2tP5ot$ITe+Bzu`9%zL*)C@;$E2@)80A4k^@asA*ByE_M1qoSPKKSA&MKKx@V&=KI}NxuHZJO?SN2`M&CD~ohe zHHsRQ;2VO`=|GRiiX11W85h-;Ka9RW488scQUO0k`PAuK>nPf=WS>nIKcfY0>lf7AF`-d-sv9S^Lb#cUF z)u^khMO()?F!H(GJ>6(cXpM>oX(OCK7QvX~?=i>UW5&yghYG&wLX|4GAnS5P7pa&Q zm0GG8wa8ShqRm;g8wErKK+RN=zlu(k$Io&K&)QC%2crhZGX+>se5WSQ(Mr2%MaT>F zRtt980GXzNF{9QMPp_fM!aXa%D0T|Q%3JJw#!SF?zSBk}6`GUEvA#MCztc{INEnEM z-!X|*Lk|xEKkn(921f>EXL8+{8tN_+Qlk^ZzRV4y;9fD31LLM9Z{DMmqt+cl? zn+Z2@jjE#8R_F*ry~$2x=pyvIG!G0`Zf#ze>|R*xZdBO`M=5b9fHr6qaU^(1tEZ|} zqmlJUvsqlZdQI6D(m)jaROGDWSZaYd@|ZkdRn@7G;sH|qrb3 z${>{OM`vyj>9I*2upo&?2jdI zOpu-|gm5_H#qI=^;RxY3DCWinw;KfG8ezEFPs?iC^#L9??7(d^wfObV&l+(*@tKEs zETKurt!KT+H&EqPThSeLArtH2C--awN#C5?d`~9a>xw~ zBbysScd7?1eE%H+#)t=_A%f9uLza{3^I()b#u|PC908>8TZ-dkY>s113CFf7V;6(JDUucp8a%2h1qlt@;aUD7HMAhs(Tm1( z9*w;@LUl6TxWk5RM+Hg40Yewm>hBc^hC2w!jl5;5hjB zTJwnY&!CaYt9^PMU2|LLo!>_P@*alQ4>7)Z9b?Oz7@Jwb=-4zy^WzvB97i@igr3w8 z+PVg)Ui(npl0u|4gHYQ5&pC)H&dl`@QI+k5b;cel%{CYVEd*67$^rsMN%n6b+^do5 zOJH?*2%9UTINV;q$^JTyC7aKMv9))AYwMesTUf^O<}OC478BEJg!v3A2NqC~ znL!yLFRrz+YAV(U)oMi2MA``A2CC{HVs1ZD!7zp+F$@N((dP~!<>F%mW}3gLu^0i< z>BV8ji{k+g6&C?B8Nm~@dXcUV(!vUm`KBMm0F>!5V?MO27#a*9b3x;WdJ8g(lloQH?_m+<(`}>H6ib|NNI&9d6|@ZtM_t zYkW=lgay6PDs+V%=&dG*YDF{Zax zx@7$BU_9;3SR?JE&TdNw4Xt-$;XDPq1jc8+BwW#ihw3kQi=9ua*=#m7ct05+RUz>* ztyG#QB?o_q1`f_rNk&>sNrU2Yn$akcouYW8C6bK;yA$D16tPGUbx|Lh>!WDpmoY(Q z8IO2T9duFcRKY2(PktF4gr19P(I+V&1cSq@1^2j2z` z<&Ydlo$4VeP*hQ?ye;dR5{atvGS!-)R*gsN|5&NkM2kT}r)eePN-cbb5-g-e$7<@( z!uM>H$XOMLqdlfRkAjkvv<<0(W0xQ(DYRgqBD4{Tgr=LHht*QSeR{Pv>Gn9`3xyD_ zZ$h}G3$d;&5`B3N`rUBXHp3N{2EMHt9H|xqRFSb{p8{Oh@DzGRr;(nVLvCgP{gboE zj8CJRFlo!?(LlJ?P8V=Ui zaJ+F1`^z)fU6{n~;uLlW#*L)~s^Cs|{ZSZf0qC7^=mj~j>AaZD(#ZSl46 zHC)@+!u;|zENt!}y|97c(44A@b2US?n2{QU=aR$NCUPnj-{W1Flat<7lRiYB7wx3BPiqZVYMQ6Tn^TCk$!J84s4y9xV28 z+sDT;0!$}13Cw$LEa69AegsDgRA!BK?w2*l02QMjBTZJN7&{5Z?g#-LcVVp2iKV2x zRu8TZNbrro(W|M((GYGBj5j7~a6H*aFeWiJkVa5|?JNkK*qHMmcX0aD-stwo-?68gPr}D+00hH=U-=RufX(r9%AfuJ8A-gmiO+;3COfh7RNBWWR2J7JFiykR(q)oCGCJ;V2OII4cU3$jEK+5b5yB_Q`PN(P*gy)N+4iji>CS5Y-qxv3nTssXR8F$(-$F1w0sm15#z;yNutQ7eRAoG@r$Jm2@R z2u7{wdATZ4C+=x+#|m665*e#%q3TuIhnOhHqAOLcGZJ(HN~w&aOg?+PfYG4VPh~yT z&B=j)(Z=UF9FmjhMIahSgy0Le_999!3cOr|qM3@=QPYSBRbp*-Rsk`VOd*jPKqsNt zH@TqT*fl(Xo{>Hk zV-r{*0CqMuvA?;Aih)l8Gh^QwdLY4`8@EkA+DBZ(|RKdq>z_-^Kd!I&A~nt2;Q{ zI>5>H4sL91;$(9jM+EiWGNHY&f}MHV+%k6O7in|YoL|5yA75G8z_n|;SRi1t{S&CE zOTzArqo$?-$&M}#vPnea^?bYzysk$Z4hz=OUhI#Cu|xGW-|Iw< zs!i&m_SJcis`VjF8*htHO;RmRwc=r<}O&i(g`r z9A%AB6k{fxy9CDe5P?W2=KW3u#w>qBr(krKg0Z3qMsbxAgc6miYaUU-Hy6RE3V5Fj zZaD?pIn#hxfKpK<-U5uL>x=?9RZsOCTnpztYgr}73MjR0v2Wvf7#44zZ$qW*;<*3J znD9{jWpAR>b{w74cdVa3L0Oqb5wa z+NFWd@C5sZYVtTUSJ zUgb*lhr+0l^@$iEY8ORIK-#o5N2UBEU$K~zSs}0!g(&G68W=?}N;x`NUo3X7FDujB z&Jw6&HcPsQNfjy=P^#$GLIY!gqPSVbJCI2BpflZ1 z)wYC9s-%6w;QH<^j&`0Hvxs+9K4Z=FykzM!dQjx$ZX1jqtsV z5XiYSMh7#z_8@kz&GNcbiTiuBLmcmEfj0Zs53sSnrNDS?eG8l0d)Vf__5JIZ*w{zo z=psz*L(owv>QWOhq$XiaPs7tc2YdGfEUkICJI7F$okeRWCohRMWa0@7aN?8ohtTJ? zBkMBI2u7~~`LG!?jSeidIWf~}#aM$8vq={=20~PH0gSg(UDjIAS4%(&>Ul8MN^eFFu628{oAoJI>h+wPs?l8v#&Ig%v3jfwwqm3| zbxSY~56K#1`qY)$m`G4H)}BVC3K+8)f-#pzn$PX-?M6#u3~fOtvb0k$It7g8OJKBC z_Y_>I5=$|?=grpXSU*T*kmR1HF*U=VJP z4{o;?H3VfM7D7F(CL)7lkTby;6_t~Ulj@T9-Bh1dRW_K+VlJAG7KFoD3%k2sK~c;= zFq-Uyq&-R~2YH`n^Q$#RcQA%%Z33+wN%W>tXlrYR(?R%p-O4pAP}5*{MOks}QPwg~ zm7;=Tp{A=qQ7J}=q@|iJm%{22aVzdv-Kpx7LIk1=1&l?dC{PqNDehI1q`F8E0<#1I zl@p9*RE!ny+Nq|gq@^aRUEI(FxZfW}Fq(in+6Zen0cU+H!I)M-Hi4E-v<{3SM<8^M zOryPj6rF@(no4nSVGZf2Mf8l#pl5UnJyeadwwUNjp^;#1qVg2Wj?SYiH-YBfJnA`E z*Clg2rXTV4l!Bu--hfz3I|is4Wle2=Pa-k*aj<)U!yQ6W)Z?bOSjE+<+1k$({nhUnI;$~abtNF$196C;%mCG zy^Ry9%+0wOOb?`y?`y-_R0eyCBUHb01noMG1%{hT+Ohj5gyIRIc)-cP7T@zGcJ{Zi zvAd<*sB3%;8yh>==0stOpULvhb);uj5$+j*w|fNc?qP&;(`cDlM|$l#>hlYTq{flR z&GG-Ti9GL*aiTKD@8oDh4JI0Ekmh7D>!!MK8<6oDF&MUBEaAj>69@W475d{wP9R)Z z>q_8@i)rbXVKaQ|&}=%zctbQyo;1F*}kW zJG#P7WqxTB+Q}LV!;~3WsNuDlLLi z3&!ca#aRE0nD9{jz3>)0pH-$cE553AtGFUjm(t5nAR%jv0s`q+AtqpuoITAd^+xEa z1`S3DSgC@Qs!_Ty=nZ_#U?w0e$|`jhDkt71G^;FDI2?o=Ri(-9hRwslFd9Y!zu@(? zaYPBuKsbU(O&zKTT9d;=1sI00$_b;mPR(v!i;tTEu$aQIR>fep#t6X(m0^??CJ1@F zT`UBHJ%}oI1i@GXT9PT%8GLAD6hp&#B$I8*mFn?0mBJHssJTxylQl<|n{c+G?39B5%y7V9-ohc+TL&(l9V`6<58Nx6*Fox9V zEQaP+F|x9SELCHAYC)|r_Ki;~H>!ZKuC)ubO-WSOw;@>5jHb>k()n3Ja)Ao5AA!0y z#9Dih=*}XZ>_v5J60NB;#%JcSO9*W59%1j`1cwJlINIM=H9T+ZZsYpay0XKqRctIx zb0X3PXP^c;XN^*gveqb#i;b>U7+lRTQZWWOyKjtGIp{i(X^e89?8D;31OdB>oBId2 zA!>~PJXqhs-s(2tNTs$)IIYS0-Wn!n7cn(GkHx7OY)(w!U~&T2r^m3rFowfb0&jDf z&|AgH?m9LJ%k{ZYY%Y#bg-+mjbBYk0=j&g^0Tu8bVSBi_rLK2?9agi=$VI7kd=_K~$3Bk<{b4JH2)dyJ)mXw#bx1f$u3)PN zBh7AP<2C|G*7)qodZJe3>g-rZRby|gS-DboN9(aM7{Rq{KtXYtN>SXVvs8uCREGk^ z$s~jn;tu{|t=h))*yS<7&fzRxDi7H6(!Qf?|}`WUA+3A#(Km?JF_amV&XU6g6;Z zYEfV)icu7zY;{dp7+VLpm1~}*fk=9i2E>fkqDr;}FrJS}JyVRLKvS2-{b$I8hwASS zZn5)OWf~AQD2h96BC_+*4{G^JEQJGFJK(r8o5`Ags052Wity=yd%_J?X zsvLxXlTfK5L?vLx!smz^R8lIe&`BT+_uE|_xV(N^08W~nu(Y}Zgq%yQ3mR>1=q2)0 z1=_e_uJRGAAp$ExNYugMj%(|TREK(NK!c&L8oqclqD>u0w00ob)r|~)Y{MfXn3x#H z$VeU??X9qgN~6M4QKyBx^14bq%hf7Ohl^ZkHK8pPkCrO65x+5`yxW({6;zO7QV9uT6)5Q-_$}gu0MbH5sn< zS`g*n=yOxq`n^=W5f#B`3)G@2QU`Zq8{(-PYC6+s%Z*}S?ivT(UF2p~&^I=RJeA@U z2kkKq+Ucoz^p4M79EXdRVjyanNC6Kd;|Xl~D-rL!N^O`Ql5 znDw0*H1`dmHrYoocA>7l2U)7o6<%v+=LiS;#|n(s_YZMMRVT^s*9kJQ!@WJiViUbN zs;8QEDn&{3uZP)DM zf`In1Lm&zi_jmV{iryj|H@68*zTQpV-r_lS`1<#*pJ1Dx)9U69RtWS}s@(O3RqQV> zVrP07TVrYLPH^JUQjKibfs|Kz2NIB>D&%Tx3U>Vh#(I8EaXb2IZRm?z(G#;G8L^=~ zY~xn$^Z0}fOX)E7MiV#~Z^ZU+Jyr(@p-dQy>41WwxKO953Mae$nCS9hqSH&0t=uOZ zMKuzd^W9#|@bP>L)gl4i8nt17ig1b0-0J7Kx;zTbonZmAgOGG#B;mnas~f9IHM+5{ z!05nn-i4E4FOEn2I35jQUxBd|`D_|}{2q6v2hi5ji;mtNf-;Bvke0`&z}P5NZ>Sgv zM43!$V3gn+Eh<&O*ePHX#mMhcnxGye95XH}GWj zRI1xZB7egWfjCsS&Bs)WDXn{k>cLp3EK}k(Ed?pw z0!A$Ym5Nc;3&lN306N^&u(_gqE`ezELC1Y2R|wu%0u3DWJF)}l%gPTXi=m+b0&xff zyq)Z5MK}~tYk*p{9Z`7%nt+jDGZU6pSu2#Z4ZXGoCemBK*<%oCbub2CH2r)cUHZmh5PayJ;RYR=ZKl zV?tC6Qa;W~Wn1MB!R(E}9!|hs(+F=%l3?sdJ=I)W{|K^EOH?A;1mZe|=2kJewu{+q zsum8w>8Uw_aT=Wxg-R%PP%$>7vWW28`?R!;2@J4 zL~CZ4ic!GWgLqpnlIc9gr!|LE{o*#RHh-oK8X{2V--73;lC zsx+L*S*Kj7dbhUjXmv$63GkvhU_+|fhOuTp=DMn>qLQjc>(TlOZXEEuyw)LMb3m}{ zudic!Z5>OC*RZ&_h83!?YfFUQ(lWN^C$T-7SGK!6hwB@J;?@SCDz=HejdkpAZ4rdK z8q8_3JrF4F3D6I<_aV1=%y19cwl z9L3M$Kqd|H`mghIIXWgh_pn7ps)Cp#!uQ%T_LpXHxG;gEg>k;`ZcHcZs1p6iaBxo( zjQuei`U%2JolOP5bP<$YQ8PNDCR!De)edxUQqjrJua~eKY_b!KLF|mg2}i2Md_7ij zby!GOW4ZjBOei#RQC^80+h6(Nc&?)xbEY6r%*+wE8tL4$z8V929d< zNqYQRx<+*;s;VU_RaBR#GU<*X)o%uALsV#alr_jYqt>vvte_fI0FHECA?&Uaeotu< zMS5-xQd>_H5T_N?6aZCjioG@PAz)u32A zU$I82tV>cg)@i2JDQ_|MKLaK_RDb_^i=EFRlcv9-kc?`bOsA75Ny{lHm20qEs=G+g ziRMC8YLNgm7$r)Q>c!#JQYU0>u>e2WR_M%{Q7sl9FM`oR0E!79^;J#MvOny+OQo_FV&&sF-AOSj|b4*7)DoP2uW^R z>w>5a5vEq1DiUsTIbaD!;fgiG5pIBsidd5O8?$*dXYyzvxcVmM6&Q;)Nwqk!zJuYV zHDqTNkeL?MIE^IXn9Pr<1pYV`pajQ6q78(1y@F#+ybU!CT?&ddgkTFH*qR+tQLfRp z9>m&HNOWeY0>`Kt2?zn>;Yk68M;cHL1T3Pc_OZTu9j&<;IQZk$1+2*qja{{QT~X?SF1x&DjLL*}GXl}c5mQuCCW=c-gHb2^<) z(&;3fdFafD%CH@_vmk>w;)tk-iXb4U2r?;(pn%9AlL!bZPJ8QikN^EY=ktB;=UtU_ zDh>O;&zDV~>pCCqYpq(f)~c#xt@V5F_kEt{ou1&f8Hx~^*Ic1ESpnhdvN+o{B?ZHh z6xfslUdA$EI!CuS!|yOlx41ArLm1Ah1pnm|eE)<%aYcboB*8iB5~xEcO0MI^+PeC? ztg94{b!@F~Dt9gJa%F+vWscu#dJ3yN|2iG%*3?m~j}Kz$a2LjN5%hUm=oTe6P>&8z zBf;2!teap|F0o3Jy^f&NbDJJ%7abD8*%xUf7|odPabTg(L)dz7tl+_D-a#l@F_JZ5 zgkaR%qDg~d+^A_69LvB+&3dUSf4a7f@8 zF<>TTz*3H2>}bSBXCpSd^ji8xkNG4RJ9teM29V_S7EQBZo5|2YcDxE0C1t}6x6=WS z$3-xPkhvlH_gWGt2oME~GER1e8fQF9!BGn;(VSzWp@|N#PJ!`&z)mKm zm2OgjAh)St90|lJy_R4dEl8)j42-f~O@}BhQ^2^NAkbULN%e$Y=$2lRUx()YnuhP)elgP7#0_X&6W&LSU%@QA_F2f_0?6suWL` zJjN!Yj(;}-xV}c^A?oQC-K~vibBG(PL7S}sQFjYcZ7yUZZpw*d$cA*pg=oM=fHtZr zzpA7t03EKu+eRRU(b|?qYbXtGrlS;4GmK=<5ITk@R9EUConqg_9D0t;pg1y#?BEE& zcnqCKC($u7u8s*8dlASL3C1|=ZaPJ$A5NQ(j?oVXKf@tl3})bnWD(?pDnv(WPvjJg zCHl1`5Qi_GNB@yySdeZ<0T$h%fM#8wLkP`Jj$?9c6vydU!|jLAz*cO9HHdz? zFqV(>Vx}{V;iMmZp;q*SEGV`$BkioCORS;9G1e%Tm~d!d%o1Fk0lfm+1i?7lWy5T@ z3ll{*q3FhN&WYiy4Z|6W>P8(*nh8M@f!K`xn1E3LsY$w2B?w1>k*~XgM#P-FhFj~9 z^XM@`Sk4tB$-f0XfkryUIz-KN$~CqV<~;=YaGPG6VIyO}TDt)o1wGaa2CQ;@g>G|+ z-|tvg2wfd{g0Uazd@thZ0+r`|+_h5@ZZ{YuUBl_HsXWGDIE-9QiUD-*fU(VMLr4Oc z2*qA5J7tWqUUQ6{x_VXlChg*N?}%z(v6rVaOgsRrnC0*hN@& z6GR<^kks_0LsQ+bCm|$|e1iaSTidXd_uP_yNRX-k8|gx&0}K>+PAMQRu271J=XQ-5 zmQpuL!8dABW2vCy7pEyI9V5B19&wVVJs3s*-vHw_2nCR`zAY_~M01UAkW_>!0U-gn zpRm|R;O&=jMk&Llfp9U4%3Ad0JOY%;@WZbgH>S(R`*AYiN# z0E%=;$4D2*7s9I4Kt= zV~$dAe5U|_8dKD|PNnjVRybXXkW1jreid;l1qCX2ypy2&@O$2kr+@sA(lhrzjAtKs z1ke8D=hP#3=7FE#X>R-Z_wU2qH+>7Ay!cY|5%3MhMgq|ZGa=^Abio~$N;O?{eUgfC zjL@4v$LJ)%H-(<@8T1`rP=Pp^!BHgph7jo-Q0W`7?m-2`c+X+DlI_ZA`sf0kfiPTz zuFEN4^uq24!0w5{K>#~K5_r?0j&~EpEC4u7l z{Bf*KkJ7ar#=^uHM#d&l=pRLz051xt>0Doa;^Yh)GN<71k$%ih9LCDb5o!?Yb3=s7 z6d|%ic&!qMo7gz}Y;00nXA^#BZ*rS#C*TOlEkaWuclL(Baf9GlBZvq%!tlf@-P!61 zr8S;wRbaY7I1#YxgrWdZK~ZTeicW79Z+hc8Zolzny!6ydWQB@v8cX$vNDCQKH% zEZQ*E;ldGu@o?6~hKCJ6z5gLRa>pGiWn;Qv!yCtY@yvY>;^`m#R4xC0h1a1&r)JqW7HPs9;d&x(#HvK8 zX6Yc)2FxWJ3D#DO774~;J93?e2*w`7Q|%fU3mO==^B5)grp@nz+vQLR{!XU@ZNVUN zSqaqX($Y1uX@mn#L@YWKseV%M*@SisM%7{a-WPh zYB`V69ee6?|8>(DXTHkD(@^C=+?E!hDoN}b7`1Umkv7h#z(~*u00oNsDg=s>+bB7Y zGSyQhj3x^qr&Hah+pe)r*M#~;qjHVPMG6=z8x$N5RMzu&t=?&4lNCCHMSVtPwWwZ= zYie+8P-z>IJg#eQMI!;~@CT8|=GbEFKo^~2Z%+qZVS!GuYX^$kU=+6~!8Z+c{Ct@O zWZxO6Ja{JRBq*k#3eAl*ur$@dq_0!ms;aK4)N&;lYiq03c%!&T>0Xs}i9pp}YtwEW zAQWrr4)S|yd5n^yXyiG=E)%}~=}(_B-OYa`dC1=Xy&vH4u}Qe{MYMGe(!Cu*viAs* z{X>ZL98!6TonzAk;yez`EGgxNjwt{J^4+jSvoLz2uthTPri<`ryWphT^ALCvP$S)` zF2d36pK88IxO- zz?QKA%nx^9?rEIL0-*qLTk=}8p^5u!ZV;S=v$(&twN1isog&;;PGDI8DdPGn-QwE1xK9D& z1_8N+6LfSd-1me8$cSU)>xIQ7%+1YUmQHbwnkA^_xxDgai75+_^__v(y z%h2)pPz)Fq1Y?9^)LKU{>JV+ILx$UW>C(pO1|=P1yxl}75DCFh^3 z0;#$PaT#lzj5lFE-GoH~aUo^EOq@AVYD~=SxD0UPG#sRv<9wgK4O8Grtlmg;X zD^8S%7$o>>Nn{%Fe zuAJ6I>XFHUrOUL4{e<9Io|3#>+}6o`3Xr1XXE{aNE={^rMaeSB7^8xt8uLpl$ET%R zNT83*&{0r8Q_-%au|`#(e7lf<1n9_TNH?#NR)|2sQoe^d!I9-2AihD$q3u&+k7}FBYt+UXC3R!pzLQ`yG+EGSXjWy` z1cv(#R!~v|U_bYjLg93h2W6a5({=!kib~xH%8{U*5*#Zf?@+m=VqsI{^812a{GKY`SF&;DiNWI{q($aeYG^AYms`u%ip4OO)4V6NaK~ zAf8>?Pwg+;#7(YiU7-TSrImH%WM>KLIq4Ez7A<3u-{HiGWquDjv~>-TD{Jdml&H~V zi6&jbv{bU8j!jHrVsZjg)00ZmQxmxUOJ7m*E$;pQNCW2IfBTQGIf?NPzI}TMjwjSo z(=vg$h&94cB!vV-n~O8pAQ;!_P*-P;sZ^7tV@I$$F^u(zBUmFK7Y1{5dv@f#dL(QT zjY_xJ+K4zEW8T?-LqP+<*i6T0#4&>LD8V=)U@Z7CkoBT3ma>02>5Y~B@9(@4=Mxq8xCJdNP zQiS4Ul<*EyDF+7gQFIhEFlIY?kjk_poyjZM^>pC#T3G=0kl|x&{;xgkZyik6t(sk>Kq9) z5GXpj$$EQQrF7KUxNb|Kt~HK2EBCQV(F)#MQc&bIRNWdzr9Fa52PIM2t~iyzL03|# zg5auhBvCE0bKNEd@AoQ7MU*PJUSa1s>nKexgfQmW!_+slC0 zQD^LXm5rx`wj(GtK<obd6S~-gCEb{gqeZ zU-ry6{?LyeMsj!x#ff?J&MYD}Fa&)dghOy=60J64yz6J7AIN=)D~L+u3!q0JohC` z9dwW$!c?l}r0H0@hmT?C*t8ZIIx>dYkwJ`g#R$eWEFDSX?AcMAy|P3nC*yz;e6mV7 zuH#R;COiILuLu~|u};8k5_Fohb#aJiZ*5D1qNcNVjX7>9w z%~P}Un31_lQ)JUT+BOEAt%;iH#+ z=oBda;prD~?NwjG`ENQ$Qx5 z=tQOQAbFOm8+vBEB!Y29E4R0Hd<^T8qbe|Gb+ijZNe9}!27<9crD?>hIu-a*^cZj? z+KfqpaZ+*>3ucTKY#0_WcC_J8E`a{D2Ym!OfK@P8S#HmW%qi!u#WNRQE&9uoq^IKj&jEgb+a}^D)X8qd3MLFzy;- z40vn^vT@ojm2ae0s-Ye^U9AFRm#!LJ`Udn^9mrZd2pS!5H4?IhR@jYp*iD44i48=v z2X3kJe#q*hYJ`>Mn;`g&~AG11EJHDBpYc$x< zq^Gzv80@Do;C0mLHRaT9sks=p6V_ESda2@zdS6RkSKE}MJPA)NiCxkav^+;iGGj^sm%B-P`9a*_um5nfGWMMt%tAR_2Ybq%oU3}~UOdLu6=6E8js zFHQ?Ds1~&HwS~|%(UBUf=};>VLPtpH2qj%jHLPY6TaZ59Kyjqgab$BzzABnf2r zxHzMk8gx^|=bLbp)k6+0{d1~`K^i0pAe|8C3xV?rBM6)A|)?gOS zL)(N_xRk}2BYT}wU*04@6l!1|sQC#0iC~kL^YEE$njGHH+ zC`$>tS>M>eCbx^@l=O)ig6=rsH>osFD9&JVdYW*Xr4!`qsTquqAEO&QhRMls92*c)}7z3A;J@O2-?Cyrr--~At+`)%3(?wOzd9A~eu(FreLmA`p) zX&&obm*2X6VgdKxc6ZtS|M9!O;GO56hqZbBJ(dW^C4!OPZ+&i>@Z;Z$VB8`kw-%?l zeTtx*z#5^rK0S=p$s<^&b6lfqTpc?^F!tbRHh^|d6Jjkjh+1k@&`X*Qt;g4l(YO_p zS*qQlz&Kp6;z+?s`EWSzrE7GdFWpKwTF^&F*h7%^5K=u6BO%$WIY(-MI>gt5qKFwi zZ6@6Eg)i>>rWYT2RCTqErY+bwS}6Oy7x3>9Ytq zn=qQN^ZP_lXqQOmKFu)_jHz@MdBRePi0An_8IL0x4j~+p?o_RixKzoKF~)4ZT|qJ5 zQA9Eshu_%(zp)-!y2Wlw6FLaOcA0XjQKp@uYt-w|XK6*z+=`UJh){h!e6=<3>*^6` z)G4(!HX_L9Pg{cl!G@-iWSy$lBgAEx&#pG^8&u-{`bM=3aTzw~5iv9&YG~%N8DT!- zf;uD5*Mv4*69QcKQ@%z`UY^U#a|XB`YBD3jXJE9M;&U*DHTOB)}P+`CdB ziMSydJ5%FllEA+I01gsr6-pJTJV=*RQKeK(xXEk~H3Z*|Dnym2<@z<;jEjIh~)fXT$xS|jZI2e$Gb*&?v4Z$v9E09&I04qlipT?3EN!L6@{ zgBNydV=Y`3BU^J9v(_Qx zpxdJY8En;31(rp%8`{_@WJv=^l>4k)1Gm6m`bVTV?{k+)iI`~`a z5VRZcOFn#e@BiLQKY^Z^1@sY&?F67J*N28c9PUCdGQ*Q}j0@-z!^bK`wu1y= z7M^I4P|U(Xz&hM*Tt*P5lk7P>j?wX1m9Q>p5USfyT;j?CHdY9M^%b0;LtC7i!HQJI zp=3PbQp&Rdoa)^UGO>dcW2R4Ok<$GQ|)uj=e|(( zfA~j2^4xQ_usE+pysjuPE+{yv?$IS~o1en3AAP#)xO=~SJ2v=t5HM~oQvALf5{=65 zxyf@07&i&VttIJBJ&yI+F>DZw>rieD9C~q(y=8`d!!X zGe3S1gLIg~1nhKIuT0tw(vD7@spSKCfc@T-i6w?hQ-4m%U z)i=n5#b*+LXW<}0DAAJ@2k7h$?pL!tR4dRC41`>*0$nv#gZgTMg-))4OC7gqs#42F z5x46JLL;}C>F(?eY>^q82tyMR))pjNEQmBW!ONDLt*#bUw$?1wbYA?7W-d)Nb+8bk zR?1daLohb*c&eGQ7!dV25exbd3HjBH5+NW{$%umEZZP(Cv&C5~AVRwO)h zj4mVM9^SBRcKqaf<*wtBk9-!rbIa(SS*Amr!6!d?HLm>JSMZfD-+)hj=4u?8S;2=s z{AoP>&@b?p7k-bQ-17iZ#a<-yMWnL@#G*;~JV82I55`BPaRZP0<-t`m|ggvRp1tXgi+Rh5D9mA{rlu%x%Y^=-K4 zJKw_(ZoQMb1K-=$!?MzIiH`15AG-n%-t%J>5&E}Z{}KQ4(w~(p zed5Ot6)+dcgzrs(^yi!NrU|w9pn1)ysD(LwlIyWKK}8t!e=m^eEvthP!U~ChocE7NswI_;RcqJB(vp z33P_61W+y3Mh9@)m#@LEAATHveeO5-+w;H0D~~^gAK!8lE_!+U3K;1&^PK|5f&yc}$?KNSiWI@vX*v~*1;VhK4f9Tm1z9?~ z1R)b=LpQ?vIxN!jUMA3@yw{^_;Kmv&sVc;Iug7*vy?0Vk9i^bSy{%duqmGmJc^=XB zxnw=8t5AwiQJuV3$?sEzq`pQep|4i2<074?QWIY%c>bh(hJ2n*J9ng{FcsoCLk$N{ z;lS&tGpb%?<7p)YMY_cbxthO~nB^KbbeNQn|i*LasrH5ELL%jf9w9 zCfD69>GtGyafnu~y9vb*FV2L`ilnUtv6g1E5p=G)N?2+tV5+8LlVwd6nyM<%R64#% z&cStKLpsQocrgK|wNaIM^S9QcEA7KTK8PDWe`VQ&@+((- z6a!fw!RSD?twljG-A3mc_n|Wx#EU;GAFJ9t|Gns*UO}FYFgiGimw)l%&U?>2@+_|Y z()DElATK`lOQZ`$6xf>1rqf77qKLMI`5^wvmOPW=X2ihzPqkp8ZAzzrCNmSATfs*Z9DD-irk~w&T;2I6O3f{()W`J$h7u zQMyh$3Q1loF%)t!j2!O4@R0#J%uy9svwa@<+noQVP5vf;kl-1C;t4vy%=_%`uy+8zQ@JyemBrnVoIom@l9cmLlwuuCbvcV4TF(%s4)O`Q>Hj zxbnjvQQ%xXK7`}_8QlKWuj2pugEo=yt4T#SfBP03?+#!%=fL3%!I-k5KiNVsn(@jn zp558^`3E1tRhPW4406AI_%VW!`v%SU{KXgTY=7|fJ5_GuV4?*BaSQ(KzknP7BjU`!H>MN<Nigag(bdv|E*l%9ytXq| zGg4ICY9h={+LF(yWDB2LyvLIwt4P1Io@mh_ZqXrO=4&?AcVyO|6dTVe3A`&w9lPsw z!qR}aSyZpdRF4Feq*A5^r9?Bg@fjtGi;N|4UG__EzpsvMQ0GXh?LPlLSqgLYn!0k)pIlRPKgDYwNuO&IJ5W2hLxH@{fkCHJL|UXCK2 zWR9)=Oq*4MV$4e@hVUUiKzHx^t4E$j*XSJbBl8INPrz3k!Ec^C3C4eV@sE7K{!`g8 zFFo-qOioW>baYs`=2)8__kHKivVBDV`TM`Al!?9D@4e-_2v`m9wlwj#v?3G;puN3_ zUqAZGvi$_I;uL@X^h>8iX8z^*SMYb|ovVUxwl>za^oy;{{}POEI_FJz>L=yh$Una0 z2UuBKB@CA^N3hJ!%_%+pDo~U(iGQYR-1}Xmkih2p3ZdAC;gLa%9v#M!BSQ+3UES?$ zRK<|ZL{zHJ#Mm%qrYG>ecfG6Z9DjQDCCo{r=)wdwg~d5)b_ypX2T^LSO6^q%qABU= z2Yyy|{PkbBn$TRtEnmH^Z2Jvgx<-vZuFcJ;X}o02ag)m}y4#2E`r)q6e_26TiWh7y zjN^%W?<+fx=zsJ7`Jcc0%PHF*y8U(>$=Pt2Fd9g*0Y{*96KK1^__r5c!GG*(2#8)J z82c3%Tkx@Wy+Z|t{mV;##9iOG5glzt^vCHwd7eK!`78YEOMjyNh@P;E4Pk;p;Aqn! zYi~f8SC7Gv5u>qYjK`aCOyDRvmF-a!i$$dNfU&)!`y?1+QFULou`%rC{qL~TF*;qU zD>a?ZtGcSWf(FJmK5x7PW5T3IM+uA_^))JoQNY-4Xhf&272Q4`iorIthl9vPg2=Ps zoQVdJCV(`{-E3J!i{QT`@p5G_Wzm4|Vqm=bK zk@L2m^6Y;dbw=H*Z2TYBYfVtBO{}{gwFH?|c+p8931PG?c`ed&UFJq?YN&xxD#Gvr zGl}$s1YMs+Uyl|-qeZVxLTocO!eKI~F+h*C83DTmZ3JS#VTPLzSSg2QGt;F}HcK5} z>y+$lb=fGZNu-CBEj_DQ#_EjRPG`n*I@khp@d53znGp_n5e>Jgx~I~GDp1^Zi|qoy zLI#EQ4BB&Pv}gI6O95kEx>>n@EaF#ViXopB@gOgxL>r2^IEsX3gcr1o9m*J_z)(^+ z0I)z$zpT8;Y!?1Dw(=ZoEw)L?Hs0`7V>N$gJt7_>LQXvbwg!aVO&B5=i)lZdp9?){ z4+aZC4CDg1>8h*B9yqsO`*pnU+&AK#=WODFwPjrRcjx1i7k^MC_=}6!-tXUk`xm_9 zf_EaBZE>fs+ggm2&UU3}x(8!<7bbsKgTbNJE~pDEk- zl_y`oxm)L<)#ihx)ko*EfnPrKi?V$#dg}!UJDL!2u@xO~;wzsi{|%4+=wSk83JzZw z!B`q^e)IYG%`Z+S?~CsE=B-*9#;&N+{|byhyZ3>z2w6i zWSH(cu6i5B2*)cve6s6M^xT7wVPQ%AWxhP8#` z_{kmjlpTNTbvLMF{=a+En^Zu~&UqhtTsg`0()3*$GVaLbo4D`4zI4)w-F@?|3XH3C zmA77dGD1}Jr>CCB$KG}hrm_x9r7XDY%?o(>k;lvS`SgWv$AFA45{%shS}{t;_{2#t zZcE_$^SkcB9oK#hH(mK@RduI}V9a`WU-SO;w=^K)&?DzJqFbODU!DdBgkdWee zQ}LKOE|p0lA%S|Sxb`|JOEz*-DWpVcZ7JL03GSDWSZWnQ+?!Rcfsd0jR1Iy%F~8Wp`Mk}~>`v+2Yv zl-Z!gIKw*N^wQ6t z!QY>IE`KL)#B>*8*&_(&h7qS@{M{ZfifcRPE$>2RXcBEbhmk&f1QSa$80CX{V)CeR zOpU3_`v3rd07*naRNMRh>&yRu!+irV8BH)XxAO1oLbKV;miqwRz@K*Zld3!^zlAMY z3z9wyp4bDLH^1cq433PU*wcq@o^O6}8K2t&;9oxc#18bflk{H;jQ4%-`(?-e;(b!w{v{3sj?*C+o^;_}`yJ%pjKI57*Rk`kF}!yAux z;on|9x!>~-J%YZB6qu;#!iAU=QSf} zZGexk3(^TDJqC1y3B{;@(Lx8=jI7(Bz^Fk{hbZsym_?f_veVmyL7w+$)QDqI1IDvX z3=xdt7-ftxy* zum_BF3XC~}4mqBqKrrUw0;ZILUy{#?gea5d^+2V#E<+GJe^QjmsP#Dam05e@DFTv> z@;Dn(iOj1>K$|L^BhCG&)NaXp1TSGMW1}JkTY;d!P`0HK+WY)naROAJy;t&niswnm zlE-MUjcdT+SE8;#<_@gXUQ_k; z70~G_l_dROTav41Y^sHcYH5}fg(mo17WmvPa1$o2bXR7h2F`5>Kt(M)#%k2Y_7oJU z7J|`2naw&rpmi!izKL$lVAOHh$j=gR(ybAUK7uhUV+}z+TabPNGN7~r##~atF`MCf zCZ!|}ARZx1Lq3Fq9_0$-(SVY4tF~w3+>aMz)Q6zAm7v%0JJzY3#(>KVubscop#d?- z7PHUMNC#Y}#uk%)vkI_rnyS#o8^1l~!f0O_-Dxi$JT`PD?C6!eF}~jG82>wZ?!m|L z!FRkJasK8+EQ@HY7xByxvYq8%l!yP@&woF<4o{;nI*&Nvm>xcgp_vIxF3sYqJ;eoX zBvh=e7B)tV{9jqv(6K?Uw?SuU#W%ltW7&C+_T`XkGpk%oNh5hDLH&Vuz84?*;D@lV zw5$^3=jInMJ2$V&sacwk;QMTQ2OF2XYsFK^bxOzeXahh&wh7v%| z&|O{kap9peN}%ugveF7xj!b2cs> zr(2X-rv&BN!W8bg(N8Ypb~GljRMF+phnniddC2jxEvRJf8gV$+2AJ zDhWji()q@f<=yfR+kZgnaVDzk4xpCct0(Xp2)qV;HP=N|(CIY@>LqcVK--p)&QBmF zk(mx#Gd!*q_y`d<;b^lN3AY9q2^I^X+0rbK(Gi3?IxHRRykMPlkS?o%5N(EwAa!!- zu*=d62VdKGPAi?7#oDaYVrgOvkW+D03HQ^48Gr3qnz zF+|7cp)(B8C5n>@5r&SY3Iy%E2?@o)ju=LJQs~PD&>7bvPJ8JZyOSQ=xCe|+&@tS} zhvB`q+=?H5>o)x8+qdJVbWFeA6LcaEtE)cx31ky&twuYL%^yaw_b6U@>f{)sbhjQl zG>QI^ITWbO=p2$mW5^8jV{Uy758VBuvU8qy?geOdIbbq3^Z#Y0bF@O&U_woe0hhk- z(z1Qu^_FvxqGQYjwQ&EZ7JTCJkKzlTz7k*j^yhK)XTPAd8;sJ$ zxzmkW0_0vW-g4bd<$*(wK8v-DElkbN6Np+G#^lU2CTFL)KBM%$cfa?Pal{w+xBL24 zU&J|^D}1QRcyk6F9Vse_&My96`r0u#*u`a0fpO^Q5u~IGJrP7WrhzfUYec%~rJL+y zmt0(S{wME$h%WRP=IIC*q}z0663cS}$0;n+If|s4b8C4Hn=6a>J{{uj}9%=y`_aYxY?KXe)9deby z#!-$9!3eK)pG6|X>v;V)AmitI;T9faMc!vZ!q$keNeYTLD7UDAv0lM4%lC>>4acX) zfWHwV{Jw)7addSR(a|dj{+)zkPDzT0cXsx$fs#ce5>ofP$0Os576nJAgJ28_lvC#vmJdcD0Zk<#EPuf-h5vn?$>XcCObb7lFA+slR5QKyGvlrGcS z+FCyBq-u-IprN@&1TF2zZ_FvxVk%wZi4H!r`>SPIx)E?sZ$WO7~Ktsm+CG&`m%&2`Go!Cf%8$Hb2j! z&L`VkN})D49iazpTzBz&Hk*LcqCVFvHwV{69=8D5ib&X}E+XX=b7`%sHOh-D7D9|} zOM-PIidA0cq;RN{$wN;-ZU@rhDz> zgL$x+#gModu6ME}_}=r+$G`C*wY{$Z;DW7l=yqesxA&r}Z4*UcxN9S<0_u|X?eSD^Oq+)uhrck6%c3B>vMh3`SkZ&dStM%_)PfH5C5qMab@5SK_5g3WYS zM&zlC94EQ91f9=Zi=eemr5R-dEy&PKCU~!e*k}&$*%D;qIKoDBl>3I8YY;WnAlXun z92=8Gw*g%~BL<{AT_K8MS33&bQoW{tbT)%jR>loGQ7HBhAQ`&(Apb8exOup+_ijZG;?MqKs3f)PAMzSbleLpt3H% zL)K-fx@MId6{yBE$PsD@UWbXeG}t9aTfis|Q0pGuEA2aIOOZfZbBmD@9A&KX{~u#K zMca844qLr@A>1ZK@Y^p0mIW+=G zUdwj7%}j8aRZGrAFv>n{eu1DHQR%j13p^&>m;pBdUl8u&eo3W7ebU4hbSZGw}a7I;c`s*E+NF-N+^aHx$C38?%yMSK8}GSQ|KI;LSc9o*~61a_YGrsW(m*lN)Pyd zt6Q$U9w!!Ou(CLfD?W6o%E#Ng&wnKijGJZJ4aQf~vk(6Q^DAqZT3p1$+$=^XCop{M zC`PC;saiv)Hg;?j$Efdq<7VYL_nu?7qV{9<7HJxJPL%LAg*%(RX69`6p z@UhY6BNRPeUU&Sz2ZIiryR}w!p5H$49Ni*8NY}P33I3FVp`@b_W@~hN>mnIPq%(Z{ zzVft|o4)dOHS5R5+A1~)$BW+cp0dWp_X$dMF6z05p4i#`(>w3M%KTBREskSjX&Ns- zc51-Pe^;No{8C5Ag|ruK3)#Sl+S=npqU^vqg|GPCgiBB6fT$QOinsR!p>u= zRrf%c=ZU+xoek`ug-|pSng+gSs6nu~PPxZ08cW+^yH-?jwJra?dWNbl)%_k z0%KM=#%!VMR4{r7M!QMDQ3E6I-<$@`6L)~1Y=fTTL#9C5*Tx_7$G9? zlW{;9XVl;*ueY7uHW+28oZf4IaW@n-FlqqQz$oilSFLo}YOe*1GR7$5gfZ2X8mDWF z$2B-A2PqC!KJT@Z+}1WQx4{_Ez!*Edz<63jrHW)cQ9vlm?QH_gg9i_&`kxKFXc}~N zs4uCG7mjSNQ}YN)-X5K!g%_dS3KuU#d#eSleBEM^E;xeJs6%seBdjgb)oFpxWkb*_ zP$3utk|^&Y2<>pmxBww*;iUc89hbW0ntq zTo-=x#Pd7vNxH?6;VJYTnn3Z;BszwsQ5=~;_t-3s%q$Z$Qe$nNz;(&q1KdkC-}dXzIV%Qn5F9yFb>lt4jdW8 zq2WOcj}2pN;wTOuIfTCcZgkTPE)z~ST>Vu%_wW-cqH^!KL@L1LZEuIq&+AhfQhXSt z>CmHWsR#J~7ASiCc0PPt=olTmKKwXBN4fia|M~lWQd41_Sen7AB=etGRAu0#y3fX{ zfN?=f^yhXdWFYyIyT8N7FS}fIrS6CTe12EHs{CC9sPB2l+sj<^$1lE+P@KTV@|4Pv z{PoYvtLpsf!N>5_5Bb0Q{=InouDkL0-FM?LE`Lt_?9RLK;P>vtPj0`1x)bj@_iTc( znNVy(kPW)MV2rx;h^%08xZ7{L{=xQPu8{lrPg;zzW)}xKrzcd>C1fic! zQNZXU7z0hU3XVa7QCwq8>IU;Z$r7fL_}?9~qq{w-=1*1oMl?6dF_I`>K^;VWb%lDZtCR9-T(7M_eeFRt^^+9# zmZh$~5(bHYHOhFU1n20LV-zSh8S0c|n{@4pV~m6abm3CkMoL9?Nmr_XQMysZAqFMy zu>?nX9gXlkJ`5#jNP>rgKAY-FO-1}jg?&hdU0in~PC!NpMS)|U&ax{NMo)$pUC;@0 z!vQ$iB6hI#?3NIAI?K+qxWFiS3sKb?mK#4C_u=X*$}8Up7_%{-QjzDA&+)Vx;AE>? z#yAUnaPQv#PkhLx*}`qlN`;R+UVi+!o%aNcgLI00gOlhY7>kFe&^xw(;rVqOU0BD@ z?<>!zd*k_kkB)(1?mvRz5xTI^5lqp2Eyz58%X8S;*mgAnvrVPjZ~Ru-Iezy2`>-^7 z49jz4bWP(sT3ebdd#DQ-rEs{+tg*3vLTPucRFQPyUiam%mlYn6b6oN9D+tCJj7*N9 zZ)gDB5=nZv4@0Aa=o{!pSGP=3n^m=P)kB4??4Ir--u;X7Zy@f3IayI=eYE>|ld z$ZLiVjbtW{aI6ghHm(9}6iGL#kJmve$;M1a8Uwu@r$Fc{S6+$L6H@+e4r?a_jv5G8 zr4-!atXi&d+a>RRe^~=T3Izy2m9s2K;CaKBzgl+wPhS3E+(s9?{rdM$y?}MP#LW{k z*jkxWMFgJOlOK8cJKv4f(LT&{hcTYEV3InTv|=z}LuXX-WMzz8Pc_ewQv!R9$x=mQ@xUp^2<`ev8Dt^ z%216E_l-!>xuqT{HYPI;9lD|pbhXC`MuJVM+!Q+rCW%U=b1d|ffl>ZvZULjjBG}Dv zvJoy_smUDOOoC>z!IXTa}NiT+X^PEt4ojN%wW0k49gz;Sz= z(MR_x4pLlWDCmaI%Nvall1N$)Z@8EQ@(_&4u;v(Jba1hNO+hOebRo%yXFD(24#F`L z@u(sJ@wV-K?8wAC=*))Em5-t`A3;%;1wMTFz`gP#<)Qx{zvyBfZ)QWnf^^i+<6USI zNV7%kr6jLy_x@4|r#qiRZ?OygJp*`US68Y8-*oj69t2|7;BoW}&tPDD3Bz;im{{Jz z?YDfd>|9^H<{KD3K8NwC8O+SiVqsR2)Taoxk`~1gEzljwY#3Uh?kDaqe;8kJ`A4uN zm2BuH&)!&5>oT>{+s{9@Y(EuzLzlR@Ay8bx)>b(f1%Q`acrm8u7I5ng-!41$uP^={ zZ|3;~j01FtGA1}Mq=8Wq_51s~RC0cMdm3RjjzVnEv<1EJdY!P@*+?n2E3oW7=jf5c z@cJAo$R?XlArfulF>EwZk+4K8`*{sTFxcOTDLT{d-FQpc@lpeIY2i3s>XhnIU7S76 z2E`!7@rPx|-|J+E@*nz6NeW(xXH;HfwP7Nku8TMK8hV z)mOns2_QA+s1-d=SnE*;+f)v*)H=;|_YrR0NauJzGB6g{xX)WGXs6rE?gFE@Md?P(_1C^tw9_fRVTCDAKa&wJCefM1f#sKtEp6_)AaRHD1eTTPH?vx=@1*~ z1oidYr$KTgYsyv1m6WBSu~s=oHJuZeG7E;xWFbIomabMc1}Zs^I(3uCn5T?=O2n$9 zarnG!{d={58*zx+Q1tPp5m-vMs#L#mJI#cmUgc4GdBeqmGQP+MB;SkrTa^+)2hxOK zIzsUBy^eGgg_I=V@&TF*AWw&wPqiVF@FOGT+z3MfqSW5(?auLLm6<&(r-1RYcfXGy zwDVY=FD<34YzXmz9+vOwwBmj~Ab0QogPU)~AY0aldwOwX;IMLHI}bF1vCut=-Xk*@ zoLI)d#3Bw+qcf|RTHeHmK2-kMzj^Wn9G9t?rY12yK8l&iQ7puw^2|ez;mG(1I{P~L8}mw?J%uvhN$zE!O#)}!grbXXLdKz6&}uW| zuA9D7cE00dM-?Oy5>wmtY zRWXuA!~5RxHk>W{$^I+a)K#Cj?6R`&^ZO^C$2oNGbNva7rL7oGT5v>??t>=e2(+s| z{$b3I_w!md@ftQG5fGWwaxWOAt2CutVzcT_mGz{^-;9Kh&ePQlM^hclyqC?qFYR1+ z8KrBr9v%Wwav^mvbRbts*VqPQ(%6Xhrbc9SwL4%e3K;1a+gr4# z)NDkO<^_0ZjV@#Z8QK_fJ>>ArSi)sp}eG+^lDI0H46A#N&P&HMRsIRR?gE+jBbX23b zK3yG*Y-yRB8eo;NKwf0cdTwv1R@+U6dRPpSilOKG2DBIjE~Sb!60pj;2noW9VhTJ80w%GC=!VEgsMm{pe%KzikhW%DUTO8 zN|dS=#%)z&qFzErOVJ3ZrJvAIP~-ztqG{bONfK`6ca>^8I=Jc5f)YjRwIj%zFX%EO zn4*J}nK$yuu|yq?3oqfZarAby^W0I@4ITD*uylM%)hgY+uRI{%d)|2%>gmKte?LYK4V?nUeCIF* zjxL~kWClG)X9>s!jLn?D^x`@eR@U+So-V=r?)U*_=B6<|G0cbjD3)i(@s^DhJam^9 z=_y@*-~8&=2)h-m6OQ-qNfCJLz6VPa2FoPF+N8o)f9?xqDFz~epn!3GjZSH89xErN z@yBO(Mbr|EBV%J2K01!06UXspg6J6 zR_XF?`C54iH_`pK-;KANy^h)AM=?i8o>-j5o43|*=QqD~N|f!7*~nR4n8mu9fnz}d zPC&O_g5#$@Qhsf0>zSWEs`e9isRj3x#xM!i7k*woZY;G+mk;L@7?0644#!$Bob}<( z>$LAK<=Q@Z$@|&BYe6bxMv~x55`25Xn4+VU?$fld2}!RMwQr&fY8h2ko|<7J>`V%b z)dXV$9i*=08ri@UD4OdLFgL(&k_iAb_ZZ~%5Z$B-#-Sn>0;{c+4a*oZg-#^s5T*Mx znd_wJ96JUG#y&MJ7mk#=Qh8s>IHLsM`J@3EY*S#&>;j`o*HB>8m4UINQA^k8Aef{p zRe`ZI#+XW#z*v%`SY%XG>PaB(4!)6S&~P}UTw)`ES5;k&eftlnd28QrrlvE_+=nw{ zl6N)z-a(ut6S>Q>q5}J?s&IhER4Q;b!eB9>*=m8sW`)gZgM-(llYnq?bzMm5$b`H-hqSL$goAEOism$AZX{u3%Ht8nJN z18VZ%12WOCPS1yRlS=TmT6m$imAA|cZ) zaM@eoc1U!pm905ZD;#t_F1JIC<;XT0Wg)zb1fE%q6Pi_ehll@kO%AsHv`AN<&#Agg zn|Y%(@rIMY9vQ=|Q(&YE<+{9XP!6(6?36lG68~w;Y$@7Df=bsuN64* z?XO&iBRxf`3!?*l3XZ>j@}y%DFt!(maA<4+xq)LS4o_ilauLU7RxmZcin*mVeDK0c z%gT_6{zz#3kPq#<_%MI??jNceqr2b#hv$BS3(kLw0^?_{_|z%s8NYerIo$WXd+_~R z@4$0EdvfRf-TTQoH`nQO*7!hQo5jNXG5m2?P>Ot~!I5DMjvmFx#017?j^lDVqTO&& zfir*q_i9Wq#v5LOXD<7|g=ODG0%HW0*MI3N_zd0obys~^MWgQC=RW>cJFnGNUfWh) z>#~$cRh0*pjPU=bfpPrkAR7yGg0nL?v9y4>nJGMYcX`7=^uPb`Hx(51^aGEmF4k9z zj{VicPpCWHrW{1@mhH6Y5gRw6C9X91U8`2JJ= zpHdd?2iISR+rD@u?!WnF{L`Ky=D&aPIUMfd?+mplD2f9-1&oBEM5e|)dPM0SqfUvs z7D;J9BZ9myTBUGDeHB{h!kh$8eJ`xC70_B-< zoJ{I2QvvcBeUPfEsYXqGEuYWzs253m2GwXFJe!+fvYPpPb-*9wGc6XOqKIsdZ${}d zqd~-|1YM`nX$Ho9ud?xfT+%gKQ&WZdh6YsE)ni{}Eh-ues5Q32(BdEvY_M4fJ_1f= zl8~x00ZGSjOC3UaaG3aykd}-YjRa^l|2YSFVO1FPs56^juv%fVwZcqrnjO+DAY!YB z4;~9)X(2RCb{iVm3aVy{=m3waYBKO#CRkeeaB@0Iva42-P31uHoCKSpsh*<4B(!zB zuxkm$I;rC-k+WRZNWe}*1;JQL&b-t|Er}doa}7g~84a)qS?} zK$9`Xu7UrDx%YmKbkENF?hJCH8=Z5`0iDrkG#WYQi~%qhgc;1-OG;*zP0C(!DYCfS zC@xoA<{*+HMM~sK6h$x1DlRF?W{|7Mm8Fs;+ds%Zsr*;?_<7FTFD_>8a3z;rcNSHr zy3yT0r}zDS&U3ye$kO_ube8vJe)~)|k8kAg{J9)oypXfYJ9&2fN`CT-Kc$a-^LgH8 z%#i%iANpZ=`SJx6;hnty!7KTbo|^nd#u9~xvj_>v@BQw-2?(4*A)U(ElPwLen)h>Y zpWj-OmEA4bIzEuSC&#jLd?^3;SAOHQ|I3EtPmYh_a7<{;R%dELJITEH{C}Mhk}Hb~ z5{a<9D6D`?;J7o2rz==cirN68Su4uM>b#sD@5xgr>ZccHa&~$w*8t=neC2mP;v9S< z`}05eBl!SonR||e*^6s}jc|nB(k=i+K=Q>cl;&4n`&&8`-}>_TN1#ZcG89WC`%_>1 z(reQ{zLBwB@%_sk>C~dqF2w-9sMO!G$5_h(fN7R;IHiblYdj7pCcIKh`2ooQZVO15 zJ(KOD5`hv+`Kc5MMS{@CPA!Fv%Pc^c30NiVw*Xcaz|kV*pjE12W~&ZMs}R<@;#PNA zYV+GtnOl)cr>o@})10%|nZe@Tlwz@f^Es)GcZ%mKXQt-iNS8~}1Q6@fZ79b{K&vL> zP?Q;fxbCw{C*YEfx0jX5#2c)GGft082cy!>m!#7JW25=?v9mHiOS3jn5{jpA)x~n0LYY?l)hn0TWJfH8s(7oJ~)8`(IJ07R-d)&_b#M)=aKugvbvb1Wiqj2XdZ;9WZkP+^(c9ek;@rWII71P!1|u@)3&>-|z+zV^m8TFkR{4InJ$;|j)d$!JKRjRN)-I`Je5||T!VzbIbpS0db$TBp{TFnxG{PSOYy)E0@jA2L)!u|Rm{i*!= zPyf8!JUNxsxvtv!;+$+iF|N#ZWw|>g|M4|2{wJu^S(%wxmhRlTtZp95J{05e*^L~W zTrh|ZUYBLgNZf;R+}n|* z%{5tsD*mf~@%ogFfA^<wYe-O$NK>JG2nO#Fh13N($9bDQ(DGCh5F`m z(Wq|!!(V(|e(DQf0K};70JUp^k;VTHp$L1<`IJ{0PW{C9e(!54`Hz41tG$d@V^5OG zkxcgPR#hHzx4C6vs99qW&~i2Lop^~LQ9asZvmqZ zV00@O3sC?v=29@$Qvn4dN5AOWJw(%+XJJ5 z_Kh{236i}MJU(~7s!u4+kzpCNjbhz&iqB7>z|yvm=3Tt`Ki;9e_xLS0e(cr{@5thT zLiGD(44@kG`NZxw%n9?eu8_s~43$zL!V^@rh6BnCIJu$Ny!eoPc%0McmJtA{Z*)Wk z0ID&_dM}_Fgy$WKLnX$c0-?f!_%Z@epnj-HZzL)1SVrv8jEn@6(&rAzpcBvUGZbSi zZWw!Z2JswTK+)+22;qgQISe3qT^ZKrT6Vi)@|z*o@W z#${%!)(A={$ub)nux2u)w-cmnZZJFDlEt}>bf=oy;J{_K$WZ?yon#WgNg9BP_P|-N z!xLl{a2hIo7M|}Syx`@Tjx5hk--B@l*Liz)q9&6ZUsEke7iwn)3&Pygl&meT$m-HM z;BzPk`zNx!dk8y{gJZT-yOEQpESi5M$CoeV?pwb{zWn!oPJZK8epCMGKl~@!d-RK+ z{es-;%tNRfW~BDOc*m^M9vDsg{EvQG{{GMWy!^sX{tT{vM*haPe5-u$>ZK;^ynMk$ z{|pQHsl2$_m+P~2IXjq_gRPEiuC`>RTbAxZTjn-bWg04&YHUMWGWOa2xzUSM%O@8Lbz9j$XmwrWl z=hy#{{NrE#HTlx#K99%lNwJjE^nOMlXaP84L0mFPhrM?>xq%)w6L2aVBQ%N6f4(E@ ztDMWYhR<>vAl?UvkLB6rneLf>%gbB&5HgyFVu1^{uZo ziRr}^9tZfDMo7LQ2zyFV?Ex5BD@uFyf}vGHuU8M*gCc?WJ|3qb*j|Z<-cN8oJCpBu z|5kqS3!jtU`q`h6-}%K~kYD@akI9dJ;``+3`jo6rCSmWu#_ zY=rMM3jUKGoe(pg@<=h^l0wW4I6Aen6Ps960LC=e2s){jLGg_ZOB9ZD(#L&9ht5IF z^pbE=0XUtw9)t55^I9biFecoDdb;v*(-Ijt>dP; zEWN6hwOL20nALqn?!6`0Z7Y|NLU~-(<>bt)OmU_o;8o6~07jS8uzpS9b+z19X}CtD zXAu#of*^aE%g z1sD?>-@NVqzI%`wV0;fiq-y+7DN=DV4BHFAzVWxFse**^9CNTy3)k_OD#jcW3t6UC z!us@0rWhZ+<;IWQ2Hjq<_yaNuWylcbuwzVy?4wYBHgT{pAD$og{vv=ym|$Zm1QeqO z-k;k?C}PnDu)=_yAB(l!>%#xA0k*iG8^!n{Vpv$>fKNOVl~@{z6JB^I8j~PYsXv|< zZ(>|riHg{wB^mZ5Wz-8`LPgTs%B17kJ%{^&p^#S_hdThoF$dHk;97~=jj8z+8XjAa{;2|8!ZF1ms+GTifKn9o)1y9fcHO?B)`N_HgM#2FKk)c$E zPtCe-`te_t!>#{-;nL?UD-c8k%Q9<**|?I z+fb6*C)cuf{#=frB2TXFN;IzX=zs0))r-Xc>&&kQ}?F`L^@#HA14^S`1}JwpWatsSEd5%T+`ZUUi;}z zap3i&EX+^qb8O)`_n>M|Pxk@FYt2YK+Fh6ZjU{~E%W?oa#_#8c+wu(eJ%4tpD)D6x zf-j#Fjs#&3iajv$^I~SILXn?2!T5sZ9L7GR0Yo+tVDoXdntNu1W4YJJ(CpQ@ykIl) z(>=L5+LUMeD{{U$Cr@D~ixaZj9hZ%%jLcL4gK`K^3~M(hCYY7s1eUa+ghw(FC_X5} zLc*<fJejv8{D}ldVaatXHMh>tIzb<+Z_kE}xN1 zF0Fffd8ob`$2vhZavmf11;^7#$>O_hV7=;kjXlOD)MCpqEN!eUZ8x45$G~&}j&7|7 zM%`naFp_VyK;PJ7WHOH#PMy$VdZV5&SImho;FH1OLFpUllfHh2IXRpG>JOKFgx6cv zI$+#WBWi1jWH81l1XRx2}FS=akbw#WEQ0Y(c{ zq7}wH!9FOF_lEjmeKKSl1{mRG5C&}49rG(7dFcx?rPwAmhAMHu`vAvqG=Rqi#1-(! zsLL)kF6e+|I2o0AiWyW{Xz3|Mg(CMCae#XOWx~;ggPYl@EaeEngC!JM(!tx< z2*7AI9MtRgV1)5^KAv54l5qoy45daw?7G8FKV$kk_Xnx&3QXxQvd1bjPphgJsRF4c zS({iXC3}i7t4gs54?Gpaff{xxIG1KSvayVX8;kZd{ztl zPJn(K=&Tpb!?{?1x?GrQDHy353CFGFMOo;;qlLFRQ7+01RLy*cS*Gh$?*Wd-vU~JIR=1C2egBE<96y!)vnx5gxP^+mQ#-$UAy2QK z>-Z>wkuX#+LNOAK=3XNK`SKMNr2$K`RO2Q7<_-%wC){72?aA5Us$4zUkhA>-Ioz6- zgYB;D@6OBa-jXb>FGw4}p9UD0x7KB4YeVLimsBavwP&%Ea4!>SngoCoSfX{M6t^uRtgH61j6*;7BEz8c@yk38T+n=87 z%I)O|0CpxXZdeog1a{Vg;(5<5G$Dz=V=XAb$Rr#SjIUU?i0j;={6N7;waDz$-d-g` zyH{{PpkQw~8}f8lF80^u7(m=vY{~X)L*^?fS*XNiy`7cma!^`Dqjpj2Ws?ycYeB%z z4=8eus#DToC$75`lIe&;Ef;fY>o_*hF94uXoFk6WA+bX-a=3U1>qG?S9kWvjLzZ$R zy#(W!0YzBcM^$N)G>pkOrI16$@xQ0a2`yEc>dZp*ElC4#t4?y-2?qhd*ue@gtf&=K zIkFt9Sm12N3>;uMGdLG&&4$(=Qq`5{bYqQbLJZ7!z1lQ<0_#JIP=qj;Vk2=tZ8o2i z>6#HrWw{0cTW@is6q`lV-vUOXj*)eXDX3D9-y>EB*Q-&imso#rEP33_Cm0jU(4gjc zd?Pq&NEHq-L#ZYdjpUskB)#pRU8@NC|DjNAL+Ww7wxX%#mPP%ro9pb%*cof3%sgZzTnQ}r>RG^j~1 z-2Zdn(!vA5;}ADI??BX0nY1uYE-K71hh3~T2mU4u$QGa)YvN0`V3XpDRiQ{TP-{?e z023!{#F<6vcj$~q)+tggT5LlyjOVrB2~vP2tJ)S3>2B0xG1Fs{zeNT*Si1{MQ`QmGhuI{~>o0}##wn)6e#2~coh zUR&sB!*5>S!fo3GB!IHLu_k*v+p>RfAUpd9vbDP}+xr0JApm)FA=^h!<>2fZV7!x? z7w^l>&2xYe3-!w$_}*uc{{zLSV0@wWO7Azo_yHb6Fh09D(z%6)+e=VT>+nh*|FN~)hU$pse;&2wj zJ{$y<+_6-#)ZQ?-9Pe z&}tt;tNr5e*d@pkwj3u9Wk2#a@5snQ{rUa3-1)Iux{#LyyeeNfD8sf;nuq`;g}I13Ca6_wfkC#{lENz+Wz+VZU{s(A;-axD)%ATnvUv{9eD72lw~J?qbAtkwVSH(VRHaAKYOy; zRVDg7R`KI?n57#D05ie%Yyez_W2c}5t0mS!M)i6&70}zug*bqS#U;+a@#rAt06To- zqB{1a)2wLNv(7ej1vUvN$TYiK;Cd2^HQVb^DL!Ucq_0mbgZ&bQ1JD|0n6#m4v4Inj zDsr(qrN0xF46Uxrb!E2Ql=pwV{u+xgvwlK%jU|ghW3uO*W_q-Q}(yl zWq)T=&QFi!_;6qL_x5FX{|InAlU=CC-D4){T*)OAa`@y#mNwV15KhPh z-q-x*8w$sDfN*|h0#3=KY^`+RfXu*VPpo|35oo7@MboM8*Zh?Zj|;ov4iUKo!1pi2^fV;t*24979y zn1)&`B%u~l+=FyWBEZg8Z0k4(Fj~Zq&o+e5F%0NLupqOHgPE$Vb4>brNjF}LWc;J5 z5GMfGscb-6_@AY~sFr_}bDXeK1YF9ROk)(g6O0p3XDp3q0C;s{fG?A6*zY(`2a`#0 zI3EiPBjS2F12DlcVk3B*+c|vqnK8URs5j35&MQD8V;Pc)9dHZ;Wja^TtW;Hulg303 zZ6e;QW2A~~t9`h~$c)tDcu|r};=(x@P2>5ic+RFVE0NjKoP}6OC*btjwUgMJ$vOO; z$ulhT=wp33vr(xOd+PB%JN5q!7-?+KGT5gomJvZO`$@y;dGl}Hk&%b`^ToH^`LS9v zACU%oKPJME_zoGs0rD6N?+^}XC!2Ohya1J9`~W#k!v*jS4MV{UJd)v&e*A7#_=TVj znXKdTdlZU6EJ6&O#^80v038}bR9^N|_3(OH0`ao=6AkevCnTJjkVJAEN-7}<{CzCI z6Uib`oH#)*JKb0S)ge`j453;8#8Dc%?%ZdhayFy`ugRec8=*-+S_wuQ!>t^o%#sZw zE6WRY=*7v&Ok3_dav##mQClq2VABDpLk?W_Kq-1$hOw@Z7J-UP0+5*mha-oiz}bvh z1BiM2&fBR9v#Fq}L^cRu_Z&YK1h-=Ze@kelH0(+UHgGaeR@lv-t>lUTT?7Di$tawZ zzQ^21XU8GJkx4lgDQ4IaqycN{NfyWZnVzW096++vW!Q8YVC-nKfdvI47H29(TrOb2 zrfuLl!FamADJL-QhaKUP?aNL8#*?E%IX*g)y}bj#>R1k-9#2l5%H;(^cHA%gXjdEE zM+6w}?(Q^6=MD?`?d`4Hz&ND%7Ao`l_F68X^q!m%z`J;^Z5W>a0B{BrcMk#MlXID0 z+mtFpS6GBPbF5pN*4~koS{2@RS(a9ppe(nb9#>_4aYn(|?b4HHG4r_Y2@+@t9D|Xt zA5M=8%HN|F@Vga;RyZD`qZS+=+@H3?#>9fpoVPLb6`*2dRyG!AHW$xi5;$J`T5HR2 zytav}=A=@|0+IzRm}Qyn;(M8CXqgThJS@*P@m)+nF;2_Q`Yb+YsK(dA1-gd;-7;)9n)0?r*EsNI5k1^&9nr~qZ_y=&cL zd~tOtch7KnaVB>chqAlWly=b%FhZFnTvCQQYoz?r9goReEv0M1xYp=KaUKR#EvBg$ z!-ir^;#iIc2}UT!5WoU3=Ab;;`jBdpPOQ_)Zde22wU0n8;{3un$xDV*1ME)aV0hJv z+pQ7@6jR<2$@?wRh&yBka9$V>Nhb@~hDM|qu|tId&Jlcvk%;aa7RU4Wyh~b_SEg!g zw4~9TkY=MU6SWH92zAI(1T$m2X!N%&lu}YIXK|j!71EwjtPg_&G6FaaVLi0sJahH; zNqEE}1z$iW3ni#kqw5VpsAU?sRO4-gA`@_^8XthMg4dOYD$M3Hl7|CZrBZDf!-82y z$+?XjV33GK#N~9z$jGqnKbnAi#O`9cA2|p(4na8%-j`=+J!G#;( zcB=Nd2Kf6RW(J1`WXLioqwGS4HSi<<FwvJH>F150^$(s$a8GtyFB5epPP)oGhBP%8WjI(LS6^%sgfIfSF;;f=XuC zrNO903^Va23~wr05O1O?E`X7HjFD7bvPm3B_}es2!YCkOf-&G71<*$DyhBimgE9=| zN3WhX!lvWQg0&l2s$Rf^pd>JvltYDUW~>sPZa2#|Txu@1mtzSB-a`n_$$`rb7nK5@ zGibn(nXC?gjLiagsoARR)`Q2hcWRy)s`&hPnN0*F9rxq*fQC&8&Ul0>(Si2>)d?qp zoq_DuAzX(d#sZs#a$#*~t6Y%TiMmWx;SqChHo#0&yDrjH=!5X|M)7`zap?f$Gx$E( zy@LH-V_3X7m1LsI6L}mktjgR}L*_e8T(97I9SgG&PF-IF7^j(t1I4v4tw|v#`x|n+ z4=C=f$??IKTs%3_y1XYRhYHC3-EG<1-jUNI&KSG^IGOdx{X*D_m+}%2ddXWG*PMwANO` z<#5#ad2-+R-W+-?5P%C0F2z%#cg*`KVX@%gbl-914AF z9;zkhl3LQPBqa_>@ za2VR<;N&txyEQhh=l?LlXoOrF4L0{E!f{LC_zYrwbLw%(!3~6BAE3sLWCQ&M7>&{m zwFLV8wi_WtQl4w&rUo3FMCOQ#qakT+f4RRteJxlHjfpQV_1*gQU?-b+Dk0%`OahvXipOT5{NQ27b1A(Z1tg>Cv_z6w3B?O|Oj#TNqcvW`WgUvK zD!F7z@)4h;;f*p&Ee0qul?Ev>-=}43h5KKNvcJ77hfp#{fFwJ*TwPwMn%mo6lf%6&IRG3l&(G!R;!>VIxsaQu zH&8Usv54R5B|&KPMFkjNz7G|1hyQUc*H?fd?Ag_GxxBuU(~E04JmY}jOF6z^lkz=T z2NYK~W@L49R#vwcWodg|y6bDw=*~#F(Ui$fGx2C`Sr%6pr9I6Q zde)CswXZ3a99x4iMDAzg1D`Rw3-Qw9=J)5)EN7pO3x%;itr@5RMn{6WfH3mFOAo&b zs!JHVI&nrRuM?JZ2Ag;l}0%w?M4o89G4|1$8CZU@9~I} zE}$AOm=N=XdyQ0$gyCt=n2d9-U^LspnVG4&-$>(#F4m8l_KKla1B&n8-e@!cb}2`#G9Gnk*P2?2oos@#HB*-vh8l6s=9t>g#vXtoN1V|(*(Duy z0fvTU<2_68*!SQ#w`y3wkqNUvf^1~?{glGbvx!3E)dNbMsq%jWA zNWys}ef>t{$ONQOu3@OdKERYwG^d-9K8TBKO7}X)#|>poD~%T{sL%)f+6W2w8-PZ5wX~v;)NFzg>qrLHnk)c8Y~3i zcu?Gar#QV#%yHtjpnB8sR8qqDV%g6x$d+0;fDi{~2$x>`?!-yvjK;+i%Zfi)mH-su zSgIx#z;O%~N|kXkCZqu1WW6|9V9bO|gqaXyQ&?GgU>vp>P^2PM<=DHl_TZ?$KQKa6 z)gwd1z06grOQQ*ZVNMsJ$vsMXTI>eI7IWO29MX1eTu_j z^>GZB+YYGWU}rP-0F;Uo(09X9P(sXv&Em69;d?Q<60sW(6fBJUD4fXA0wj6Krsm5t zEZ1PY{p&Vl>^*& z00{3MZOg{qs;urV$=d#!EJ8K57U!jm#ixcvXlZ>Ni(g%#Si}Ot@`~Bz;&wmdsOf*osf@msBHWU>CGj;!MFXJdj1!N_o_F@}mERD$vq_ZoX@k&q-9 z6`TYk6y?iX?lrQxI923Jxy0wZ+9|>rW`c`N@_|vn(Wyg(3C5XfTIMIXM+fI324@)O za*EC#pvW<28J27SjMMh}d!kW2Fb#wZdnuF!%mf^pOUBX0M? zvG(AcAS_wSSOBD_3O-q^24%G#l;w&~X7VnnM#m(?EtJ0ZWB`C57%QBQnvH03UZzmc zDHOGdhEy3rsd6te4FKXiVq3Tzr=%350AQwyISJr>jlkJ_%ssn@`)`D!0@8pbVdVAW zJ!i9U#A@0&oJKGKL!)zqA-5UmJhCmF4k_;SZmqM2 zYPFteH%R zGgc5!5L5U&(r5-8Sq3tuZQPhG z8-Pa~@EWF#(E&&fQucWm{$c-C!yIGAj7lr_u<&~MKO#^rQ7D;uAuBC-bd#)ygfS6^ z8L3X3!~vWfew-W$X8JO4ddPzvGFHJ)oF3D3U7o8n={S06`meb>HIfRP5I6DOJE_IF|!N~=i zs`ByzD)N%W`nP~07UMh4RD6NQ-l)PnIXslJ(=$0gdn(7rXL59MA?w?RP=^Pyv2!GA zn>(_#w=Y`Y4Gt*MTLQ*Ifp%8L9S%5I?beRZImrAwJ z8{S%!S|z87!st{K)@Cm++I#Y>BS|%J>dk7{iw08&V6$S z9Fj3c80b{7Sw6pquwS!S*#LtRI@q8-m1by_`;j=WG9fHJ5p5mFk{#Bva;nPuB9!|4 z1ipv597CbAxj08tnR6PAL>hvT&WAC#@zve68nb!%JHH2oq?Ti{){-nvWTc(;VKxZtl|+JIL`h4B+fyFP}Be; zVVLLMB4Cz|GNkG>_7-t|azvaP4r~zMi{SXDVhqDfFj6J@oCXvO{<#b4rL5J=+vL`5^SZS1H9L{2fQ#P_J zW+xb-oNzt`lL>Kz!ZPadN#Dq*k-(x*{OGz!qYCr*ygKNZ5Hu9xlmSR4;`BnQ<}5}N ziVwj^&=E!o#s^{4doU7`OfED3$0Xa$8NemnSaZmUFx=Z_-E{`X63gQl4KosNj0Bt! z%Lr6rQ2(aZ;9z894kTwXYHcOqsG#l*I@bEdaSbu2u|B`~-rtdthx!wG%bg#q`ElTT z;FYj5!objou;Y6l6yuO}Oxwh{S>((lm7cM+o72aZZ8ov6$et<--nA!aw0Lv);DLBN zGUoS)3ya1W{$>!K%zGA#JhD2Z-{F&CPeiPNq>P2rVhJW>C=izsUkv{@EFl0if|DhT z6Dx$1C**SiI`EhPtx?=QqF^)><7;39_y|7*AV**Ipr~MESoHxI&7>UuJ__(Td$pKs z20&11Gjf)9uz>)_W!VYE(fiC+!jYM+G%8AlLs{BE1<7e11SN0Nx=G!a?3tZic}!Td zDZ#M*4?f0gtu~MbyPf-W<;>7)OVPv_vC{&zM7a-`4y>mx&UKK%G{4(CLb0!)?hIa zrogTp749WwRTVIFR%Sy5?vX()6G)jfC#rC=3LynWjoS@48pff+DP~{-hy^BSMZ?dwP?X6mvwkw!SO9`X4N3;vDL3|{hgn$cXGS*S*h zBQIIwNKn3}B3VAe@b>dN*<9$zY%L)(;{lm124sRzO!;Lp8v-mtGF6Pp9KhHZ&q$g1K(i<4h+jZ zI9HR2I5n1G0E**qk}~ey2|!S;pi&-M4#~@Iu9Cs6}39 zwrDUEg2Oc4YXN6~ak8fzwPZufHXbO&wv*b~Es$M`$%8-q;jadf`wWf=aRV-|iW*gEPONJ9H1RE8iCg9+< z;emU*53lxAq~3<>1SXSk%-i^PREK`QTc3vzWo;z0SP3zzI=%)PA!!|DD3tY(SOl2m z3gd(iHXq==73&{4AJPONFB$$IWC>lX&CI0bYapaK)@xY9PpnO>=QA?V%TCQft^43q zaP*fA-$j@;QFyH!=@o@yPe%Nj%)@@JEGG&1aXUTexL2(R#nR-ANQP6ZECDGi7-`M6x56i;T*GsGd<()xhO6BCM9_9CrV}<*UypK)BSqn+k$i16zgl!br zAixPw`gO{~I2Q6M6e(wN&Q2C(pQQlHj_Q3c)_aA9SQq-%PTUl(^0KX8RcsHA7>P(jG3MheKs)ly2b{@#l$_plqFdiPTEMhq>y&NL3Bwy=axps zEuCTzkPHEWUR9M5zf;Qi{#$Tr>Hs6BbQCiQsX^h^t0k#&FA-4JfyF5f9EeIPo0e>) zBEC#PMk6U1@I|C=%p;Hbhjj#$HuMHu`ni_}(6B6u^}-{ALy}3c9Eagj0?-&x{2CNF zoALh#FcO5X8=#2$2sZY1<=;-U0JIjvtVs>?vy%>$`d% z{H7UHOdjgbyB|HpnPBvq-ZMI@sJFzveymd*>X!k4U=R!Wpsi;BMn7QjSi#sQ{Q%f7 z7W@%Ar*b%C*zS-ayB+Xzh|R|?I4&8m*zi2V@@UY8zjfmAP@HbJjCon?PZ&Xc+8lt0 zOG1E5nB8Sq*1&L8$PaJbtu>VvZWaR~gQEr*2`^@uQUMy-sRkTbN}|_I1=+j(9*lgv z#n^Wwq?nAuE+;O$W_n_JA0Dp>I~J-$01Xgh*#v>e+Z2#Cg3k(-$YdU7II?8KXe6NO zl1VnaZf7XeZB@2#KFmI4M$@V4nwINq^x08z;S)SDC5}O zT$H`7B?TjsZ=O9pmuDB}a>Fnw7F_Nv-d;VG>r3ALL@v)y1iqB zGsr?cr}8ODt0g3<`+x?AZj}^_vlBT0C@1R*MmQ$xv$DUvB&UZPa(Tf$-Xl07r`i$cB|ykp z##ai)XL?=7b7@c2OL-qaddIS7-Y2CGNkG87Piogb6K!(oQ;M z24I|m12qXawxJrklcTS#kTY_(ik$1fF|EeVxsGL|aINF*b} z-YC{Dt47HNIsXt)90mvn*{mCIv@k0b4tupwk`^;kdn&O#Whlmn_WuQp6NKLzP;3y2 zJ!_h9BUfpM*&986SHYbd=Tm?#&QUF;Y=qUbNj>>is&9=0iHKc0HX*y zp;I*&#$sC~3l=2JNX6o0PSRj#(gdQaKmxC)B+dOtGx>&!P*q_s{7RsjqpDc5reN$r z_Wm*aJ3_LzKS}lWVHT{>tlZAaF{61ofo&>I-fyTxqqM}>17(QUfTTW#@Pr!Wd`s@@ zq@ffGnIul|3>MaawzgCCY9-A3_3>j6l!%$JM%=@k%UbL=-tPB@TMa& z!6_e=92Sj~G|E|-?@ma&fdzW1F3WRmSzCl++2CH|ob0U4X;++sEw(M&hT?-A?P_ue z7iB8N^V0)4J>CT%*~*Ly^p!Tu{@{Iv?YIyd#>9}Di#<8n?8xD2Q}&nZvb$K7l}QHPfVDW@sUt^_=g$s(TSxw?Sr=&ZP zg>o;;Vz(wM^DWt0VLQA-6V9~$sNAf$k zX4titkn{3ZUcO}CTDIqVsZAK31DaP)PNhL5tfQSqWISM%CY-04LR6OUnwFbsnZtL% z#t{W9vaxtfn_$PnAuR_=0Q4#DF9KpELNNo?nDGIOehGWo+#bg!%QWEVh0Hxgr$tLP zg04{wo4Ra6;v^Jt-1?kD67!BqiOD}4aGZ6>bTcg7R!k-;A<0JV;=(Y|JHfm*j zhU3z1R-^+bqlNFUj$?faPDiJdFvesRqkvgN9g#fu=1N7$m1~k|w8fq&%U~=ogJA=V zg9KwAU^u|@9BUK4SI(xj^!JMkuq^oDEaW*|qoGCogdiJ;-`j(-4Q(*4HIBWk)RqCE zI>VL?Hh?GtummH)$q5{$8l-XX@uXS<#yxdzAJky1-__bl1#KCRW%)-&kKb4n=QrLX zTWuz|O@Q;f)~-o)l2*s{2L2DBI?;opk$_`l$JVsjKpmj1Hwqu&!aFkZP=9#k|9;B@ zK0X`ZI1*+$jp_lS$`RfYr$&2%0f{DJ_r@*`Va`>AckRX^%uOG_$JjSeZq^eUe@^5-7 z^P%bfyEw-qWfzlW{C!SwN$V&%cUArB=>pUsjI7TAGLF3*|5k zl{U|M#u;{InKkwtm!Te4W@LADR*tq7;l%>g}tafv<+$})4W&rL4UKe}H0#Z4)>I=zu ziQYcIlr}O;sR;8})N@((&;@V+Mutw)sel5pkfSm*F7fR&gawe0U!RQ4X;k2=<5qspq!f-OU2hDKR;P5aE&KVrNVJjRWd{^9i4^mx0 zRrvr=KaAm2Dn;&9rnncD@*D4q3wJp#&00#Pnpx>i7G$1c+G@etvU#p`+FtU#=YfN7N zjOT~DPfJOvC_Ohxo<@H2P7m76BB(Xi7Rvx~k`8l3)H5q#p{>BTc-fMj@o79EAeG zSdwg|scO-ZDoTGmFa1!A1D>GfQuIHDL*0)xV%P$KFrZ~omVrL;K^WA-fOIY|)0LV` zH6~%H`6LHu#_?u#nksQ1SBY*zzEf4zmY@lC;aDtE89WpX%)wV-@gF~8l<71}@fG(1R z*9=&xF&P1ik_U^g2McmAXpC?&!RUwg%%Q_RT!!)~2^F&9NvCvzN1xRW)#uO*OQvVX zT|7DL;_&#y7R28q(vpQjEU|I1mO2d5AHKFT~$TiL(+hrg0Tl#IGnA(F9-`*|H{omk{iv1i z*8n5;D!C_Wl$4B$8)}hY^m?q~cCjvURBI*)Mm8NF5Oq#uF{RgAP>KX&XR;zwt+LE^ zs2Zm<0Y~AuGz~R3C3~wgvcEPXN1NOmT$JP8Ww|=rmuIl63n~}(@-#{djL8qZUY^`z z`(XC0mL0S*0n(N%hz>{?0Hio1fQfs+61cV$ZQ-$0d%8 zD(Y5Csa(+gL&8o&rMf3+gl_piOfZ_6vI@pVMKie@)o%(gl7p}P{CB-O-i-l_!*-n5 z9=D7-95`6|<u(MxVo;gEd8G~B%rn6Y2l2S;pKcgGUi7;e_ zsL|C%p=E-x2R<`QN+6n0dos*}!t4PMAHvgw@4e#e-G8qv z&A%}fW)Fe{qS@Qk2)};#I1{eCkG*NB5UCUyLe;Vn)3pAQVbxI$rxK3bYh*%B44+>S zCl4E&YfG#=6BGkCa;n{UbnAi1-K&wq1XvsZUFX0^%slf!lGEBpNEsoXJB`1)L4F>_VxAC1Ap zMgk5Um0rVz7ti(a6D(2TJj8%uSwHI;eVTZ)*i6fEo9zh4al8~Hl}T$it3;Fy{r!@R z8emLD0M@t@iq5U28w8+(AymMT%8^Mn+Udr_=Hc95WQQ9Aj9$Hjiga5f<{y;;n}uh* zP>WD{IfpE?W3oOA%) z_8liCxz}jyIko}SDg2Kq{Ev2{F6|oLccm=tN(m~ttl7fsl9kUUrB=oFRDu&z-~jD1 z0E*`YKqmmd7Ho2Yt>>sTsTz$?ssTp8v)4?$Q7e73WTldWul;QI?szBmn2SF=U3Nu1G+i(S#EaC$kBO&o508<>io=jdxwd4TCC_F*C-Du~= z5To`xrD7zIdN4FqBLQZ@PfIW!fX!5XW*NsrU@8=QATr@-UYhnM5Y5NF_M9Uhs#ndB z?fq_o(0mRvWNJdxRE%c0Re@=$NWNDpNE;tZVDkU5C#+HAOE9`w7Sao&`nks#p zThB!TOvDN6aO4s|Kqzu(G7~_!$aGp2>9%XS-^l43oV3Ax#?8fPS($0d_7ZM`Z7)s9 z?&`E01B~YfYfv4V^6Ye1Zk`@Nt(?j8X8#-%hi)Txn`#v7?nH~!`j#+lvy$|ru&RJfRSUUm{dch=pAF0>8JvcU}QKoi#@eB@1!H3t8Gv+a}iMXmcK(X0r8#ZM$6judFC8=uCDArf-se%I-;fz)% z03l|TPOwyB9Pgo|PHG$18M&FleH}c8O*p#vn@$z?7c%%>;6z~!ZsOQ%v)d1ZN)E?j zJ{gq?d$Fdu<-oF~vQfa_q#CRnWghp&*JF0rftmyuTL9w(N3Ye2Qm=kf3@RoEU;8Qc z?szB03{x9bNx-9{q8?cW0LwwW&XG~^6tnKQAo<{_z~kkDlVoQQhq!TqaimHh5tcwY zCGJ#4YyjeLDABXH3T0Waiojlg0f8E|K#E! z?cUFfONI{b6=M&KCh#7HL+@2&50-DLNfU~1Q+XP)?EP<3A>M=0)(eC7o=3si`~N10 z^}gQUny>F+$n>ESG?nB>Layd*c4N@8sU!(PHf>jP84U=u){>0|+ytWmMGjAnV=-rM z))2mz2o}CPPN+$odF%h<2*70A ztG64lge7}wF=K#{FywK{x1QZZ@*4{I5FWgKShqiF@qqwhRZRrI^bBk0Zsduf{}fCwZ)u=aC8|Z8yP0~B=G!Dt_3(M<4lA~ zNuBC(JRy@+hLy82)5_yJ;C>@}+d|QI%d#?CRTa4l)p)$U1i)?TcfiZ1$6IoFx&z~W zb8~+%1k}2-+LE} zXr)v#z{nxqSO=19;vEGDV@}D$0iUE-2Nx&c!202+c>qOTQY{jU8cNlDMnZ8!`=hdl zs)7-q4Ee0uXLURcFy;Zqf){`U(6UabN4HGmy#NEiRP@PIH6)D^XP?4}0t~7Z9M4d= zHGIES9P{NuOh3;mKGzZzI-C+htsaU<3lMB#4QhrHfF(X}K(Y!rmT-HE>5sOtyzM!-@U8B~}{Y8dK8%&Iunv_NdhRY_~!Eso!+J}wAxhF_4 zHZ)w>o4f+$IN4;YMkYAL@g5_ZFf>z3%X~8@ixYWSY~*C2mXSHO5zK_7g>#~nbiy3? zo$uEz#jpzwfLF#@ro^_C_)ZJ?w05-7a4JK%P@^>_;7s+Q&ruA@r`h*2`&>-s@i%0y$9oiuqtmO zyzT+TJw8)u_TWgM@pco04;AV?Xy5YO_o34_)TS9ueW*Uo=Qh=(g1QGsoi7QGp6bKr za(B6<>z3ZmG1!9Hs>b+#!1;*CeWs34|cRUuW-CL z+JHjY*X+r=t0z#8=c*pxf5FU1c4N7g@B5zbl>g&j{adx)|IOdR|7gkHN<)^X^DvW8&_k2&ZPbDyo>V5|K`8O z|M>^ZJdAzOj7P;?ucg3+&cLo^m-iLa8Ar~jd(yo;y z!>J$uBYW{i{eXcF&IX*~65jt*B`HgtI>6YJ>iD>%2}X8OV&@=yMrpQ#!{?socqt~` zKtV>mHu2d<#A_ecy+sp@grZTR0U+W&1!FIi%64#JfH56)N-^b<3P4!P6OdGoZVjsv zjFSLkyXcYWYCzYWENe_NaVf)*sO14meD4!*Xqs%=UdtQNfMi6{L44-;UWy){)O-P{ z0elTyw&0+*BXMcNd7lI%C&EdYh`=$S0hBcWw2U>Y=z;)n0YZ5ERHh))<+^n0%?Epo zy<&fcQhC|JWs8^Q_^GCbGFfWX1c0c_+Kr-21Aa60l+0FRGM&dUn{vxE9D{{oP*y5Y zwdHa|mP%0X1t{gTTV}EjSu8nZx#E)fqD$HUWFty*NfYNmCG3DA#^;j*XvV95H! zzM+1xJ8hBx7^|5W4p4lN#fWrEVH~I-fRbQzi47;$2q$uc0l_d}7>r3jpx6&6_PYZz z429_MICaJ$d-CZxA1o$A4*Z=zDE4?tf{C1X5>SkZf_PKxG!Jhs5s@56UHKSJ{V)kd zLzoZ1Xof{iAble+@^Rc(R2$@+v&VYBsTz$Wmk-M{9)jy$F}@ATZ@|%nt*I2v1f7Sl zG@*MRUhS#YdqDQ!s6Ac1Oy=P5Wru>$?8svp_ZaW}{H9z_2+`|_tht%`A*$smg@0FuU9#92+oVMy=kiJ?}Wa|->{sfP1jvgllk z&!5Woe%E)r2FBf$3H;Bh?kzUUA=zE)d_hEqpu1f)}3Ue?`)#2@ejj&x)IpC~g@sYDY{ zwF!I=Dc$qs_ff+_{#Rf7&wnRh$M^R6Pkutf+w5GkyF9D=zq>0P*;}KET+|Tv?ZvUY zxV$jHczY+WZeW1pi<=ucJ=}*X9oJ|~0w9dBIf36RQ2;&WgKEV2)+j_}j$!sDM&P+TSf#wh@@8%xVfETfmxk(5k@ z0nSiDCSV<`Pcyl)%$DjhTW&zzH37E?nQgRWt~sgJnV6I*K+&)XX~VIY1caC{L{-+Q z7V&pEnFkaX0mbF)x2Al^DbEc5NFe4vNGRVWU6f`FeJ3ell+6qCU*iHF!(hDG{L z8Dhs9hE^j+B+eHf#&R3+OD5Ne}yz2s{!_8e{ONy%p9Hr6rP6pozu5oMW1 zI-;Fcn2E{^wiZ-lb^P^3_)q`)KZJcv{_LxNB!B+)~ce4&|m7N_}~Ki|^vO++Dwb-OAPZxoj*iXh)lLEU2?Pqi|{? zP>c~ToQ|MdN;qz&uy9T`>I%kOE+a`m{XWTw;nS1{iqR)od^a&R;a~}d6~~~B0Q?Y) zX8Sikn}j>q_Kmk0unf3I0me~@2W^rHTO}JC!*jc&n)d;Cerc9i&>xWYxF2BjVzCdw zLHB8sevS^SVm)fYQD^pPBNx`%*Cxvo0D)4ugx4As2i5=|92mke3uintYLWbyO#xX2 zAnV?s)S(V1{7{jw4jlR}KsW;^&PD*rXhxmlPBf--XG1pK^Rn2-WPmN;+&&rf0iM2qSm4nO+U%+#y^)w?b)!5fIV?hKtgU4l z40Bpp!#HwpBctp<0syLF8}8k2v{~aUG6ItK>m?!izz9v6!i*|Sp=*RsO=W2A5t=}I z6O8wdGZkSEg!k&OrwmO6Y2NmxY3-tWthbkH>?xY|5Q^GSN7b_tMm3F%$q7ap`?Rt^ zolUbjIU>#epjg<;#e~{JFm~G&W4ip}tZc1w4&#xz33jUD;Te z1kfgAeZD0JT!^7i4!0KN$^NQbJ=xV{5bk*ql-zsd?@y1n<-7mJ%lqg1D!{n8+|d?j z^HcC>t2l|5KU9pr1u&+d3R6^pfL4rQx(MG3!RQ4TdEK~=zY~gQ2Rrf~{_J1t-~Vra z{=dlI{`POj!W~r0r-NGLe|dT+U;pDjzki#{K%K?>W(GY6i;Gq2BSH7zM_kaDL{tDmqnAn|8Z9GkNsdGqEaXeR8 zI4GHuJt`cB1kiE{3d7r9|0CnI{k#A1FEvAW0pGz~2cJ>5Da-S1`H4?|_Wrg18-Q|s zehS}38{bJsc2;IJVd`LKT?aj1uv^i^6S=)&b}A=pJcojRF3+D`%hkoXoSh!X;^MRv zp<2T@e`CQQAO__KWt#|64FWdRl1$WVJuqhR{^I}*Gl2a7BY>DPN@_TenEQwT#6Ua0 z9F69|@vS4$a4fSd!vv$B^^5Fx?CSMQ^)gF!6lTm=W%5lb%s~Nc2j`J;&M(zMKE za~xLkYv0sv1;=oPL&RP9{OvfFlhP=~r3N6B;n)J7=1{vYDr`^&Yoy!WhA zQ90+FbE#B0oH})K&N+t;G+?^PPGC$MFkrwo!DMWc8;l7i*aqWp!Pjf-vG2@XGk50B z-!eZu^Zh>WekIkZhH>gct@W%eZAn`yh5dQIPweVMATQ1fL8$s1K9eRstD4uR*2KA{ zgLBP%Bo06(WFZ0=hZC}d?Mf^q>wx5Dnvg82?a!3}%8KkjP3{zHY6r1^KU8kW;c80` z*IQ6ruueyIx_#LJD0h1Ea-i3Q!UT9aS=p>aq3|Mds2Y_MjhLKm#R0>FTmkg20*cq5 z3a`&cUJZtXExfdVfsrUarWs6M4C`la*5oI8H4j=b#ubLZn=P za=rw?a$s?&i{kE@G)SWlaJYz!K*(JjaZfVx$R%E4kpj+Y{PxbTE+ zPYt8}`})M*J3kR~vAr0BbZFe)$1~A#p zW){kCGMc`GwE&cNuAbJi4%!=@do%*$OMfaSa14U+z-miY=L>S?@Y*ggR_Q9Gk^=-S7z=p= zLp4>9{GaGfO~|*u@YUht-}7s~u0Z7f%9d~qx!?Oe zE~_zX)WiW>EazaBDm&j)jp8ep3z9En0lk=b*$0?q8Xos9FtYgH=lAP<3MEe1;8cXF z0c$CX<5r*)%VsPYM^pj2cCkV*Zf^pJP=p7V0L6qTTs{P2ywv`mufE458Z1-*O_tW^ z98ET9zkFVYOW(W02_2k_!a>px2F^QG58;UGxZJ^cs)q&q zJgkq){a{oEp_nX1ld=jmxt7exdWuStpv=quOhFC+lGb+eWjR==04#uJ375+?IaF!M zk!nW{*III@1~B0}wSz^(ekkGtP45h`R065uJ)30 z9?(2di$M`aWHB};OW7GYzJmLlD$422sGM7m%c)*SPSpZ(0V?}SH71vF|0|8CT!+HE z(T*x`FZ2M=ep!z88P~*bnvjH&TyN)PwL<8I0Q-;}!}FX0U?1ng6E^biW&dtZ?7j07 zF`suzQZcU-GhtPA?ElGFKodY)D~03`WdAXIIZt#G0Ams>ptSTG?4cMJZw#t2l2jma zYR0rbA})OKf>=>!@FS_<$53^SOXWAs)OG-HmdOiHrEF48h05B=8IM<@_%c@TWvl0l zSivS0rbaD}U`Xhhtpy|1qFbTJ`x21mHmXUZD96_wTbFqdKUQSLQTHOuC0<#_s7*#d0$lie>K{(1xjmrT*#KMliZ?fb9K&-Je zgC!WwWhUED6*3XWKG$oXeyGP~!qWEUvb^PWuajSS{p;oGg|j+wqunYi99zwjY^*NI zTc3Zu{PGKLklWX;OAc_1#3S;mhtJ4!kDeVKllJWWr{p!*ck%2woln|qL&Wno) zQS}<^?@KVI0mihtRX3JvGFa|P0nqklvf_(#x)06^K`f~8yfdk^xNmxr?zIfB=5Bwvxk`2s8>hYE23C@hDe7*EsyHg%l> zV)HQokzkC<4V+(Z;QzebOvpJv?j)4l5j&^Yz5^O?0PdSS5%c|<@`M0$gJ01Nj7obUd6Fjuo&6Gdw#eGzygwI zYl%Hvc)~{hz3ksFY%XKSvkzZbHxyb}=dDEnFn-yq*tdd}&JLvi;TA0l^@tM*KETxu zX8@)of|aHlU#1xVaoQ8aiWy&4sJ|$nQ3`ti*Ps^a(*?p+_B4|f*kjVq)^LEA4&0oS z2{!Hp7(;P(*C^pf1MtQ|I?{rIjY9-Iz`Pu z9e1B{>lFE0FmgJ*ne4&ZxsXCK3$;ii7}-BHgOd`ICw76cQ{s$e|zrG}!%RO0J zXvq3PO*WTWvVW}yV6Fj}Yg+jKmtXtVE(na! ziT7xwCtGWM*@pccAZL$#?c51Dyv3QCORB)no;WC1E}fN^KKsYJ;;G|CckTV#x204s zOJ|`kt@#D{+($k=y#3^nV^HU5ytnKlTayJqaiQOlAO6XA_4dE}&R=Q=Au7gd84DGh zD^fA4L_*OmNh-xK)gsLRF%>nIiP3H9mm(J0bf4zp9x0@lk!n<8tq{az01M|DwwW7( zu|qIs)b?-nWDyIYOt&kODL^k4mFciwrtmwO2>N9rU69E<+r9N=uGAAxt|&8{UIWD# zn{!K%3NewC8n!hL6eGdt$MXdU$bfXQQ1AMKy6xdU{ZK>(5va#l0t%8Y)}+F5J(+g4 z8GzE*7VH3^xdUanlPahk#Opbf$;qKCz?e(Pp**05^W_PAhtJefasjINN+&7T0K}^R z*cF^(FV$mEfKfRQFrI^QJ_lHx0kn>mf^r1v@OT^QuHlzcb)Q^l1>{;cEVlsGJH4pf zosY;}!1G==B=``42}cBk8|M( z+i(u!);T1!NQQx!G9>05~ZCtrqu5!x6vOIW~4%z!bh2`1wZG_Yd>ajOOyN3@D@UA4$G%-oupZi%vt`MYgHe)V<6EJJNnpz@Iz+#7rk+AufAMaL-Ov+gq zv}FnR-CF5t{9zrd%dMrR9NAuyV^Ac=4{peJzc^A`e+4!2(cgZbmKOZ&w~ZT-_BY@9 zfx1{PoZQiVpLDxEd*|Bl_V0iBYjSX{EnALSWb^6ccn*8}pWwuv!*?!^?;*=G3>af- zbgSCS8e;@3KlEGg8b0=2zxFl&kS*R=$ZukWysl8xZBA}qy*#}Cx4-Zb-Y2$s3(KqS z-yiP((7S$HRb8i38*Xo09s}dYKciqQlyW%6*W_EDe`$Cd?VGs%t2Yi#LXk`M`_6t>dLi zC6=mGq}OZ7@gs+ZkA44dzNp=X7-K9Kv1rK#6@UbzCftOn5RLoPf-$X7H0m%1AQt%9 zCcJ8;jOm=ixMBmpF%QWm2*~ zosw;U^8f(4lTHJefMhNyCkiP!jqmH33IQ0AGiAmMBXW_D#Cve55toaA<+*xP&S2lU zRzl;F*E(^z*^S8^D9-x}ut8KFz#a}F#`pOciIuT-HFMS`Gg#+5Qbj7Hb1rz zIgknA^#lNMA7Jj=!-Xeo=f=hHB^HHBi*J1;y4s7 z7zsZ@Q9%f`$nE6hKG`=pp_e%**ebnUV06GXbhD1Z(bhv!Me1W51!(Ux?n2!K#*p8% zfFmFsIGW7UQCyL*Q{XwO(e5{9@3Xt$Kb>MME-8h4QlZGin;uTc{eDXoPpOau6r)&h zgm;1QRS)jSYaZQ~=N{aZXYSmT*W&tfcdyHHx39}7sKlN1zQ(t%pFcf3LH_i6Kaz9D z4$ArChXBCCP%kItAAk6F!(%>s_nMqPu`TD0@0T-2Hsz_Cmxi}}?@KRf0XZ8yx64s! z;>0)(#;*g6dHhhR7z^339;27@Hh> z#rB6;d`FWp`N?V|Ma^*l#3@1%JynU4sG@2=z&Ej#ua(~nTNyA zhb1e|KlduRedC(kxp718K_$NTo$nqVaP!9*YQK!rVU?-B`#t8oRSe1?YnipB8&JlG3!3XzQ~*bW89?*kuYRT zF`w{2IkK?dbk1p4IbMpf#fWqpfFcx5zm;^rm<1T~vfRtdk%LQe;Mk7z4(v#JVOc_z zn#{)IvJU{;2XIY7Ax@QhGFe%Ysmh|b$}O3VM71%v4~y;~EDJ?g2N+v^K$u|kdZmHi ztTC@NeFWrV25@!&%pRVn4>dUmLLlJz78R6HfHG!488^1dPC1UP0p4rLB-ABkSyOToi-mi=jNI>~ zLPWZH|`eI7^PK>kAYFkFbKv7m7am* z5R`g+13}{=HB&P*3-z%K)NwE}VTbb{O^qlMZ4wGcjykH>*xrnNKTV@-D#pjb`19d=;)J-P$<89)+f_Hn=V!Y`>>WD{(v znfuqz4{!VK7rr7Jy@Cu_?gJ<`82I16IJ}*Tk*?H|<3`ojOtnieQY|`=w23%>_~Abo zKKAv`Jtw6iPV6j1ujHg!_uR-7ZVFLnQ|5aJol9 zx~;tQ+J#*SQ9sM50vX@kgp%LC(vkyfT{*;Q90!)XGxs>u zF1~Mo8^Jg#=%dZ%V2I_Hv-F9?MQFnayc^a6;!aRVF)NEk2M{ViPXz&efaWTcvxjF)4$95)8#xe-qSOlg2A4KStTAe7``EVhmU zl*eJG@+mn}Ov$-&3Xn|7C7f$-;GBD}oskC}fU%d9M}rh#n3iYP((aCcn9k7b}tBp83J5GP^m%LP6qM(v;bZMK#BABq3kczl}hftY(}d6`_jbT2fgA} zNdzSqcI(_T*9_DYz(L3)c+zEaU_!z(gUdeC_&Yc)mB_3tm7=m<2OL@3gjGi-i2J~p zbyi6F0mhKz!f%4AlpXV-P-kbMAg8As)woYzhpI-pcX^yKH>fGH zr|Z%{oe;F~M^%Ro1Z^??5RQ(E)PmC-gP?OPJOX6IG3zchS*9k|NC1vQ(SlR&Go~2h zF}5BHXeO$KBLQJy$&A7R$0%iXyHbCiz4^IkWqr`p_}2Eyyc}4amm^zCfZ+l8C8*3_ zd*OL``y1aVZ-2uZ>Hy6l(D9m9xX!zVrDn>#*4ssDLh3#LZ$v zj&2QxxBtoKJ`ZKfUawS#bf1oyCgHFPj_F^@#Fe&oB&Z`d4-7zvH(604Cj3rPFRec{g{tVChQbf`i5S zj2jZbKmFd1^)`Yrm5NCc3Z6yrt#%bqtVqL|1Iex|%S&zT($Xg&9XQ&o)c^Y*{x|u+ zJKw4H{&)PQeCWj&2Io5TD3);oS%lI4aZ0mhB}2Zw6&ci-~?$rQ30KV{o6mcMZSi@)-#+EbRv zTNRegS(OuKj>*oMbFy~)tSoFDkov+v3Z0H*I$eoj8)_{`u)8L~ z`3(uQ7sQ>)V1euxH^At|`NaogtG5bWsVw1uVk8`m@iJATF$>1J1IH$;O+Z3LcA+AB z0l&X=~tk+Ts$qv5o zwZxoM6E3JotO_~$D1wz@7%RsJOF(dP$BEqqSWLTJG6}^vIc?xY6{mC10Jw0NZO?*$ zjL&3`I+>+LC7Sr+I2;v(&en9anHnm^eSjjtNZ4~qH|MQQ;{Ta|Qk}r_&df5&hAvXN zOHE5SlZ{H?(N${d40T8_U8J7Tz~Ws=G+Kyn+PJC0bRcP+JTTis z(qR46_VV!duYc|flEq>w$ENgIC`3Y@1Ap01SEpMfplFP74Ak$x=Y7M+GGml;JBtKi zi35i-dV((&Im|V!Q!Y*&JudkF^_@M_~NI$3HEcmcec~ zwh_SJf8T(SF+AhOEvO5dabDZ$rVG{B@0dg;6FOj-*@szOc%VT_SkpG~L) z*68hQEbL0YdE={|mhDwGo9;j{F3bP%lmFE`KfwA77A>4?^61e+xq0ihT)1>adP}SF z%u}x(KK|n$`U6SiYm&%SC6TQ_8JeW3fB1{Pl@v>)pjzJaTGN<;aNJ&BQWvUGi&4p^ zgE|>QOECaJ)+Ewh%6MX0vrtWJkplwgJ}su0c*B7KZYWKFGV8-}g7_c9(kjQKTTjS* zGo|&528<@Y$k^iYJm9!clw(KNw-~IsSgQcJ!a16)_&Sk4(wgPZ2 z2LrlYi-cfdSVYzV$_=Q=Eht^OTDMavIRH2s%K~5-b-fIN zk8leF2o_Vjs8Dp`i5856B;Bc#xIbN_RE7#h#uKOMCN*l1?owk$1y2KlyTC|bP7=s; zjWVm$>6Pkb8HNMKA=C^QZ7aC(QVn&L(lzRgkYfCBR~Bl(lv|7n_D3$!k(t<{Rg0R0 z6CGu!8aL|hWE=}hmTOQk5{lNX$~dDb@@Kh1R{N*s)4LTTPteRt?Xjsgz|+Rbz5|=b z^+jez_8YRZz95%RAJ*DG`?!Dj!C%Wa|M*Mtl}~&|zWj+#Yljwl+b_TFHL|nG;m3VB zxVa#=E}b6U_H8J}Zk=6|Vp1!1C+1I7rpP`?@0sWEeu^AO`WVaFs5 zxF=I=j~9@)z3DB($9~|&_vi_oalce5j`xC@&{4gdgNn>y#r^c%d&B#G@#CM>1w{n! z;rMzx10x(8b@oLq>&Pz}2S&41 zADg=~YnCp`AsB!1&pIW9P0$;al*~g>uJmiNwbGH_c;l$G-d8{QS%u=kjlLX);^y;m zKa2l4RfCH0;lqb=>-HTva_odoufKI`1pm){^fQ2BSrVC&#M4E2<1f8wc-#3iXC;+R zK)svtkneoqYg$rLru&)+QJJ9jIMu9E&Qpw-->{RWCQ@rH2B%5py^M~^JYu``Ed`{YSkIec7}ws)klv?8fiSG>il%w}^k zn<>g{t|qg^rp#5E;wzNI9SCA!PcTl2duCb!IN!wFfHvXh2N-=}>3Ty$Fe)5*n~&yI z5Y}K-2aE*eF83<#OBZVgx6`^X3&#bV!xnMATml3MLTd!(Qh@snIMsp#W=L%{98pki z#0)4m0m{vUf#v=rfSF8a0?%=%`_rX@97@GxKg7y5K8GV|znsK-d%hf!%eAmvg-X0y z3qoZ^lHgvX`xOJIQCECOqs~Qa~ zM+$GG3Ju)G)uAo$f854lY89eAo~lJYUfrn%jMkk>C~`~FexNz7_T#(2sJ%J~#%2+a z!pRsXz%EYIgLWA!^}4JQj2i=aX)NRM!|#5N9AHuo%LTSquw9Zr{P0JIx4)UONu0UrffV-C{_W*3Vx`EHb<^hf{~>qgkmOTYB1U0A)StDU)}^8P{f0d zi`gw_jvpI7_PbDk@puHv+0@Ibf)Db&!ut|u8B17x_g(KD-v8}ydaE{Mr;WQ(-}jCe zwMjKQ)DVol$H2%KW4&Hb#YmSfhYyc~kw9eP6SGj6#G{}D82MiJU@XO86Y*9(uWGSb zV}ZYul?pJj2P{W!wE^5gx2*M~hXB7Ec?lR~VjmPG6LA`T+6azDJsS5a zU8_vqAslIK2aFxR0b>uB=dF6gx$NiJA|W}nfSLv6YM2&QTd_uH0+t7`7&u%k$rAPv z$X%SX7I4m5!GdKo>XsdR28Z$fAI1BB0-xK_L{JXJLvjGWk!}1Y4&pa<7@z5}UpyGe zy`THX0OaEjdc}=Xue*3-TDg!E6HqRU>oG|MU#5NgCRHu&o1hY#RQKbAqr_aZlM)L| z1FBxA#wb){OxCe7SuTa7pT+SwB|O2Fa9CyHgcgki#Dy;up*RO~W3}ahY9y3Q?9V`M zTrpa;Xk4kI%hQY>ved&VyRcw1S*H_2@X?h@FcOASGc4Nx7y&~5FIHL7jmuc0cGnqG zjH7x%13R0XGlZh!TD7%`b{d8)%P`joIG)Vu?ldQ2!py2e0&%!sZ4^7S4Z|OIyIR$# z7}JoRDg= ze|28|@rVCK@6VIx4nW41ar@a$4$$1$T$Has!PsNI>DAB5`ce~Mt;#~DC})oz7~aMr zbxwOXgKjy~4`AFFf$?hqV>(5+hqX4-8eN`ze{2~GUD6!d9Etje{|{Y$TkC838QBI5 z{CueBLqRW2#wq!yADIkK0_5Pohq&DX*P~2*zQ#2EoWaumEGHp4D+wYXdG$`ttTSzA$_Z zY?QzbLu?w(Hhh2k?H>$pd)r&yqF{Uk#d!VZEm>S%m14CaAAHxSt=yZRf3qahIV?2N zuoNz*JT$~f7U=qA-{Qv*Y_ zBL3c1SBAu#3DHjkY=DDsT#GYKccEp7Xlo^3dfEQa3m}VMunmS#=vecTGeP{k1aK~wEYH*U2bun7{U>@faClu8^9Lv zTr^%DIG1S_n1ts5w%{cH48l=a!)Lg^P{C^mN(CaL;x*9b>*(S67w{Wd@&lCky=>rj zvx)Q3RyZhIk&tXf0Z5#e57Lzi5p(1ho0a-=6L0L_f1B9*z*p2(Dj``ahox7*N}e+i z@n+5dBKxLjGtL)_@j4TiBNz!EpJ!U4ff>m~UDC;8g;R^`7?qV$SQfDwoX0A&i<4~= zYNe9Fi8>h*AAuL(%(@Uj8Ioi)f)imD=6gBT zCsy6lRO_?yu3vlm@bQ2C(zoy)#D>#ORLRq&jT6NuKltIX*YV{c6qAXFTs%E;_kR6z zU&Q;B(nKD*RH+(&|2^*?-u|Ued=5&msEx%rl8R%ie)8QP>1~8_rOdj?yh4%6k#WZP zE*1$~DD>D44lt~9`bkzVw;H<@W4-E>abW*^E3b=-)rGoz|0`b~zJ@>i@JHl6XJOvG ztlK~O$j64aedkMGlcyg<+&qK{4Kz<<)g*b^G$qKQ``KzQ#4|OQq7<Jn1ItT%F%8KM|G)a~+w;w`H=@k-1_;W?0HGJ%e)r&lUJyuw@@ZLUS&O&jH|6h=GXof>8i1 zGz8{(xCL$5QYZhR@XJx`^;pWCFB@zrs3Mc-2)F+)BU8xBjtT`wWv{;2BV&KV@(Z`AWh5L;=?2}S1mmcajWt4&>XUBL zX@U^1n~63E!c*!#j)FY-KxUz5{}2+tQNFXR2GO#yort}$aFfQ$t&#g!m&!@VB}!q9P1mM z8b@s#$FWr$zf|B9g_L&3`RKjuaCw-@1HN z3i&Ml_oSRUc1&LS%;$%<|M$Q9M_FH4+6Bf+DK~T-{y+cAf0wuX(hD*VrMR{<(7ML) zZZcm2EEqSel+EyNs>bhs)s!{RZd|&kU|e19D;Tw&v{%LPs1$Qh>1iFR+y?lVk!rG1 z&1XVIe)sAHd35`lJbnARy!O#OdGVLuB7gDHH;2b(9Pw56Z)j&BPBfvt_NjZipSSb1 ze&(Ye*BIlaD_7<4Vf_D}9krAD%pqfaXuWEg-{G&3`*1cGGKH-$XMfU_2|~y z8#q@qVJ)Arp=(uLoK$cIk}qfTxV=w>=XDI12WoD$1-+g3W66jU+YE+el??-`b?y6F z!1+20#aO`WE(4$y+($vKD$=dWw?$a%aR6JdIradrnc!XW{ldU_Z{lD1SDM)S;8)bP z0Y)|pUoIu2nN3I}6qGqg^~re3Ow33ZWh$AMDK-j^Wn{|fi|PucBos~K8tx3X;N!ER|x$ zVMbT7VW>z=i1C?La2AMm%hC;AR&Y8^!EKXpt3FNV8{XeZydemw5>+kIrMgdB(h;D% zKgU*$6r|U2vN6mwwJ}6ftZzHt5SpX-B2V%o@Qo|I5eP@Hv|AfjR_{i-PWdIwcph zzxvZ30P0OFh%&IGWYcjNJ0`_pN%_coKRCQE|Az__o)|}DJTdN)65wW_$e{o}sirwK zCm;=iF&`L0k=sg+wTcFoWvWL2wS>npwpdUD9G(4j!m-RE|ENN-TQ{y%Zo7bEhZ8rJ z+frFulF(p9rhCgW)f~uFeIS$7MVTls$z*9>riu$PRT{{?QXgP!$xN{-u0&F1p{5AN ziAk1v@mzuL5El9&fH4NuSoHX%12`@KjvdxGvXsMuQQ`P9VDuXWsn-L{R>k+wXRJAd zqcOTwO$_kmjc(7rcW##vj@J6P4`D`#b^*E$tPer5$qdzcO}aQ=7qKq~*yVAbB3@g` z8XjB1F-lOf6+hK2R4slpU7R0#9y~W5N1KN|&V?srrHOy#-|WQR2fw1WRZT!KCS?&y zp`J_NSV9-Hj_YO>KeJW}s*jbhwXQb?Az9F+Sz9jl4}#%^on0 z0g&5aCz~-N7;UZM&_!yM9^+l9i|S6D zu0c6g2YPv;+?Ba%OWc45ll>-`AFgI*^@;m-0klQH za2x;I$yyys7w;>fi2D|3c%C94NEjA*8CLMKxq%BH$7{oVS{@o+lZQz}9);!OTzEo8 z-ug85gE2Y+AH|yDnbXDsWnS z-dPFahaU+su_G?$P8^q4-G3mjee{%EJAWSkQ+k)HnIPn4tE`9dS!}E2ygvTq;e&Xc z32kD}IhU-RtT`j8+HJy)MgFF#HsiFMeR=WBDS5+dUIR$omxcM3?kg2J_9`uvGMk@A zVA0`_WnL~ZuFu(qWuw%YtvZ-*$gzW)a{25DxpMZToIiO)E}uUoH?EwMJ2x-M!@Jkz z=?AxTd;j)Td2okAp>N4EPd$)lpLtr|`sTOF```6mdEYzVEiXLxTG?1#$MLI@&g3MS z$x1q(!{RfiQ$pAuHJ3?g{QvO&QD>k#moI3BI%g?zY*Ze<>2k^s5CV)DCf)ElfRg6# zoRfL{l6OF7;aGvyasY@n2oFlV7&7ivb-UX5BkoU?Nr2{k(kupzm#IqkssUrQ5|u{3 zA=$w|JUu8xsKp7KlP0iGpD6caf~v6r1=)gvtOJUbd6}p$;#}1iHx}8m_`PUu!~`?Y z@!gr5(;limz>!8cax_&#=QAc{5K2g&*{WW`k#1G%S{<3`vC0G-x+#s-e~#7g{j3p6 zege|O{yL6gqgtC+I9hWJFVlspN>O8%j{3yomO~*qh|lwMwIR#Fu*N(~c-+u@yG;R! z{bes-hl!Imyd!I3-{V|(0`@a!F#fE+PfhGS$SY=aX*Tf#E@k6T5Mgm)#XbWt&E)W< zD%WMU){yuQbF{s9;5whiXhqIF*uAE+x5qQe#)iI8Q)6O}j7UQ&KDE zq*BakH=RO;tH6TvS~Z+_YpNC#`MgB4If>?r5@MUDNJQK?QCfAV>ThTkjOMZ}_-Cf7 zQIb|A8dYhp+ZZM9XX_vpj!e=a9NAo)4FZ_us$ev2=6Ir3*XbSrIsmh(QWYO(D*Dv@ zXWXrPoEa%))S*$07FslBt!i?Q6T2K&pZ2m%^0A7Q&&SdPmM9Rc)+Nj1TIg!B4xTIS zocO68nT%si!I(5)%%<6!G^#a(+!pg349uB_{Or;id#ph5GlR8VhZ+PVSdT|o&bQ0> zED6Q}ZZmLXgX}U}xn)_87|~8P+-C56DZU=U3IBH-?^zg7WNFUO9nQ~+u5zcxElY5; zq({qhSkg0Pl4}B{)|6#HF_x}`y}C^i_Rh#H)hN;0Ev*VUztg7Mmg({kg|IRN*#g7N0n3kpF(@tKErrs(%ijF)kN4frG<} z6Ioe`B%#iNP*i?xINs3O#t|UdN3|JXY?1Cs*B%h=v4GovQI#VhN0;abj0B*yaY!l{ z{SFxYd%<`HU|faDWnHDIwcKlLPN0Bvz({pz%T8=(AI2Xa=fV>(a_-;scVJ@gL0&Pd z)tLMO#fKkAB$bfaa7bLqB*0e$0P7O0H6@4-AdGFa-ja9&R%=KEU%C+0T{fvo{c?PD2^*f(^k&JCr!!6NImLFS6j|a8#k@jOzfaiv#Rms zz-9L<+=3?F$XZ9^PJJxF#)&N|6dm`fai2cc6u@sA1DO3*g$|Q^!aNR-5gr|Hmm(!_ z4TO_P140vTG!r$0mXn|S438xu4 z)MJ6JYxaHRSY4)!JV71 zTXN_2Z8>}Xf?T+AO|IU&Bj*9eqsLFknX~6)=g<+Uw%UMVLDH3?WMJ7!L9$q^vN6KB z6DQSeOE7-mH{U6lxL49_@up*>I75+jiGIM42{p8l;-gAr)+*sh_o!y20+Ox8eiT3A41e;AgZMu4j36T z)U4HiHyE3;4yD`m6WXIPk~))a#*Ba@6w4k1N87Bxg0aidT`$9iSJ=q8f74%hV(&p- zF)QH*6Dt%XlFLf~keiK0#gk4;uvnBxr7E#XO`_$B#Bn)Qt4p@gkW9TM>1st1JUW>l3`jJwU0e2lwRZF6#?8qM=jF|wvo z!R0{8f@)XS8wZNRM&sv@_q(*+)3)aA4;) zLa~&GGJ>)+qpnP!Q`S)uz8pHO%8c&=OJE!*`hCWAY7?eRqj%G}i0uLiM%LB(aC?C7 ziQm9060wjY)S>F|f25N^ef@k+17!A#jqCqAgq;J&akENsTupMTJ!si|hn<8VQO~PunoYRPOi8+|&4dunnIshLI4#C@*Oz;; zve1^}2e;Ifdi~;AxduSqx^~GZ!-sbP#(VPU9u?zF*e!VgyM61HoH=(MK)fo~0LClV zZpv9)zkKzYoIZC!mNqs3#S#{t0AsZ%$4(s6sT$1WwS7@J&4UdeG6~ZdT*0W*GtB5H z)-V!|EZa~ZCf!CQrcKO{eNauQ1{6%rD|JMrk47j`F|vucUIz>f7()uiwi-bS zV8Y5!j)nP}Bml<1U_*S1JL2iB%Uo+krlA%m0l~@MmP`SRQ&5xBP><8yEr4-FT-C13 zB{Q-QN|9h>Z8k^asbW+pdep7zbz`CBfjZ_O<6u-4Vi{RYd{^1Q2pM_H;BR zzD!1nE^11?T!>X9VvI(Qi8D|a302O0>|?LjQeH@t$hkD0?sDljMp_1 zWEPBeB-MEQaW@khGWio-u1Pmxo$}!m8JqEXFKTmKhcGJs=ouLk0GyHLdsz90|!r&8S8l zp3L`7r&O5Oq@mWRrg@NE{nZ}9Nxbs=T9D$E9Xwhl?!K~8VSam0OLKirytw_ z9B(Te3Cw%9Z^@M_fZ~l?a_i1Lxq17JT)cQu&H;``p$HX>Wq`2^rC2S=$RbP_X3c;9_DVCY-<3ejvW~XOHF~&K!US@rx7Z!nv%rdqJAT9xn zgkwJ#1CWAHcz(dlr^bX8Lb2r~9Bp!qRgfcCn&N-c0AOgt$5A;lGu0?XcENdBFnWzr zd^s>O#%RFER(1{y32o={&;b3q$EZdo=oE3RihtCsU_F)G!-XecKXcU7&-!CP@_$b3 zJAt#=&P>%b6JC#892u`_iqaW2v0j zp1L>*D{krP3>sIe-EU)&!vq~p)^O?=$KhyzX!@U;f_0-l?N}?iVl4#eKBU=hF5|cJ zG2`yjQ9_SVi#E<^l$CKEa!WAsvZ;3rs#3I2v8L`%Zs`(bjFBgFC(cGA6bZ;`l~XLz zs+#DsWZaT4%%oW+!WgKD-D&wrz=EC&0B#9Ir}ZD-cXgqfwtkE$a(@8tYYguxW0H(b za*SCVpry*CrIUQ^Gy}#IPTmIaY;F+MPC5!a2ZRd9F*uI9SEJ5*WL?e7TurCh#GH-8 zi#o)&MQd_=6l3HSz%8d>v%c0E`Id}Z9T)l8c?p(hr_ix{jr|#X6XCK~&V!SWUJOCW;-<3yz;{BUfgD>-xM`FH6Rs0uSW0{aI!Aa z7+++=@Te+8jWKe%2K%M5mJwi7#Yixg!_t9KHPQvk*kg&0@7JY)|D(KlND7V*BrACQ0<%?p0RYPHm=}O#Hm6a3yTIpwQ32@VRF1u19Nj)rjZ};Z zLeD7q=4XL%DHxKSR8~$`8nPKn>b%IILd5TBS7MEqi9Tk3g<$kKS*m_ha#F{0?BILx zI2T@FBj5f_i8uD|#>C!(y&|@-z6!ON5q}}8>CKaohy<`rGDu%8N)kUPs>W26u2gIZ z!zM1{1d+h?IDnZ17?ahqMDrO5B%|U19Q~;Tlq7zPjXLh%1SA2*WKx3pJnmnYT&E-1 zPFwP=hU8$`7Stt-+cb_FO2uTxV^rO^O0;o98#~+uMopj@sm77(bu`nF#r!swI0U29 zI?g8WjJsS3A)EZ7^>kk2=2SR3kW_`}cR)!n5^}t+&y1x~I68HR#(io^GH4n<^ieSx z*b#!7eM!aYKye64kEydXwU#CZX;q?CjfrH$Y*~(g%dB-I1jbd7oy0+i5sXw^gv>Y~ zsld38$y96(z?!`wAX&rb)bTOyMrFiNS9vHV_BQ44WG4IYIoP@_0ssf`9x%(8uUnPB zoBuOG&oN}|u;eI3b)QZtI9ak2kA)=_3rU*gCrqrNio@$RuajE>(Sc){F;coy2}VLa zqHbJ`qjHfz09u#sSh9_6h+xV$Os1;6Z;E52iU1kD_be^akyNdk%y;T)3dd?*)gq6< zChk@_QZ-g#RMS+iRM&)JQ{Afuj#P?v{$wd1(}wSzdQmo(=H=-2rkp)~L~dNZB)6_z zk$bmp%2W660gex#8VN^0^8Rgk=I%9laPzXm0ivA8c<1JIId*6p3bcpk#ljW} zBZY;pjr*4X#}bopvL^W^8Kb)!--8$wB28y28aO6G95cmzUI5W2*#w({1Cs2BlV(P$ z&nQMM%V4XwphB(<*tNN3cbjV5s7A&ZHAB@&!l5z*0I4$T*b<6HF&ZUVWmm2~79lIk zQd>J9)vaTa9IT74GmzQtlFSV@Wwx^>-u9xz7gi*-ye0nbn#|S~WUkZ_cPb|?s66d} zMKH28+&CELIGi0e>(c9C7yeH-3*{ryk7Z;9k6!|O`hl>j#tx3vVV_h2hvqZN&zgas zRfGnNy8!Bdap+c6*g5e;59E zm7Nrw>6OJUR5|!Nt)ypxkd;a17gozyf$XHYUxLouWt;B zY*gTktx~n<7~QJ;pO~P-2`}8z=!#|H4$Z=o`!$(|aOC?$05f3;zmI%@3xS*tDQ0u= zUWZ+6nyMV>RweYbn^1->T*eXUE~VQvt*&W1TarC%2}QbB=}y)6mF{Ow6=4Q1?!%E( z{dPsxm%4Ij|EioidPpvuJ|QdJmURS- zJGDfWNjO4jR%6nKV(hN0NOfgfa*Nv%>#m3&AoM^rdKLh}&bq`pOOoj=NqT-se2u=$ zR_0~4)D};=AYOn(TU#m^@f~#IcjsoDk)3ex`*XnPQPqgwE8v*%_@x?%NNT#^WZ zS+BvWWUW;-KG|hqkU{D&Zg)S!*UJAGP&QDdDv1B zE&6xhsN<=8&J+&4PUU8s0T7JFeM%VcGH;`qHgPP;a9pxhIZ+`he9iNiUa!WTXooDT zdzipir8{yd+l2y^qJfVCMm2yi0ZSS{nlg@2at?>-s_RvirEz^K9OwdN)A4M~8FU=i zc5<`=OE?N91Ct7|Tw)B3wQxzz+9VKD1Y(-Qdd)NpK8L;+LC)5syOb^b%>PLM@_(mI zIZ0D)FQ=M#w9^k?o9X7mI3iBY%#w7P5fFYmzDuK3qS&o8LK8i zhuNs61csMwpITLt1-4`}ZfKUy@Hwd(8#o>(a;y&8va_))Cl4QxD`!sueplt`yLSM@ zd)VHUN4IYQiUi{gK$C_4P?h&?Bh(Fxk;bkgDQ|rihB;BaSn6=ujC8R%SNo#pU@=%A#{+7ghYZ9GblVE>C{J5T&-!B<} zG1u-(ve^?4fH+g?$aJwKE`ZS=4C8k-Ba`fziY>hqy2xeT!Vrv9j@UP6da1?$$E+K` z2{9QbDJxKBOQD!7c!IEi^kF@KlJ$-z_DJ`t<6`x_JQ#-wI!?waOF4L*&>{e-G;Kow z(+pq)#%{o^8LG@;B^bBj0AsO=Z4yxRsR|_=2|5crHXY#c*-DN^^~wVODt>1bnvdp^ zv;DO39?pXH+AAn}X7ezYG|QEdsHoTPntUt7VdM8UQ0! zxc-n|Twc0D0S}&70Ytl<8G_NM$MI4P>n7Dk<3rc!Zna1dDij?s+A&u4I5ew5c_OE( zBN%O`9dq5dHBB-Jf#)RMXr}21j5ZFbNi?eTj8as$=@5tphS~t#Nj|Y)w8qzLl8`*Q zcRtdv#W9&>5X_&}ThzsXC5{z`47N8K> za66k#XyztiXpe6*Zgosnh;^NF>KdNm;$@np7wolb)FWqq@-yWki0)PbUbATla=JQ0 zEZ(1$NO%q>Z8zXWg-5rq&vBVDK4)M=BM2YAPPZ^m_|dRiw~v>n*!s8JjJzele+A3&h7?pUr3;2P0#RtOaFF=se)K zKIqDk?RB|y`ncR-63$J6kU+eN%LF1_sn_KGjcfAo_6H zY7wdDgPM55cq6;plyW`?f(DWWE$lb@tb)`GRi_aEx09 zU91+24je5QZH6kLWjg0L`yDu{S{wu8z)vtH0mh1KL&Wq0%$POD9S0+e`KcHcu6$iS z#vB1m{2r?cMFYl@^G_6vK!vJFfV9Y8MV*p~j zT##g?Fa#srqQP=i0;LMTNLMO=$XFwcU}Ta0OfV=joTQOT>OKWyd@mUDFvb`&P>bni zTe3_PXtpGU6>TUH6A!)&JaNuBP~>)IZpwg>``kti8UT*e;^Rm>?m@nBcJ1(W!T&D>X}Z zqyt8}QK@cte{DdW8o5k)Oe$yA8G5{YZ)SAM_rSP_xd1T#7geJzNAYt3!Je?T){`zh zx=xb>Bg-e|_CPVsxqzx1O)I;{K}cmrAklc8Cwl^xV6;HA8Mu55VPqQ`7$s+v-4L{@ z{-_4IP%uiG?}aJVFm6!7m(Mq@5XZr2k8k&LYr#k}?ASa}ByY$)?AzX00vG|q99zI) zA%ov$KF6_HP>^{nT3NpHuK;5VVB|Il)tE^ViatQmtB}kPjGBnUj8sA`EHx(9P!$r2 zj*S$e<4Oex*$KzES4XZ@dwUgNWD|rO7SAc1yi?0NQrbQxxs`2+_7)}3T>u={pd`1Y z&|Aj2V_u>)sKo-uQT1dW067CNdLuEJoSoA`|EZ}dE!pr8j&!9uZq&IM*sOshlW;=V z#$Y**AAo@>^oOJ$jLJ#`$}t$1zApmB7}8otPQ2*)IQfFc_#<1sxrU~o{26f6Sfk#~ zm>^(Aa48&3oYKyD+yll~Lcw?-mC;dDtgB>Pk)SIx>(l`w>nIhj4jB3T1TbB#G~REc z-rB>3SJ23{|InXzV(&r!(=8ed%WNnh?sNiROv*HX=8X}Id5M-wfFR?GP>U9fP=68Z zClo`KD!z!!JT+iUXl-Lz>muEeh~rL;sXH}>{RE>YO&2Ze9E~eA2g?AAsb*6W4FC~v z%m9om5eX*Z3PvhMYpN36jJcWXkH-_Oja;S#q=nsB#~TNPyllman9F?7e>bO6_xIEvG zt>t;B#x=Qc@~Emtx=#r|Rf-BqV~?O7pSn$GUXi<3FUpYvYtn0#4aBuaYFb;tn%xSuwOFkM>Y8-)R~u1cV3dq z>rz|Wk;=jmY6Adl!g_(IEJl(t037FiP>!&9fODSXpnMz+<#n2UyRc=#4B<#n z8UWgCRO?o?U{tUZk*uU>9|aD+*2$r!AxF4 zML@7*;YcVJp&Uy9TTwz~x>2hVBM==|Dr1aHwn^YIzC=Q%@I~>&A{uvOhU)AtFxI8e ztYMW`gHo&mt_=lal5pf@D#lbod?7->xKa%WXVksw_L+nno1wb9!;NvTTIFYzBSE(- z;YMAj#w-+VjFG0Qkzk~f!(&ZDYm+QOm1jx}jB7^wc}`F1&|}6hSc>5Hv*yv%DC$HA zudP1}jNqVkk<4Npl`*I}u+`c=Rj+2avbL$SU{sf+QK*b#YIAYTMx`-BmF8rpIz3cv z_Nq~5MrDrrrZS6j1j%t%DwA+nm&p5=>`gv~P09(z7>*Uz*I{F?1U4bagc_@+HPaT` zQMVx0HJTyL%n;SOO6_3d*Em;NOD{~Osal3vpH?YGoWl4KyvCtOvr29}ne|QHvIcRy__cYkN6BGE4QyDK7@NsiYgP3(r%)qNUf7%+iL$7Pp}g_XCp45^DD( z((6lRWkVWk+fp5@NDc}z+?)px`!ds9mYLeTxJq^Lr3*6U4G3qDYGvJi!8jHG1{h|2<$Ba?Cn#(A9Y%y=kH z!fJr$Ij_+#8_|RuE0pD6nzfc8(MIPu-;}&; z9!@w?J(^m@VNK;27_ALrPZWy(=KiQZ>+gLNdk_AfZq;f-+&FQ%Q&E7?FCHe~U?t+m zYRiu|pRq)$M`oQeQ#Dq~Lje+)Wr-7n%t)=VoWocW&}5u(3Llm$!tB(HM2bb3jTu*J z6vrbN^H7@Erc?ewI5O!5$}wGMYq*lcvBC}E1WXVr5FI!&E;SCu$ALJ?T(y8S`)qjz zYZeI_8%rFACm&<8Sk?7P#W_RZ88v8&(d}5PIsAZTIqPwXNi&2c`+YLgl%OLNP3eZl z)I6s4kPsVn&0%?mPgSP6WF06DRihI>wLrHWd6I!FFli@lz{q~B@%aBo-J9+4 zG%!|zRoN>xp9o-NJ*mM_!Pp=aq2lX=SQ^JhM%}BNx!Bj3qCwHj5^bm&bqWVZRE66d zJw-5DN1eR%TD*vXYOSZRZ#n4{R9N}%5^zqDF@(qlB>!g!I;Ua9V#4|3F=@pm1l4?<#@aH(Oj!* z*QU8agF7{tgV9{61Y=EJ^+xgx0_FfQ4P2TT>^?qPA5O8`ZM>aHNNJ_ zAArISj@fPwMHUQm9ihnrcEW&eMF%6BfUm$Rw@C>(u!zYQ9;>c=|EN8dpvnE&e&?PydyLu zZxEsYY>i!QSPsJJAXLF?zSHdH2xEmqC)WJj{xJRm2ur4zPyuXSI0UAY(8nhx-w@= zyQyW-GH$Hjt(Nt$e8pn1WdhNS6GqsRHYiAfktH21y0!_$8Z&*N?pVUnGS%4QSg8&G z*f9WlZ1ILGHGq;Tk!q1(WXn0u>1*?@e0*PqP>)Th$o%Y3yWZTJ9LvUFA+i2c(wqcTZOA4sUHxZno1_*K7+A zYy*s~1=JywqPbFcaDOgccEVZAw6|lW377`gA>DAE=1&F5cq5Z=?$#+<;>~S~cDY%* zP6@+xJ*25pYYM>Ev^qs^+2*}dS*K{tujw)+3=@g)qtYc6B;Bm6O|+Ps)#q6Qa4JTh z)ZwmFZkKQ=6j|O7jP2%%9KV$fB^uV?fKYTWTBB_nw9M`J{K!@FavggG;I!)+Q=+vy zbpSGyS7`DKPmBdC_-ENdfTP~mb&ORKV%B2LUh zg~$SW>oUW7LLFB|m!{VsQlZj?>ejOCQ-hcRi$Js%Yi0!FN`(P91mVq&K33L2H|6TK zZnLH!V{N3G&WxnHbgdA_cnnPkEd!22KBmip{ECg#(gJwAM zFJILD({F!*(Utl$VEIK}KY0MPIhF-Jul;%7rlG)g=WKG$I!Y#A@nVOyot#jT4vI0Q zMo20c9gd7Ua_R;y44O5@fZ3iesc@ufbTIbXyq#WUpE?jVv1VwAH=2OcFUho5(rngo zuc+8ZvMdlxUIdHPJMyQh*J%_KLTOMU-Xh5%x3v6KcZzq2Qs zqdiG3P9;9sm-t{V>A{X98*SOd@03~J+gt3vi{E!57vLC;Ga4AF8q)w{6~OBNjJ-@j z%Qt$kai%ECd{s`%O}VP~4J?Lnc=3o(R5*rA)tnDnHbAl~&g6pW1-W0QC;+r`Z|xnm}k=?>sHS9dC5*<=X_UM~kl zk|G!gz*}InnnQD|uEBWM)E&v%zz|#X_3N?^yY2Byx@)Oay;rKjF>8r4-rLkvk%5s= zG&3l&n3&^|EJ=qk$;}lQqy1GCxVlXPqy9grNE?uxS1>Z^#v2`Y0|HZwwtaO|h8U)1 zd}`T<71vWmHkwq0tT$}vl3?UIi$CUZo7t;WniikreFLFE(Gq$XpR`yer+XNHIX27Q zlfN%j*Wt6$SZXmqF^s^nZadc6P5Yc`mZ`Z(O?@#T#=6&->(msOD#I}+Rk*FeNB}ty zJ(g&(#Yo#YZ3tjZ0UV4v?Se}MV%2~+WHWSvu%`DXoGq!3E9odL0+Q>dswnNT>{@ff z^f3*cOyY24JdsdT6;3$fy>&Ubnd`A6ED0#WifVXo(UqgUf$Zz@)a+iu5n!w&0Y_#HuT^6gU~IS2 zP=Gh#NFdI%c{ux|1~3lFYRph&YdI>$Y7@sUE*k3Np0uF`8^_mDJbEm-{VOQNeM$Dm zP>oY*>>bKrzEm()r-a~Cwuf^mEID0cUk9r*&X@#1HleES@i)2YV9W-y7^5fPm^;-n zREtoE%`Bh@Ft$@vj8MNJ*0^7&%2}-~59%$z5unTwjyb>)3Nal93uo8$h?*UG3ycoO z6&Mv@1mn5^fPyhcv+ULVTvlI?P<#P9EEW`iqa4AA&m50oj8WaF*ghMGtBV%TALIAv zeNtJ<(S!25&4ce`$RhuVf{|Tu%z`Tww@bY)AX|{loW&W7-Bti&Q%gVyMOsyXIFs^pDrFq#HNue% z1Jtd`kyK+TKxwA4S#@2el1y$P7zxGD5hi0w$`fwfb?WL-vrA)E&>w9Zw~j}y;YctN zifJ4~EG6)U*9JnXLG&^Va~Tqhsa33zF4WD*yx+eNb3(=Azant{a*&>r~@@3N9vYjq+;Z{>4@_xo2%y#n5r)Mzwlfpz4$(|wVtX%T9;N?L6N4g#6EF;<6_p913>ZQ z019u`lD(Y;pfi=M)pyKa{Ra7|5pAT_y6-Bevjqvp%{ObU*5lh zYCMyRlq=b`oi#;(kCkTR2mEZ)k`tjftHB?lvnS5-i(4#YaCZ#Oeq)_df&i!R<39x@fY2`92J=yL>OiOaKI5u z-uA>B!qLW085G$Hj{m!EckXcDJKEcgZ~T|uxcegC+>VyVlC4y<_AptYE43}feh&cb z2z#lPSnLm=l>oi`faMy1AHg`8C=jh>+*q0b920OVPS~ejjK&dFEhe^BWgt|HREzoIS}CqTrfSSfF!(>45W!>{W~UO4EF!jK94lz2=|l`} zlh4ardocoKbh>(B*YbvRcYyxkhCsC6R5ad z0PJvoB*zDIgVv$2IJT*x%JKSaAs=5plHY%MFMs*9q0OzN_P`dsdGb?EdC$75-XmWsBfDq6b&F+-Tm)j7$8eRhLl zq+8XDHH|5Cqc#|0tg=4Tz)01|j8a0e*<>?-r1Ut@m|$dwo6rhw-43oO-6kMfOPCuK zP^{IUOdB|Ua3PY#ahS&WA+dKVvHc6VH#?RsDnOir3M>^{?n@U?td3@qY7b?r*_Y&K zSF*DciH{Csv%f3x@vh`KaJ^cS%>*x8*-V`7Qv419$J7llCRSkNG81S2RKOpwYrxnl zt`Ai>WEltJjZls!l{z5PlZVZ&oE0l_%<>JW#=W$~6aP^#dh*Rb0>=BLvOI2fG|qTb zDk<~^I2W}Qj9J{yVtW}?h3xIBJv@ zyC;%`JWmwMlBzZ&*Xrtoi~@j|2N(;Zo)pJ87y-cy4$3S?RgE~WkzizJ87 zFmigfW~SmwtqjmA7+Wm(AK(g)r5ZcZp3hVn(rro@ws$zSV~B%&D4i)YQ`?fmb_hl- zY0!iYDkTG>LD1Zy4#jA^F{&1$ZdCq%oz;rxN5Gh&S|qGWIaNPCMMITdP>t>awb+`) z8!e;MOw}zR&IFnadw-gm@|JLPdwRKs#V-SVgFBS3r=4>M<`84_k`n@vu2pYQx7tT_ zy?W^eXEL%Sn<++}{6W{Mx;|Mi$ha2Uxizc-K!dSGCh8av2}`qz8e?Eq3~r?#+_uL= z`T83Fg%a0UlsUF_V;v>8WywC448$0k4H52gsR}OwsE}O4C86lHN@5vU!9HVk(PW$3 zS*UC>ZlkoUhblp+DluaEdOcH#7Ed%F`fZIJ1{Z5o9lAm^SF5>Rxo$q?0B0&Ng3zF7 zfb3|}3r9+6$wZHnIGBYCU=!lleiHy7Bnid=)oB=FJOvQvQ*38gmD#W&bM_vc*5qi> zmB(j$^6AAR`Q3-t^2aZ4p$U>bl6EijfmKnpJBaP^~0zY+;EDm^v<$n%K9}d@f05o6Z2oonuM%r&5Fh ztWS5sXuGB4J3~n{dJ=Dqpcnze;ht;__5sm-iBI<>x3iRFqa|CofTb6QQ#QU1#rFM9xExf~L22=1(Om@tI%CD+Xv+strZGO`O>gb`E(`E}kizO(=nkL^6jQM_B;aG%PBpCCfk)-=Wz>x+1QynekiqTagjd8|g zr7SUgLCFFXMysjHv9JQ;MB&IxRLw@Ef}Ap2bqpwupcaSH8uz6NrJ2R^()fZ290#Mj zQrDTO4n?nNjK&)YM=#=EyHfpej4i5Sq$`z5jt#-t2)tk}&uGn|15x1^0pu#-Bx?yL zUeBj$&f|&xobVU}>v~(>JJm}&v|f^NP@1}k?Y&YhTA@GZLz>ET*Q>iVS8iA;#-Kd; zID(U}#s9N7pGi4{R=r`+BNPcri$fY52}Ld)j8uSZMQ0@$R=6LX24W2ds4(e{H7Gh5 zSrVekj?K!oz@BEciP5Z6mSSioYG++K!S-yf1YI3^X@w@d^sEjsS~_9z%Jpl|ycTlh zvW=+4RlJa@FrpGw8IDXvQVm7{$R)u@Ee2)o7 zs+L(lTEt_@3dY4wOLk}6K9wm4_?G4Ta40V>59Q0thXCUX`P1ju@-JWBz~0Kg{_;uw z{nwvhKg*wg`Y7+7oXgq4AT;qV0ZO>&!0Qh2oeny7(LuGyk{Dh{SnIsC8PlsdFwA;Rs;oaL&KYf$wDG*LV5LZQOmaZ*IGg*6~7KlGUn?o}w$2 zU@Q)M+Ay3&{dA#b@MUBN69r?9GZ!_kcr(^W1(~i@WgAyFi9Alo^}3{@V1z=XX=8xU z9AM=_<-A8I$0!(63Py9K>dBa33>l<1!RRXRX2WnQMK`X$`8i?Ry%v&w& z$G)pOSHZ|;0E}A(;8KZFH7XRXkllKnT3nIFWEf7jCmea7Cu_#NJbrjPj_9Qq(ON{$ zOyxSwKy@fa;+Rn*7}Y(haJ-d76D%4(w4@q?q%ReU69c0IllSKYeC~E8@twn%$Sh~R`1f`W~oIy1%b{cq%DwJPcu1?4D>iSTAe*I8>|KYj(;Uf&o zKYe~B|LN!Vfa6E`%TFKVUw`vSetP{#o?Pt7(Jo%M#{?I~NG(pvdQ7^i`590})8(vS z1O!W*S(#7WaHUp4jL|G1)m3xxR0NDvjB7A5`6k*9ZdK?X3jYVJdt|*LvrqxWS_4b& z3&7X~7)R5V^p|^5+r2N@9oY0(3WFV~;Nra6>r1KA)0*jRPSD5}Wvf_|d!?pq)OvES zJq8#TvN<^fRF5UwpGX|QA{b+vTYw%x_&30)W_68hA(u-grI^A+L7H$(Lz!`QBePU3 z8HYoSFRE>IsWMabC|6Xa_V>YP8L0n%z<5$9$|GD1u*myD#`n?fm3IGfA0zQ|Pv(H0Vj8#~5Qz z%Qea)s6;5mYIL09FJ4T2F@I@%RKY0#i6)k`ZJaO%%%AFk{O$7;2#?p8N;v7xKA)w1~G zI$PDc=n#zDHZxLHrMjCqs9)O;#wF=?T{j${;BSh*9fZ85_Lj?4PB{( z;FPMcW9kw2d3ymcE=FdAEPurE}b4h5sOh)ZhnO?_3*NHEfkYA#il zY>enS^_XISqd}4VRWmxzvD3;c5G#Olxt7K4tbuXTlZHVB^ZwZMvk0%h4b-Y8ON{2KQq$I;`adSWSBvl0UXoP!}f=|O&dMM8I2zfPVb!m zzmt($-^GpUfB&{|_eH;{RZA6s5z4Gyl|sLxN->Wm0jXeQ!VRuaa@_&ekEJv;pfQ<- z8LKn`(i9}y!qwE38q3g4TMl4sDj1nqV_@9TM&#uYr*<&zIFt5#$K0%J9?|n&04@&S%t?KJwb=iQa5PInx1RDq?d~@ZW!t`6>jWuqX{@+LPuyPXRpOf zQ>x91!qk&|_!;?rsIegc)gl{~Yt!;uVC-8b8(sEU%)fT2GFy@m)V`@WaT^@1?1HXX zi&I+d-woBM1^2E9x&5lSXjc}%7!ql2szZyzc|wiHA>D22>sQJ!fRTMo)ik-qAh|m+ zTL6l)QAhihGVVC>DV=z8KHN=YiMl2lw%SZP2=O^%elgf`V~>*_Hdp19@;dR4~2{ zVEogk=khOKUO*+jg-U#l<$L*eD8@g3c`N_<*DvxHs>Zi3G$WO2v4rD*$}t}WV?wP;mufjBRe~`RXEfEwCBc}%=f~Pb#y86fM}l#n zwT@w)BYUl~lm_2J8Q*aZz%8-C1NO6r&$c$5NseG#oB?p>lAkZ7fD7pCuq$!)c*gM^ z;{|v=uOsv7A)-V!^5ioj7xOIU) zA4e!U7#Xk3$T1YMwuQqv_zc4G# z=fBd%-534lwzGRE$!0^cfMFhR%MF=;(+3>;noz^yea0S(Bb&uon^==^17a9tJfUhF zNVY*RW+cXh6u^y1IE*zm)s;#xvX$Ia6L?fH!dg&}9YB%LWD|k1g0ZYqxLG`(!WCSW zy-4X+4QB1x7~irhJIziF?cCVw)XOy1@kIxtKaUD@9or)idD|i72{#UwXqkd1ytrcX z3{!<)aIX@8zHQ%@yEFav3WfoQt|(nSa!FWeU8U}a)hMcIT+s^psbG2An}qZK+#grH z3U)l+_leu)KJYPAnpBU38~4*M25iuBNaP7IOafWUKN@wM469P1as^OJMRri({|G~C zO5SO)2k07z3a$V?DwZ)${KElZWl&&zjqCM)RCa)d_f2Id9CeFovA&g0X!jXUl=0$x zEuS!;ajD5PZ4NrVX?z~H?-{24cu%akZB~Nei8ZDQ+0S&T)|I`Tp6mgRx`gesNPjVq z3mG56OR6!7!F_ov;AtiF^r zt2H*5=eREbu|(zQB^w%JG%Mx-t~|$qr4*t%=d#M0R8Pb)_2_kteY}@(NVFM;(hTj1 z%34QlL~iw_$a_c zWZ{28JK|^`RVL#AI*p7ay^Jz8g@Yv=d-;l-Roimi8Ym!HjDN@`;~4{^C)><&2~DzL z2C6sozHRIFZQ-#B%d{NeysFSrM!*v1-zGrV!SA`B zwdMgYAx3VW_rIf&Ti^AMa`gY+xckE2)J~5sB*}OnfRq6cvs8^kHWcqE7@1VV!Nny) zi>}TIyWfO%a8t$$eQ5DS^6eH5)||RIs1|8utRwJNuGCv#R97nh$NsBqR*r){T`Eb! z!H9!08k zsH@x6Yu>CqLx>SsLd=6#V1sD$&EjiiisA7Ec=vaP!buEAR_yRzDt#L+zkxKE;Khd4~5n%i% zfBN~0{Py!FdGq3_9PCc?vtSR}HXzt!Z(5EZ3pJ){tW~Y#6pTeeP+h7HM$1w)Fj`%s zsY(|46N+Xmi}9Ev6LC6h5y$sI0~8ro?6KCdWp$6NFJ()*3gB9*;yA;FT?WTk9LHb` z0N8GiB{n{mt=Wad=Qux&7n1Dubhvt&7tT1R#BtHRoy$WJRwdK!Ns95r(XPY+!_@p( za(fr5I+OJ-E{>B5#_cVFF|A;{4a1ve%25mdx8pW_BZ&)xR9ay~WyTCu#u}#?j;Jch zVX-FXwT?V$59LXl-Epcq9?HSUR&NC3EXQR8jF~kQeFBC;F&mdD9?$gz<38T&8MaBq zcnUBM0p&UXSi%1qS*k>{CT=%zzHH+>*~?NjCgs)s4{HNQUVT?Ls{j3u8+Tv)n_HQyDM%x6}T`+osZ?;SGLBwu< z4U9L`TtvOOs&ZiY|J^m}B^a*$G(jf-giCE5hsS!yo+uPoiZKF42eNO=-M9`T&p6fC zp2qoH#o0VVpP=DWG_;PeYNkm!Au-3F&uwcbAtoTj*({yowfLUxvyJYjL(|`*CfHQi zGnIg>;-pwsFmhjNRZ}4?%|fM8qoSz=aaxnlhLCwAv_9?YG%b$jak3W5qpFe((XOFI-x~)!;lS?>r zQOh#;T@j8oHWD{mff3;Q8W=tPs4+-|V@h4H21RSAKqy*mV=8pO$*4-yn4%6hwiqOf z`RjFhD>zge$0hc$fMX|(<9!Rii+lLpZ??vAZ+I;CCKs|bJ(u`!feZJcq&rGPn9dnNvSTE^^QDlvBr^2$18G>%LO;8 z^+8oYW(|xSJGC-hA5n`DFmgi1KF+K6i)DE^7|Z=?Q^o*e1KX`;nHWS6a=+4=B-CI$ z6u;#zw!5s9?ws$xqmfrX{!N`_u4n``+zoi(XYSC5NZRO~X^Rfh2lA0wOQG^Z- zbEleOR7DzK>L69{h1>2*T`4t<83v^m+_#=>>TomlNY!d?RG+oz1Alc4Rme1Tqq|fa z0MKm;<97YE^#XvO4KsPS?r9r4g(YL3VgFbA9QL!!cx#C#Q>qPI_;8F=IMEsySy#xK zMZ(d_Dm=c&?9(+64TdWl5~6gMS^+*G<|txq)9r`9Q!vT6!PPB?Ke z@)-JxVstoi=~=7lQe{6?b*CB_TMY*zd#EO@u95LZ0I>%Ub~!l%_Z#&Dj!CE-D9j4M zh-0OMV~RVv33^t689f zOlTLEDaamF<59jWr-iDVmum6|aJ&K>Ps?SU+or0DD>}$%{TN zx&TJHaho_7*75%q&X1j7REu>2GJx^T!4Iolq>)!YB93m; z5!=7@rAVWKQ>AF@E2L#QT%pL4 z52{85qe9V&{h5`@xMh8S*RIzkje{YDFFMJo76FXW5l~Sua#kV>d9A45rczi|s?A(9 zi`|GZIsk8&gEE+Bl)9RXLebr^QMI><6Vg?gU3b4(sY|+B!{d103-w*mc??q(V^|-x zV#yL+2u0p5F+LRBsR~Pgia@pOQ-kD6IaVyARl%HIyKc2klnPQmpP0U1kDIz`og-1YLPukZ^jDO@kCdQ z9z&#}bYR+JLi{km(9B|lURL2yWW4Y;_`EjJO%rOESQE^%P(8LtwMY;i?T*w=_9lSh zOs>xkUp~B-H?N*S5e_wxh(IyLSWx#O-KTp@xVb-r?aJBN zLeB2*$i?Xt+nWQ7$MW*}R9?g0KR$tCyp-R)e*(ow*Xk?z6O`jmFR$gxo0kCNJ9+W! z2|m|0U`6Oz?65@0@%UgL+e(0AowGLi9cR}uMvpT_09n9EI**feF~>xln_#pqLk7lL z74WOZrCCcz2N0xMq!E%-lJ!PLYRo)tm89CLNC_8ENgQjN0LNxNr=#k&+Bdv%-JIDziG(gJ676!vz`y2;HU4TuOVTa=J!e zRbxtO+L!>Kq#L(0xO2Y$PDW1s5I3s-J>9sw6W`qS&#olTn4-E$S;N@ZSfj=p0Y~ZE86VUbAz)^$-Nrh6rS&tVw6g~6R<97~5SB3sqcVD_h(8FRn63qsr7(ZkCFC{oeR~9rPaKRu2H&4yR2Qbgd2rq$jIz=3TkZJ?QYa)qKvygy>voji#J@Rkz)PeI`z2Y?U>@t z_@Tqn+@%gmTN(%nMfMrh<&G&ubD<6tjGAb(H`W2em#2I3E<8|EE_M^4oW;X?!BTqXCdqk00>APf(_x-oKZ(P^s5f=Q{hb%s8P!k4ZK>UKkhV zplDN#su&|+q&i&36-_nrKH*3!=HtPg>WMd&e4|EX2*ucLq!fnzW+>5MoUzNAMZ69a zV-C+vz%+|E~JE0u%#D*%v1RgIg8 zq-?>qaWNh%mI23xYyw300E2tOg=~%YCElItY{rdy_q1dq9%DJiUk9VYFh(f41vqLl z4t~>gr>2+@ii?_z^-IrRvg+7+?$^a&hExNh;)YYP@M@;~-?M9*Kud9FzN|cbLid?;pyLZ#UZJe?; zZ=P^O7@G^1qs&kyD4)qQydFus2Q_4ekS{Pf|Y{N^*j`0<@Qd32#O7_~>NHXz`Ig$@6010Lfs zPNvrvK2rPTEtYQ|t9$j+>lXmy z2YK`QwLH9jAYFiwO0lTM3nYst(rgSEJpnhtNC*~lW`v{184Zr{8(^#jFj6sk7aS_X z4vYymgd$^&13{OSLKvJ5ytU%aU7emQb9Ihu?hg#7|Ld6S2lZxven&_?Q$3J zE8_Q`m1M4{5ZuJc{~lna!-$hfiDkKss=8D++I`s=%q2F4YV6O{{Yo%y!nR{^1>xTX z;|h*YrT}9Ms&SirRpX2`vX^R3RU_T0Q-FDy&B-BPb(||G6pylHfUKg0|JU`lTmfcu zg&xqY3Ux;aTFs(?QI%wfMgBD~vbzok6|>XMGM|?o&WoL#4JjV0;j<1|ss!Wt&fcB# z{C6~R>WBVOp8n4pcX#BQ+v4O*N^B%PU~9OpWP2SL^kg&!G zkmGaeHHqU3Arv<@V;US!m8$?ICv`wsj@VNb+rl9|b4Z2fp zHlt6L&{0%`Tqw~{qdFuE6^LxBX06o}ngOP6rZCrP&td4GTV<;T!0GJ(I0xTKNrwAT zbr^-At3%#isleb)wQ>(H2Ql|2V}x{*@;=w=Ttm8B{e;H`2$F`?&zyQ8g zM;upNa(CnADh~f;0fr6l3CsVzg%MEW-$ciT=^?EJ&w=W3YnXREgzW zoCBMO6(tGV#&Nodi?DkIsKII*fE&Z6xD7~VD}Z7S$7NPh1Rx)yU}T&zra29pX(-M@ z1&;?9J9y4$Dch4nN%ZFuuQc_Xq+s0I)>4fX9JO@g78rwCG`A|C7^5X%^h_lrhsRZt zS!qEv_L+c#*IodOsu&5ze0gOju(M(faO^11P77r%*tgoo2o%*kIft=DH%r#>TE-_h zmr^k%(4!#W@M7Wa5luJ^q zSEbylNu`ae*Jf1;jS3)I(VC?^UXP6dvRLMt4Q$V>+<@Wrb49vS6WSV1Gg2cB!@p(( zA`?hFUgi*VmAASbRfj0aJh)TMWrI-dubgx1<}*6knO!Kil zT*2%6ltU$PmBXS+o91HdtM`Y$H;mCr0 zSBaL13NTVJ&KX~%8+Av{4tJsI4(0KKGkN~#T3$bYDjxu-&+p%9mgr9(-z&5pUf!3B z`}@Kks=R2>wsp85XaO1xsH?%CELW#)LLLXmJ>fw91g zF#wRNkqI~9asEG5lM2S9RM-ip!ZHnlkxDVA?cPSPiME2n`{`Qg1}}M=gB?c%mzPL#+(s278 z0JV{?%0{Il_c}WgpB_qlv@eM+6l0~0^HCCDWNSFa895cl;CMIjW^LO9;#ORjdK+-u z#{D#w#ROfJOv1^_h*LM{PR#^377B6%b!SFER^_6?)^S5Xtt-b+j@naoRp-c#H?+9S zLrDh*7klwPGgfzT4mmCYjGeBIykdz+JIV5lthT9}u!k$a$Qg`1Joak7f9L%E9c{4j zAM{5W|Gyh|cj%kjXfTtlI1VCQDRCLY0T4^zK*T{r=;_s2Vr}&C(>C$gds{J6i#Px` za63lD2+5yf>;TFymcsVp+p@LIsS&ieZ7=RiZj0MAi?gsF&(rQUA(p6x{GlJJ_Z5vM z*AR#f#c0i<+Z`}QRNvRspaYUX^7RVKpad0+`E`Phf~&yEAOV^Yg=iU`Y@tRK=Pqc~X%`w_45~4x#Z}1#72v9*Vhuodv##By_PD6Klon00 zQ80##Q-h;{(qoEVmZ3@!P`rOIlZ&Gz0CpgcFHYs@)rC9S@VF4WH3q2=xdcb~uuW%Bs#Gzh#}FcziIG1z!8|@<^UPy9D?i%gdKf z|(ebQ>AEXF|Jvs@iJfvwHO0@V#B4@ zGsdw@_GXf-_W;ne&P?6HbGKswjJMsWQN#IfFG%T#STWaH!_`RKug1^oAAb zblE7uRM>D>lO62SaMY56W4zAweYw0om(#OTIX*oF0FPy7zLfrOES+9Y=DTxQ?9OCw zZ!XK_R6$fJC(TOMwMG+h0vzwaFQOVDwJaaV2tB9r6tQH{0~4Z!l1MmTfDcG!1*L* zVBF$`F+jy(;eY~@{gTC!f^navsI}q_p+RVK{%RfG%%(B#?&1!9_4fLsM&(*1Q@aXdV);{Sgx@iR6N1+9{kv( z8*=GC^e?+{cc;FKEk?Vt$r_;;)E$TLhS=Sf8fO{e;G{bfCuZK?j8P?S;K1F`dLbIO z!|YUE(Z$m2Ygm-+JZqN9Qmogc+-m8}#uBG`w6N@SrP3Qnt>2ewud7+9`Dz6RbV$C@ zlulN=m#8b1a8$QyLF@8d5t^AB)nTY`43MN-)#Ht8Fs@IL~s_k;!5zGeB>;z;mZN(&`SSRAcrwE+}*Oeww%-n2zLNe=hp~ zBh`DYYQ0U@wTuzBXn-Gqs22TSaHBdHwFv+p!wWT4o&+NmV*n%jpYl6pc5RzY!|7JF zm}9%mY*ZXu0AsGg#vcVqS4)y_)+7bhn89tXi|07Y6|gMUBwm05%$9IroyCRsHqI|w zdOq2rCrZJ{^FmrLp5rXnU_uVtzX6Q#!A#2gr_wpSmI182IFuCQkASLzaf=t&rWh5D zx4{^oxU#RnG66Vdupecd+Zq{b=-ta?boA3Kos(s*DEpk#2xWHwxD$>VYpk{9X=fl$ zdqa6pZ)$V!JslCX?x(7KRBtIpu0PCYi@cNcgMcDbsAks-~f%Yt_UaE1h4YSywb}`3Rim>9L!l`3cd|}yYO~F@acQomyJ{d`47A9>>*&tvd)twz_E*8?okG?zGk@jRP z6}EoDw&Q8KRo9uNKB(Ac7TyJ8R4uMxcx!z$zUY8+xOx20V~4A_VzAqaab*!`-Ug(% zSM#{y3XZqH7*%WPcFnV|sXfQyjn+iK8wv2exSLkNr=YW#qW_=omA461Re+j+!`Kq* z5t*)U#@M5Q(f;R+1T?nD=HhkMEVA}3XK_XSHXO}7{={^mRb49o=x%gV4{@wMfk_=avkp!G|_Nlu~Z-UWEGgzxgrD$rA zV5DLs7_R`vYk-l8@%6JO^6|}U`T3K%P^lK#iRSwJzJige@#5@AcIP8iU)kKYGyuW= zkgBmN4JhdvE*^?n){v1rKK~rP(_FPIl~zMq_zl(YTS{gDgha+d94tc5=ViJxR_JmT zWEb0L*4Vzyz-Yz#k>s182px)F1LF->YuOZ|fze&5977e{sQ6C%9ri{oXgj!mhu?Kp znjA3&#aOE5C6D7MTPsPfS(VzLgWF{()T@#yu`vjK&j3p@Uy%gWVj3zh&SbtA&P(({ zu^fx%mu*vjxNz4vV=688Si(_lO1wMLA;rz(3mKk2lJVKKbO6S5v5Jd)Ja)s}sS3t; z0AnJ6@hcGgnlUMdeOJ?XTsedHmd#mFeJZ6*yhmxeHS@9n90|xJ)ariLl5$wz$V8lH z*w3f9u(_xLEhEb=1^}BC;y2h(e1!GgwhkrUg1Td$ z)EEws7_a6Ec_}pOP=P(oG-cmat%qbY@%fHaXHzKwjHT&RD)YHCmP;JObLjw#Er7Ay zX=z7{ZNMm&q*65ydOXo%iw?(i(f?ft{!Me`NH7wFemlU<0p|eK`wmNoU{Gfc$*5X1 z7b?pyLNZNIfvd!u03a&0+hELQ6DyE1Lp54r!PjP@5nnG_Ug33*eBCI__4yICXs%R? zF%pV|B-NwGJH1BITh9@WEXS}|Vt%C>Ju8*#Ik{owGG&dPc6SM|47asrk;yo1TT(%K zwyMH1#27u!==U{VsA_QSR*kw*SHO$J8u@tbSQC`ty4Bknj-GhqMpx=>mFQ&|Ub7el z-pLEH1k;!0|*L0HTLbcI|cr-%m`6 z02krdWReOMBR0^~CEDix}@U&VVQ7?UAyfneOw zi*CmG2sg$IH@3DEjENec*zQYqJd?)ZiPZN`q<8v21^{G>O~|3v=mqIjAc$9!a1(2U2f9y@$iR@mU1JH{we-Q=l^Hp z?hbwzTbx~JsfM+Gn^@PI@dzLrNo8lEU}K+DcErhZj$*5+1CL7`D8pV?%Q3WpxDF&{ z{bOHCGTJ*FGi5E}*ae4UW*W1Fv=&Qg&u7{VM<;Exo9bSPrJ0;Vx9ob1l+9l>m#W7b zRW06Dhyi>zEC4a8C{;lQ5Z(Y@#BQj>uK+XZT3tOa#1=I>m8vchKeWV}b&I#CdW>eR zx?)uI7~+SXP{TMQUuRYC$ePH|48Ut4J%iQ$7jc{3O1@DDaz9wUL1_E_h4`YioikqH!PuSQj*sz-v*OErRGwCvPqq5iEHVsNQC>{g%* zrl1VZ`&;VqCK$bdpFp(EHU>n-7H4vPM76l9V0;WPzIgaR-o1P#pWeP!rAWm{cdDty zv!E6MMvXI`%Gt?*%x6P|PdXddNfT9kW;M20YZn!a$xK2UUC?#Ngg7?N*kp{IA&NLh zB&Br8kO${=vPbQx11R!hqlM490pJEOno{KVZ4mrxiZQAvwWPz{sCwVWR0S}W7-vjq zT$JD6K%vMOF|&-J{)ZKH6LR@C8kL^u7R%4Eq>7Co(*{lIi)i4EIl^)aYXS37prc zIR8Evy^Le!W{rR`0Wc;v0me;Sv*24NdhqnOLM=5A;l3ea-Y0#e`O(C)jQp2!GEYnq$+d>dPDM6 zXB0nCu8cL74n?X&gCW7l1e|DAsu`hp6O6VDiZT3;%a$$!B*S{%W-|b~P&MATD%S`_ z{-MoVG%NLXJaMH6Z-dbRIw>bG|R$NilSz{v4Y*78lE2&H(oza!^|J92R} zlgkq-#id-|w`|lG*MK6F;TM3AD)Hx!tY3UDZ(lx_M^_INiVuQ080k(uhT`mXYx?|07(;oqhd_s`({|e6HwHhxMf-0G0qN5nyXyrVAgSQ!gh0YLeV~dx;hPv zynqTdjr_i;0O=m({~~t#7^nm=`s3L^oFk(uY8Jy}p+6^vu1>eF2Oc~!vH3jvU=KRKt^s|qCHLnm&q z%gv597FPo(X*DJcOczj)bA@7WI+4zVZQ-U+jB}|2jE%*Cv=@8Q#`7!9rvB)u3ODI8 z(YR$)HLew-#~WG1@9xnR^!}bjpve1C@clI~x&q{VKL3WQbTCFh$!)Jlv+naSchmKeR!^oRG1rAPj~4yglL6jJ6!iI&wJg$}zxrvK(rn&Ds7; z9zY>p9xvqTbRmz<_T=&Tp**|1FRvb5$$LQYr#ElpmyaLhmroz%H=nF_@x{}}a(#I& z4+uhqA>F93^AiQ*8Pq2Gr?RJP2?{Ko+LB6Jxj0LMCh^9far_n3gQ!3%^-a@*iT`Ed9cBS76NGc2*KePW1_JjHpE~)!5#`IbsV? z+_L-3a81C4C>SFk{I39GRQ-8;E($&_ z-975-6_g>)_}3umV02rRZUitotQ3T*4%aSMDoDm0y-N+Z%lAgbsGw$Yk7m4PSB3p< zt9Ek=NmHm%IQrNszAn`PTfJEi)RK0$S&b;t+cyjQRV@;VEss6YZEAp{>9qI&M~y!+ zju!6o|0^hlB~^z5kxRAJEJrKOU%5+fTX2`IlWlG$-{?Am5jG#$Ttx%qdRhj{GY+8^ zk9P+E;#lspB;$YzaZete9Ri3{i2DHIvAlSACU2fz%ZC@wWb@gtx}3yC++ zpFEPQ2WJLF2je;ISiyJ>#d-f^DZBH5w$RG}j2Rr;ROq!P8*SqP2TNvPZvhT5KyjO8 zR2z)9-IGLm8!*dC7oSg!Q!Aj}DgYzRfW>uGfd)nv{71p4P{eaev}zJS3%4IBUz^qARxvw?Zt`%hy$Lxj<6%R=@ zEb}55dGSlt1|Vh&J;~&<#(60@S;$s* zDw~|`*cwT^!giH;oGZ4&1vbwgys!lP5(Y(DGMT#z#<+FBS=BLeu49bu>xAwD-PlQ} z+6uPQ%ThV!a62xg0LMngW;l-1S=oWjaeEgk@&NmNQmV;its_s{BYD}M$#uOeNBNR0 zpf=eGE;_(?iQoSTE_^Rr_-p~y8o)ShcJ7?7e}Iuc|CE26l6-q-znd+04|M(_XD@PG z6kVbmOw1)y5^+Fl zUsb5nJiw^M|IB#ZWWA(~lX4JxcIvv&--`PGYrwctc@dZB4GZwogqny;(-r1QX+|L# zZWjnfb!~b*<2v5xwTkXmjVeV=ya{0R>{D)Ul~fa{S@d!ZpQzytz_o8`X`N-d24YZ- zH9me_y5UOEq3C0Zbo#qzqDBk+0mgQVvly+G(G=lYIj$fX0LeCSt`-SHYZ=Gno02Uf zP}EtD0gP)`=^A_wCauI|h8hfs-69>|B6PvrBP7xMEvD8&!&<=0Q2<+qhnE*}asNcl z?jOrJpm=_E928>!sx^fxs1-LVSWG$7IejdM%6!r;lEE10D zR%OO&R+S@rt7TTX|XPs)wVnX9G^isUIBJT#S#FTmKn2D0aw;JF7aDu_Zxz7 zKY(%3o7_2H{{SO@{we<$^!#5o?(Xn+vxkpgYLbmM5FhsexB=ASP-iw4*e4ZMnb^b) zCfKmCczb3I!EK}z? zj4K5f!00M5su~GK-^W#wPtLa+l5z;fl9g;wA^JXga*jiARiY8VxLSsqHHV@q#xR=5 zU8&kMoIu10(UhWDo0I9)rD_0lBLr9La9iQmw#U)5!MHXVHz3k%fG>Ng8Wd@hQ9~{2 zCXK4YbzE_snR;WqRB)ND+^A|caM%)UMsmyqn}Z!qs<{FXnQi(6Kz#A=QZr89JY$XG zWBK&vnf(0zH6Zv-et|mt?Wd3O>lc9WvkeMnxyFkpkLBv(OjRPGcyV^BO9kVZfswA% zQ@qy6(Lz;Yw^df)wd!SQL$PzXa6TQA5{{#C)*3{2^MDY(?>4`WDvuq5AHk;vWk?V@ z5EY8r0f%N~7-~$SDVxHqG7d>7vRhFo$1#_wsZV#E^7VY4@Bpw`Jin_QTz~+E z%l(1u9Smi*H^jN1D+MU^1m4pY_I(q_@rHVVf*Un}k&xL=7bTtrMAL0aq-wIc6%X*- z(8saoDa{*+(4|@eEZEDrFrG+ewv_mEPtuE1NzYCtJ2{Z@cqyrJU1G_!xnZfk=}yIc zx=#&?`I}&j#2TXsI4sv-ypkESym03}Z*6T!9NWz^D;3~ltF{W@n8*L}IDfGazn;lR zCu?vVLp5?L$8N3&MoJmM3l2IF96DyQdv=mKn=dW&5~&cE14_uUZ{BDA(la z;`q*a`Ue=f^G}s@bNg?;ad)S`t33c5t0O>h+|vwG-Y)ig+Gsr6Cm0F13I0D)(^-pj zm8ya?P`2iPB2;2+hw3n7q$((PG}cI$Did+)P>;oK4+nEavgML?z;Rb8l-Pb2PAe~gz+c!G=;+6R@V=1DaXK(5@I0gN7F)E=o0 z#uB$@4F^^rcUQ0PPk^F6V;#Q^m z)D)w;OC5}>+f9~c82G*hMpuarMu#E+IVKoG$;OR3#ap%lWJE=-Mo6u|*jc$y*ENcv zXrFb7XNU6m^1come!lRiK`?8vlRmjOQO4q(;;Ap7NljPbqB z@jXmnT`0IZ!54sNYS3;w7!`eMSuU!3~AT*`eWA3fhvp#wYXuBqe01W2thJm zm1GW31Q_GVD%Nj{)-i4njOIdSGZBR;p2PN$rFKheq>Gb@qbYLjvulID;~>o4TABy z*_Pj)T-`Z8{~#lG{;B^+?f+}z?v8&~JHEWunnZ$+?$JW8FPS#L*k!GwsXm?AID)#I zFcXzSi6^?Q1t7K;0O1@^#QG9rl*~q*FSLB4&HBaJ9FN)6(v8N>+!A{@5V=~CRK_~s z{7o>@otlWWg!@M<3ddVuT)9KtqAt?Nx+pB&wW%?`07+AjbcI^M{@2~9>#_}ZpSoH! zPzDGG#YjMI$2avoaJ?%>E`2J7XR+F7D<M#PvRje_0BjJYb zvuGpn7U8HC+^NB3s&EX-kMVvMcAOoTjmq`};FFob+VBUza_64oiGa zyZCJ9faDx7oEH-^1?c*)7GPH^S<5%=N<;9m{hPZ|T`dM<4PvEeU2vFPS|eO5rv4O) z3c8#sK{g0yFH|m93K7<1K|j0QuoQ=x#!>4Qr8ln0WRA~!feVs(M@EyDH1J-Ey@q6) z6^TRfvY4OelN$Bwn7kaqe{VEt4PVv$W)@~-Ty>hoLr2$kaOULF*NlbSo z3q@7lzmWR=IWEALlC9JM+lyco6z_4jAa|ugfT-s zp2lwx7tO_9Tk`CrGwe$m7vkyZ0?P47s(?sy|Gw0QJCZHgeAjK}ErfvwRDXBC7%AEK znqo|7Eh7z(+)7BCNkA;0*&|)k2N`+u-^Ab6#@(I&?sjl^CXMBx zl%eS8)6WBdMP{H*L)PkKAtjb`jA4_I#fmGq`g~97%YCUp4VGrRQkgBKxjc~W{(%hk zmeODDN|QB603xB-!()4ZWVP3kOrBSE2C+LZys?gOBnDTq%@K}Py20#NpYP~NIGoQ&b7knsHrnZ?;i@qt-_&h=3u>{`uBdv{Ox0kX zfMdxu1RrCHrQl`_3X!TYJVwFT4sO(7y^dw3>cHV1i^XdONQY&Z%@}o`M%CeL;_g#+ zwONmr^641{MW3a}g8jK%p6vlJT-xLe z1LLQ6mT>dr>Op{FP>N89_tj41et@O@&%wB>amF*kk;;(`1@M0N0H0-PTlR|EvRjM; zh6!0fE$-&yGQ)BRICfZEUt#wd))Uh0>2-xxTX@rKohrlt#C5FDfoMaAZ88ci6IF@^Ta{+7DTOKr4l@D9+^96`$IN<0OQcEV zo02I3jQN4Y07lj=T71zSuLdx3Qco(&{;Opvb=rU<&J$gz%nqJAoJ)CmEKQuNI(t~+ z!n{x{N;<_%RF;5Q;*a%R1sGF#01y_>S@{Ox$5B_2B7co7Y64CGBePQ#j5dynJy>Hg z)=1)sY?w{RnUr%>C~LFuSN(}RZx7@_ zxu$Tu8vW488MlqR`ETa$&l`8&z<0OP2hSx70J76WcDy460I>{pR|f1#J9|=`F3l!O zDNJ~KPbzc3ba5<&*`efdzqGS2^~E97AwbCDemuXlIFRb>KpJ>%1KX|k`%-MxC7tKh zn}adh7S8QfYq&J0c&rB$bG<+IHW)2wXAQ<^0uFBzG8QKclQIJ2wBdIYc(9~XsUv}}X_XFE9sVlt9>tNR|5uPR>Oe*+^;*QHr|NmuLIwaP42 znhh>yS%<|K-IZ!xZdj&41L$#hQhjOG~%mR#YSrUpx!Z2x;Ps$X_ z0n}rsoRnsj{Yr0HEeVLF6ks~7qsH-2LH((jTl7Y(@UMc=Ees}(+6t5bl67;Pd%Hhv z5Z^6H3*Tw8U6m|;FIJa)PhF2ps@vQSJx{k;m&h1nQ_|&;B#R?Jv~ImoH^OiN2P2FS zN~JSUmqjTy8j@=^C0TDttlpRG2J?o_Uf z7izgi9Dsx+wlk&*)vV4@lq$zW zfF@n5N$qvo0wnu{VQ6p#moBI0?QH`{-tGALK z?y6-c`;y-|knGN(WTrH`oyPj)cu!KW?Cc2Zj9hY7CHK zeX%!_Tpd?`#j+&JMNPiZ_+kLyx+UDYp}1$OCIC22v9cA%UX3XDiEn4!#ZE@P>i;N^WLaFT_fs7y;-u+4Nx=~n)Lxiv%Sz1 zT$62<2F0@jj*i-whi4}`9fNQq7+*gl7+(Z1GJePwZ&ZeF)IPs|t1(9!@4tERTpNV5 z)f?5|`RO5`c%*8PP~^-+n!8l_xKo1h|7-6&prlEPJ6|)?-P68j+Iv6Vf8P6b>@H$i zyjzyT3y@9-qZLjdSXi8p7GVXP76gm;9$^+Q1VWYr4v-K?aHrFWhXfM3i;I6`Wp#Dc z%{*3!b;|JAQ$rzf24iz(mfGDmHA*=uB6}O- z!4Sf?_^bi7m6fbhgeMrIFvAc67~vhte4>Cc%-`DuMz;XR!C@&^CtwV?!HEAEmEAZL z9Qix5*BA}=;Fx2Tqo}bOrIzfJ!GPq)sIR(zBum#XZdtO8){gQPwcTL(f5@h2|Dh`> zRGy;Y+8hlx<|){kr$AdN*jbRVn}VqlS&i3 z933!i+VCn+%gSdE& zV5_M_T#BO)V2xpb`zw2lk!+X8fC-9?*17F6knH(LHyC9-Bi1!y4w6AM#NHP6WsH}b zRGr<=P&`EKg?-eSnW6Eq7ELxw)WHQE`Y^Vw8?d*@!`voH(XnTW&}cY-ZKV|OWKlo% zk%c7LW*I077!?%p8A0(Fxi1cfDZxM-i6v;1l?t=x$e#mXhC;Z=56K4XaqfpB+-Gy_ zHI||(tlC1&R4E}Br@PN?S+b4R4b~2|E%O?og{8AJnD5eHX@UkTfZQwv7?gqfyxbqG z&dBXhZI*(7UuB#I%g`jhHcbQky2Y)74h6Dp3g@_E6!?m<#P>@L_8hY`ghI*^ zeoq0AjT)5RxktB$sXa&c<6bzmKSNcPLm-rDds=;ARM(thZ*I{I#@?Kv14#`- zk2k5|sHEWN_81XHjoaZ}r$oJFSX|G~0E!g%7Fpcg7Iz9PETt5OVnr7#QlJ!y6n9wM zTio5fxVseB#i95D#pUk*ci;Qm`FNf)Cpk$blVmc9yFXrk2NQ!whsmuGisEddLc2Z| z1aAbXV4uS|QkGMy)NP4vhve9)tgRQKk2zL57>7u?55$N;%T2SAXMk7qim zH7m1x>x*hvv#;~|H7PmN1sfV4R0ouO06^;=S6Ik3hh#GRnlJ(U#D=S<%fn{2Sb#iS za0s~{QRl!lKjDT@u8b#L1RkOY~Ns*u`W&&Z#b55?{7eyz9z&gk2HdI?ss`8qq-1I7^g2$T&_ z;)XMQ_(ND>S8u|Iu%uPCy4ba&yd@>Na0K$JMF~7vH5DGH zTKE&pFlKHy=o77lG$vgxR-X1nLpHYh`cz_NMZBHN^K%<;teG`wD{EL9MY4r z4fuE{Nft(N-!JVl(qp}~WsR%8YQVfHF@2Sz9i&c=ZuKMR!6zdmGU12p7z8s04V06* zyzNR3G;hLP>H|nbF(nZ560^Zhfq<0aI``Pt%ZJbQp2-8h@qT{Uvq|S2F<31seeAqk zUB7%Z!v66|c^Hti=v9$_yTy}KI4vLX0G`FVe4j)WhAayG7sEqWI#q(F*d;~i)Rk%u zv?7OkphKjSbL-us==IM;p?vR=!mBxA1c(~?7-N1FgZF9P`Y9I*`2&e3X!1b3z&E*w0i3v?b} z7l~g&X@DG}hw|w@zzJ+(9X3}ObOancc;H7=0E?#0zqF2?-rZOIlSDT0ZiqND$0E-d zuS%mE{*$v(oqkqp@bA>K*mIW7v$W;22{#-iX`xvXaD(WsxraQ!zLeseiQJCKR!g{* zVFip901(MhLkJtmp?EZ1l&ho^!-QT^xSTY*+B~!$Ps2fc$zZh zvbcSo8YSJn3$J$0*T1QMfj4)b*`4nTk_Q+!0D>wQVEZdzK3TjFvl-+(gR?MZdL+i> zsrmaj}NLYKfJ$gL3`e~${q)m1O2K=mxlrF@88bdJM>pVgb9+qhE zDL@DSJ?ZbAO|uqN9iP@KQc7428Cd+~;M`g2LRocwQ+xq0hi_YPfY;)fRLF1yH7d07 zH1j@5^Li<;{9#O_qTZC|lViVrzkR$Ej24f?5JQQSBUKglfDM&RQ~rSH&dfwYe#`t( z`lp2`n1m|u8pbc*i#v_!m4Mk!3OFAu-1FW(BE|Z&1ixk*ed!g}Nl1v)PG6iEFQe{8%q2OSM_7gFi@vS!-r}!nrOnc8S+81SPV4Hcg==l zNr40awfAfy<%ck}(Km^R4jISIYLkdww+;BnTt9=`*jqg7Hf_A3zN3Mu?~gy@nSNU@ zd;K+$m~ia{6i5`WUTI_@<13folA+c_!)*8-_VC(V0c9e> z^f*{^j=>jCaaW8%pn(?ZDf`mQ@zm%Tozu+b0xjx;NDfs?$dOHC5~`h#;8^SLzlt7u zj|PZ?1}eOesb*W`?C9Hi!m?|`*E^I}ym7Ka`^7v>^rbPlTH~3JSztLIz^-{5#21J9UeV7i)g+MN zcuj#AS6>C05)}Q?fw!@%?##;62LKZ1fXV4~8up0v%k-tC z^-hDNMNH2s{Ug_8ug5|F*#0|gXcyer=L)Xbl8n=gei|p0Iftd!1C&9Udbv^i}{V-EdhZB_aOlqvZ4%80VfF+@&FSE zNU4Ge808~{kwUQEGm?jHigBs$N^`oz9M4%}3(ip8M3osbom=QGCVNGx=L`i-Zwe5X z2;d%3M~DovEoJ7r2TJvQN(+hqOtFLh`km!xU|b<`M?`IpGtnu*K%JnVW}!^9)F_A7 z&kAR3iwnUaU0Z)(X*(O+2u)Pr5QkO?4Ed8k)+(W}b`Iztpjtg#g2O|xTSHd;Z4ph` zE~Vamb{p6_uCv`oqk9++973NAfetv7cz}e87IE^#O%nsg+7XFyJw9hzz3NX{G=SY2 zyXlU~<~$sNp~qY#Bkm<9;)WDQ%taj(BA-ZXvb_9sl)N#MErAdcQ;lYdQK{-@zERzY zyH6o=oJiU23g0hO8h#dF?-5Cv_PGf8RfY6FoFiS%npc}Cmssh@YVgh-ctG{7Q}Fa_ z>FMWufY`Gp%WUDvh4gBTfno~EGFQ9C2BU&n+shtM4Da^`Cxf~N_NV%p? zWJ-QW;R9^)F{FFWSz7-+*5SO&7VbjLQGmbmqfgs8 z(<*5BjK0>x#m$GAlAMS%?Ct5J@!Amp6~G-x<1?6YO8+vW&8=v3T`kV;9@)$9zHs+A zXCZ?DxO4t_hA4+{NEnDiKOPb!48cxp)Lwj3bu-I`6s7^cHaOmG(5LQznZ>#yNg~sB zegP5Lo?Caj5TEf?$zX{#o=YRmq1z|q=<&i|_9ig^af=C~i&&yWV=#8$$WJgaK`2?$ zghutEh8Py^fb2B@BgDwGo^#_W|F9q=_n5D?h-8#3e~f9KM;H)MaR-`BGsyl@q>!-s zu{Ai~k4U|I;7)YlZn3tNubd!i%A8LT2X}gD80%-cx#+|P&F`M^14XPh5sv$XMK(X$ zl;;eB+hIfz=gqm22nXKJJ}%UdX{m4N4He#CpB5J~6lIV&=`}mW=7PGrByP0;vBaD( z$?c8T;0*U{K0nMO(*-@CfvLQTjXA&BNsaK?1DtLH~j508>S0kt1LEg;JfaRH=(_l?B>5% z8g$-dH^p0Y;9a^(b_M4>QuXrnWT0O%@D19{nAS^421&#*_0oMXJITS5YHB*L--h%~ zOJxUUsRM0xMDUd{+n~k?4e|{)v0PPNc*TGx9a*y!`3c z?B(I*hBx}%7KnK_o6c{kr1s9y? zk4m+vf9E9LFFUgv&KkGQx*c>$~jELE2q-Ba?s1nN& z`!&IIT7n_~%8`g&rLjjfnI}l)6@%NyIhmEPlYaNvJ(5wf8eSvE=II`$>1^Q}eQ{GZ zbv&Co#)uMx0-9&A^MAQP0Xdt|2x$)Hs~)1*IX8kH7V|Rpwgr+cfdz8M+##N(&@$Qf ziA;-x6%B#j*b#~QUjY8mKye>TK!hTPh)XJBtA~WFNlMh5 z8bX&;C{v;gYVe>aul?%KVXFErAd2h!#-HfPS4O4A>1|A*K;qE{Ou(j)ur(PubVhLf z^F=?p*XF8~;i}^iX5LqcLAbnLLx0TRUFt+iogi!zhwb{dsBqx3d5Ek{ptIbDs4C>q zAkV1i2f|O3OB|#Qa;bSlZCY#rMJXUz2Kj0Q4Ay^RQoT#XE=jH_aei&4L&JI70O+(f zyA+}5;PhwwJ<=GwQ0#hj{+WVZhh2ZC>~NY3&75zE8-kR?b8Jgiy4=n&ZGlJMf}Uoo zhe=h`VJ)aJ3tyWo9i zAxd+gd6fh=-aB|Dq6WZd@66E~A{y6F<#wlU!CDV{Z-ma{r8dO$tNpUPO;Bs9-nCo< zTyqH}WhvclRlhF6rCmkmm3D}bbKf66jf~Ek24O@&awGGsk6oi{Z+*#u*KW&zq_55f z6j1d*Sxiw58I*|onvC?k$cW#wy8IKFF$nr$D0pQ$qX7>c3aWja-v%Dgp(;uCgRmp4 zt9{^$MAIdZP|IQTE=)FKpVLG?qO_uSLoFAp!zKX^ySPSt`-Gd9&=Ch8m9ls7DL}!{gBc=fX_Wq{~0E4ggC5^tp`9= z#@H`BO6qQmgExdO?(Cy$bq7vLGXElCKZ@?(aC5=*JYOXhSMrWMyli=hj57`SvoH^k z!-R>;{u0jJHlhRf%xzU?LMq6hCk$S1nccHF=oNdK9(^qO_B5(U6nM7uO8rXkWrEBG zf#fprIC3Qgd=#a;Kq@k(l{IWuBhxEP2$JLkJ@Fd?%`tR{hi7JK9nNfOMv<_WM=FG> zY$yL#JU(@n3L+nEji;ae;|Eb=CbzXsd?4xbGQejJ47==8Oi~;A<~vQqTp}CGHqxM)?`m z@NZcM;T+p>y%4PNM+prUf3&+KF_JHxE|VhFDNNz$qD;j4)<9HZImx&oof)_v>OC{t zDi6N}Xpj19bUVv<#54+0ZOWp=iXUlL=pK*%Zt0Cd0mCVf6@v5|$guoOzwok9Ga#Sg zJMG{L#ZxpkJx=R5%rf|Vw<=vQBnFC4X(D}UeAgm{alrHXROU}|os-G?L3RRluf|i) zGVH$gDXuSb_e0s+`iGVr=cKL<`gnsH`rv@_x%H3%DIi0AL<1B%;vByWS7P-ehm=ff z_aZME_=H*9wEpI^HoZ<#PHAuHXkbmBX&(>8vf(S@UlaHg@0z=p6~?$3miD;3!uM6F zaxPh;r&|&R54esHnLj8!qm#(c##hjDipgQ|!Gae3kwQhAMO7=g5Hqfb9cJ9e&CLD9 zat_hj{bnkFHF<=~3^gT`+MwsBvNUN1SFJjE1ZGB0?NMVlK3#jh~Wy!7%?T%Jr3tCRNm)J zF^2L8Day!crV~f#^y+n*+BclX#iS7IgBSZd-}7W!AN!9a1T=DAab?gZgQP$mxfJpv z4T4iOOL|%ieLNfi461 zN=tVSUeOGvN1Ecjp@Dc{`VDVD!R+y2T3ku_L5X_X(G$AYX>qak$oZVB&Fx_JGpoRw zrUR4i5&b;2sgsk;P1Q%_EA>JNnpj&d_L5pUK zqi-ReiIgvUKN4_p^rp*G@fbhmqyRWrT&E*N!_f9tX4*$JSf?f<@q~TZPg_Y$O7uPE z9DbfSB`K&8Av{ZZq)=vbMo=6^Q;G0l?);+R?5KeHU#kz_oMgSAk>56VH0JqQ9|gU_ ztdY9~G%-KP6_HI~N#DfcD&s#)f0O>#Auq}~K0Z6bShkRRoO#EMQiTLIh0 zR{(B)Vj}PfDkI3*t@XsuIj-}Ji8j)Wg@wHM-zzU$VL%NdDBLmf_7l2A+$1Cp$vg61hzN3KkNUCA;(t65u>Jl==GDB`xt7qQCD}5o0MvLngCz+jys^n({|*W~WhL zJ|7Op4|GZwe*@vVCT10%wN$GWTF>X`WKB@ixG=+j-fyiwty%oynkVG!^Mm4}v6JA= zgbzFXWtQ6*h+dT4Hg}l6csbx+U^1cKok2?j4hD%!D)`g((arV;BxzgXtP-FDVg1H< zdsF6mT0xyU=UN*sh#c>C{$FMI2i08}D58p66od47-x+IM#vWv22b^p6{xBh-2J1YV zU3=EJ;{E9jTn%R|A?mPwWq)fM+dd#jApXou?p8eKUtkwa6f370LybST{_{I^0luYY zQ(b(91mV{t^)eJl6|i~P{5=`g0rPF~jhKYP5X8N~wv1zp^>C%bL)E=NnChQ_V!4Yp zmY8Q$o>Y~M7nCCUoXVAL?u;GLd#>w%_|5mVK{su2c12#;K_COEQ)Ce)-8^}i$~Cdh z-=+d`bcQ3OKuj}jp-xd&{o=(Rw-+<4fapO>n1Ve&v{a-x3ERkx6yY0_$66O$j4x>w z*?hH!A_G$DAL)bOz^Xn6!3Z&ZX)tC13bgqxiXR;Qw|0SFLO|99DHnABE)C?7IbMrS z5#abRaxR0;JinF%;o}&n)^|?4X#D!PB=*HiKLiq;v@iT|!>u4G^tOjPX5r4;<5{ve zHh`E5`6Hexni@Js)8yCXf{wv+nxw&{kuv#=N;dE|ZZFong&6parDXK*Wqb?v*=u@Z z_jFvvN7^4vxX~o{NG1Sq0wXa8XN)tqDOJ}6mwccm)_da1#Qu=OgjBoq!izppOHNC< zE&b>fps;5pi<3W5%67P|KoVd+JmhnH`^e`{dal0&h35+=+*73F3-AMLImt`$I7CJS zNA`)yCixXPVEqJO^6&P@vAf@VBrG#{Se+ocl*KPPh&W19FewXJes0jZilL-5R@ULo zfm7)PinC6%2d~j8<)xTAe)bVYUZKRN!wVObcX3Z*$7ymD(CF_RPS7C-&sREMt9|oc zBe5$B$J(RPEt_d`@2W5`{d6ULe&|jmnVgEld*3dSCvi6bC$%gIY3FmMq$EU*;Qj(J zGDtuC^W36z{kq1ga`t=N2X+mtL{hB76=S3dP#a4V25XkO-yD; zvd8eI1pT_i9d@brbq@EHc>N_Lqs5-dbjT-Q6-*7h@KCu>NY8ZPBC9(NuD40vl`hT)qdpfVew_njMfa6 zhSp>HXjeT4+n5GD6|B5uTLp?uoZhZ#Yvpp10a~WLvF}Yr0a3ae{gv0G4ZGYgF)-m$ zVh%w8K2AURFcM>nGuKtx+F)C5z1Yeg4{T_vSAAXg@m*h1*Fom@<8jb+{I^*uro9<; zGL4hD!qQVlC^j3%rbMy#Y5*?yl$g;Hn{2jq%#>e+o~D?=O-`B0g^iu$skL%*bPXo4a32kj|Mu)tl=Pg@d>z75xIzg0cHBQt^ zjeq9ggpI0FWKfJl+1Yq%zBdMO2-YRk)0)eee}NM!v#zI$xyAas%jd^C0w>+$RcTQH zYHYwv4N4Ld59Ht0>G{KOES=3)UgyYA8#0^DA$eT1zB1KIzQFh&r$~x6iL?tIQyCTn zZiu)Z6=47FnJTbGYYPWujFzRQoQ}(~Cjz&hij#W_LJKNL#Ee4e!|DP!Y15>lm}{R# zI??x@aJ^~TO!e!L!UBfg3CU=Ar4T6|dL!9{MGPY)kw?#IXv45ZHKSFf<<@>AcJ~H)&{*aL9^fJ zKATaQR^xhhoPB1yhwJfs+<|yJg*ZPA%Tl+ytuJjKvui#kEuWwZEnV7wGq9y*^omnK zw~8|1)V@gEIg4zW{*AJ&SD{kyq5I}hnAp9B75A!h{DKy7%KEqFGtIepZL*S7QG34+ zuyltEjX>tL>9=Hit{J+9Z_PU0TA>n&+AN%MX74fqZs;xaU4-k~z(a8cB}^VM3|1H&JQag*ws!rDnlsMbtpZ))gkd{zUQ+7zDBuB~^#yB+J9*pW}n z(-`!;5+3Z`sBZko@5->nFpJ)!M33>IgftFfR>d-B<{9A)Qoldx*6@g+h`U@c&{ggkWNHBGmp!k;y1fL~J zO7h$!er-Q7JVB9?CB@kabwvw=UtI1V4CR1u4@2rvKTCj`{WQr`hpIm!isXFt6m|RY zh519+HVM{<*xzrIg1zfURFaAqQ0gSVzz2K)MB5UOBZqT+4D$315gIwMPsDIxe*W== zHg9zv>7BocoIel(`;HX8zlHs^%b3mS-Mpua+dlf6mhnX5e7&?0vrY2v% zF{4+^oW`|{e$*9Eh&=ve4Cq=%kIdAjXwybWVk1X=4P1H0A;(ft!O=@(3^CrD5;*2- z1(iT}fIPIN#Ggf5+Xj(nv)BTKb-D%ykHhiHARp^N#U5mG4 zHQyIayOo0|W=$PymbtV#()0Q-g+CdSL;sm4u}~Pjd|%5%VZ9D&D&{u7Bj{&nSvtSmL2vHYgijSr89x4&Hs znKj75hu?f_k;)2V`o+luWSYEu8s(iTNf=y=w1MA+l}3t6z;V>&HRlQE#~D_$WCBQ{ z>1ki4iKEW@gUa!OZzlI!Kl1+Bu`om=hQP+EF~r7UlubxGvw9h=B+~ewnZoIy6gema zdugI3>GE$ht?ZdzlT`8blCfjk(vR@fzxs;Ohgq;my?nD zeEFC5>&fZNtYfKAj}O;vdX_}JQSB?@d-5|Jbq#4CXQZGHcRs>$+=iMklFOtY&S6Y+ zW4a7tn3p+XpB3{2KiQWp52Fk?hfnB%=p}M@qB$y<(kZ!KFl+Zyv)#p2YKZJ($H-DN z#-`1eUUB?kGtD*pr?xxS%KT;6 zC|3HS%eDNdFI{6rZ1zlLqmH6qs7QAAP$n_KD})evE#+d{)Y90J_9a| zeZeW@X>;k#;O_P8G$SJ9qmB(w%TOmT!3Ep%y6##Yv*$9cl8`ZZ)6S{JCZb_t143it zB91NPNdr*8#DOxH20ded<4w!U8WaF1j=sg|z|B^06h`9oidX@+KdnSKux1`(fWPUx zyU1Ta7obR6bR^;(8_6Z~T^CUovi)}yaFE6(o-Gg?k;t&DJ~pty-NUIp!XoE`xW1yq zbY;3uCY+vyw+Rd6-#RRCcy#v`ebg5>vxym}X+}dU5r4 zJ!?V^9rDB>u)>xK{x2S{uEk1IyRsU~j>$%{+iF(4m5|4`qrNhY4Tl9BOxSEs-}DK z5`fX`Oz~cq4HMXyl6V79y7HfYczKnG38!m+TfCQN(J8O=PuFfU)|(RWXBeES6$M0O z;7-SI&Kk!18nlr=-UG)C|go(D2!c_E)#Yy!s&r46kdmqRnMzmhNQlpjNNGm!gh65VZkinAQ(Yzx3wt`(A#oy|3 z?P0ni`p$BO<@41i(JM`1D^u#600Sb?$FKwl6<_ncXZAG3#U~hnmn>il_8V_=1rjyI zqU?M%#T}K2M%!Yiger9mjnEMf0X6(kc05gqMNxvTz4vSIzzt&{?i+Q)ZBqqirHPv0 ze5zgj>pgn7K8m8u+_h+Ad2N?Qx7xg3PeRb`%Z5<#fuHD57RkmWzLGF^eBd7}CeJ8L zKp-yI2DreW{J!V!PHQ9*qZcA{W3u!0t!j_51+YgeXiy4!@>dcBND4_6P|>VIT+5Fu z{l}j~9Ce7MjN|NzbHZ8`RW}-7FHJkhvi&%@kWjt{2%QK7;i1 zJh-YZ$3@<~ilZ(rS6LUyZv&UG3&(RrqhtxxJmZDtPYkqqYa2~95D{2XAZp=mV8 zdZIRfh=Ph;vsifCDZN0Zl}lN)n%F{2w34X-e@2u2WvG@~eR7k}wmCOeh9%2v6I+LS z?jTrG!@n@aKCid*6v&Y|=kC|Btd#wUbW$KnY^^?A46Xm^fz%>em*kh?JpcT*c{uvv z5kDYrao5P72#HvYHe4h%FsdvUj{;hwr_S?wLx|zWGHTxIuEou6@|4{Xl>Iwg$MS}#eqIPzs^d?4dKZA?ve22pk(mS6{}%j?j_da zz0aq2Y%xR|W&AsbNSzh7ul2Ku^uMRYz+sns!xs)AF|t3qQ!T5Aj>!2$#Cy6Tm^B4I z*=Q6?51OXu`P(Oy6W(W?7TF;&&cDCpix`eC%`g9@3IYtm(!FDoHb(|oQ>3{jSRNl@^ zS6mb!#()MMZjOTZDuzgK4x=8iy-a>emP-F5=U0pq<<;K5yGPM)Xu;-oLRk9K@Yr9& z1FDh+`IJgdRt4YqQ%)^yL@3I^J)O3#h~`NK2%zxOo2??fzH}*4{d1=^1m4{zPqkL1 zE&{hRU}<>b8`P$p$aA9&6r+M0{<_BIHdk+UlQM5JB`l*uL?zkCaL*}NSq=DM2WXJr z<+YllHR`m0gjG@vS!NVu7V>+`}r5PFMhnU?ILTu)Bq`{-G7I^?F)!+v=eotPn(~hr{VMUSH(Aa2UR=_ zxp3m(3%rhv^f;Ue{||xP0G%iO`%$AC&Y~=QhM&YFj(iloKWD1#j}rGD7KufP=FQnc z;ZN%KJW5dv%Vr%I;1Kh;$(Kz~=)o~uOMA$^Ob(X9aBix`yjpJIJnHM@R-U_>O~z{d z*~k26#9dneBk3;WWRrh=<9+P$%PKOvl{CQe%v6w7!VlMJupS*{b~JwX!9NUdfJeW% z6pwYsHw46yc=S|RmK0>q#~UuD6y)_)zqFBpe~>SJw79yIGqE(@LHl<0gajp;zsV-_ zBaSctExw@MJ*=5K3I15@9)+T`0y);H@2;dk==V&fJ=!_R0t3d9_iIX;1bc546Pr@s z=Mo~l-z|AK2MF-rq;9w*5uXvNbCGD`6R*uV2?B(u)^fCEYDB6Q3DulclO?(g`!Ykc z_y;k8wxX@w?px=wXc*y3h=P~iwNz*d%(Gv( zInql7Qa5E8?!Xn_b;#^$o0xkwn6*k;cARjL`fKxK#aP~fe*zq_sd!1DEw46;CEqgD zvlaIP^bS4PQM&wQH7PGSkgz{!J>_V7aEE)yJWKwt!v1y3a2J|01Y^eNYUyG-3%16@ zytr|If{QcomBoI4MBmi*SwpuYU1#8TtGSMU%Q*hx$V6iioG(XsErts}>m}}2_mFGM zq!>d4Y>9NTz0#g*)2V>?xJqtf96G@@CX6>nsrEEuG?FpY(`IZOlgzi~tm9 zu2=IO93M@o5;OV&hczfBh;1-UaZ#YMuj%CcnB)*fR>>a?n=-VQ^Nak0F54a{gWH$) zsi3&_ReQGR{2A@fvnA6f>fw$xpKaeKt6s^K*m{6@p{1ab5xe?*jEA;iA~-(19}x-{ zvM%OQK66O1Aw}%DI9yz=QXCQ6<{*l1NbqrL zfc_i7*vhXaI5+@}j}H9}&_?ZGa<388v=Tj4M!Q5tVt@s2W{hDvuep;1lwz!W6KPK~ zLD0}~Dy`r9o9*YfNtY7lYnug_RKPv{=83npj~KSP9KC+O?4xG3`l#%Z3vYe$v>{=8 z&02+QJ-X40YAW-rBQR5cC%wiNY-=21z+VrjZM5?c^7hm_|B$kT+-@7qJ+wf#H1V?= zJ$)&*Qtmo!ehsd)Y`Frt3g_nz2t>PBhdoWHY)rfTxF;#;(5R?brf8!WIc=O?U`{nC z?%cL>gRj(*R9_JV+-6+uudhi{h~3R_Rl32pqJf;8S~rFiWMC^2E%{t^JkUJ?&&~+l zPc@Z6kj_s29f=*KYXhadu{}s5*(TA#Bjl$pBA<(|YABN-(88HCX9jC&6p`IZaH2(C zthlry;k@HF#<$gh@F2GQ`#pSUjaM9bH%)<=V1@~2pC7R=YKEncrl({s-JYBRNE&Tk zE4>(O8t)19Be0=tvEwop+4zt*E3wN+h8z?MDDmxvWqTRwhdUObg@x5~8lfx$w{4IK z5>pGhq+BA_JCvh@n}O7$v^UP8;lJ?IwVA2|$y4LRy!eKT-*ZnO}z5ME|lJ6S|){ioD4^?m)H z4vY>#t&Cvd$i_(FV}}LsFCOSNOHgZcNZ=jysBd-b&Vu`28gBL%UcWuoy+bEs%v;MAk$y<} zGthprZUYL2uPmZ3wIdJ_F<>@X!l*puq{d%DAcWPYH#|w{i)k#EeO6Gq%P8pULjTgecS4QZvplW z=6*!x9T*ZfZA`cLbAWnweo=d9C{r?>u&)jo<9k$!WT)C=y@p)Pkltk|J3DqQ!U>I{G1A8kNhEft_EI;CtoW5N-^&f4k;BJaVK zEa;D(TRXYpl_@7paL3MxiI*P0gl~dk#q49vBdg2g-wKh=i3P-5 z=seFAv*XKhZ_ll*edsdZsIS}&v{Kq9t;z*~o>ALWQQMO}0rqxj4YhqLu}}W)+Zr!9 zUf&BGZ|W5UW?RA1yC>FO9{_49wc|X%^ghHo$6BAW)%|(3_T6`Up#}kg$M`_&z;OM! zQ8CDQR>ql(Ty+nzro-18JQo`Xu3T*qOi?DgPj2cwK{k67R9_7a!4v4Txl_BXoVClk z<~Ioy=I3wymgDI0u);$πMa&Lf<@+FAR^>Z8j}6FzP7I8EJw?_go^?eD$Iso?=+ z-KR-882(4bnLy9)pVTM}$t@~+jQZTw3IXZgoBPxz*omC?q~>-(jg+~p9hvT+N1qhU z@zD@Mr5v$d@i}&`SoYk8IsaLt5jdv2elrTAb89oc4T4>`TKxZCU@-e6_`q>$7FpwC zc1Jl7J-?Fmf^MQHye#g0x=Wi+0K51&4eK~M>R5lw>@?7%z zQAK$onG@sju*O3;APWs0fQIjK`7$om+^>5*k1fPS%@@9H{i}mNcKShts$HZ#4fepB zbz6BRP>&1vp7kFNWSHC8d=T#ta1E#AV3yDQLr1iIy>JC7)F4LklJ5TZcV1c+A=6cF zIoiwX-_%@CFZ76kkAgu&Zdd7y*U*Q4GM^m;o$L}Qp=zzyHQr{kZ=V9yrmTI=ysv(m zcwnvB!EN`wW5j$>pH_-q)^GIDp}*A-4C!b>Xq<^4wWzfMvn`K7t1|Qul&iC>2Mh$k z41TSeKAvDahn%@qbhe$;d1r28WWA8Wy#5bqZ$}L5?R2GjzD8S6=|!~B{w;6TW9EO9 zD??+viVuCe;&E1Ydcy=e`aftsO}#lYdV-B+coZDH%@N1d#hd6dyjQoFkou%{=l=N^w|+0d$@EEpUFvj&}cpHgPrcwYrO zUbcU!7yeJM@MD*ldly?NC}yIUCgDvqciR7P=pzo;-SG?W8A;6V{+rA>Ke (CC0 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 From 7474924480f4092e74742b854d19c59e346bbc59 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 26 Oct 2025 22:23:12 -0400 Subject: [PATCH 17/40] gradle: update dependencies --- build.gradle | 8 ++++---- mobile/build.gradle | 8 ++++---- shared_resources/build.gradle | 2 +- wear/build.gradle | 4 ++-- wearsettings/build.gradle | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.gradle b/build.gradle index 74901930..5ebfe85d 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { ext { compileSdkVersion = 36 minSdkVersion = 24 - targetSdkVersion = 34 + targetSdkVersion = 35 kotlin_version = '2.1.20' kotlinx_version = '1.10.2' @@ -22,7 +22,7 @@ buildscript { preference_version = '1.2.1' recyclerview_version = '1.4.0' coresplash_version = '1.0.1' - work_version = '2.10.5' + work_version = '2.11.0' navigation_version = '2.9.5' datastore_version = '1.1.7' @@ -33,12 +33,12 @@ buildscript { androidx_truth_version = '1.7.0' google_truth_version = '1.4.5' - material_version = '1.14.0-alpha05' + material_version = '1.14.0-alpha06' material_compose_version = '1.5.0-alpha06' compose_bom_version = '2025.10.00' compose_compiler_version = '1.5.15' - wear_compose_version = '1.5.3' + wear_compose_version = '1.5.4' wear_tiles_version = '1.5.0' wear_watchface_version = '1.2.1' horologist_version = '0.7.15' diff --git a/mobile/build.gradle b/mobile/build.gradle index 40914c1f..3eba6b57 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdk rootProject.compileSdkVersion + compileSdk = rootProject.compileSdkVersion defaultConfig { applicationId "com.thewizrd.simplewear" @@ -22,7 +22,7 @@ android { targetSdkVersion rootProject.targetSdkVersion // NOTE: Version Code Format [TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1)] // NOTE: update SUPPORTED_VERSION_CODE if needed - versionCode 341916050 + versionCode 351916050 versionName "1.16.1" vectorDrawables.useSupportLibrary = true @@ -33,13 +33,13 @@ android { applicationIdSuffix ".debug" debuggable true minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } release { minifyEnabled true shrinkResources true crunchPngs true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/shared_resources/build.gradle b/shared_resources/build.gradle index 30966e8a..f930fffa 100644 --- a/shared_resources/build.gradle +++ b/shared_resources/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { - compileSdk rootProject.compileSdkVersion + compileSdk = rootProject.compileSdkVersion defaultConfig { minSdkVersion rootProject.minSdkVersion diff --git a/wear/build.gradle b/wear/build.gradle index 04cd1ad6..377a86a2 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -6,14 +6,14 @@ apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'org.jetbrains.kotlin.plugin.compose' android { - compileSdk rootProject.compileSdkVersion + compileSdk = rootProject.compileSdkVersion defaultConfig { applicationId "com.thewizrd.simplewear" minSdkVersion 26 targetSdkVersion rootProject.targetSdkVersion // NOTE: Version Code Format (TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1) - versionCode 341916051 + versionCode 351916051 versionName "1.16.1" vectorDrawables.useSupportLibrary = true diff --git a/wearsettings/build.gradle b/wearsettings/build.gradle index 209f604a..064239fb 100644 --- a/wearsettings/build.gradle +++ b/wearsettings/build.gradle @@ -5,7 +5,7 @@ plugins { } android { - compileSdk rootProject.compileSdkVersion + compileSdk = rootProject.compileSdkVersion defaultConfig { applicationId "com.thewizrd.wearsettings" From 8717e59f5104f18b4596816e125d21b07d7ec703 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sun, 26 Oct 2025 22:24:19 -0400 Subject: [PATCH 18/40] SimpleWear: v1.17.0-build0 --- mobile/build.gradle | 4 ++-- wear/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/build.gradle b/mobile/build.gradle index 3eba6b57..a0dc663a 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -22,8 +22,8 @@ android { targetSdkVersion rootProject.targetSdkVersion // NOTE: Version Code Format [TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1)] // NOTE: update SUPPORTED_VERSION_CODE if needed - versionCode 351916050 - versionName "1.16.1" + versionCode 351917000 + versionName "1.17.0" vectorDrawables.useSupportLibrary = true } diff --git a/wear/build.gradle b/wear/build.gradle index 377a86a2..8b56ace0 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -13,8 +13,8 @@ android { minSdkVersion 26 targetSdkVersion rootProject.targetSdkVersion // NOTE: Version Code Format (TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1) - versionCode 351916051 - versionName "1.16.1" + versionCode 351917001 + versionName "1.17.0" vectorDrawables.useSupportLibrary = true } From 1dfe2240234b67237fca2cdc2a8ebac242bf9e65 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Wed, 29 Oct 2025 00:10:52 -0400 Subject: [PATCH 19/40] gradle: migrate to toml catalog --- build.gradle | 61 ++----------- gradle/libs.versions.toml | 160 ++++++++++++++++++++++++++++++++++ hidden-api/build.gradle | 12 +-- mobile/build.gradle | 78 ++++++++--------- shared_resources/build.gradle | 48 +++++----- wear/build.gradle | 142 +++++++++++++++--------------- wearsettings/build.gradle | 40 ++++----- 7 files changed, 325 insertions(+), 216 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle b/build.gradle index 5ebfe85d..afcd69f4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,68 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext { - compileSdkVersion = 36 - minSdkVersion = 24 - targetSdkVersion = 35 - - kotlin_version = '2.1.20' - kotlinx_version = '1.10.2' - - desugar_version = '2.1.5' - - firebase_version = '34.4.0' - - activity_version = '1.11.0' - appcompat_version = '1.7.1' - constraintlayout_version = '2.2.1' - core_version = '1.17.0' - fragment_version = '1.8.9' - lifecycle_version = '2.9.4' - preference_version = '1.2.1' - recyclerview_version = '1.4.0' - coresplash_version = '1.0.1' - work_version = '2.11.0' - navigation_version = '2.9.5' - datastore_version = '1.1.7' - - test_core_version = '1.7.0' - test_runner_version = '1.7.0' - test_rules_version = '1.7.0' - junit_version = '1.3.0' - androidx_truth_version = '1.7.0' - google_truth_version = '1.4.5' - - material_version = '1.14.0-alpha06' - material_compose_version = '1.5.0-alpha06' - - compose_bom_version = '2025.10.00' - compose_compiler_version = '1.5.15' - wear_compose_version = '1.5.4' - wear_tiles_version = '1.5.0' - wear_watchface_version = '1.2.1' - horologist_version = '0.7.15' - accompanist_version = '0.37.3' - - gson_version = '2.13.2' - timber_version = '5.0.1' - - // Shizuku - shizuku_version = '13.1.5' - refine_version = '4.4.0' - } - repositories { mavenCentral() google() } dependencies { - classpath 'com.android.tools.build:gradle:8.13.0' - classpath 'com.google.gms:google-services:4.4.4' - classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.6' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.jetbrains.kotlin:compose-compiler-gradle-plugin:$kotlin_version" + classpath libs.gradle + classpath libs.google.services + classpath libs.firebase.crashlytics.gradle + classpath libs.kotlin.gradle.plugin + classpath libs.compose.compiler.gradle.plugin // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..cf5b98b3 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,160 @@ +[versions] +compileSdkVersion = "36" +minSdkVersion = "24" +targetSdkVersion = "35" + +gradleVersion = "8.13.0" +kotlin_version = '2.1.20' +kotlinx_version = '1.10.2' + +desugar_version = '2.1.5' + +firebase_version = '34.4.0' +firebaseCrashlyticsGradleVersion = "3.0.6" +googleServicesVersion = "4.4.4" +play_services_wearable_version = "19.0.0" +app_update_ktx_version = "2.1.0" + +activity_version = '1.11.0' +annotation_version = "1.9.1" +appcompat_version = '1.7.1' +constraintlayout_version = '2.2.1' +core_version = '1.17.0' +fragment_version = '1.8.9' +lifecycle_version = '2.9.4' +preference_version = '1.2.1' +recyclerview_version = '1.4.0' +recyclerview_selection_version = "1.2.0" +coresplash_version = '1.0.1' +work_version = '2.11.0' +navigation_version = '2.9.5' +datastore_version = '1.1.7' +media_version = "1.7.1" +palette_version = "1.0.0" + +test_core_version = '1.7.0' +test_runner_version = '1.7.0' +test_rules_version = '1.7.0' +junit_version = '1.3.0' +androidx_truth_version = '1.7.0' +google_truth_version = '1.4.5' + +material_version = '1.14.0-alpha06' +material_compose_version = '1.5.0-alpha06' + +compose_bom_version = '2025.10.00' +compose_compiler_version = '1.5.15' + +wearableVersion = "2.9.0" +wear_version = "1.3.0" +wear_ongoing_version = "1.1.0" +wear_phone_interactions_version = "1.1.0" +wear_remote_interactions_version = "1.1.0" +wear_tooling_preview_version = "1.0.0" +reorderable_version = "3.0.0" + +wear_compose_version = '1.5.4' +wear_tiles_version = '1.5.0' +wear_watchface_version = '1.2.1' +horologist_version = '0.7.15' +accomapnist_version = '0.37.3' +wear_protolayout_version = "1.3.0" + +gson_version = '2.13.2' +timber_version = '5.0.1' + +# Shizuku +shizuku_version = '13.1.5' +refine_version = '4.4.0' + +libsu_version = "3.1.2" +dexmaker_version = "2.28.6" +hiddenapibypassVersion = "6.1" + +[libraries] +accompanist-drawablepainter = { module = "com.google.accompanist:accompanist-drawablepainter", version.ref = "accomapnist_version" } +androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "annotation_version" } +androidx-compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose_compiler_version" } +androidx-compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "material_compose_version" } +androidx-compose-material-icons-extended-android = { module = "androidx.compose.material:material-icons-extended-android" } +androidx-compose-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata" } +androidx-compose-animation-graphics = { module = "androidx.compose.animation:animation-graphics" } +androidx-compose-ui = { module = "androidx.compose.ui:ui" } +androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } +androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } +androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } +wear-tiles-tooling-preview = { module = "androidx.wear.tiles:tiles-tooling-preview", version.ref = "wear_tiles_version" } +androidx-watchface-complications-data = { module = "androidx.wear.watchface:watchface-complications-data", version.ref = "wear_watchface_version" } +refine-annotation = { module = "dev.rikka.tools.refine:annotation", version.ref = "refine_version" } +refine-annotation-processor = { module = "dev.rikka.tools.refine:annotation-processor", version.ref = "refine_version" } +hiddenapibypass = { module = "org.lsposed.hiddenapibypass:hiddenapibypass", version.ref = "hiddenapibypassVersion" } +horologist-audio-ui-material3 = { module = "com.google.android.horologist:horologist-audio-ui-material3", version.ref = "horologist_version" } +libsu-core = { module = "com.github.topjohnwu.libsu:core", version.ref = "libsu_version" } +refine-runtime = { module = "dev.rikka.tools.refine:runtime", version.ref = "refine_version" } +shizuki-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku_version" } +shizuki-api = { module = "dev.rikka.shizuku:api", version.ref = "shizuku_version" } +compose-compiler-gradle-plugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin_version" } +wear-compose-ui-tooling = { module = "androidx.wear.compose:compose-ui-tooling", version.ref = "wear_compose_version" } +firebase-crashlytics-gradle = { module = "com.google.firebase:firebase-crashlytics-gradle", version.ref = "firebaseCrashlyticsGradleVersion" } +google-services = { module = "com.google.gms:google-services", version.ref = "googleServicesVersion" } +gradle = { module = "com.android.tools.build:gradle", version.ref = "gradleVersion" } +horologist-compose-tools = { module = "com.google.android.horologist:horologist-compose-tools", version.ref = "horologist_version" } +horologist-tiles = { module = "com.google.android.horologist:horologist-tiles", version.ref = "horologist_version" } +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin_version" } +desugar-jdk-libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_version" } +test-core = { module = "androidx.test:core", version.ref = "test_core_version" } +test-runner = { module = "androidx.test:runner", version.ref = "test_runner_version" } +test-rules = { module = "androidx.test:rules", version.ref = "test_rules_version" } +androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit_version" } +androidx-truth = { module = "androidx.test.ext:truth", version.ref = "androidx_truth_version" } +google-truth = { module = "com.google.truth:truth", version.ref = "google_truth_version" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx_version" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx_version" } +kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinx_version" } +core-ktx = { module = "androidx.core:core-ktx", version.ref = "core_version" } +fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment_version" } +preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preference_version" } +lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle_version" } +lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle_version" } +wearable = { module = "com.google.android.wearable:wearable", version.ref = "wearableVersion" } +work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work_version" } +core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coresplash_version" } +play-services-wearable = { module = "com.google.android.gms:play-services-wearable", version.ref = "play_services_wearable_version" } +app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "app_update_ktx_version" } +firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebase_version" } +firebase-analytics = { module = "com.google.firebase:firebase-analytics" } +firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" } +firebase-config = { module = "com.google.firebase:firebase-config" } +appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat_version" } +constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout_version" } +recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview_version" } +recyclerview-selection = { module = "androidx.recyclerview:recyclerview-selection", version.ref = "recyclerview_selection_version" } +media = { module = "androidx.media:media", version.ref = "media_version" } +material = { module = "com.google.android.material:material", version.ref = "material_version" } +timber = { module = "com.jakewharton.timber:timber", version.ref = "timber_version" } +gson = { module = "com.google.code.gson:gson", version.ref = "gson_version" } +dexmaker = { module = "com.linkedin.dexmaker:dexmaker", version.ref = "dexmaker_version" } +wear-compose-foundation = { module = "androidx.wear.compose:compose-foundation", version.ref = "wear_compose_version" } +wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wear_compose_version" } +wear-compose-navigation = { module = "androidx.wear.compose:compose-navigation", version.ref = "wear_compose_version" } +wear-protolayout-material3 = { module = "androidx.wear.protolayout:protolayout-material3", version.ref = "wear_protolayout_version" } +horologist-compose-layout = { module = "com.google.android.horologist:horologist-compose-layout", version.ref = "horologist_version" } +horologist-media-ui-material3 = { module = "com.google.android.horologist:horologist-media-ui-material3", version.ref = "horologist_version" } +wear-tiles = { module = "androidx.wear.tiles:tiles", version.ref = "wear_tiles_version" } +wear-tiles-testing = { module = "androidx.wear.tiles:tiles-testing", version.ref = "wear_tiles_version" } +wear-tiles-renderer = { module = "androidx.wear.tiles:tiles-renderer", version.ref = "wear_tiles_version" } +wear-tiles-tooling = { module = "androidx.wear.tiles:tiles-tooling", version.ref = "wear_tiles_version" } +wear-watchface-complications-data-source-ktx = { module = "androidx.wear.watchface:watchface-complications-data-source-ktx", version.ref = "wear_watchface_version" } +palette-ktx = { module = "androidx.palette:palette-ktx", version.ref = "palette_version" } +activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity_version" } +compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose_bom_version" } +navigation-runtime-ktx = { module = "androidx.navigation:navigation-runtime-ktx", version.ref = "navigation_version" } +datastore = { module = "androidx.datastore:datastore", version.ref = "datastore_version" } +wear = { module = "androidx.wear:wear", version.ref = "wear_version" } +wear-ongoing = { module = "androidx.wear:wear-ongoing", version.ref = "wear_ongoing_version" } +wear-phone-interactions = { module = "androidx.wear:wear-phone-interactions", version.ref = "wear_phone_interactions_version" } +wear-remote-interactions = { module = "androidx.wear:wear-remote-interactions", version.ref = "wear_remote_interactions_version" } +wear-tooling-preview = { module = "androidx.wear:wear-tooling-preview", version.ref = "wear_tooling_preview_version" } +reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable_version" } + +[plugins] diff --git a/hidden-api/build.gradle b/hidden-api/build.gradle index 8cec97d3..69eaba75 100644 --- a/hidden-api/build.gradle +++ b/hidden-api/build.gradle @@ -4,11 +4,11 @@ plugins { } android { - compileSdk rootProject.compileSdkVersion + compileSdk = libs.versions.compileSdkVersion.get().toInteger() defaultConfig { - minSdkVersion rootProject.minSdkVersion - targetSdkVersion rootProject.targetSdkVersion + minSdkVersion libs.versions.minSdkVersion.get().toInteger() + targetSdkVersion libs.versions.targetSdkVersion.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -38,7 +38,7 @@ android { } dependencies { - annotationProcessor 'dev.rikka.tools.refine:annotation-processor:4.4.0' - compileOnly 'dev.rikka.tools.refine:annotation:4.4.0' - implementation 'androidx.annotation:annotation:1.9.1' + annotationProcessor libs.refine.annotation.processor + compileOnly libs.refine.annotation + implementation libs.androidx.annotation } \ No newline at end of file diff --git a/mobile/build.gradle b/mobile/build.gradle index a0dc663a..c8f1c968 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdk = rootProject.compileSdkVersion + compileSdk = libs.versions.compileSdkVersion.get().toInteger() defaultConfig { applicationId "com.thewizrd.simplewear" @@ -18,8 +18,8 @@ android { // that the app's state is completely cleared between tests. testInstrumentationRunnerArguments clearPackageData: 'true' - minSdkVersion rootProject.minSdkVersion - targetSdkVersion rootProject.targetSdkVersion + minSdkVersion libs.versions.minSdkVersion.get().toInteger() + targetSdkVersion libs.versions.targetSdkVersion.get().toInteger() // NOTE: Version Code Format [TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1)] // NOTE: update SUPPORTED_VERSION_CODE if needed versionCode 351917000 @@ -66,47 +66,47 @@ android { dependencies { implementation project(":shared_resources") - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$desugar_version" + coreLibraryDesugaring libs.desugar.jdk.libs // Unit Testing - androidTestImplementation "androidx.test:core:$test_core_version" + androidTestImplementation libs.test.core // AndroidJUnitRunner and JUnit Rules - androidTestImplementation "androidx.test:runner:$test_runner_version" - androidTestImplementation "androidx.test:rules:$test_rules_version" + androidTestImplementation libs.test.runner + androidTestImplementation libs.test.rules // Assertions - androidTestImplementation "androidx.test.ext:junit:$junit_version" - androidTestImplementation "androidx.test.ext:truth:$androidx_truth_version" - androidTestImplementation "com.google.truth:truth:$google_truth_version" + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.truth + androidTestImplementation libs.google.truth // Kotlin - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlinx_version" - - implementation "androidx.core:core-ktx:$core_version" - implementation "androidx.preference:preference-ktx:$preference_version" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" - implementation "androidx.work:work-runtime-ktx:$work_version" - implementation "androidx.core:core-splashscreen:$coresplash_version" - - implementation 'com.google.android.gms:play-services-wearable:19.0.0' - implementation 'com.google.android.play:app-update-ktx:2.1.0' - - implementation platform("com.google.firebase:firebase-bom:$firebase_version") - implementation 'com.google.firebase:firebase-analytics' - implementation 'com.google.firebase:firebase-crashlytics' - implementation 'com.google.firebase:firebase-config' - - implementation "androidx.appcompat:appcompat:$appcompat_version" - implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" - implementation "androidx.recyclerview:recyclerview-selection:1.2.0" - implementation 'androidx.media:media:1.7.1' - - implementation "com.google.android.material:material:$material_version" - - implementation "com.jakewharton.timber:timber:$timber_version" - implementation "com.google.code.gson:gson:$gson_version" - implementation 'com.linkedin.dexmaker:dexmaker:2.28.6' -} \ No newline at end of file + implementation libs.kotlinx.coroutines.core + implementation libs.kotlinx.coroutines.android + implementation libs.kotlinx.coroutines.play.services + + implementation libs.core.ktx + implementation libs.preference.ktx + implementation libs.lifecycle.runtime.ktx + implementation libs.work.runtime.ktx + implementation libs.core.splashscreen + + implementation libs.play.services.wearable + implementation libs.app.update.ktx + + implementation platform(libs.firebase.bom) + implementation libs.firebase.analytics + implementation libs.firebase.crashlytics + implementation libs.firebase.config + + implementation libs.appcompat + implementation libs.constraintlayout + implementation libs.recyclerview.selection + implementation libs.media + + implementation libs.material + + implementation libs.timber + implementation libs.gson + implementation libs.dexmaker +} diff --git a/shared_resources/build.gradle b/shared_resources/build.gradle index f930fffa..e2ff600f 100644 --- a/shared_resources/build.gradle +++ b/shared_resources/build.gradle @@ -3,11 +3,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { - compileSdk = rootProject.compileSdkVersion + compileSdk = libs.versions.compileSdkVersion.get().toInteger() defaultConfig { - minSdkVersion rootProject.minSdkVersion - targetSdkVersion rootProject.targetSdkVersion + minSdkVersion libs.versions.minSdkVersion.get().toInteger() + targetSdkVersion libs.versions.targetSdkVersion.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -44,37 +44,37 @@ android { } dependencies { - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$desugar_version" + coreLibraryDesugaring libs.desugar.jdk.libs // Unit Testing - androidTestImplementation "androidx.test:core:$test_core_version" + androidTestImplementation libs.test.core // AndroidJUnitRunner and JUnit Rules - androidTestImplementation "androidx.test:runner:$test_runner_version" - androidTestImplementation "androidx.test:rules:$test_rules_version" + androidTestImplementation libs.test.runner + androidTestImplementation libs.test.rules // Assertions - androidTestImplementation "androidx.test.ext:junit:$junit_version" - androidTestImplementation "androidx.test.ext:truth:$androidx_truth_version" - androidTestImplementation "com.google.truth:truth:$google_truth_version" + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.truth + androidTestImplementation libs.google.truth // Kotlin - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlinx_version" - implementation "androidx.core:core-ktx:$core_version" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" - implementation "androidx.recyclerview:recyclerview:$recyclerview_version" + implementation libs.kotlinx.coroutines.core + implementation libs.kotlinx.coroutines.android + implementation libs.kotlinx.coroutines.play.services + implementation libs.core.ktx + implementation libs.lifecycle.runtime.ktx + implementation libs.recyclerview - implementation "androidx.appcompat:appcompat:$appcompat_version" + implementation libs.appcompat - implementation 'com.google.android.gms:play-services-wearable:19.0.0' + implementation libs.play.services.wearable - implementation platform("com.google.firebase:firebase-bom:$firebase_version") - implementation 'com.google.firebase:firebase-analytics' - implementation 'com.google.firebase:firebase-crashlytics' - implementation 'com.google.firebase:firebase-config' + implementation platform(libs.firebase.bom) + implementation libs.firebase.analytics + implementation libs.firebase.crashlytics + implementation libs.firebase.config - implementation "com.jakewharton.timber:timber:$timber_version" - implementation "com.google.code.gson:gson:$gson_version" + implementation libs.timber + implementation libs.gson } diff --git a/wear/build.gradle b/wear/build.gradle index 8b56ace0..53e2e9fd 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -6,12 +6,12 @@ apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'org.jetbrains.kotlin.plugin.compose' android { - compileSdk = rootProject.compileSdkVersion + compileSdk = libs.versions.compileSdkVersion.get().toInteger() defaultConfig { applicationId "com.thewizrd.simplewear" minSdkVersion 26 - targetSdkVersion rootProject.targetSdkVersion + targetSdkVersion libs.versions.targetSdkVersion.get().toInteger() // NOTE: Version Code Format (TargetSDK, Version Name, Build Number, Variant Code (Android: 0, WearOS: 1) versionCode 351917001 versionName "1.17.0" @@ -50,7 +50,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion compose_compiler_version + kotlinCompilerExtensionVersion libs.versions.compose.compiler.version.get() } kotlin { @@ -63,81 +63,81 @@ dependencies { implementation project(":shared_resources") implementation project(":unofficialtileapi") - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$desugar_version" + coreLibraryDesugaring libs.desugar.jdk.libs // Kotlin - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlinx_version" - - implementation "androidx.appcompat:appcompat:$appcompat_version" - implementation "androidx.core:core-ktx:$core_version" - implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" - implementation "androidx.fragment:fragment-ktx:$fragment_version" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" - implementation "androidx.recyclerview:recyclerview:$recyclerview_version" - implementation "androidx.preference:preference-ktx:$preference_version" - implementation "androidx.core:core-splashscreen:$coresplash_version" - implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version" - implementation "androidx.datastore:datastore:$datastore_version" - implementation "androidx.palette:palette-ktx:1.0.0" - - implementation platform("com.google.firebase:firebase-bom:$firebase_version") - implementation 'com.google.firebase:firebase-analytics' - implementation 'com.google.firebase:firebase-crashlytics' - implementation 'com.google.firebase:firebase-config' - - implementation "com.google.android.material:material:$material_version" + implementation libs.kotlinx.coroutines.core + implementation libs.kotlinx.coroutines.android + implementation libs.kotlinx.coroutines.play.services + + implementation libs.appcompat + implementation libs.core.ktx + implementation libs.constraintlayout + implementation libs.fragment.ktx + implementation libs.lifecycle.runtime.ktx + implementation libs.recyclerview + implementation libs.preference.ktx + implementation libs.core.splashscreen + implementation(libs.navigation.runtime.ktx) + implementation(libs.datastore) + implementation libs.palette.ktx + + implementation platform(libs.firebase.bom) + implementation libs.firebase.analytics + implementation libs.firebase.crashlytics + implementation libs.firebase.config + + implementation libs.material // WearOS - implementation 'com.google.android.gms:play-services-wearable:19.0.0' - compileOnly 'com.google.android.wearable:wearable:2.9.0' // Needed for Ambient Mode + implementation libs.play.services.wearable + compileOnly libs.wearable // Needed for Ambient Mode - implementation 'androidx.wear:wear:1.3.0' - implementation 'androidx.wear:wear-ongoing:1.1.0' - implementation 'androidx.wear:wear-phone-interactions:1.1.0' - implementation 'androidx.wear:wear-remote-interactions:1.1.0' - implementation "androidx.wear.watchface:watchface-complications-data:$wear_watchface_version" - implementation "androidx.wear.watchface:watchface-complications-data-source-ktx:$wear_watchface_version" + implementation libs.wear + implementation libs.wear.ongoing + implementation libs.wear.phone.interactions + implementation libs.wear.remote.interactions + implementation libs.androidx.watchface.complications.data + implementation libs.wear.watchface.complications.data.source.ktx // WearOS Tiles - implementation "androidx.wear.tiles:tiles:$wear_tiles_version" - debugImplementation "androidx.wear.tiles:tiles-renderer:$wear_tiles_version" - testImplementation "androidx.wear.tiles:tiles-testing:$wear_tiles_version" - debugImplementation "androidx.wear.tiles:tiles-tooling:$wear_tiles_version" - implementation "androidx.wear.tiles:tiles-tooling-preview:$wear_tiles_version" - implementation 'androidx.wear.protolayout:protolayout-material3:1.3.0' - implementation "com.google.android.horologist:horologist-tiles:$horologist_version" + implementation libs.wear.tiles + debugImplementation libs.wear.tiles.renderer + testImplementation libs.wear.tiles.testing + debugImplementation libs.wear.tiles.tooling + implementation libs.wear.tiles.tooling.preview + implementation libs.wear.protolayout.material3 + implementation libs.horologist.tiles // WearOS Compose - implementation "androidx.activity:activity-compose:$activity_version" - implementation "androidx.compose.compiler:compiler:$compose_compiler_version" - implementation platform("androidx.compose:compose-bom:$compose_bom_version") - implementation "androidx.compose.ui:ui" - implementation "androidx.compose.ui:ui-tooling-preview" - implementation "androidx.compose.animation:animation-graphics" - implementation "androidx.compose.runtime:runtime-livedata" - implementation "androidx.compose.material:material-icons-extended-android" - implementation "androidx.compose.material3:material3:$material_compose_version" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" - implementation "androidx.wear.compose:compose-foundation:$wear_compose_version" - implementation "androidx.wear.compose:compose-material3:$wear_compose_version" - implementation "androidx.wear.compose:compose-navigation:$wear_compose_version" - implementation "androidx.wear.compose:compose-ui-tooling:$wear_compose_version" - implementation "androidx.wear:wear-tooling-preview:1.0.0" - - implementation "com.google.accompanist:accompanist-drawablepainter:$accompanist_version" - implementation "com.google.android.horologist:horologist-audio-ui-material3:$horologist_version" - implementation "com.google.android.horologist:horologist-compose-layout:$horologist_version" - implementation "com.google.android.horologist:horologist-compose-tools:$horologist_version" - implementation "com.google.android.horologist:horologist-media-ui-material3:$horologist_version" - - implementation 'sh.calvin.reorderable:reorderable:3.0.0' - - androidTestImplementation platform("androidx.compose:compose-bom:$compose_bom_version") - androidTestImplementation "androidx.compose.ui:ui-test-junit4" - debugImplementation "androidx.compose.ui:ui-tooling" - - implementation "com.jakewharton.timber:timber:$timber_version" - implementation "com.google.code.gson:gson:$gson_version" + implementation(libs.activity.compose) + implementation libs.androidx.compose.compiler + implementation platform(libs.compose.bom) + implementation libs.androidx.compose.ui + implementation libs.androidx.compose.ui.tooling.preview + implementation libs.androidx.compose.animation.graphics + implementation libs.androidx.compose.runtime.livedata + implementation libs.androidx.compose.material.icons.extended.android + implementation libs.androidx.compose.material3 + implementation libs.lifecycle.viewmodel.compose + implementation libs.wear.compose.foundation + implementation libs.wear.compose.material3 + implementation libs.wear.compose.navigation + implementation libs.wear.compose.ui.tooling + implementation libs.wear.tooling.preview + + implementation libs.accompanist.drawablepainter + implementation libs.horologist.audio.ui.material3 + implementation libs.horologist.compose.layout + implementation libs.horologist.compose.tools + implementation libs.horologist.media.ui.material3 + + implementation libs.reorderable + + androidTestImplementation platform(libs.compose.bom) + androidTestImplementation libs.androidx.compose.ui.test.junit4 + debugImplementation libs.androidx.compose.ui.tooling + + implementation libs.timber + implementation libs.gson } diff --git a/wearsettings/build.gradle b/wearsettings/build.gradle index 064239fb..ca13197f 100644 --- a/wearsettings/build.gradle +++ b/wearsettings/build.gradle @@ -1,15 +1,15 @@ plugins { id('com.android.application') id('kotlin-android') - id('dev.rikka.tools.refine') version "$refine_version" + id('dev.rikka.tools.refine') version libs.versions.refine.version } android { - compileSdk = rootProject.compileSdkVersion + compileSdk = libs.versions.compileSdkVersion.get().toInteger() defaultConfig { applicationId "com.thewizrd.wearsettings" - minSdk rootProject.minSdkVersion + minSdk libs.versions.minSdkVersion.get().toInteger() //noinspection ExpiredTargetSdkVersion targetSdk 28 // NOTE: update SUPPORTED_VERSION_CODE if needed @@ -57,34 +57,34 @@ dependencies { implementation project(":shared_resources") compileOnly project(':hidden-api') - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$desugar_version" + coreLibraryDesugaring libs.desugar.jdk.libs // Unit Testing - androidTestImplementation "androidx.test:core:$test_core_version" + androidTestImplementation libs.test.core // AndroidJUnitRunner and JUnit Rules - androidTestImplementation "androidx.test:runner:$test_runner_version" - androidTestImplementation "androidx.test:rules:$test_rules_version" + androidTestImplementation libs.test.runner + androidTestImplementation libs.test.rules // Assertions - androidTestImplementation "androidx.test.ext:junit:$junit_version" - androidTestImplementation "androidx.test.ext:truth:$androidx_truth_version" - androidTestImplementation "com.google.truth:truth:$google_truth_version" + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.truth + androidTestImplementation libs.google.truth - implementation "androidx.core:core-ktx:$core_version" - implementation "androidx.appcompat:appcompat:$appcompat_version" - implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" + implementation libs.core.ktx + implementation libs.appcompat + implementation libs.constraintlayout - implementation "com.google.android.material:material:$material_version" + implementation libs.material - implementation "com.jakewharton.timber:timber:$timber_version" + implementation libs.timber // Root - implementation 'com.github.topjohnwu.libsu:core:3.1.2' + implementation libs.libsu.core // Shizuku - implementation "dev.rikka.shizuku:api:$shizuku_version" - implementation "dev.rikka.shizuku:provider:$shizuku_version" - implementation "dev.rikka.tools.refine:runtime:$refine_version" - implementation 'org.lsposed.hiddenapibypass:hiddenapibypass:6.1' + implementation libs.shizuki.api + implementation libs.shizuki.provider + implementation libs.refine.runtime + implementation libs.hiddenapibypass } \ No newline at end of file From 203105d17e6e495520be23ff692b8479eafd9d3e Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Wed, 29 Oct 2025 19:58:32 -0400 Subject: [PATCH 20/40] gradle: update dependencies --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cf5b98b3..0e0c4ff3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,9 +40,9 @@ androidx_truth_version = '1.7.0' google_truth_version = '1.4.5' material_version = '1.14.0-alpha06' -material_compose_version = '1.5.0-alpha06' +material_compose_version = "1.5.0-alpha07" -compose_bom_version = '2025.10.00' +compose_bom_version = "2025.10.01" compose_compiler_version = '1.5.15' wearableVersion = "2.9.0" From 02d9ad64f23d226672be386c81e35631a80cf979 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Wed, 29 Oct 2025 21:22:44 -0400 Subject: [PATCH 21/40] SimpleWear: update sleep timer icon --- .../src/main/res/drawable/ic_sleep_timer.xml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/shared_resources/src/main/res/drawable/ic_sleep_timer.xml b/shared_resources/src/main/res/drawable/ic_sleep_timer.xml index 32f8f05c..03fdb481 100644 --- a/shared_resources/src/main/res/drawable/ic_sleep_timer.xml +++ b/shared_resources/src/main/res/drawable/ic_sleep_timer.xml @@ -3,13 +3,14 @@ android:height="24dp" android:viewportWidth="6.35" android:viewportHeight="6.35"> - - - + + From dd6b1e7cbe3904f058dcb340bfb0cbcd4f4717c8 Mon Sep 17 00:00:00 2001 From: Dave Antoine Date: Sat, 1 Nov 2025 10:40:12 -0400 Subject: [PATCH 22/40] SimpleWear: M3Expressive migration pt. 3 --- .../com/thewizrd/simplewear/MainActivity.kt | 57 +- .../simplewear/PermissionCheckFragment.kt | 178 +++- .../simplewear/TimedActionsFragment.kt | 115 ++- .../simplewear/adapters/SpacerAdapter.kt | 42 + .../adapters/TimedActionsAdapter.kt | 8 +- .../helpers/SwipeToDeleteCallback.kt | 4 +- .../drawable/preference_round_background.xml | 30 + .../preference_round_background_bottom.xml | 32 + .../preference_round_background_center.xml | 28 + .../preference_round_background_top.xml | 32 + mobile/src/main/res/layout/activity_main.xml | 29 +- .../main/res/layout/fragment_permcheck.xml | 948 ++++++++---------- .../res/layout/fragment_timed_actions.xml | 106 +- .../main/res/layout/layout_action_item.xml | 2 +- mobile/src/main/res/menu/selectable_list.xml | 15 - mobile/src/main/res/values-night/styles.xml | 11 +- mobile/src/main/res/values/strings.xml | 1 + mobile/src/main/res/values/styles.xml | 120 ++- .../drawable/preference_round_background.xml | 30 + .../preference_round_background_bottom.xml | 32 + .../preference_round_background_center.xml | 28 + .../preference_round_background_top.xml | 32 + .../src/main/res/values-night/themes.xml | 2 +- wearsettings/src/main/res/values/themes.xml | 2 +- 24 files changed, 1160 insertions(+), 724 deletions(-) create mode 100644 mobile/src/main/java/com/thewizrd/simplewear/adapters/SpacerAdapter.kt create mode 100644 mobile/src/main/res/drawable/preference_round_background.xml create mode 100644 mobile/src/main/res/drawable/preference_round_background_bottom.xml create mode 100644 mobile/src/main/res/drawable/preference_round_background_center.xml create mode 100644 mobile/src/main/res/drawable/preference_round_background_top.xml delete mode 100644 mobile/src/main/res/menu/selectable_list.xml create mode 100644 wearsettings/src/main/res/drawable/preference_round_background.xml create mode 100644 wearsettings/src/main/res/drawable/preference_round_background_bottom.xml create mode 100644 wearsettings/src/main/res/drawable/preference_round_background_center.xml create mode 100644 wearsettings/src/main/res/drawable/preference_round_background_top.xml diff --git a/mobile/src/main/java/com/thewizrd/simplewear/MainActivity.kt b/mobile/src/main/java/com/thewizrd/simplewear/MainActivity.kt index 1b84fcec..461cf213 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/MainActivity.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/MainActivity.kt @@ -2,16 +2,12 @@ package com.thewizrd.simplewear import android.content.Intent import android.os.Bundle -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View import android.view.ViewTreeObserver +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.MenuProvider import androidx.lifecycle.lifecycleScope -import com.google.android.material.appbar.AppBarLayout import com.google.android.material.color.DynamicColors import com.thewizrd.simplewear.updates.InAppUpdateManager import kotlinx.coroutines.launch @@ -26,10 +22,11 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() + enableEdgeToEdge() super.onCreate(savedInstanceState) // Note: needed due to splash screen theme - DynamicColors.applyIfAvailable(this) + DynamicColors.applyToActivityIfAvailable(this) inAppUpdateManager = InAppUpdateManager.create(applicationContext) @@ -63,54 +60,6 @@ class MainActivity : AppCompatActivity() { } } } - - val appBarLayout = findViewById(R.id.app_bar) - appBarLayout.liftOnScrollTargetViewId = R.id.scrollView - appBarLayout.isLiftOnScroll = true - - setSupportActionBar(findViewById(R.id.toolbar)) - addMenuProvider(object : MenuProvider { - override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { - menuInflater.inflate(R.menu.actions, menu) - } - - override fun onMenuItemSelected(menuItem: MenuItem): Boolean { - when (menuItem.itemId) { - R.id.timed_actions -> { - supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, TimedActionsFragment()) - .addToBackStack("timedActions") - .commit() - return true - } - } - - return false - } - - override fun onPrepareMenu(menu: Menu) { - menu.setGroupVisible( - R.id.action_group, - supportFragmentManager.backStackEntryCount == 0 - ) - } - }) - supportActionBar?.setDefaultDisplayHomeAsUpEnabled(true) - - supportFragmentManager.addOnBackStackChangedListener { - supportActionBar?.setDisplayHomeAsUpEnabled(supportFragmentManager.backStackEntryCount > 0) - invalidateMenu() - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - supportFragmentManager.popBackStack() - } - } - - return super.onOptionsItemSelected(item) } override fun onResume() { diff --git a/mobile/src/main/java/com/thewizrd/simplewear/PermissionCheckFragment.kt b/mobile/src/main/java/com/thewizrd/simplewear/PermissionCheckFragment.kt index 6b4f66d6..9fbe9f94 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/PermissionCheckFragment.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/PermissionCheckFragment.kt @@ -1,6 +1,7 @@ package com.thewizrd.simplewear import android.Manifest +import android.annotation.SuppressLint import android.annotation.TargetApi import android.app.Activity import android.app.admin.DevicePolicyManager @@ -16,8 +17,9 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager +import android.content.res.Configuration.UI_MODE_NIGHT_MASK +import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.graphics.Color -import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings @@ -29,7 +31,11 @@ import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.IntentSenderRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.ColorInt import androidx.core.content.ContextCompat +import androidx.core.graphics.ColorUtils +import androidx.core.net.toUri +import androidx.core.view.children import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -62,6 +68,11 @@ import java.util.regex.Pattern class PermissionCheckFragment : LifecycleAwareFragment() { companion object { private const val TAG = "PermissionCheckFragment" + + private const val CORNERS_FULL = 0 + private const val CORNERS_TOP = 1 + private const val CORNERS_CENTER = 2 + private const val CORNERS_BOTTOM = 3 } private lateinit var binding: FragmentPermcheckBinding @@ -163,7 +174,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { ) .show() - binding.companionPairProgress.visibility = View.GONE + binding.companionPairProgress.hide() } } @@ -172,7 +183,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { if (it.resultCode == Activity.RESULT_OK) { pairDevice() } else { - binding.companionPairProgress.visibility = View.GONE + binding.companionPairProgress.hide() } } } @@ -184,6 +195,26 @@ class PermissionCheckFragment : LifecycleAwareFragment() { ): View { // Inflate the layout for this fragment binding = FragmentPermcheckBinding.inflate(inflater, container, false) + binding.toolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.timed_actions -> { + parentFragmentManager.beginTransaction() + .replace(R.id.fragment_container, TimedActionsFragment()) + .addToBackStack("timedActions") + .commit() + true + } + } + + false + } + binding.scrollView.children.firstOrNull().let { root -> + val parent = root as ViewGroup + + parent.viewTreeObserver.addOnGlobalLayoutListener { + updateRoundedBackground(parent) + } + } binding.torchPref.setOnClickListener { if (!isCameraPermissionEnabled(requireContext())) { permissionRequestLauncher.launch(arrayOf(Manifest.permission.CAMERA)) @@ -326,7 +357,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { binding.wearsettingsPref.setOnClickListener { if (!WearSettingsHelper.isWearSettingsInstalled() || !WearSettingsHelper.isWearSettingsUpToDate()) { val i = Intent(Intent.ACTION_VIEW).apply { - data = Uri.parse(getString(R.string.url_wearsettings_helper)) + data = getString(R.string.url_wearsettings_helper).toUri() } if (i.resolveActivity(requireContext().packageManager) != null) { startActivity(i) @@ -344,7 +375,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { if (!PhoneStatusHelper.isWriteSystemSettingsPermissionEnabled(ctx)) { runCatching { startActivity(Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS).apply { - data = Uri.parse("package:${ctx.packageName}") + data = "package:${ctx.packageName}".toUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK }) } @@ -387,7 +418,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !canScheduleExactAlarms(ctx)) { runCatching { startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM).apply { - data = Uri.parse("package:${ctx.packageName}") + data = "package:${ctx.packageName}".toUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK }) } @@ -410,11 +441,12 @@ class PermissionCheckFragment : LifecycleAwareFragment() { } } - binding.companionPairProgress.visibility = View.VISIBLE + binding.companionPairProgress.show() enqueueAction(requireContext(), WearableWorker.ACTION_REQUESTBTDISCOVERABLE) pairDevice() } + @SuppressLint("WrongConstant", "UseRequiresApi") @TargetApi(Build.VERSION_CODES.Q) private fun pairDevice() { runWithView { @@ -483,7 +515,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { context?.let { _ -> runCatching { lifecycleScope.launch { - binding.companionPairProgress.visibility = View.GONE + binding.companionPairProgress.hide() } companionDeviceResultLauncher.launch( IntentSenderRequest.Builder(it) @@ -499,7 +531,7 @@ class PermissionCheckFragment : LifecycleAwareFragment() { context?.let { ctx -> lifecycleScope.launch { - binding.companionPairProgress.visibility = View.GONE + binding.companionPairProgress.hide() Toast.makeText( ctx, R.string.message_nodevices_found, @@ -591,32 +623,57 @@ class PermissionCheckFragment : LifecycleAwareFragment() { private fun updateCamPermText(enabled: Boolean) { binding.torchPrefSummary.setText(if (enabled) R.string.permission_camera_enabled else R.string.permission_camera_disabled) - binding.torchPrefSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.torchPrefSummary.setTextColor( + getTextColor( + binding.torchPrefSummary.context, + enabled + ) + ) } private fun updateDeviceAdminText(enabled: Boolean) { binding.lockscreenSummary.setText(if (enabled) R.string.permission_admin_enabled else R.string.permission_lockscreen_disabled) - binding.lockscreenSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.lockscreenSummary.setTextColor( + getTextColor( + binding.lockscreenSummary.context, + enabled + ) + ) } private fun updateLockScreenText(enabled: Boolean) { binding.lockscreenSummary.setText(if (enabled) R.string.permission_lockscreen_enabled else R.string.permission_lockscreen_disabled) - binding.lockscreenSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.lockscreenSummary.setTextColor( + getTextColor( + binding.lockscreenSummary.context, + enabled + ) + ) } private fun updateDNDAccessText(enabled: Boolean) { binding.dndSummary.setText(if (enabled) R.string.permission_dnd_enabled else R.string.permission_dnd_disabled) - binding.dndSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.dndSummary.setTextColor(getTextColor(binding.dndSummary.context, enabled)) } private fun updatePairPermText(enabled: Boolean) { binding.companionPairSummary.setText(if (enabled) R.string.permission_pairdevice_enabled else R.string.permission_pairdevice_disabled) - binding.companionPairSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.companionPairSummary.setTextColor( + getTextColor( + binding.companionPairSummary.context, + enabled + ) + ) } private fun updateNotifListenerText(enabled: Boolean) { binding.notiflistenerSummary.setText(if (enabled) R.string.prompt_notifservice_enabled else R.string.prompt_notifservice_disabled) - binding.notiflistenerSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.notiflistenerSummary.setTextColor( + getTextColor( + binding.notiflistenerSummary.context, + enabled + ) + ) } private fun updateUninstallText(enabled: Boolean) { @@ -626,7 +683,12 @@ class PermissionCheckFragment : LifecycleAwareFragment() { private fun updateManageCallsText(enabled: Boolean) { binding.callcontrolSummary.setText(if (enabled) R.string.permission_callmanager_enabled else R.string.permission_callmanager_disabled) - binding.callcontrolSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.callcontrolSummary.setTextColor( + getTextColor( + binding.callcontrolSummary.context, + enabled + ) + ) } private fun updateWearSettingsHelperPref(installed: Boolean, upToDate: Boolean) { @@ -643,36 +705,50 @@ class PermissionCheckFragment : LifecycleAwareFragment() { ) binding.wearsettingsPrefSummary.setTextColor( if (installed) { - if (upToDate) Color.GREEN else Color.argb(0xFF, 0xFF, 0xA5, 0) + if (upToDate) { + getTextColor(binding.wearsettingsPrefSummary.context, true) + } else { + Color.argb(0xFF, 0xFF, 0xA5, 0) + } } else { - Color.RED + getTextColor(binding.wearsettingsPrefSummary.context, false) } ) } private fun updateSystemSettingsPref(enabled: Boolean) { binding.systemsettingsPrefSummary.setText(if (enabled) R.string.permission_systemsettings_enabled else R.string.permission_systemsettings_disabled) - binding.systemsettingsPrefSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.systemsettingsPrefSummary.setTextColor( + getTextColor( + binding.systemsettingsPrefSummary.context, + enabled + ) + ) } private fun updateNotificationPref(enabled: Boolean) { binding.notifPrefSummary.setText(if (enabled) R.string.permission_notifications_enabled else R.string.permission_notifications_disabled) - binding.notifPrefSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.notifPrefSummary.setTextColor( + getTextColor( + binding.notifPrefSummary.context, + enabled + ) + ) } private fun updateBTPref(enabled: Boolean) { binding.btPrefSummary.setText(if (enabled) R.string.permission_bt_enabled else R.string.permission_bt_disabled) - binding.btPrefSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.btPrefSummary.setTextColor(getTextColor(binding.btPrefSummary.context, enabled)) } private fun updateGesturesPref(enabled: Boolean) { binding.gesturesSummary.setText(if (enabled) R.string.permission_gestures_enabled else R.string.permission_gestures_disabled) - binding.gesturesSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.gesturesSummary.setTextColor(getTextColor(binding.gesturesSummary.context, enabled)) } private fun updateExactAlarmsPref(enabled: Boolean) { binding.alarmsSummary.setText(if (enabled) R.string.permission_exact_alarms_enabled else R.string.permission_exact_alarms_disabled) - binding.alarmsSummary.setTextColor(if (enabled) Color.GREEN else Color.RED) + binding.alarmsSummary.setTextColor(getTextColor(binding.alarmsSummary.context, enabled)) } @Suppress("DEPRECATION") @@ -681,14 +757,14 @@ class PermissionCheckFragment : LifecycleAwareFragment() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { runCatching { startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.parse("package:${ctx.packageName}") + data = "package:${ctx.packageName}".toUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK }) } } else { runCatching { startActivity(Intent(Intent.ACTION_UNINSTALL_PACKAGE).apply { - data = Uri.parse("package:${ctx.packageName}") + data = "package:${ctx.packageName}".toUri() }) } } @@ -740,4 +816,56 @@ class PermissionCheckFragment : LifecycleAwareFragment() { .setNegativeButton(android.R.string.cancel, null) .show() } + + @ColorInt + private fun getTextColor(context: Context, enabled: Boolean): Int { + return when (enabled) { + true -> if ((context.resources.configuration.uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) { + Color.GREEN + } else { + ColorUtils.blendARGB(Color.GREEN, Color.BLACK, 0.25f) + } + + false -> Color.RED + } + } + + private fun updateRoundedBackground(parent: ViewGroup) { + val permissionsPreferences = + parent.children.filter { it.tag == "permissions" && it.isVisible }.toList() + val settingsPreferences = + parent.children.filter { it.tag == "settings" && it.isVisible }.toList() + + permissionsPreferences.forEachIndexed { index, view -> + val cornerType = when { + permissionsPreferences.size <= 1 -> CORNERS_FULL + index == 0 -> CORNERS_TOP + index == permissionsPreferences.size - 1 -> CORNERS_BOTTOM + else -> CORNERS_CENTER + } + + when (cornerType) { + CORNERS_FULL -> view.setBackgroundResource(R.drawable.preference_round_background) + CORNERS_TOP -> view.setBackgroundResource(R.drawable.preference_round_background_top) + CORNERS_BOTTOM -> view.setBackgroundResource(R.drawable.preference_round_background_bottom) + CORNERS_CENTER -> view.setBackgroundResource(R.drawable.preference_round_background_center) + } + } + + settingsPreferences.forEachIndexed { index, view -> + val cornerType = when { + settingsPreferences.size <= 1 -> CORNERS_FULL + index == 0 -> CORNERS_TOP + index == settingsPreferences.size - 1 -> CORNERS_BOTTOM + else -> CORNERS_CENTER + } + + when (cornerType) { + CORNERS_FULL -> view.setBackgroundResource(R.drawable.preference_round_background) + CORNERS_TOP -> view.setBackgroundResource(R.drawable.preference_round_background_top) + CORNERS_BOTTOM -> view.setBackgroundResource(R.drawable.preference_round_background_bottom) + CORNERS_CENTER -> view.setBackgroundResource(R.drawable.preference_round_background_center) + } + } + } } \ No newline at end of file diff --git a/mobile/src/main/java/com/thewizrd/simplewear/TimedActionsFragment.kt b/mobile/src/main/java/com/thewizrd/simplewear/TimedActionsFragment.kt index 504ef6fa..21d82d6e 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/TimedActionsFragment.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/TimedActionsFragment.kt @@ -1,12 +1,10 @@ package com.thewizrd.simplewear +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.os.Bundle -import android.view.ActionMode import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuItem import android.view.MotionEvent import android.view.View import android.view.ViewGroup @@ -18,10 +16,15 @@ import androidx.recyclerview.selection.SelectionPredicates import androidx.recyclerview.selection.SelectionTracker import androidx.recyclerview.selection.StableIdKeyProvider import androidx.recyclerview.selection.StorageStrategy +import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.transition.TransitionManager +import com.google.android.material.transition.MaterialFade import com.thewizrd.shared_resources.actions.Actions +import com.thewizrd.shared_resources.utils.ContextUtils.dpToPx +import com.thewizrd.simplewear.adapters.SpacerAdapter import com.thewizrd.simplewear.adapters.TimedActionsAdapter import com.thewizrd.simplewear.databinding.FragmentTimedActionsBinding import com.thewizrd.simplewear.helpers.AlarmStateManager @@ -39,49 +42,6 @@ class TimedActionsFragment : Fragment(), SharedPreferences.OnSharedPreferenceCha private lateinit var onBackPressedCallback: OnBackPressedCallback - private var actionMode: ActionMode? = null - private val actionModeCallback = object : ActionMode.Callback { - override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { - activity?.menuInflater?.inflate(R.menu.selectable_list, menu) - actionMode = mode - return true - } - - override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { - return false - } - - override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { - return when (item?.itemId) { - R.id.action_selectAll -> { - selectionTracker.setItemsSelected( - actionAdapter.currentList.map { it.action.actionType.value.toLong() }, - true - ) - true - } - - R.id.action_delete -> { - selectionTracker.selection.forEach { itemId -> - deleteAction(actionId = itemId) - } - true - } - - else -> false - } - } - - override fun onDestroyActionMode(mode: ActionMode?) { - selectionTracker.clearSelection() - actionMode = null - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -93,7 +53,25 @@ class TimedActionsFragment : Fragment(), SharedPreferences.OnSharedPreferenceCha actionAdapter = TimedActionsAdapter() actionAdapter.setHasStableIds(true) - binding.recyclerView.adapter = actionAdapter + binding.recyclerView.adapter = ConcatAdapter( + ConcatAdapter.Config.Builder() + .setStableIdMode(ConcatAdapter.Config.StableIdMode.SHARED_STABLE_IDS) + .build(), + actionAdapter, SpacerAdapter(requireContext().dpToPx(64f).toInt()) + ) + + binding.actionDelete.setOnClickListener { + selectionTracker.selection.toList().forEach { itemId -> + deleteAction(actionId = itemId) + } + } + + binding.actionSelectAll.setOnClickListener { + selectionTracker.setItemsSelected( + actionAdapter.currentList.map { it.action.actionType.value.toLong() }, + true + ) + } val keyProvider = StableIdKeyProvider(binding.recyclerView) val sBuilder = SelectionTracker.Builder( @@ -128,26 +106,47 @@ class TimedActionsFragment : Fragment(), SharedPreferences.OnSharedPreferenceCha selectionTracker.addObserver(object : SelectionTracker.SelectionObserver() { override fun onSelectionChanged() { - if (selectionTracker.selection.isEmpty) { + if (!selectionTracker.hasSelection()) { onBackPressedCallback.isEnabled = false - actionMode?.finish() + animateToolbar(false) } else { onBackPressedCallback.isEnabled = true - if (actionMode == null) { - activity?.startActionMode(actionModeCallback) - } + animateToolbar(true) } - actionMode?.title = selectionTracker.selection.size().toString() + binding.selectionCount.text = selectionTracker.selection.size().toString() } + @SuppressLint("RestrictedApi") override fun onSelectionCleared() { onBackPressedCallback.isEnabled = false - actionMode?.finish() + animateToolbar(false) } }) val swipeToDeleteHandler = object : SwipeToDeleteCallback(requireContext()) { + override fun getSwipeDirs( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + return if (viewHolder is TimedActionsAdapter.TimedActionViewHolder) { + super.getSwipeDirs(recyclerView, viewHolder) + } else { + 0 + } + } + + override fun getDragDirs( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + return if (viewHolder is TimedActionsAdapter.TimedActionViewHolder) { + super.getDragDirs(recyclerView, viewHolder) + } else { + 0 + } + } + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { if (viewHolder is TimedActionsAdapter.TimedActionViewHolder) { val ctx = viewHolder.itemView.context @@ -192,5 +191,13 @@ class TimedActionsFragment : Fragment(), SharedPreferences.OnSharedPreferenceCha val action = Actions.valueOf(actionId.toInt()) PhoneStatusHelper.removedScheduledTimedAction(ctx, action) WearableWorker.enqueueAction(ctx, WearableWorker.ACTION_SENDTIMEDACTIONSUPDATE) + selectionTracker.deselect(actionId) + } + + private fun animateToolbar(visible: Boolean) { + TransitionManager.beginDelayedTransition(binding.root, MaterialFade().apply { + duration = if (visible) 150 else 84 + }) + binding.floatingToolbar.isVisible = visible } } \ No newline at end of file diff --git a/mobile/src/main/java/com/thewizrd/simplewear/adapters/SpacerAdapter.kt b/mobile/src/main/java/com/thewizrd/simplewear/adapters/SpacerAdapter.kt new file mode 100644 index 00000000..eac0593b --- /dev/null +++ b/mobile/src/main/java/com/thewizrd/simplewear/adapters/SpacerAdapter.kt @@ -0,0 +1,42 @@ +package com.thewizrd.simplewear.adapters + +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.widget.Space +import androidx.annotation.Px +import androidx.recyclerview.widget.RecyclerView +import com.thewizrd.simplewear.R + +class SpacerAdapter(@Px private val spacerSize: Int) : + RecyclerView.Adapter() { + + init { + setHasStableIds(true) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return object : RecyclerView.ViewHolder( + Space(parent.context).apply { + layoutParams = RecyclerView.LayoutParams( + MATCH_PARENT, spacerSize + ) + } + ) {} + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + // no-op + } + + override fun getItemCount(): Int { + return 1 + } + + override fun getItemViewType(position: Int): Int { + return R.id.spacer + } + + override fun getItemId(position: Int): Long { + return R.id.spacer.toLong() + } +} \ No newline at end of file diff --git a/mobile/src/main/java/com/thewizrd/simplewear/adapters/TimedActionsAdapter.kt b/mobile/src/main/java/com/thewizrd/simplewear/adapters/TimedActionsAdapter.kt index aa34fca0..8f56c125 100644 --- a/mobile/src/main/java/com/thewizrd/simplewear/adapters/TimedActionsAdapter.kt +++ b/mobile/src/main/java/com/thewizrd/simplewear/adapters/TimedActionsAdapter.kt @@ -60,15 +60,15 @@ class TimedActionsAdapter : ListAdapter + + + + + + + + + + \ No newline at end of file diff --git a/mobile/src/main/res/drawable/preference_round_background_bottom.xml b/mobile/src/main/res/drawable/preference_round_background_bottom.xml new file mode 100644 index 00000000..208a469b --- /dev/null +++ b/mobile/src/main/res/drawable/preference_round_background_bottom.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/src/main/res/drawable/preference_round_background_center.xml b/mobile/src/main/res/drawable/preference_round_background_center.xml new file mode 100644 index 00000000..66cbcce3 --- /dev/null +++ b/mobile/src/main/res/drawable/preference_round_background_center.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/src/main/res/drawable/preference_round_background_top.xml b/mobile/src/main/res/drawable/preference_round_background_top.xml new file mode 100644 index 00000000..053faa4c --- /dev/null +++ b/mobile/src/main/res/drawable/preference_round_background_top.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/src/main/res/layout/activity_main.xml b/mobile/src/main/res/layout/activity_main.xml index da0838da..77ca5cd2 100644 --- a/mobile/src/main/res/layout/activity_main.xml +++ b/mobile/src/main/res/layout/activity_main.xml @@ -1,34 +1,13 @@ - - - - - - - + tools:context=".MainActivity"> + android:layout_height="match_parent" /> - + diff --git a/mobile/src/main/res/layout/fragment_permcheck.xml b/mobile/src/main/res/layout/fragment_permcheck.xml index dd384148..06e2b255 100644 --- a/mobile/src/main/res/layout/fragment_permcheck.xml +++ b/mobile/src/main/res/layout/fragment_permcheck.xml @@ -1,587 +1,509 @@ - + tools:theme="@style/Theme.Material3Expressive.DayNight.NoActionBar"> - + android:background="?colorSurfaceContainer" + android:fitsSystemWindows="true" + app:expanded="false" + app:liftOnScroll="false" + app:liftOnScrollTargetViewId="@id/scrollView" + tools:expanded="true" + tools:stateListAnimator="@null"> + + + + + + + + + + + android:orientation="vertical"> - + android:orientation="vertical" + style="@style/Permissions.Preference.Category.Expressive"> - + - - - + + - - + + + + + + + + + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - + - - - + + + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - + - - - + + + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - + - - - + + + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - + - - - + - - - - - - - + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - - - - - + - + - - - - - + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - - - - - + - + - - - - - - - + tools:visibility="visible"> + + + + + + + + - + - - - - - + - + - - - - - + + + + + + + + + + + + + + + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - + + + - + style="@style/Permissions.Preference.Expressive" + android:tag="permissions"> - + - - - - - + - + - - - - - - - + android:orientation="vertical" + style="@style/Permissions.Preference.Category.Expressive"> - + - + - - - + + + + + + + + - - + + + + + + + + + + + style="@style/Permissions.Preference.Expressive" + android:tag="settings"> + + + + + + + + + + - + - + - \ No newline at end of file + \ No newline at end of file diff --git a/mobile/src/main/res/layout/fragment_timed_actions.xml b/mobile/src/main/res/layout/fragment_timed_actions.xml index abebd27b..7ef508cb 100644 --- a/mobile/src/main/res/layout/fragment_timed_actions.xml +++ b/mobile/src/main/res/layout/fragment_timed_actions.xml @@ -1,16 +1,58 @@ - + android:background="?colorSurfaceContainer" + tools:context=".TimedActionsFragment" + tools:theme="@style/Theme.Material3Expressive.DayNight.NoActionBar"> + + + + + + + + + + - \ No newline at end of file + + + + + + +