improve login flow

This commit is contained in:
Phillip Thelen 2022-06-22 10:34:35 +02:00
parent 3d6949e2cc
commit 587ec56600
37 changed files with 147 additions and 129 deletions

View file

@ -4,7 +4,7 @@ import com.habitrpg.common.habitica.models.auth.UserAuth
import com.habitrpg.common.habitica.models.auth.UserAuthResponse
import com.habitrpg.common.habitica.models.auth.UserAuthSocial
import com.habitrpg.common.habitica.models.responses.TaskDirectionData
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import com.habitrpg.wearos.habitica.models.WearableHabitResponse
import com.habitrpg.wearos.habitica.models.tasks.BulkTaskScoringData
import com.habitrpg.wearos.habitica.models.tasks.Task

View file

@ -2,7 +2,7 @@ package com.habitrpg.wearos.habitica.data.repositories
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.asFlow
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
import javax.inject.Singleton

View file

@ -1,7 +1,7 @@
package com.habitrpg.wearos.habitica.data.repositories
import com.habitrpg.wearos.habitica.data.ApiClient
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import javax.inject.Inject
class UserRepository @Inject constructor(val apiClient: ApiClient, val localRepository: UserLocalRepository) {

View file

@ -1,3 +1,3 @@
package com.habitrpg.wearos.habitica.models
data class DisplayedError(val title: String)
data class DisplayedError(val title: String, val subtitle: String? = null)

View file

@ -1,7 +1,7 @@
package com.habitrpg.wearos.habitica.models.tasks
import com.habitrpg.common.habitica.models.responses.TaskDirectionData
import com.habitrpg.wearos.habitica.models.Buffs
import com.habitrpg.wearos.habitica.models.user.Buffs
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

View file

@ -92,68 +92,29 @@ open class Task constructor(): Parcelable {
val completedChecklistCount: Int
get() = checklist?.count { it.completed } ?: 0
val extraLightTaskColor: Int
get() {
return when {
this.value < -20 -> return R.color.maroon_500
this.value < -10 -> return R.color.red_500
this.value < -1 -> return R.color.orange_500
this.value < 1 -> return R.color.yellow_500
this.value < 5 -> return R.color.green_500
this.value < 10 -> return R.color.teal_500
else -> R.color.blue_500
}
}
val lightTaskColor: Int
get() {
return when {
this.value < -20 -> return R.color.maroon_100
this.value < -10 -> return R.color.red_100
this.value < -1 -> return R.color.orange_100
this.value < 1 -> return R.color.yellow_100
this.value < 5 -> return R.color.green_100
this.value < 10 -> return R.color.teal_100
else -> R.color.blue_100
this.value < -20 -> return R.color.watch_maroon_100
this.value < -10 -> return R.color.watch_red_100
this.value < -1 -> return R.color.watch_orange_100
this.value < 1 -> return R.color.watch_yellow_100
this.value < 5 -> return R.color.watch_green_100
this.value < 10 -> return R.color.watch_teal_100
else -> R.color.watch_blue_100
}
}
val mediumTaskColor: Int
get() {
return when {
this.value < -20 -> return R.color.maroon_50
this.value < -10 -> return R.color.red_50
this.value < -1 -> return R.color.orange_50
this.value < 1 -> return R.color.yellow_10
this.value < 5 -> return R.color.green_50
this.value < 10 -> return R.color.teal_50
else -> R.color.blue_50
}
}
val darkTaskColor: Int
get() {
return when {
this.value < -20 -> return R.color.maroon_10
this.value < -10 -> return R.color.red_10
this.value < -1 -> return R.color.orange_10
this.value < 1 -> return R.color.yellow_5
this.value < 5 -> return R.color.green_10
this.value < 10 -> return R.color.teal_10
else -> R.color.blue_10
}
}
val darkestTaskColor: Int
get() {
return when {
this.value < -20 -> return R.color.maroon_1
this.value < -10 -> return R.color.red_1
this.value < -1 -> return R.color.orange_1
this.value < 1 -> return R.color.yellow_1
this.value < 5 -> return R.color.green_1
this.value < 10 -> return R.color.teal_1
else -> R.color.blue_1
this.value < -20 -> return R.color.watch_maroon_10
this.value < -10 -> return R.color.watch_red_10
this.value < -1 -> return R.color.watch_orange_10
this.value < 1 -> return R.color.watch_yellow_10
this.value < 5 -> return R.color.watch_green_10
this.value < 10 -> return R.color.watch_teal_10
else -> R.color.watch_blue_10
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarBuffs
import com.squareup.moshi.JsonClass
@ -14,4 +14,4 @@ class Buffs: AvatarBuffs {
override var shinySeed: Boolean? = null
override var snowball: Boolean? = null
override var streaks: Boolean? = null
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarFlags
import com.squareup.moshi.JsonClass
@ -6,4 +6,4 @@ import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
class Flags: AvatarFlags {
override var classSelected: Boolean = false
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.squareup.moshi.JsonClass

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarHair
import com.squareup.moshi.JsonClass
@ -11,4 +11,4 @@ class Hair: AvatarHair {
override var base: Int = 0
override var flower: Int = 0
override var color: String? = null
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.squareup.moshi.JsonClass

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import android.graphics.drawable.Drawable

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarOutfit
import com.squareup.moshi.JsonClass
@ -13,4 +13,4 @@ class Outfit: AvatarOutfit {
override var weapon: String = ""
override var eyeWear: String = ""
override var headAccessory: String = ""
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarPreferences
import com.squareup.moshi.JsonClass
@ -14,4 +14,4 @@ class Preferences: AvatarPreferences {
override var background: String? = null
override var chair: String? = null
override var disableClasses: Boolean = false
}
}

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.squareup.moshi.JsonClass

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.AvatarStats
import com.squareup.moshi.JsonClass

View file

@ -1,4 +1,4 @@
package com.habitrpg.wearos.habitica.models
package com.habitrpg.wearos.habitica.models.user
import com.habitrpg.common.habitica.models.Avatar
import com.squareup.moshi.JsonClass

View file

@ -47,6 +47,7 @@ abstract class BaseActivity<B: ViewBinding, VM: BaseViewModel> : ComponentActivi
fun stopAnimatingProgress() {
if (progressView != null) {
wrapperBinding.root.removeView(progressView)
progressView = null
} else {
wrapperBinding.root.children.forEach {
if (it is IndeterminateProgressView) {

View file

@ -40,7 +40,10 @@ class LoginActivity: BaseActivity<ActivityLoginBinding, LoginViewModel>() {
showValidationError(getString(R.string.login_validation_error_fieldsmissing))
return
}
viewModel.login(username, password)
viewModel.login(username, password) {
stopAnimatingProgress()
}
startAnimatingProgress()
}
private fun loginGoogle() {

View file

@ -9,7 +9,7 @@ import androidx.wear.widget.WearableLinearLayoutManager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityMainBinding
import com.habitrpg.common.habitica.models.tasks.TaskType
import com.habitrpg.wearos.habitica.models.MenuItem
import com.habitrpg.wearos.habitica.models.user.MenuItem
import com.habitrpg.wearos.habitica.ui.adapters.HubAdapter
import com.habitrpg.wearos.habitica.ui.viewmodels.MainViewModel
import com.habitrpg.wearos.habitica.util.HabiticaScrollingLayoutCallback
@ -37,7 +37,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"createTask",
getString(R.string.new_task),
AppCompatResources.getDrawable(this, R.drawable.icon_plus),
ContextCompat.getColor(this, R.color.brand_400),
ContextCompat.getColor(this, R.color.watch_purple_100),
ContextCompat.getColor(this, R.color.black),
true
) {
@ -47,8 +47,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"habits",
getString(R.string.habits),
AppCompatResources.getDrawable(this, R.drawable.icon_habits),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openTasklist(TaskType.HABIT)
},
@ -56,8 +56,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"dailies",
getString(R.string.dailies),
AppCompatResources.getDrawable(this, R.drawable.icon_dailies),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openTasklist(TaskType.DAILY)
},
@ -65,8 +65,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"todos",
getString(R.string.todos),
AppCompatResources.getDrawable(this, R.drawable.icon_todos),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openTasklist(TaskType.TODO)
},
@ -74,8 +74,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"rewards",
getString(R.string.rewards),
AppCompatResources.getDrawable(this, R.drawable.icon_rewards),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openTasklist(TaskType.REWARD)
},
@ -83,8 +83,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"Stats",
getString(R.string.stats),
AppCompatResources.getDrawable(this, R.drawable.icon_stats),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openStatsActivity()
},
@ -92,8 +92,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"avatar",
getString(R.string.avatar),
AppCompatResources.getDrawable(this, R.drawable.icon_avatar),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openAvatarActivity()
},
@ -101,8 +101,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
"settings",
getString(R.string.settings),
AppCompatResources.getDrawable(this, R.drawable.icon_settings),
ContextCompat.getColor(this, R.color.brand_500),
ContextCompat.getColor(this, R.color.brand_700)
ContextCompat.getColor(this, R.color.watch_purple_200),
ContextCompat.getColor(this, R.color.watch_purple_700)
) {
openSettingsActivity()
}

View file

@ -64,8 +64,14 @@ class SplashActivity: BaseActivity<ActivitySplashBinding, SplashViewModel>() {
}
private fun showAccountLoader(show: Boolean) {
binding.progressBar.isVisible = show
binding.textView.isVisible = show
lifecycleScope.launch(Dispatchers.Main) {
if (show) {
startAnimatingProgress()
} else {
stopAnimatingProgress()
}
binding.textView.isVisible = show
}
}
override fun onPause() {

View file

@ -5,7 +5,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.android.habitica.databinding.RowHeaderBinding
import com.habitrpg.android.habitica.databinding.RowHubBinding
import com.habitrpg.wearos.habitica.models.MenuItem
import com.habitrpg.wearos.habitica.models.user.MenuItem
import com.habitrpg.wearos.habitica.ui.viewHolders.HeaderViewHolder
import com.habitrpg.wearos.habitica.ui.viewHolders.HubViewHolder

View file

@ -5,7 +5,7 @@ import android.view.View
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.RowHubBinding
import com.habitrpg.wearos.habitica.models.MenuItem
import com.habitrpg.wearos.habitica.models.user.MenuItem
class HubViewHolder(itemView: View): BindableViewHolder<MenuItem>(itemView) {
val binding = RowHubBinding.bind(itemView)
@ -19,7 +19,7 @@ class HubViewHolder(itemView: View): BindableViewHolder<MenuItem>(itemView) {
binding.rowContainer.backgroundTintList = ColorStateList.valueOf(data.color)
} else {
binding.iconView.setColorFilter(data.color)
binding.rowContainer.backgroundTintList = ContextCompat.getColorStateList(itemView.context, R.color.gray_5)
binding.rowContainer.backgroundTintList = ContextCompat.getColorStateList(itemView.context, R.color.surface)
}
binding.root.setOnClickListener {
data.onClick()

View file

@ -34,9 +34,9 @@ class HabitViewHolder(itemView: View) : TaskViewHolder(itemView) {
}
}
if (data.up != true && data.down != true) {
binding.habitButton.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.gray_300))
binding.habitButtonIcon.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.gray_100))
binding.habitButtonIcon.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.gray_300))
binding.habitButton.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.watch_gray_100))
binding.habitButtonIcon.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.watch_gray_5))
binding.habitButtonIcon.imageTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.watch_gray_100))
} else {
binding.habitButton.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, data.lightTaskColor))
binding.habitButtonIcon.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, data.mediumTaskColor))

