From 6854632fecf21cc14d03fca514e659ca670b10d7 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 15 Jun 2022 09:45:28 -0300 Subject: [PATCH] Allow separate specification of status and toolbar active/inactive coloring. --- .../ConversationSettingsFragment.kt | 10 +++++ .../ConversationParentFragment.java | 8 ++-- .../securesms/util/Material3OnScrollHelper.kt | 43 ++++++++++++++----- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 942f2c170..1fd5c212d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -82,6 +82,7 @@ import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.ExpirationUtil import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.Material3OnScrollHelper import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.views.SimpleProgressDialog @@ -191,6 +192,15 @@ class ConversationSettingsFragment : DSLSettingsFragment( } } + override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper { + return object : Material3OnScrollHelper(requireActivity(), toolbar!!) { + override val inactiveColorSet = ColorSet( + toolbarColorRes = R.color.transparent, + statusBarColorRes = R.color.signal_colorBackground + ) + } + } + override fun bindAdapter(adapter: DSLSettingsAdapter) { val args = ConversationSettingsFragmentArgs.fromBundle(requireArguments()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index c4b52e05b..0f2dd902f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -2223,13 +2223,13 @@ public class ConversationParentFragment extends Fragment material3OnScrollHelper = new Material3OnScrollHelper(requireActivity(), Collections.singletonList(toolbarBackground), Collections.emptyList()) { @Override - public int getActiveColorRes() { - return getActiveToolbarColor(wallpaper.getDrawable() != null); + public @NonNull ColorSet getActiveColorSet() { + return new ColorSet(getActiveToolbarColor(wallpaper.getDrawable() != null)); } @Override - public int getInactiveColorRes() { - return getInactiveToolbarColor(wallpaper.getDrawable() != null); + public @NonNull ColorSet getInactiveColorSet() { + return new ColorSet(getInactiveToolbarColor(wallpaper.getDrawable() != null)); } }; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt index 2c42c380b..82b9380b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt @@ -4,6 +4,7 @@ import android.animation.ValueAnimator import android.app.Activity import android.view.View import androidx.annotation.ColorInt +import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.google.android.material.animation.ArgbEvaluatorCompat @@ -21,8 +22,18 @@ open class Material3OnScrollHelper( private val viewStubs: List> = emptyList() ) { - open val activeColorRes: Int = R.color.signal_colorSurface2 - open val inactiveColorRes: Int = R.color.signal_colorBackground + /** + * A pair of colors tied to a specific state. + */ + data class ColorSet( + @ColorRes val toolbarColorRes: Int, + @ColorRes val statusBarColorRes: Int + ) { + constructor(@ColorRes color: Int) : this(color, color) + } + + open val activeColorSet: ColorSet = ColorSet(R.color.signal_colorSurface2) + open val inactiveColorSet: ColorSet = ColorSet(R.color.signal_colorBackground) constructor(activity: Activity, view: View) : this(activity, listOf(view), emptyList()) @@ -44,7 +55,9 @@ open class Material3OnScrollHelper( } animator?.cancel() - setColor(ContextCompat.getColor(activity, if (active == true) activeColorRes else inactiveColorRes)) + val colorSet = if (active == true) activeColorSet else inactiveColorSet + setToolbarColor(ContextCompat.getColor(activity, colorSet.toolbarColorRes)) + setStatusBarColor(ContextCompat.getColor(activity, colorSet.statusBarColorRes)) } private fun updateActiveState(isActive: Boolean) { @@ -61,29 +74,39 @@ open class Material3OnScrollHelper( if (animator?.isRunning == true) { animator?.reverse() } else { - val startColor = ContextCompat.getColor(activity, if (isActive) inactiveColorRes else activeColorRes) - val endColor = ContextCompat.getColor(activity, if (isActive) activeColorRes else inactiveColorRes) + val startColorSet = if (isActive) inactiveColorSet else activeColorSet + val endColorSet = if (isActive) activeColorSet else inactiveColorSet if (hadActiveState) { - animator = ValueAnimator.ofObject(ArgbEvaluatorCompat(), startColor, endColor).apply { + val startToolbarColor = ContextCompat.getColor(activity, startColorSet.toolbarColorRes) + val endToolbarColor = ContextCompat.getColor(activity, endColorSet.toolbarColorRes) + val startStatusBarColor = ContextCompat.getColor(activity, startColorSet.statusBarColorRes) + val endStatusBarColor = ContextCompat.getColor(activity, endColorSet.statusBarColorRes) + + animator = ValueAnimator.ofFloat(0f, 1f).apply { duration = 200 - addUpdateListener { animator -> - setColor(animator.animatedValue as Int) + addUpdateListener { + setToolbarColor(ArgbEvaluatorCompat.getInstance().evaluate(it.animatedFraction, startToolbarColor, endToolbarColor)) + setStatusBarColor(ArgbEvaluatorCompat.getInstance().evaluate(it.animatedFraction, startStatusBarColor, endStatusBarColor)) } start() } + } else { setColorImmediate() } } } - private fun setColor(@ColorInt color: Int) { - WindowUtil.setStatusBarColor(activity.window, color) + private fun setToolbarColor(@ColorInt color: Int) { views.forEach { it.setBackgroundColor(color) } viewStubs.filter { it.resolved() }.forEach { it.get().setBackgroundColor(color) } } + private fun setStatusBarColor(@ColorInt color: Int) { + WindowUtil.setStatusBarColor(activity.window, color) + } + private inner class OnScrollListener : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { updateActiveState(recyclerView.canScrollVertically(-1))