blob: 7d0f9f7b65af19598ae87042dc2901e52dbf9c37 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package ca.allanwang.kau.kpref.items
import android.support.annotation.CallSuper
import android.support.annotation.IdRes
import android.support.annotation.LayoutRes
import android.support.annotation.StringRes
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import ca.allanwang.kau.R
import ca.allanwang.kau.kpref.GlobalOptions
import ca.allanwang.kau.kpref.KPrefMarker
import ca.allanwang.kau.utils.*
import com.mikepenz.fastadapter.items.AbstractItem
import com.mikepenz.iconics.typeface.IIcon
/**
* Created by Allan Wang on 2017-06-05.
*
* Core class containing nothing but the view items
*/
abstract class KPrefItemCore(val core: CoreContract) : AbstractItem<KPrefItemCore, KPrefItemCore.ViewHolder>() {
override final fun getViewHolder(v: View) = ViewHolder(v)
@CallSuper
override fun bindView(viewHolder: ViewHolder, payloads: List<Any>) {
super.bindView(viewHolder, payloads)
with(viewHolder) {
val context = itemView.context
title.text = context.string(core.titleRes)
if (core.descRes > 0)
desc?.visible()?.setText(core.descRes)
else
desc?.gone()
if (core.iicon != null) icon?.visible()?.setIcon(core.iicon, 24)
else icon?.gone()
innerFrame?.removeAllViews()
val textColor = core.globalOptions.textColor?.invoke()
if (textColor != null) {
title.setTextColor(textColor)
desc?.setTextColor(textColor)
}
val accentColor = core.globalOptions.accentColor?.invoke()
if (accentColor != null) {
icon?.drawable?.setTint(accentColor)
}
onPostBindView(this, textColor, accentColor)
}
}
abstract fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?)
abstract fun onClick(itemView: View, innerContent: View?): Boolean
override fun unbindView(holder: ViewHolder) {
super.unbindView(holder)
with(holder) {
title.text = null
desc?.text = null
icon?.setImageDrawable(null)
// innerFrame?.removeAllViews()
}
}
/**
* Core values for all kpref items
*/
@KPrefMarker
interface CoreContract {
val globalOptions: GlobalOptions
@get:StringRes val titleRes: Int
var descRes: Int
@StringRes get
var iicon: IIcon?
/**
* Attempts to reload current item by identifying it with its [titleRes]
*/
fun reloadSelf()
}
/**
* Default implementation of [CoreContract]
*/
class CoreBuilder(override val globalOptions: GlobalOptions,
override @param:StringRes val titleRes: Int) : CoreContract {
override var descRes: Int = -1
override var iicon: IIcon? = null
override fun reloadSelf() {
globalOptions.reloadByTitle(titleRes)
}
}
class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
val title: TextView by bindView(R.id.kau_pref_title)
val container: ViewGroup? by bindOptionalView(R.id.kau_pref_container)
val desc: TextView? by bindOptionalView(R.id.kau_pref_desc)
val icon: ImageView? by bindOptionalView(R.id.kau_pref_icon)
val innerFrame: LinearLayout? by bindOptionalView(R.id.kau_pref_inner_frame)
val innerContent: View?
get() = itemView.findViewById(R.id.kau_pref_inner_content)
inline fun <reified T : View> bindInnerView(@LayoutRes id: Int): T {
if (innerFrame == null) throw IllegalStateException("Cannot bind inner view when innerFrame does not exist")
if (innerContent !is T) {
innerFrame!!.removeAllViews()
LayoutInflater.from(innerFrame!!.context).inflate(id, innerFrame)
}
return innerContent as T
}
inline fun <reified T : View> getInnerView() = innerContent as T
operator fun get(@IdRes id: Int): View = itemView.findViewById(id)
}
}
|