From da2cca16a6ba401db5247583eb1aea9aeacd271f Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Sat, 17 Apr 2021 01:58:05 -0400 Subject: [PATCH] Turning MenuSheetItemView into an attributable view So we can just set this in xml (to be used later) --- .../tachiyomi/ui/base/MaterialMenuSheet.kt | 72 +++++--------- .../tachiyomi/widget/MenuSheetItemView.kt | 97 +++++++++++++++++++ app/src/main/res/layout/menu_sheet_item.xml | 20 ++-- app/src/main/res/values/attrs.xml | 6 ++ 4 files changed, 139 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/widget/MenuSheetItemView.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/MaterialMenuSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/MaterialMenuSheet.kt index 7b085dd2a6..7a392c381a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/MaterialMenuSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/MaterialMenuSheet.kt @@ -2,21 +2,16 @@ package eu.kanade.tachiyomi.ui.base import android.animation.ObjectAnimator import android.animation.ValueAnimator +import android.annotation.SuppressLint import android.app.Activity -import android.content.res.ColorStateList import android.os.Build import android.view.View import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.widget.ImageView -import android.widget.TextView import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.widget.TextViewCompat import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog -import com.google.android.material.textview.MaterialTextView import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.BottomMenuSheetBinding import eu.kanade.tachiyomi.util.system.dpToPx @@ -24,14 +19,14 @@ import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.hasSideNavBar import eu.kanade.tachiyomi.util.system.isInNightMode import eu.kanade.tachiyomi.util.view.expand -import eu.kanade.tachiyomi.util.view.invisible import eu.kanade.tachiyomi.util.view.isVisible import eu.kanade.tachiyomi.util.view.setBottomEdge import eu.kanade.tachiyomi.util.view.setEdgeToEdge import eu.kanade.tachiyomi.util.view.updateLayoutParams -import eu.kanade.tachiyomi.util.view.visible import eu.kanade.tachiyomi.util.view.visibleIf +import eu.kanade.tachiyomi.widget.MenuSheetItemView +@SuppressLint("InflateParams") open class MaterialMenuSheet( activity: Activity, items: List, @@ -72,42 +67,35 @@ open class MaterialMenuSheet( var currentIndex: Int? = null items.forEachIndexed { index, item -> val view = - activity.layoutInflater.inflate(R.layout.menu_sheet_item, null) as ViewGroup - val textView = view.getChildAt(0) as MaterialTextView + activity.layoutInflater.inflate(R.layout.menu_sheet_item, null) as MenuSheetItemView if (index == 0 && title == null) { view.setBackgroundResource(R.drawable.rounded_item_background) } with(view) { id = item.id binding.menuLayout.addView(this) - setOnClickListener { - val shouldDismiss = onMenuItemClicked(this@MaterialMenuSheet, id) - if (shouldDismiss) { - dismiss() - } - } - } - with(textView) { + if (item.text != null) { text = item.text } else { setText(item.textRes) } - setCompoundDrawablesRelativeWithIntrinsicBounds(item.drawable, 0, 0, 0) + setIcon(item.drawable) if (item.drawable == 0) { textSize = 14f } + if (item.id == selectedId) { currentIndex = index - setTextColor(context.getResourceColor(R.attr.colorAccent)) - TextViewCompat.setCompoundDrawableTintList( - this, - ColorStateList.valueOf(context.getResourceColor(R.attr.colorAccent)) - ) + setIconColor(activity.getResourceColor(R.attr.colorAccent)) + setTextColor(activity.getResourceColor(R.attr.colorAccent)) } - updateLayoutParams { - height = 48.dpToPx - width = MATCH_PARENT + + setOnClickListener { + val shouldDismiss = onMenuItemClicked(this@MaterialMenuSheet, id) + if (shouldDismiss) { + dismiss() + } } } } @@ -122,7 +110,7 @@ open class MaterialMenuSheet( currentIndex?.let { binding.root.post { - binding.menuScrollView?.scrollTo(0, it * 48.dpToPx - binding.menuScrollView.height / 2) + binding.menuScrollView.scrollTo(0, it * 48.dpToPx - binding.menuScrollView.height / 2) } } @@ -154,14 +142,10 @@ open class MaterialMenuSheet( private fun clearEndDrawables() { (0 until binding.menuLayout.childCount).forEach { - val textView = (binding.menuLayout.getChildAt(it) as ViewGroup).getChildAt(0) as TextView - val imageView = (binding.menuLayout.getChildAt(it) as ViewGroup).getChildAt(1) as ImageView - textView.setTextColor(primaryColor) - TextViewCompat.setCompoundDrawableTintList( - textView, - ColorStateList.valueOf(primaryColor) - ) - imageView.invisible() + val itemView = (binding.menuLayout.getChildAt(it) as MenuSheetItemView) + itemView.setTextColor(primaryColor) + itemView.setIconColor(primaryColor) + itemView.setEndIcon(0) } } @@ -169,18 +153,10 @@ open class MaterialMenuSheet( if (clearAll) { clearEndDrawables() } - val layout = binding.menuLayout.findViewById(id) ?: return - val textView = layout.getChildAt(0) as? TextView - val imageView = layout.getChildAt(1) as? ImageView - textView?.setTextColor(textView.context.getResourceColor(R.attr.colorAccent)) - textView?.let { - TextViewCompat.setCompoundDrawableTintList( - it, - ColorStateList.valueOf(it.context.getResourceColor(R.attr.colorAccent)) - ) - } - imageView?.visible() - imageView?.setImageResource(drawableRes) + val layout = binding.menuLayout.findViewById(id) ?: return + layout.setTextColor(layout.context.getResourceColor(R.attr.colorAccent)) + layout.setIconColor(layout.context.getResourceColor(R.attr.colorAccent)) + layout.setEndIcon(drawableRes) } data class MenuSheetItem( diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/MenuSheetItemView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/MenuSheetItemView.kt new file mode 100644 index 0000000000..181672e0a8 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/MenuSheetItemView.kt @@ -0,0 +1,97 @@ +package eu.kanade.tachiyomi.widget + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.core.view.isInvisible +import androidx.core.widget.TextViewCompat +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.databinding.MenuSheetItemBinding + +class MenuSheetItemView @JvmOverloads constructor(context: Context, attrs: AttributeSet?) : + LinearLayout(context, attrs) { + private val mText: String + private val mIconRes: Int + private val mEndIconRes: Int + + private var binding: MenuSheetItemBinding? = null + + init { + val a = context.obtainStyledAttributes(attrs, R.styleable.MenuSheetItemView, 0, 0) + + val str = a.getString(R.styleable.MenuSheetItemView_android_text) ?: "" + mText = str + + val d = a.getResourceId(R.styleable.MenuSheetItemView_icon, 0) + mIconRes = d + + val e = a.getResourceId(R.styleable.MenuSheetItemView_endIcon, 0) + mEndIconRes = e + + a.recycle() + } + + override fun onFinishInflate() { + super.onFinishInflate() + binding = try { + MenuSheetItemBinding.bind(this) + } catch (e: Exception) { + MenuSheetItemBinding.inflate(LayoutInflater.from(context), this, true) + } + text = mText + setIcon(mIconRes) + setEndIcon(mEndIconRes) + } + + var text: CharSequence? + get() = binding?.itemTextView?.text + set(value) { + binding?.itemTextView?.text = value + } + + var textSize: Float + get() = binding?.itemTextView?.textSize ?: 0f + set(value) { + binding?.itemTextView?.textSize = value + } + + fun setText(@StringRes res: Int) { + text = context.getString(res) + } + + fun setTextColor(@ColorInt color: Int) { + binding?.itemTextView?.setTextColor(color) + } + + fun setIconColor(@ColorInt color: Int) = binding?.itemTextView?.let { + TextViewCompat.setCompoundDrawableTintList( + it, + ColorStateList.valueOf(color) + ) + } + + fun setIcon(@DrawableRes res: Int) { + binding?.itemTextView?.setCompoundDrawablesRelativeWithIntrinsicBounds( + res, + 0, + 0, + 0 + ) + } + + fun setEndIcon(@DrawableRes res: Int) { + binding?.menuEndItem?.isInvisible = res == 0 + binding?.menuEndItem?.setImageResource(res) + } + + fun setEndIcon(drawable: Drawable?) { + binding?.menuEndItem?.isInvisible = drawable == null + binding?.menuEndItem?.setImageDrawable(drawable) + } +} diff --git a/app/src/main/res/layout/menu_sheet_item.xml b/app/src/main/res/layout/menu_sheet_item.xml index 89afa15e7d..afe52ef0a8 100644 --- a/app/src/main/res/layout/menu_sheet_item.xml +++ b/app/src/main/res/layout/menu_sheet_item.xml @@ -1,17 +1,21 @@ - + android:orientation="horizontal" + tools:icon="@drawable/ic_share_24dp" + tools:endIcon="@drawable/ic_arrow_downward_24dp" + tools:text="@string/share"> + android:tint="@color/md_white_1000_54" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index d4ccfa4943..58711367cb 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -26,5 +26,11 @@ + + + + + + false