feat: 优化代码

pull/103/head
kunfei 5 years ago
parent d8e2e36c23
commit 25c9285524
  1. 4
      app/src/main/java/io/legado/app/lib/theme/prefs/ATESwitchPreference.kt
  2. 6
      app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt
  3. 8
      app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt
  4. 131
      app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt
  5. 9
      app/src/main/res/layout/view_select_action_bar.xml
  6. 2
      app/src/main/res/values/arrays.xml
  7. 4
      app/src/main/res/values/pref_key_value.xml
  8. 9
      app/src/main/res/xml/pref_config_theme.xml

@ -7,7 +7,7 @@ import androidx.preference.PreferenceViewHolder
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import io.legado.app.R import io.legado.app.R
import io.legado.app.lib.theme.ATH 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) : class ATESwitchPreference(context: Context, attrs: AttributeSet) :
SwitchPreferenceCompat(context, attrs) { SwitchPreferenceCompat(context, attrs) {
@ -17,7 +17,7 @@ class ATESwitchPreference(context: Context, attrs: AttributeSet) :
holder?.let { holder?.let {
val view = it.findViewById(R.id.switchWidget) val view = it.findViewById(R.id.switchWidget)
if (view is SwitchCompat) { if (view is SwitchCompat) {
ATH.setTint(view, ThemeStore.accentColor(view.getContext())) ATH.setTint(view, context.accentColor)
} }
} }
} }

@ -2,16 +2,15 @@ package io.legado.app.ui.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.Gravity
import android.view.View import android.view.View
import android.widget.FrameLayout
import android.widget.SeekBar import android.widget.SeekBar
import androidx.appcompat.widget.LinearLayoutCompat
import io.legado.app.R import io.legado.app.R
import io.legado.app.utils.progressAdd import io.legado.app.utils.progressAdd
import kotlinx.android.synthetic.main.view_detail_seek_bar.view.* import kotlinx.android.synthetic.main.view_detail_seek_bar.view.*
import org.jetbrains.anko.sdk27.listeners.onClick 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 { SeekBar.OnSeekBarChangeListener {
var valueFormat: ((progress: Int) -> String)? = null var valueFormat: ((progress: Int) -> String)? = null
@ -28,7 +27,6 @@ class DetailSeekBar(context: Context, attrs: AttributeSet?) : LinearLayoutCompat
} }
init { init {
gravity = Gravity.CENTER_VERTICAL
View.inflate(context, R.layout.view_detail_seek_bar, this) View.inflate(context, R.layout.view_detail_seek_bar, this)
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DetailSeekBar) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DetailSeekBar)

