From b28d5678bc7b803ecea2134e848b5a92aea83b7f Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 21:35:58 +0530 Subject: [PATCH] Added MD3 switch --- app/build.gradle | 2 +- .../retromusic/extensions/ColorExtensions.kt | 4 +- .../main/res/layout/list_item_view_switch.xml | 3 +- .../layout/list_item_view_switch_no_title.xml | 3 +- .../name/monkey/appthemehelper/ThemeStore.kt | 2 +- .../common/views/ATEAccentTextView.kt | 5 +- .../appthemehelper/common/views/ATESwitch.kt | 30 ++++-------- .../appthemehelper/util/TintHelper.java | 46 +++++++++++-------- .../layout/ate_preference_switch_support.xml | 1 + 9 files changed, 46 insertions(+), 50 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 49b56f546..b5f0c4863 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10588 + versionCode 10590 versionName '6.0.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt index 9d27c12bc..b0a1759f3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt @@ -135,7 +135,9 @@ fun Button.accentTextColor() { fun MaterialButton.accentBackgroundColor() { if (materialYou) return - backgroundTintList = ColorStateList.valueOf(context.accentColor()) + backgroundTintList = ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_enabled), intArrayOf()), + intArrayOf(context.accentColor(), context.accentColor().addAlpha(0.12f))) } fun MaterialButton.accentOutlineColor() { diff --git a/app/src/main/res/layout/list_item_view_switch.xml b/app/src/main/res/layout/list_item_view_switch.xml index a536b1fa6..255bb87b2 100644 --- a/app/src/main/res/layout/list_item_view_switch.xml +++ b/app/src/main/res/layout/list_item_view_switch.xml @@ -79,8 +79,7 @@ app:showText="false" android:clickable="false" android:focusable="false" - app:track="@drawable/switch_track" - android:thumb="@drawable/switch_thumb" + style="@style/Widget.Material3.CompoundButton.MaterialSwitch" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/list_item_view_switch_no_title.xml b/app/src/main/res/layout/list_item_view_switch_no_title.xml index 4f65d0a6e..e23e42a1b 100644 --- a/app/src/main/res/layout/list_item_view_switch_no_title.xml +++ b/app/src/main/res/layout/list_item_view_switch_no_title.xml @@ -65,8 +65,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:showText="false" - app:track="@drawable/switch_track" - android:thumb="@drawable/switch_thumb" + style="@style/Widget.Material3.CompoundButton.MaterialSwitch" android:clickable="false" android:focusable="false" app:layout_constraintBottom_toBottomOf="parent" diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt index 74800b49e..c1dca0f66 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt @@ -343,7 +343,7 @@ private constructor(private val mContext: Context) : ThemeStorePrefKeys, ThemeSt return true } - private fun isMD3Enabled(context: Context): Boolean { + fun isMD3Enabled(context: Context): Boolean { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(ThemeStorePrefKeys.KEY_MATERIAL_YOU, VersionUtils.hasS()) } diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt index 9f88e54ec..13359781b 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt @@ -26,9 +26,6 @@ class ATEAccentTextView @JvmOverloads constructor( ) : AppCompatTextView(context, attrs, defStyleAttr) { init { - setTextColor( - // Set MD3 accent if MD3 is enabled or in-app accent otherwise - ThemeStore.accentColor(context) - ) + setTextColor(ThemeStore.accentColor(context)) } } diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt index c4dc3c77c..869f5db83 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt @@ -2,34 +2,24 @@ package code.name.monkey.appthemehelper.common.views import android.content.Context import android.util.AttributeSet -import androidx.appcompat.widget.SwitchCompat import androidx.core.view.isVisible import code.name.monkey.appthemehelper.ATH import code.name.monkey.appthemehelper.ThemeStore +import com.google.android.material.materialswitch.MaterialSwitch /** * @author Aidan Follestad (afollestad) */ -class ATESwitch : SwitchCompat { +class ATESwitch @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = -1, +) : MaterialSwitch(context, attrs, defStyleAttr) { - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context) { - ATH.setTint(this, ThemeStore.accentColor(context)) + init { + if (!isInEditMode && !ThemeStore.isMD3Enabled(context)) { + ATH.setTint(this, ThemeStore.accentColor(context)) + } } override fun isShown(): Boolean { diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java index 001b51dd7..6f985b0da 100755 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java @@ -3,6 +3,7 @@ package code.name.monkey.appthemehelper.util; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; @@ -14,7 +15,6 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RadioButton; import android.widget.SeekBar; -import android.widget.Switch; import android.widget.TextView; import androidx.annotation.CheckResult; @@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.materialswitch.MaterialSwitch; import java.lang.reflect.Field; @@ -210,17 +211,6 @@ public final class TintHelper { image.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } - public static void setTint(@NonNull Switch switchView, @ColorInt int color, boolean useDarker) { - if (switchView.getTrackDrawable() != null) { - switchView.setTrackDrawable(modifySwitchDrawable(switchView.getContext(), - switchView.getTrackDrawable(), color, false, false, useDarker)); - } - if (switchView.getThumbDrawable() != null) { - switchView.setThumbDrawable(modifySwitchDrawable(switchView.getContext(), - switchView.getThumbDrawable(), color, true, false, useDarker)); - } - } - public static void setTint(@NonNull SwitchCompat switchView, @ColorInt int color, boolean useDarker) { if (switchView.getTrackDrawable() != null) { switchView.setTrackDrawable(modifySwitchDrawable(switchView.getContext(), @@ -232,6 +222,15 @@ public final class TintHelper { } } + public static void setTint(@NonNull MaterialSwitch switchView, @ColorInt int color, boolean useDarker) { + if (switchView.getTrackDrawable() != null) { + switchView.setTrackTintList(createSwitchDrawableTintList(switchView.getContext(), color, false, true, useDarker)); + } + if (switchView.getThumbDrawable() != null) { + switchView.setThumbTintList(createSwitchDrawableTintList(switchView.getContext(), color, true, true, useDarker)); + } + } + public static void setTintAuto(final @NonNull View view, final @ColorInt int color, boolean background) { setTintAuto(view, color, background, ATHUtil.INSTANCE.isWindowBackgroundDark(view.getContext())); @@ -254,8 +253,8 @@ public final class TintHelper { setTint((CheckBox) view, color, isDark); } else if (view instanceof ImageView) { setTint((ImageView) view, color); - } else if (view instanceof Switch) { - setTint((Switch) view, color, isDark); + } else if (view instanceof MaterialSwitch) { + setTint((MaterialSwitch) view, color, isDark); } else if (view instanceof SwitchCompat) { setTint((SwitchCompat) view, color, isDark); } else { @@ -388,12 +387,15 @@ public final class TintHelper { }); } - private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, - boolean thumb, boolean compatSwitch, boolean useDarker) { + private static ColorStateList createSwitchDrawableTintList(@NonNull Context context, @ColorInt int tint, + boolean thumb, boolean compatSwitch, boolean useDarker) { + int lighterTint = ColorUtil.INSTANCE.blendColors(tint, Color.WHITE, 0.4f); + int darkerTint = ColorUtil.INSTANCE.shiftColor(tint, 0.8f); if (useDarker) { - tint = ColorUtil.INSTANCE.shiftColor(tint, 1.1f); + tint = (compatSwitch && !thumb) ? lighterTint : darkerTint; + } else { + tint = (compatSwitch && !thumb) ? darkerTint : Color.WHITE; } - tint = ColorUtil.INSTANCE.adjustAlpha(tint, (compatSwitch && !thumb) ? 0.5f : 1.0f); int disabled; int normal; if (thumb) { @@ -413,7 +415,7 @@ public final class TintHelper { normal = ColorUtil.INSTANCE.stripAlpha(normal); } - final ColorStateList sl = new ColorStateList( + return new ColorStateList( new int[][]{ new int[]{-android.R.attr.state_enabled}, new int[]{android.R.attr.state_enabled, -android.R.attr.state_activated, @@ -428,6 +430,12 @@ public final class TintHelper { tint } ); + } + + private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, + boolean thumb, boolean compatSwitch, boolean useDarker) { + + ColorStateList sl = createSwitchDrawableTintList(context, tint, thumb, compatSwitch, useDarker); return createTintedDrawable(from, sl); } diff --git a/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml b/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml index 50d68fcec..96e84ab06 100755 --- a/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml +++ b/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml @@ -1,6 +1,7 @@