From aa1ec21668a00e62ce8301c77a4c5cacaa20d2c8 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Fri, 24 Jun 2022 12:43:55 -0400 Subject: [PATCH 1/4] Animated stat values, truncate text if needed, --- .../habitica/ui/activities/StatsActivity.kt | 52 +++++++++++++++---- .../wearos/habitica/ui/views/StatValue.kt | 36 ++++++++++++- wearos/src/main/res/layout/activity_stats.xml | 17 ++++-- .../src/main/res/layout/stat_value_layout.xml | 9 ++-- 4 files changed, 94 insertions(+), 20 deletions(-) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt index a6fe343c0..144642914 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -1,7 +1,8 @@ package com.habitrpg.wearos.habitica.ui.activities +import android.animation.ValueAnimator import android.os.Bundle -import android.view.View +import android.view.View.* import androidx.activity.viewModels import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ActivityStatsBinding @@ -9,8 +10,10 @@ import com.habitrpg.common.habitica.views.HabiticaIconsHelper import com.habitrpg.wearos.habitica.models.user.Stats import com.habitrpg.wearos.habitica.models.user.User import com.habitrpg.wearos.habitica.ui.viewmodels.StatsViewModel +import com.habitrpg.wearos.habitica.ui.views.StatValue import dagger.hilt.android.AndroidEntryPoint + @AndroidEntryPoint class StatsActivity : BaseActivity() { override val viewModel: StatsViewModel by viewModels() @@ -18,14 +21,36 @@ class StatsActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { binding = ActivityStatsBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) - - setStatViews() + setViews() viewModel.user.observe(this) { - updateStats(it) + loadViews(it) } } + private fun setViews() { + binding.statsImageview.visibility = VISIBLE + loadingManager.startLoading() + setBarViews() + setStatViews() + } + + private fun loadViews(user: User) { + binding.statsImageview.visibility = GONE + loadingManager.endLoading() + updateStats(user) + } + + private fun setBarViews() { + binding.hpBar.visibility = INVISIBLE + binding.expBar.visibility = INVISIBLE + binding.mpBar.visibility = INVISIBLE + } + private fun setStatViews() { + binding.hpStatValue.visibility = INVISIBLE + binding.expStatValue.visibility = INVISIBLE + binding.mpStatValue.visibility = INVISIBLE + binding.hpStatValue.setStatValueResources(HabiticaIconsHelper.imageOfHeartLightBg(), R.color.hp_bar_color) binding.expStatValue.setStatValueResources(HabiticaIconsHelper.imageOfExperience(), R.color.exp_bar_color) binding.mpStatValue.setStatValueResources(HabiticaIconsHelper.imageOfMagic(), R.color.mpColor) @@ -38,6 +63,10 @@ class StatsActivity : BaseActivity() { } private fun updateBarViews(stats: Stats) { + binding.hpBar.visibility = VISIBLE + binding.expBar.visibility = VISIBLE + binding.mpBar.visibility = VISIBLE + binding.hpBar.setPercentageValues(stats.hp?.toFloat() ?: 0f, stats.maxHealth?.toFloat() ?: 0f) binding.hpBar.animateProgress() @@ -45,7 +74,7 @@ class StatsActivity : BaseActivity() { binding.expBar.animateProgress() if ((stats.lvl ?: 0) < 10) { - binding.mpBar.visibility = View.GONE + binding.mpBar.visibility = GONE } else { binding.mpBar.setPercentageValues(stats.mp?.toFloat() ?: 0f, stats.maxMP?.toFloat() ?: 0f) binding.mpBar.animateProgress() @@ -53,14 +82,19 @@ class StatsActivity : BaseActivity() { } private fun updateStatViews(stats: Stats) { - binding.hpStatValue.setStatValue(stats.maxHealth ?: 0, stats.hp?.toInt() ?: 0) - binding.expStatValue.setStatValue(stats.toNextLevel ?: 0, stats.exp?.toInt() ?: 0) + binding.hpStatValue.visibility = VISIBLE + binding.expStatValue.visibility = VISIBLE + binding.mpStatValue.visibility = VISIBLE + + binding.hpStatValue.setStatValues(stats.maxHealth ?: 0, stats.hp?.toInt() ?: 0) + binding.expStatValue.setStatValues(stats.toNextLevel ?: 0, stats.exp?.toInt() ?: 0) if ((stats.lvl ?: 0) < 10) { - binding.mpStatValue.visibility = View.GONE + binding.mpStatValue.visibility = GONE } else { - binding.mpStatValue.setStatValue(stats.maxMP ?: 0, stats.mp?.toInt() ?: 0) + binding.mpStatValue.setStatValues(stats.maxMP ?: 0, stats.mp?.toInt() ?: 0) } } + } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt index 5a82b7ee2..36ca62d8a 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt @@ -1,5 +1,6 @@ package com.habitrpg.wearos.habitica.ui.views +import android.animation.ValueAnimator import android.content.Context import android.graphics.Bitmap import android.graphics.Color @@ -7,8 +8,15 @@ import android.util.AttributeSet import androidx.constraintlayout.widget.ConstraintLayout import com.habitrpg.android.habitica.databinding.StatValueLayoutBinding import com.habitrpg.common.habitica.extensions.layoutInflater +import kotlin.math.abs +import kotlin.math.ln +import kotlin.math.pow -class StatValue @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : +class StatValue @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : ConstraintLayout( context, attrs, @@ -17,10 +25,12 @@ class StatValue @JvmOverloads constructor(context: Context, attrs: AttributeSet? var binding = StatValueLayoutBinding.inflate(context.layoutInflater, this) - fun setStatValue(maxValue: Int, currentValue: Int) { + fun setStatValues(maxValue: Int, currentValue: Int) { binding.currentValue.text = currentValue.toString() binding.maxValue.text = "/$maxValue" invalidate() + + startUpdateCountAnimation(currentValue) } fun setStatValueResources(bitmap: Bitmap, bitmapColor: Int) { @@ -30,5 +40,27 @@ class StatValue @JvmOverloads constructor(context: Context, attrs: AttributeSet? ) } + private fun startUpdateCountAnimation(statValue: Int) { + val animator = ValueAnimator.ofInt(0, statValue) + animator.duration = 1000 + animator.addUpdateListener { animation -> + binding.currentValue.text = + (truncateFormat(animation.animatedValue.toString().toLong())) + } + animator.start() + } + + private fun truncateFormat(statCount: Long): String { + //If we want to truncate and remove text after decimal (Example 1200 -> 1k) + if (statCount < 1000) return "" + statCount + return (statCount / 1000).toString() + "k"; + + + //If we want to truncate including text after decimal (Example 1200 -> 1.2k) +// val exp = (ln(statCount.toDouble()) / ln(1000.0)).toInt() +// binding.currentValue.letterSpacing = -.07f +// return String.format("%.1f%c", statCount / 1000.0.pow(exp.toDouble()), "kMGTPE"[exp - 1]) + + } } \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_stats.xml b/wearos/src/main/res/layout/activity_stats.xml index 6800e1374..a3311aa56 100644 --- a/wearos/src/main/res/layout/activity_stats.xml +++ b/wearos/src/main/res/layout/activity_stats.xml @@ -4,6 +4,13 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp"/> diff --git a/wearos/src/main/res/layout/stat_value_layout.xml b/wearos/src/main/res/layout/stat_value_layout.xml index ba6196678..775d24d6c 100644 --- a/wearos/src/main/res/layout/stat_value_layout.xml +++ b/wearos/src/main/res/layout/stat_value_layout.xml @@ -4,8 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="30dp" - android:layout_marginStart="4dp" - android:layout_marginTop="4dp" tools:parentTag="com.habitrpg.wearos.habitica.ui.views.StatValue"> From 9dfeff695bf33d0914861b06107dc3640ab4f7b6 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Sun, 26 Jun 2022 18:28:04 -0400 Subject: [PATCH 2/4] loading ui update --- .../wearos/habitica/ui/activities/StatsActivity.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt index 144642914..f45eb03bd 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -41,9 +41,15 @@ class StatsActivity : BaseActivity() { } private fun setBarViews() { - binding.hpBar.visibility = INVISIBLE - binding.expBar.visibility = INVISIBLE - binding.mpBar.visibility = INVISIBLE + binding.hpBar.setPercentageValues(1f, 100f) + binding.hpBar.animateProgress() + + binding.expBar.setPercentageValues(1f, 100f) + binding.expBar.animateProgress() + + binding.mpBar.setPercentageValues(1f, 100f) + binding.mpBar.animateProgress() + } private fun setStatViews() { From a807a03a0ab6c156021d9a64480c9da2e8f6c33d Mon Sep 17 00:00:00 2001 From: Hafiz Date: Mon, 27 Jun 2022 13:01:02 -0400 Subject: [PATCH 3/4] Update truncate to use common abbreviator, UI fixes --- .../habitica/ui/activities/StatsActivity.kt | 2 +- .../habitica/ui/views/CircularProgressView.kt | 4 ++-- .../wearos/habitica/ui/views/StatValue.kt | 16 ++-------------- wearos/src/main/res/layout/activity_stats.xml | 14 +++++++------- wearos/src/main/res/layout/stat_value_layout.xml | 6 +++--- 5 files changed, 15 insertions(+), 27 deletions(-) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt index f45eb03bd..4396cc8a3 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -57,7 +57,7 @@ class StatsActivity : BaseActivity() { binding.expStatValue.visibility = INVISIBLE binding.mpStatValue.visibility = INVISIBLE - binding.hpStatValue.setStatValueResources(HabiticaIconsHelper.imageOfHeartLightBg(), R.color.hp_bar_color) + binding.hpStatValue.setStatValueResources(HabiticaIconsHelper.imageOfHeartLarge(), R.color.hp_bar_color) binding.expStatValue.setStatValueResources(HabiticaIconsHelper.imageOfExperience(), R.color.exp_bar_color) binding.mpStatValue.setStatValueResources(HabiticaIconsHelper.imageOfMagic(), R.color.mpColor) } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/CircularProgressView.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/CircularProgressView.kt index 8b0a895c3..e8bb6bc15 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/CircularProgressView.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/CircularProgressView.kt @@ -39,14 +39,14 @@ class CircularProgressView( style = Paint.Style.STROKE isAntiAlias = true color = backgroundArcColor - strokeWidth = 5f.dpToPx(context) + strokeWidth = 4f.dpToPx(context) } private var fillArcPaint = Paint().apply { style = Paint.Style.STROKE isAntiAlias = true color = fillArcColor - strokeWidth = 5f.dpToPx(context) + strokeWidth = 4f.dpToPx(context) strokeCap = Paint.Cap.ROUND } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt index 36ca62d8a..e78c6d991 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/views/StatValue.kt @@ -8,6 +8,7 @@ import android.util.AttributeSet import androidx.constraintlayout.widget.ConstraintLayout import com.habitrpg.android.habitica.databinding.StatValueLayoutBinding import com.habitrpg.common.habitica.extensions.layoutInflater +import com.habitrpg.common.habitica.helpers.NumberAbbreviator import kotlin.math.abs import kotlin.math.ln import kotlin.math.pow @@ -45,22 +46,9 @@ class StatValue @JvmOverloads constructor( animator.duration = 1000 animator.addUpdateListener { animation -> binding.currentValue.text = - (truncateFormat(animation.animatedValue.toString().toLong())) + (NumberAbbreviator.abbreviate(context, animation.animatedValue.toString().toDouble(), 0)) } animator.start() } - private fun truncateFormat(statCount: Long): String { - //If we want to truncate and remove text after decimal (Example 1200 -> 1k) - if (statCount < 1000) return "" + statCount - return (statCount / 1000).toString() + "k"; - - - //If we want to truncate including text after decimal (Example 1200 -> 1.2k) -// val exp = (ln(statCount.toDouble()) / ln(1000.0)).toInt() -// binding.currentValue.letterSpacing = -.07f -// return String.format("%.1f%c", statCount / 1000.0.pow(exp.toDouble()), "kMGTPE"[exp - 1]) - - } - } \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_stats.xml b/wearos/src/main/res/layout/activity_stats.xml index a3311aa56..8e4f3da87 100644 --- a/wearos/src/main/res/layout/activity_stats.xml +++ b/wearos/src/main/res/layout/activity_stats.xml @@ -6,8 +6,8 @@ @@ -16,7 +16,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:arcFillColor="@color/hp_bar_color" - app:backgroundArcColor="@color/bar_background_color" + app:backgroundArcColor="@color/watch_gray_1" app:offset="5dp" /> + android:layout_marginBottom="8dp"/> Date: Mon, 27 Jun 2022 15:19:52 -0400 Subject: [PATCH 4/4] UI Fixes --- .../habitrpg/wearos/habitica/ui/activities/StatsActivity.kt | 2 ++ wearos/src/main/res/layout/activity_stats.xml | 5 +++-- wearos/src/main/res/layout/stat_value_layout.xml | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt index 4396cc8a3..0f39814d6 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -4,6 +4,7 @@ import android.animation.ValueAnimator import android.os.Bundle import android.view.View.* import androidx.activity.viewModels +import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ActivityStatsBinding import com.habitrpg.common.habitica.views.HabiticaIconsHelper @@ -28,6 +29,7 @@ class StatsActivity : BaseActivity() { } private fun setViews() { + binding.statsImageview.setColorFilter(ContextCompat.getColor(this, R.color.watch_purple_200)) binding.statsImageview.visibility = VISIBLE loadingManager.startLoading() setBarViews() diff --git a/wearos/src/main/res/layout/activity_stats.xml b/wearos/src/main/res/layout/activity_stats.xml index 8e4f3da87..6bfbcf571 100644 --- a/wearos/src/main/res/layout/activity_stats.xml +++ b/wearos/src/main/res/layout/activity_stats.xml @@ -9,7 +9,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_stats" - android:layout_centerInParent="true"/> + android:layout_centerInParent="true" + /> diff --git a/wearos/src/main/res/layout/stat_value_layout.xml b/wearos/src/main/res/layout/stat_value_layout.xml index ebf46d61d..b6ae24d2c 100644 --- a/wearos/src/main/res/layout/stat_value_layout.xml +++ b/wearos/src/main/res/layout/stat_value_layout.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="30dp" + android:paddingStart="16dp" tools:parentTag="com.habitrpg.wearos.habitica.ui.views.StatValue">