From 25c9285524b94cbb4955c153eea220ead4845d80 Mon Sep 17 00:00:00 2001 From: kunfei Date: Thu, 13 Feb 2020 13:33:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/theme/prefs/ATESwitchPreference.kt | 4 +- .../io/legado/app/ui/widget/DetailSeekBar.kt | 6 +- .../legado/app/ui/widget/SelectActionBar.kt | 8 +- .../app/ui/widget/prefs/IconListPreference.kt | 135 ++++++++++++++++-- .../res/layout/view_select_action_bar.xml | 9 +- app/src/main/res/values/arrays.xml | 2 +- app/src/main/res/values/pref_key_value.xml | 4 +- app/src/main/res/xml/pref_config_theme.xml | 9 ++ 8 files changed, 149 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/prefs/ATESwitchPreference.kt b/app/src/main/java/io/legado/app/lib/theme/prefs/ATESwitchPreference.kt index 998865a7f..70f620dac 100644 --- a/app/src/main/java/io/legado/app/lib/theme/prefs/ATESwitchPreference.kt +++ b/app/src/main/java/io/legado/app/lib/theme/prefs/ATESwitchPreference.kt @@ -7,7 +7,7 @@ import androidx.preference.PreferenceViewHolder import androidx.preference.SwitchPreferenceCompat import io.legado.app.R import io.legado.app.lib.theme.ATH -import io.legado.app.lib.theme.ThemeStore +import io.legado.app.lib.theme.accentColor class ATESwitchPreference(context: Context, attrs: AttributeSet) : SwitchPreferenceCompat(context, attrs) { @@ -17,7 +17,7 @@ class ATESwitchPreference(context: Context, attrs: AttributeSet) : holder?.let { val view = it.findViewById(R.id.switchWidget) if (view is SwitchCompat) { - ATH.setTint(view, ThemeStore.accentColor(view.getContext())) + ATH.setTint(view, context.accentColor) } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt b/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt index 9d956def5..a959ce515 100644 --- a/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt @@ -2,16 +2,15 @@ package io.legado.app.ui.widget import android.content.Context import android.util.AttributeSet -import android.view.Gravity import android.view.View +import android.widget.FrameLayout import android.widget.SeekBar -import androidx.appcompat.widget.LinearLayoutCompat import io.legado.app.R import io.legado.app.utils.progressAdd import kotlinx.android.synthetic.main.view_detail_seek_bar.view.* import org.jetbrains.anko.sdk27.listeners.onClick -class DetailSeekBar(context: Context, attrs: AttributeSet?) : LinearLayoutCompat(context, attrs), +class DetailSeekBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs), SeekBar.OnSeekBarChangeListener { var valueFormat: ((progress: Int) -> String)? = null @@ -28,7 +27,6 @@ class DetailSeekBar(context: Context, attrs: AttributeSet?) : LinearLayoutCompat } init { - gravity = Gravity.CENTER_VERTICAL View.inflate(context, R.layout.view_detail_seek_bar, this) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DetailSeekBar) diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 4597abd3b..3aab86a50 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -2,27 +2,23 @@ package io.legado.app.ui.widget import android.content.Context import android.util.AttributeSet -import android.view.Gravity import android.view.Menu import android.view.View +import android.widget.FrameLayout import androidx.annotation.MenuRes import androidx.annotation.StringRes -import androidx.appcompat.widget.LinearLayoutCompat import androidx.appcompat.widget.PopupMenu import io.legado.app.R -import io.legado.app.utils.dp import io.legado.app.utils.visible import kotlinx.android.synthetic.main.view_select_action_bar.view.* import org.jetbrains.anko.sdk27.listeners.onClick -class SelectActionBar(context: Context, attrs: AttributeSet?) : LinearLayoutCompat(context, attrs) { +class SelectActionBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { private var callBack: CallBack? = null private var selMenu: PopupMenu? = null init { setBackgroundResource(R.color.background_menu) - setPadding(16.dp, 6.dp, 16.dp, 6.dp) - gravity = Gravity.CENTER_VERTICAL View.inflate(context, R.layout.view_select_action_bar, this) cb_selected_all.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView.isPressed) { diff --git a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt index d56790533..25f863a52 100644 --- a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt +++ b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt @@ -1,17 +1,31 @@ package io.legado.app.ui.widget.prefs import android.content.Context +import android.content.ContextWrapper import android.graphics.drawable.Drawable +import android.os.Bundle import android.util.AttributeSet +import android.util.DisplayMetrics +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.widget.ImageView import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentActivity import androidx.preference.ListPreference import androidx.preference.PreferenceViewHolder +import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.utils.getCompatDrawable +import kotlinx.android.synthetic.main.dialog_recycler_view.* +import kotlinx.android.synthetic.main.item_icon_preference.view.* +import org.jetbrains.anko.sdk27.listeners.onClick class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) { - + private var iconNames: Array private val mEntryDrawables = arrayListOf() init { @@ -19,19 +33,17 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference val a = context.theme.obtainStyledAttributes(attrs, R.styleable.IconListPreference, 0, 0) - val drawables: Array - - drawables = try { + iconNames = try { a.getTextArray(R.styleable.IconListPreference_icons) } finally { a.recycle() } - for (drawable in drawables) { + for (iconName in iconNames) { val resId = context.resources - .getIdentifier(drawable.toString(), "mipmap", context.packageName) - val d = context.resources.getDrawable(resId) - mEntryDrawables.add(d) + .getIdentifier(iconName.toString(), "mipmap", context.packageName) + val d = context.getCompatDrawable(resId) + mEntryDrawables.add(d!!) } } @@ -39,17 +51,118 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference super.onBindViewHolder(holder) holder?.itemView?.findViewById(R.id.preview)?.let { val selectedIndex = findIndexOfValue(value) - val drawable = mEntryDrawables[selectedIndex] - it.setImageDrawable(drawable) + if (selectedIndex > 0) { + val drawable = mEntryDrawables[selectedIndex] + it.setImageDrawable(drawable) + } } } override fun onClick() { + getActivity()?.let { + IconDialog().apply { + val args = Bundle() + args.putCharSequenceArray("entries", entries) + args.putCharSequenceArray("entryValues", entryValues) + args.putCharSequenceArray("iconNames", iconNames) + arguments = args + onChanged = { value -> + this@IconListPreference.value = value + } + }.show(it.supportFragmentManager, "iconDialog") + } + } + private fun getActivity(): FragmentActivity? { + val context = context + if (context is FragmentActivity) { + return context + } else if (context is ContextWrapper) { + val baseContext = context.baseContext + if (baseContext is FragmentActivity) { + return baseContext + } + } + return null } +} - inner class IconDialog : DialogFragment() { +class IconDialog : DialogFragment() { + var onChanged: ((value: String) -> Unit)? = null + var entries: Array? = null + var entryValues: Array? = null + var iconNames: Array? = null + + override fun onStart() { + super.onStart() + val dm = DisplayMetrics() + activity?.windowManager?.defaultDisplay?.getMetrics(dm) + dialog?.window?.setLayout( + (dm.widthPixels * 0.9).toInt(), + (dm.heightPixels * 0.9).toInt() + ) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.dialog_recycler_view, container) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + tool_bar.setTitle(R.string.change_icon) + recycler_view.layoutManager = LinearLayoutManager(requireContext()) + val adapter = Adapter(requireContext()) + recycler_view.adapter = adapter + arguments?.let { + entries = it.getCharSequenceArray("entries")!! + entryValues = it.getCharSequenceArray("entryValues")!! + iconNames = it.getCharSequenceArray("iconNames")!! + entryValues?.let { values -> + adapter.setItems(values.toList()) + } + } + } + + + inner class Adapter(context: Context) : + SimpleRecyclerAdapter(context, R.layout.item_icon_preference) { + + override fun convert( + holder: ItemViewHolder, + item: CharSequence, + payloads: MutableList + ) { + with(holder.itemView) { + val index = findIndexOfValue(item.toString()) + entries?.let { + label.text = it[index] + } + iconNames?.let { + val resId = context.resources + .getIdentifier(it[index].toString(), "mipmap", context.packageName) + val d = context.getCompatDrawable(resId) + icon.setImageDrawable(d) + } + onClick { + onChanged?.invoke(item.toString()) + } + } + } + + private fun findIndexOfValue(value: String?): Int { + entryValues?.let { values -> + for (i in values.indices.reversed()) { + if (values[i] == value) { + return i + } + } + } + return -1 + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/view_select_action_bar.xml b/app/src/main/res/layout/view_select_action_bar.xml index 6a2e67e6e..c9a8b0e21 100644 --- a/app/src/main/res/layout/view_select_action_bar.xml +++ b/app/src/main/res/layout/view_select_action_bar.xml @@ -1,9 +1,14 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index ec780c8b6..6a36a65da 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -139,7 +139,7 @@ @string/icon_main - @string/icon_book + @string/icon_1 diff --git a/app/src/main/res/values/pref_key_value.xml b/app/src/main/res/values/pref_key_value.xml index 71c26bc29..fc7269764 100644 --- a/app/src/main/res/values/pref_key_value.xml +++ b/app/src/main/res/values/pref_key_value.xml @@ -13,8 +13,8 @@ downloadPath checkUpdate - ic_launcher_round - book_launcher_round + ic_launcher + ic_launcher_1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.2357.134 Safari/537.36 diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index e665e355f..422fc3bff 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -2,6 +2,15 @@ + +