View file

@ -3,7 +3,7 @@ package com.habitrpg.wearos.habitica.ui.viewmodels
import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

View file

@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.models.DisplayedError
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import com.habitrpg.wearos.habitica.util.ErrorPresenter
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder

View file

@ -157,10 +157,13 @@ class LoginViewModel @Inject constructor(userRepository: UserRepository,
}
}
fun login(username: String, password: String) {
fun login(username: String, password: String, onResult: (Boolean) -> Unit) {
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
val response = apiClient.loginLocal(UserAuth(username, password))
handleAuthResponse(response)
onResult(response?.id != null)
}.invokeOnCompletion {
onResult(it == null)
}
}

View file

@ -6,7 +6,7 @@ import androidx.lifecycle.viewModelScope
import com.habitrpg.common.habitica.api.HostConfig
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.models.User
import com.habitrpg.wearos.habitica.models.user.User
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch

View file

@ -26,8 +26,8 @@ class AddTaskButton @JvmOverloads constructor(
0f,
0f,
80.dpToPx(context).toFloat(),
ContextCompat.getColor(context, R.color.brand_400),
ContextCompat.getColor(context, R.color.blue_100),
ContextCompat.getColor(context, R.color.watch_purple_100),
ContextCompat.getColor(context, R.color.watch_blue_100),
Shader.TileMode.CLAMP
)
private val path = Path()