@ -2,27 +2,23 @@ package io.legado.app.ui.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.Gravity
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
import android.widget.FrameLayout
import androidx.annotation.MenuRes import androidx.annotation.MenuRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.appcompat.widget.LinearLayoutCompat
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import io.legado.app.R import io.legado.app.R
import io.legado.app.utils.dp
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.view_select_action_bar.view.* import kotlinx.android.synthetic.main.view_select_action_bar.view.*
import org.jetbrains.anko.sdk27.listeners.onClick 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 callBack: CallBack? = null
private var selMenu: PopupMenu? = null private var selMenu: PopupMenu? = null
init { init {
setBackgroundResource(R.color.background_menu) 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) View.inflate(context, R.layout.view_select_action_bar, this)
cb_selected_all.setOnCheckedChangeListener { buttonView, isChecked -> cb_selected_all.setOnCheckedChangeListener { buttonView, isChecked ->
if (buttonView.isPressed) { if (buttonView.isPressed) {

@ -1,17 +1,31 @@
package io.legado.app.ui.widget.prefs package io.legado.app.ui.widget.prefs
import android.content.Context import android.content.Context
import android.content.ContextWrapper
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle
import android.util.AttributeSet 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 android.widget.ImageView
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceViewHolder import androidx.preference.PreferenceViewHolder
import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.R 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) { class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) {
private var iconNames: Array<CharSequence>
private val mEntryDrawables = arrayListOf<Drawable>() private val mEntryDrawables = arrayListOf<Drawable>()
init { init {
@ -19,19 +33,17 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
val a = context.theme.obtainStyledAttributes(attrs, R.styleable.IconListPreference, 0, 0) val a = context.theme.obtainStyledAttributes(attrs, R.styleable.IconListPreference, 0, 0)
val drawables: Array<CharSequence> iconNames = try {
drawables = try {
a.getTextArray(R.styleable.IconListPreference_icons) a.getTextArray(R.styleable.IconListPreference_icons)
} finally { } finally {
a.recycle() a.recycle()
} }
for (drawable in drawables) { for (iconName in iconNames) {
val resId = context.resources val resId = context.resources
.getIdentifier(drawable.toString(), "mipmap", context.packageName) .getIdentifier(iconName.toString(), "mipmap", context.packageName)
val d = context.resources.getDrawable(resId) val d = context.getCompatDrawable(resId)
mEntryDrawables.add(d) mEntryDrawables.add(d!!)
} }
} }
@ -39,17 +51,118 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
super.onBindViewHolder(holder) super.onBindViewHolder(holder)
holder?.itemView?.findViewById<ImageView>(R.id.preview)?.let { holder?.itemView?.findViewById<ImageView>(R.id.preview)?.let {
val selectedIndex = findIndexOfValue(value) val selectedIndex = findIndexOfValue(value)
if (selectedIndex > 0) {
val drawable = mEntryDrawables[selectedIndex] val drawable = mEntryDrawables[selectedIndex]
it.setImageDrawable(drawable) it.setImageDrawable(drawable)
} }
} }
}
override fun onClick() { 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
}
}
class IconDialog : DialogFragment() {
var onChanged: ((value: String) -> Unit)? = null
var entries: Array<CharSequence>? = null
var entryValues: Array<CharSequence>? = null
var iconNames: Array<CharSequence>? = 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 IconDialog : DialogFragment() {
inner class Adapter(context: Context) :
SimpleRecyclerAdapter<CharSequence>(context, R.layout.item_icon_preference) {
override fun convert(
holder: ItemViewHolder,
item: CharSequence,
payloads: MutableList<Any>
) {
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
}
}
} }

@ -1,9 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:gravity="center_vertical"
android:elevation="2dp"> android:elevation="2dp">
<io.legado.app.lib.theme.view.ATECheckBox <io.legado.app.lib.theme.view.ATECheckBox
@ -47,4 +52,4 @@
android:visibility="gone" android:visibility="gone"
tools:ignore="RtlHardcoded" /> tools:ignore="RtlHardcoded" />
</merge> </LinearLayout>

@ -139,7 +139,7 @@
<string-array name="icons"> <string-array name="icons">
<item>@string/icon_main</item> <item>@string/icon_main</item>
<item>@string/icon_book</item> <item>@string/icon_1</item>
</string-array> </string-array>
<string-array name="chinese_mode"> <string-array name="chinese_mode">

@ -13,8 +13,8 @@
<string name="pk_download_path">downloadPath</string> <string name="pk_download_path">downloadPath</string>
<string name="pk_check_update">checkUpdate</string> <string name="pk_check_update">checkUpdate</string>
<string name="icon_main">ic_launcher_round</string> <string name="icon_main">ic_launcher</string>
<string name="icon_book">book_launcher_round</string> <string name="icon_1">ic_launcher_1</string>
<string name="pv_user_agent">Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.2357.134 Safari/537.36</string> <string name="pv_user_agent">Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.2357.134 Safari/537.36</string>

@ -2,6 +2,15 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<io.legado.app.ui.widget.prefs.IconListPreference
android:defaultValue="icon_main"
android:key="launcherIcon"
android:title="@string/change_icon"
android:entryValues="@array/icons"
android:entries="@array/icon_names"
app:icons="@array/icons"
app:iconSpaceReserved="false" />
<io.legado.app.lib.theme.prefs.ATESwitchPreference <io.legado.app.lib.theme.prefs.ATESwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:key="transparentStatusBar" android:key="transparentStatusBar"

Loading…
Cancel
Save