From 609737e414737cc4ee7d6f7dc3e33333f1ea7e40 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 7 Jul 2023 11:01:40 +0200 Subject: [PATCH] wearos adjustments --- .../android/en-US/full_description.txt | 14 +- version.properties | 2 +- .../habitica/ui/activities/LoginActivity.kt | 2 +- .../habitica/ui/activities/MainActivity.kt | 2 +- .../ui/activities/SettingsActivity.kt | 2 +- .../habitica/ui/activities/SplashActivity.kt | 2 - .../habitica/ui/views/TextViewWrapper.kt | 67 ++++ .../wearos/habitica/ui/views/TimeText.kt | 306 ++++++++++++++++++ .../habitica/util/TopScrollAwayBehavior.kt | 53 +++ wearos/src/main/res/layout/activity_login.xml | 18 +- wearos/src/main/res/layout/activity_main.xml | 22 +- .../src/main/res/layout/activity_settings.xml | 21 +- .../src/main/res/layout/activity_splash.xml | 26 +- .../src/main/res/layout/activity_tasklist.xml | 8 +- .../src/main/res/layout/curved_time_text.xml | 53 +++ .../main/res/layout/straight_time_text.xml | 63 ++++ wearos/src/main/res/values/attrs.xml | 6 +- wearos/src/main/res/values/styles.xml | 10 +- 18 files changed, 641 insertions(+), 36 deletions(-) create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TextViewWrapper.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TimeText.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/util/TopScrollAwayBehavior.kt create mode 100644 wearos/src/main/res/layout/curved_time_text.xml create mode 100644 wearos/src/main/res/layout/straight_time_text.xml diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 57ae3e75f..f716419f5 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,7 +1,9 @@ Habitica is a free habit-building and productivity app that uses retro RPG elements to gamify your tasks and goals. Use Habitica to help with ADHD, self care, New Year’s resolutions, household chores, work tasks, creative projects, fitness goals, back-to-school routines, and more! + How it works: Create an avatar then add tasks, chores, or goals you’d like to work on. When you do something in real life, check it off in the app and receive gold, experience, and items that can be used in-game! + Features: • Automatically repeating tasks scheduled for your daily, weekly, or monthly routines • Flexible habit tracker for tasks you want to do multiple times a day or only once in awhile @@ -17,8 +19,16 @@ Features: • Reminders and widgets to help keep you on track • Customizable color themes with dark and light mode • Syncing across devices -• Brand new WearOS watch app available in version 4.0! + +Want even more flexibility to take your tasks on the go? We have a Wear OS app on the watch! +Wear OS features: +• View, create, and complete Habites, Dailies, and To do’s +• Receive rewards for your efforts with experience, food, eggs, and potions +• Track your stats with dynamic progress bars +• Show off your stunning pixel avatar on the watch face + — + Habitica is an open-source app run by a small team that’s made better by the work of volunteers who contribute pixel art, translations, bug fixes, and more. If you’d like to contribute, reach out! Community, privacy, and transparency are important to us. Your tasks are private and we don’t sell your personal data to third parties. -If you have any questions, feel free to send feedback to admin@habitica.com! And if you enjoy our app, we would really appreciate it if you would leave us a review. \ No newline at end of file +If you have any questions, feel free to send feedback to admin@habitica.com! And if you enjoy our app, we would really appreciate it if you would leave us a review. \ No newline at end of file diff --git a/version.properties b/version.properties index be3ab81a0..d90835ba9 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.2.3 -CODE=6181 \ No newline at end of file +CODE=6201 \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt index 550340237..1e31df4d0 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt @@ -62,7 +62,7 @@ class LoginActivity : BaseActivity() { binding.loginButton.isVisible = true } } - binding.root.smoothScrollTo(0, 0) + binding.scrollView.smoothScrollTo(0, 0) } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt index 2fdb480e8..5653194e5 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt @@ -32,7 +32,7 @@ class MainActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { binding = ActivityMainBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - binding.root.apply { + binding.recyclerView.apply { layoutManager = WearableLinearLayoutManager(this@MainActivity, HabiticaScrollingLayoutCallback()) adapter = this@MainActivity.adapter diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt index 5ff13ce66..20a6df1d1 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt @@ -27,7 +27,7 @@ class SettingsActivity : BaseActivity() { } else { stopAnimatingProgress() } - binding.textView.isVisible = show delay(90.toDuration(DurationUnit.SECONDS)) if (isActive) { // the sync attempt has timed out diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TextViewWrapper.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TextViewWrapper.kt new file mode 100644 index 000000000..3be1f62e2 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TextViewWrapper.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2021 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.example.android.wearable.timetext + +import android.view.View +import android.widget.TextView +import androidx.wear.widget.CurvedTextView + +/** + * A wrapper around a [TextView] like object, that may not actually extend [TextView] (like a [CurvedTextView]). + */ +interface TextViewWrapper { + val view: View + var text: CharSequence? + var textColor: Int +} + +/** + * A [TextViewWrapper] wrapping a [CurvedTextView]. + */ +class CurvedTextViewWrapper( + override val view: CurvedTextView +) : TextViewWrapper { + override var text: CharSequence? + get() = view.text + set(value) { + view.text = value?.toString().orEmpty() + } + + override var textColor: Int + get() = view.textColor + set(value) { + view.textColor = value + } +} + +/** + * A [TextViewWrapper] wrapping a [TextView]. + */ +class NormalTextViewWrapper( + override val view: TextView +) : TextViewWrapper { + override var text: CharSequence? + get() = view.text + set(value) { + view.text = value + } + + override var textColor: Int + get() = view.currentTextColor + set(value) { + view.setTextColor(value) + } +} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TimeText.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TimeText.kt new file mode 100644 index 000000000..8d88acddc --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/TimeText.kt @@ -0,0 +1,306 @@ +/* + * Copyright 2021 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.habitrpg.wearos.habitica.ui.views + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.database.ContentObserver +import android.graphics.Color +import android.provider.Settings +import android.text.format.DateFormat +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import androidx.annotation.AttrRes +import androidx.annotation.StyleRes +import androidx.annotation.VisibleForTesting +import androidx.core.content.res.use +import androidx.core.os.ConfigurationCompat +import androidx.core.view.isGone +import com.example.android.wearable.timetext.CurvedTextViewWrapper +import com.example.android.wearable.timetext.NormalTextViewWrapper +import com.example.android.wearable.timetext.TextViewWrapper +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.CurvedTimeTextBinding +import com.habitrpg.android.habitica.databinding.StraightTimeTextBinding +import com.habitrpg.wearos.habitica.ui.views.TimeText.Clock +import com.habitrpg.wearos.habitica.ui.views.TimeTextViewBinding.TimeTextCurvedViewBinding +import com.habitrpg.wearos.habitica.ui.views.TimeTextViewBinding.TimeTextStraightViewBinding +import java.util.Calendar + +/** + * The max sweep angle for the [TimeText] to occupy. + */ +private const val MAX_SWEEP_ANGLE = 90f + +class TimeText @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + @AttrRes defStyleAttr: Int = 0, + @StyleRes defStyleRes: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + + /** + * The underlying [Calendar] instance for producing the time. + * + * This will be updated in [onTimeZoneChange] in response to any timezone updates. + */ + private var time = Calendar.getInstance() + + /** + * True if we should format the time in the 24 hour manner. + * + * This will be updated in [onTimeFormatChange] in response to any format updates. + */ + private var use24HourFormat = DateFormat.is24HourFormat(context) + + /** + * An [IntentFilter] for any time related broadcast. + */ + private val timeBroadcastReceiverFilter = IntentFilter().apply { + addAction(Intent.ACTION_TIME_TICK) + addAction(Intent.ACTION_TIME_CHANGED) + addAction(Intent.ACTION_TIMEZONE_CHANGED) + } + + private val timeBroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + Intent.ACTION_TIMEZONE_CHANGED -> onTimeZoneChange() + Intent.ACTION_TIME_TICK, Intent.ACTION_TIME_CHANGED -> onTimeChange() + } + } + } + + /** + * The wrapped view binding for the inflated views. + */ + private val timeTextViewBinding: TimeTextViewBinding + + /** + * A non-clock portion of the time text to display. + */ + var title: CharSequence? = null + set(value) { + field = value + + timeTextViewBinding.timeTextTitle.text = title + + // Only show the title and divider if the title is non-empty + val hideTitle = title.isNullOrEmpty() + timeTextViewBinding.timeTextTitle.view.isGone = hideTitle + timeTextViewBinding.timeTextDivider.view.isGone = hideTitle + } + + /** + * The color of the non-clock portion of the time text. + */ + var titleTextColor: Int = Color.WHITE + set(value) { + field = value + + timeTextViewBinding.timeTextTitle.textColor = titleTextColor + } + + /** + * The backing [Clock] used to drive the time. + * + * Overridable for testing. + */ + @VisibleForTesting + var clock: Clock = Clock(System::currentTimeMillis) + set(value) { + field = value + onTimeChange() + } + + /** + * The [ContentObserver] listening for a time format change. + * + * This is constructed lazily, since [getHandler] needs the view to be attached. + */ + private val timeContentObserver by lazy(LazyThreadSafetyMode.NONE) { + object : ContentObserver(handler) { + override fun onChange(selfChange: Boolean) { + super.onChange(selfChange) + onTimeFormatChange() + } + } + } + + init { + val layoutInflater = LayoutInflater.from(context) + + // Create the view structure based on whether the screen is round. + // This will inflate one of two distinct layouts, which we abstract away in a TimeTextViewBinding + timeTextViewBinding = if (resources.configuration.isScreenRound) { + TimeTextCurvedViewBinding(CurvedTimeTextBinding.inflate(layoutInflater, this, true)) + } else { + TimeTextStraightViewBinding(StraightTimeTextBinding.inflate(layoutInflater, this, true)) + } + + // Set the divider text + timeTextViewBinding.timeTextDivider.text = "·" + + // Update based on the styled attributes. + // Note that this runs the side-effects of setting those attributes. + context.obtainStyledAttributes(attrs, R.styleable.TimeText, defStyleAttr, defStyleRes) + .use { typedArray -> + titleTextColor = + typedArray.getColor(R.styleable.TimeText_android_titleTextColor, titleTextColor) + title = typedArray.getString(R.styleable.TimeText_titleText) + } + } + + /** + * Restrict the total sweep angle on round screens to [MAX_SWEEP_ANGLE]. + * + * We accomplish this with two measure passes: + * + * After the first, we measure to get the angle that the clock and divider occupy (together, these shouldn't ever + * be more than [MAX_SWEEP_ANGLE]. + * + * Then, we update the title's max sweep angle to the remaining angle, and measure again to apply the limit. + */ + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + when (timeTextViewBinding) { + is TimeTextCurvedViewBinding -> { + // Reset the title sweep to ensure we get a true initial measurement + timeTextViewBinding.timeTextTitle.view.setSweepRangeDegrees(0f, MAX_SWEEP_ANGLE) + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + + val clockSweepAngle = + timeTextViewBinding.timeTextClock.view.sweepAngleDegrees.coerceAtLeast(0f) + + // Avoid getting the divider sweep angle if it is gone, since it won't be accurate + val dividerSweepAngle = if (timeTextViewBinding.timeTextDivider.view.isGone) { + 0f + } else { + timeTextViewBinding.timeTextDivider.view.sweepAngleDegrees.coerceAtLeast(0f) + } + + val maxTitleSweepAngle = MAX_SWEEP_ANGLE - clockSweepAngle - dividerSweepAngle + + // Update the title max sweep angle to effectively get a total max sweep of MAX_SWEEP_ANGLE + timeTextViewBinding.timeTextTitle.view.setSweepRangeDegrees(0f, maxTitleSweepAngle) + + // Measure again, with the updated max sweep + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + is TimeTextStraightViewBinding -> { + // Need to do nothing special the for the straight view, just call through to super + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + onTimeZoneChange() + onTimeFormatChange() + onTimeChange() + + context.contentResolver.registerContentObserver( + Settings.System.getUriFor(Settings.System.TIME_12_24), + true, + timeContentObserver + ) + context.registerReceiver(timeBroadcastReceiver, timeBroadcastReceiverFilter) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + context.contentResolver.unregisterContentObserver(timeContentObserver) + context.unregisterReceiver(timeBroadcastReceiver) + } + + private fun onTimeChange() { + val pattern = DateFormat.getBestDateTimePattern( + ConfigurationCompat.getLocales(resources.configuration)[0], + if (use24HourFormat) "Hm" else "hm" + ) + // Remove the am/pm indicator (if any). This is locale safe. + val patternWithoutAmPm = pattern.replace("a", "").trim() + + time.timeInMillis = clock.getCurrentTimeMillis() + timeTextViewBinding.timeTextClock.text = DateFormat.format(patternWithoutAmPm, time) + } + + private fun onTimeZoneChange() { + time = Calendar.getInstance() + onTimeChange() + } + + private fun onTimeFormatChange() { + use24HourFormat = DateFormat.is24HourFormat(context) + onTimeChange() + } + + /** + * A provider of the current time. + */ + fun interface Clock { + + /** + * Returns the current time in milliseconds since the epoch. + */ + fun getCurrentTimeMillis(): Long + } +} + +/** + * An abstraction around the view binding, since we inflate two different layouts depending on the shape of the screen. + */ +private sealed class TimeTextViewBinding { + + abstract val timeTextTitle: TextViewWrapper + + abstract val timeTextDivider: TextViewWrapper + + abstract val timeTextClock: TextViewWrapper + + /** + * The [TimeTextViewBinding] wrapping the [CurvedTimeTextBinding]. + */ + class TimeTextCurvedViewBinding( + timeTextBinding: CurvedTimeTextBinding + ) : TimeTextViewBinding() { + override val timeTextTitle: CurvedTextViewWrapper = + CurvedTextViewWrapper(timeTextBinding.timeTextTitle) + override val timeTextDivider: CurvedTextViewWrapper = + CurvedTextViewWrapper(timeTextBinding.timeTextDivider) + override val timeTextClock: CurvedTextViewWrapper = + CurvedTextViewWrapper(timeTextBinding.timeTextClock) + } + + /** + * The [TimeTextViewBinding] wrapping the [StraightTimeTextBinding]. + */ + class TimeTextStraightViewBinding( + timeTextBinding: StraightTimeTextBinding + ) : TimeTextViewBinding() { + override val timeTextTitle: NormalTextViewWrapper = + NormalTextViewWrapper(timeTextBinding.timeTextTitle) + override val timeTextDivider: NormalTextViewWrapper = + NormalTextViewWrapper(timeTextBinding.timeTextDivider) + override val timeTextClock: NormalTextViewWrapper = + NormalTextViewWrapper(timeTextBinding.timeTextClock) + } +} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/util/TopScrollAwayBehavior.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/util/TopScrollAwayBehavior.kt new file mode 100644 index 000000000..a24facab5 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/util/TopScrollAwayBehavior.kt @@ -0,0 +1,53 @@ +package com.habitrpg.wearos.habitica.util + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.ViewCompat +import kotlin.math.abs +import kotlin.math.min + +class TopScrollAwayBehavior(context: Context, attrs: AttributeSet) : + CoordinatorLayout.Behavior(context, attrs) { + + override fun onStartNestedScroll( + coordinatorLayout: CoordinatorLayout, + child: V, + directTargetChild: View, + target: View, + axes: Int, + type: Int + ): Boolean { + return axes == ViewCompat.SCROLL_AXIS_VERTICAL + } + + override fun onNestedPreScroll( + coordinatorLayout: CoordinatorLayout, + child: V, + target: View, + dx: Int, + dy: Int, + consumed: IntArray, + type: Int + ) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type) + child.translationY = min(0f, -min(child.height.toFloat(), -child.translationY + dy)) + } + + override fun onStopNestedScroll( + coordinatorLayout: CoordinatorLayout, + child: V, + target: View, + type: Int + ) { + super.onStopNestedScroll(coordinatorLayout, child, target, type) + if (child.translationY != 0f && abs(child.translationY) != child.height.toFloat()) { + if (abs(child.translationY) < (child.height.toFloat() / 2f) && abs(child.translationY) < 40) { + child.translationY = 0f + } else { + child.translationY = if (child.top < child.bottom) -child.height.toFloat() else child.height.toFloat() + } + } + } +} diff --git a/wearos/src/main/res/layout/activity_login.xml b/wearos/src/main/res/layout/activity_login.xml index d262a6074..575e9a6d2 100644 --- a/wearos/src/main/res/layout/activity_login.xml +++ b/wearos/src/main/res/layout/activity_login.xml @@ -1,6 +1,10 @@ - + @@ -15,7 +19,8 @@ android:layout_height="16dp" android:src="@drawable/ic_gryphon_white" android:importantForAccessibility="no" - android:layout_marginBottom="@dimen/spacing_medium"/> + android:layout_marginBottom="@dimen/spacing_medium" + android:layout_marginTop="24dp"/> - \ No newline at end of file + + + diff --git a/wearos/src/main/res/layout/activity_main.xml b/wearos/src/main/res/layout/activity_main.xml index ddd9427f2..0958a6368 100644 --- a/wearos/src/main/res/layout/activity_main.xml +++ b/wearos/src/main/res/layout/activity_main.xml @@ -1,11 +1,21 @@ - - - \ No newline at end of file + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + diff --git a/wearos/src/main/res/layout/activity_settings.xml b/wearos/src/main/res/layout/activity_settings.xml index 07afd292e..a03e5c736 100644 --- a/wearos/src/main/res/layout/activity_settings.xml +++ b/wearos/src/main/res/layout/activity_settings.xml @@ -1,10 +1,21 @@ - - - \ No newline at end of file + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + diff --git a/wearos/src/main/res/layout/activity_splash.xml b/wearos/src/main/res/layout/activity_splash.xml index c96a44138..ed956e78a 100644 --- a/wearos/src/main/res/layout/activity_splash.xml +++ b/wearos/src/main/res/layout/activity_splash.xml @@ -1,17 +1,21 @@ - - - \ No newline at end of file + + + + + diff --git a/wearos/src/main/res/layout/activity_tasklist.xml b/wearos/src/main/res/layout/activity_tasklist.xml index 68bf693e6..97047fe1b 100644 --- a/wearos/src/main/res/layout/activity_tasklist.xml +++ b/wearos/src/main/res/layout/activity_tasklist.xml @@ -14,4 +14,10 @@ android:layout_height="39dp" android:layout_gravity="center|bottom" app:layout_behavior="com.habitrpg.wearos.habitica.util.ScrollAwayBehavior"/> - \ No newline at end of file + + diff --git a/wearos/src/main/res/layout/curved_time_text.xml b/wearos/src/main/res/layout/curved_time_text.xml new file mode 100644 index 000000000..780000d3d --- /dev/null +++ b/wearos/src/main/res/layout/curved_time_text.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + diff --git a/wearos/src/main/res/layout/straight_time_text.xml b/wearos/src/main/res/layout/straight_time_text.xml new file mode 100644 index 000000000..6a47a77e5 --- /dev/null +++ b/wearos/src/main/res/layout/straight_time_text.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + diff --git a/wearos/src/main/res/values/attrs.xml b/wearos/src/main/res/values/attrs.xml index 7ee35e9b5..99b6a8a7a 100644 --- a/wearos/src/main/res/values/attrs.xml +++ b/wearos/src/main/res/values/attrs.xml @@ -19,4 +19,8 @@ - \ No newline at end of file + + + + + diff --git a/wearos/src/main/res/values/styles.xml b/wearos/src/main/res/values/styles.xml index 02945d79b..b9e503e60 100644 --- a/wearos/src/main/res/values/styles.xml +++ b/wearos/src/main/res/values/styles.xml @@ -105,4 +105,12 @@ @color/watch_gray_200 - \ No newline at end of file + + +