View file

@ -23,8 +23,8 @@ class HabitDirectionPickerButton @JvmOverloads constructor(
private val rect = RectF(0f, 0f, 0f, 0f)
private val bitmapRect = RectF(0f, 0f, 0f, 0f)
var mainTaskColor: Int = ContextCompat.getColor(context, R.color.gray_300)
var darkerTaskColor: Int = ContextCompat.getColor(context, R.color.gray_200)
var mainTaskColor: Int = ContextCompat.getColor(context, R.color.watch_gray_200)
var darkerTaskColor: Int = ContextCompat.getColor(context, R.color.watch_gray_10)
var iconColor: Int = ContextCompat.getColor(context, R.color.white)
private val radius = 15.dpToPx(context)

View file

@ -21,13 +21,13 @@ class IndeterminateProgressView @JvmOverloads constructor(
var progressBarWidth = 4f.dpToPx(context)
private val rainbow = listOf(
ContextCompat.getColor(context, R.color.red_100),
ContextCompat.getColor(context, R.color.orange_100),
ContextCompat.getColor(context, R.color.yellow_100),
ContextCompat.getColor(context, R.color.green_100),
ContextCompat.getColor(context, R.color.blue_100),
ContextCompat.getColor(context, R.color.brand_400),
ContextCompat.getColor(context, R.color.red_100),
ContextCompat.getColor(context, R.color.watch_red_100),
ContextCompat.getColor(context, R.color.watch_orange_100),
ContextCompat.getColor(context, R.color.watch_yellow_100),
ContextCompat.getColor(context, R.color.watch_green_100),
ContextCompat.getColor(context, R.color.watch_blue_100),
ContextCompat.getColor(context, R.color.watch_purple_100),
ContextCompat.getColor(context, R.color.watch_red_100),
).toIntArray()
val gradient = SweepGradient(225f, 225f, rainbow, null)
private val paint = Paint()

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="40dp" />
<solid android:color="@color/gray_5" />
<solid android:color="@color/surface" />
</shape>

View file

@ -22,7 +22,7 @@
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:textSize="14sp"
android:textColor="@color/gray_400"/>
android:textColor="@color/watch_gray_200"/>
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"

View file

@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"/>
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/syncing_account"
android:visibility="gone"/>
android:layout_margin="@dimen/spacing_xlarge"
android:visibility="gone"
tools:visibility="visible"
android:gravity="center"/>
</LinearLayout>

View file

@ -33,7 +33,7 @@
style="@style/Chip"
tools:text="Task Type"
android:textAllCaps="false"
android:textColor="@color/brand_500"/>
android:textColor="@color/watch_purple_500"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.wear.widget.BoxInsetLayout>

View file

@ -10,7 +10,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@color/brand_500"
android:textColor="@color/watch_purple_500"
tools:text="Header Text"
android:fontFamily="sans-serif-medium"
android:textSize="16sp" />

View file

@ -1,9 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">@color/brand_300</color>
<color name="bar_background_color">#34313a</color>
<color name="exp_bar_color">@color/yellow_100</color>
<color name="mp_bar_color">#a9dcf6</color>
<color name="hp_bar_color">#f2666a</color>
<color name="watch_red_500">#FFF0EF</color>
<color name="watch_red_200">#EFC0BD</color>
<color name="watch_red_100">#F06B63</color>
<color name="watch_red_10">#E43E42</color>
<color name="watch_red_5">#2D2424</color>
<color name="watch_orange_500">#FFEDE0</color>
<color name="watch_orange_200">#F8CCAE</color>
<color name="watch_orange_100">#FF944C</color>
<color name="watch_orange_10">#F37724</color>
<color name="watch_orange_5">#2B2622</color>
<color name="watch_yellow_200">#FEDEAD</color>
<color name="watch_yellow_100">#FFBE5D</color>
<color name="watch_yellow_10">#FAA11F</color>
<color name="watch_green_500">#E8FBF4</color>
<color name="watch_green_200">#9BDEC5</color>
<color name="watch_green_100">#24CC8F</color>
<color name="watch_green_10">#1FA574</color>
<color name="watch_green_5">#202725</color>
<color name="watch_teal_200">#97EBF2</color>
<color name="watch_teal_100">#3BCAD7</color>
<color name="watch_teal_10">#26A0AB</color>
<color name="watch_blue_500">#EAF8FF</color>
<color name="watch_blue_200">#B4DCF0</color>
<color name="watch_blue_100">#50B5E9</color>
<color name="watch_blue_10">#2B93CA</color>
<color name="watch_blue_5">#23292C</color>
<color name="watch_maroon_200">#F19595</color>
<color name="watch_maroon_100">#DE3F3F</color>
<color name="watch_maroon_10">#B51A1A</color>
<color name="watch_purple_700">#ede7f6</color>
<color name="watch_purple_500">#EAE3FF</color>
<color name="watch_purple_200">#BEAAF9</color>
<color name="watch_purple_100">#A675FF</color>
<color name="watch_purple_10">#6133B4</color>
<color name="watch_purple_5">#23202A</color>
<color name="watch_gray_500">#EFEFEF</color>
<color name="watch_gray_200">#C3C0C7</color>
<color name="watch_gray_100">#A5A1AC</color>
<color name="watch_gray_10">#878190</color>
<color name="watch_gray_5">#686274</color>
<color name="ic_launcher_background">@color/brand_300</color>
<color name="surface">#23202A</color>
</resources>