aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt16
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefBinder.kt20
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefCheckbox.kt26
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefColorPicker.kt11
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefHeader.kt6
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt23
-rw-r--r--library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemCore.kt44
-rw-r--r--library/src/main/res/layout/kau_preference_checkbox.xml2
-rw-r--r--library/src/main/res/values/strings.xml2
-rw-r--r--sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt15
-rw-r--r--sample/src/main/res/values/strings.xml2
11 files changed, 96 insertions, 71 deletions
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt
index eb9202d..c441782 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt
@@ -1,6 +1,7 @@
package ca.allanwang.kau.kpref
import android.os.Bundle
+import android.support.annotation.StringRes
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.Toolbar
@@ -12,7 +13,6 @@ import ca.allanwang.kau.utils.resolveColor
import ca.allanwang.kau.views.RippleCanvas
import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter
-
abstract class KPrefActivity : AppCompatActivity() {
lateinit var adapter: FastItemAdapter<KPrefItemCore>
@@ -32,6 +32,20 @@ abstract class KPrefActivity : AppCompatActivity() {
adapter = recycler.setKPrefAdapter(onCreateKPrefs(savedInstanceState))
}
+ fun reload(vararg index: Int) {
+ if (index.isEmpty()) adapter.notifyAdapterDataSetChanged()
+ else index.forEach { adapter.notifyItemChanged(it) }
+ }
+
+ fun reloadByTitle(@StringRes vararg title:Int){
+ if (title.isEmpty()) return
+ adapter.adapterItems.forEachIndexed { index, item ->
+ if (title.any { item.title == it })
+ adapter.notifyItemChanged(index)
+ }
+ }
+
abstract fun onCreateKPrefs(savedInstanceState: Bundle?): KPrefAdapterBuilder.() -> Unit
}
+
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefBinder.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefBinder.kt
index 57f4cb9..fc3b6ff 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefBinder.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefBinder.kt
@@ -3,6 +3,7 @@ package ca.allanwang.kau.kpref
import android.support.annotation.StringRes
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
+import ca.allanwang.kau.R
import ca.allanwang.kau.dialogs.color.Builder
import ca.allanwang.kau.kpref.items.KPrefCheckbox
import ca.allanwang.kau.kpref.items.KPrefColorPicker
@@ -17,7 +18,7 @@ import com.mikepenz.iconics.typeface.IIcon
fun RecyclerView.setKPrefAdapter(builder: KPrefAdapterBuilder.() -> Unit): FastItemAdapter<KPrefItemCore> {
layoutManager = LinearLayoutManager(context)
val adapter = FastItemAdapter<KPrefItemCore>()
- adapter.withOnClickListener { v, _, item, _ -> item.onClick(v) }
+ adapter.withOnClickListener { v, _, item, _ -> item.onClick(v, v.findViewById(R.id.kau_pref_inner_content)) }
val items = KPrefAdapterBuilder()
builder.invoke(items)
adapter.add(items.list)
@@ -27,30 +28,25 @@ fun RecyclerView.setKPrefAdapter(builder: KPrefAdapterBuilder.() -> Unit): FastI
class KPrefAdapterBuilder {
- var textColor: Int? = null
- get() = textColorGetter?.invoke() ?: field
- var accentColor: Int? = null
- get() = accentColorGetter?.invoke() ?: field
-
- var textColorGetter: (() -> Int)? = null
- var accentColorGetter: (() -> Int)? = null
+ var textColor: (() -> Int)? = null
+ var accentColor: (() -> Int)? = null
fun header(@StringRes title: Int) = list.add(KPrefHeader(this, title))
fun checkbox(@StringRes title: Int,
@StringRes description: Int = -1,
iicon: IIcon? = null,
- enabled: Boolean = true,
+ enabler: () -> Boolean = { true },
getter: () -> Boolean,
- setter: (value: Boolean) -> Unit) = list.add(KPrefCheckbox(this, title, description, iicon, enabled, getter, setter))
+ setter: (value: Boolean) -> Unit) = list.add(KPrefCheckbox(this, title, description, iicon, enabler, getter, setter))
fun colorPicker(@StringRes title: Int,
@StringRes description: Int = -1,
iicon: IIcon? = null,
- enabled: Boolean = true,
+ enabler: () -> Boolean = { true },
getter: () -> Int,
setter: (value: Int) -> Unit,
- configs: Builder.() -> Unit = {}) = list.add(KPrefColorPicker(this, title, description, iicon, enabled, getter, setter, configs))
+ configs: Builder.() -> Unit = {}) = list.add(KPrefColorPicker(this, title, description, iicon, enabler, getter, setter, configs))
internal val list: MutableList<KPrefItemCore> = mutableListOf()
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefCheckbox.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefCheckbox.kt
index 474c3e5..75b480f 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefCheckbox.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefCheckbox.kt
@@ -5,7 +5,6 @@ import android.view.View
import android.widget.CheckBox
import ca.allanwang.kau.R
import ca.allanwang.kau.kpref.KPrefAdapterBuilder
-import ca.allanwang.kau.logging.SL
import ca.allanwang.kau.utils.tint
import com.mikepenz.iconics.typeface.IIcon
@@ -19,27 +18,24 @@ class KPrefCheckbox(builder: KPrefAdapterBuilder,
@StringRes title: Int,
@StringRes description: Int = -1,
iicon: IIcon? = null,
- enabled: Boolean = true,
+ enabler: () -> Boolean = { true },
getter: () -> Boolean,
- setter: (value: Boolean) -> Unit) : KPrefItemBase<Boolean>(builder, title, description, iicon, enabled, getter, setter) {
+ setter: (value: Boolean) -> Unit) : KPrefItemBase<Boolean>(builder, title, description, iicon, enabler, getter, setter) {
- override fun onClick(itemView: View): Boolean {
- val checkbox = itemView.findViewById(R.id.kau_pref_checkbox) as CheckBox
+ override fun onClick(itemView: View, innerContent: View?): Boolean {
pref = !pref
- checkbox.isChecked = pref
+ (innerContent as CheckBox).isChecked = pref
return true
}
- override fun onPostBindView(viewHolder: ViewHolder, builder: KPrefAdapterBuilder) {
- super.onPostBindView(viewHolder, builder)
- viewHolder.addInnerView(R.layout.kau_preference_checkbox)
- if (builder.accentColor != null) {
- val checkbox = viewHolder.itemView.findViewById(R.id.kau_pref_checkbox) as CheckBox
- checkbox.tint(builder.accentColor!!)
- checkbox.isChecked = pref //Checkbox tick needs to be delayed since notifyDataSetChanged will cancel the animation
- //It seems to work well here
- }
+ override fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?) {
+ super.onPostBindView(viewHolder, textColor, accentColor)
+ val checkbox = viewHolder.bindInnerView<CheckBox>(R.layout.kau_preference_checkbox)
+ if (accentColor != null) checkbox.tint(accentColor)
+ checkbox.isChecked = pref //Checkbox tick needs to be delayed since notifyDataSetChanged will cancel the animation
+ //It seems to work well here
+// checkbox.jumpDrawablesToCurrentState()
}
override fun getType(): Int = R.id.kau_item_pref_checkbox
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefColorPicker.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefColorPicker.kt
index a9926ef..b590233 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefColorPicker.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefColorPicker.kt
@@ -18,17 +18,18 @@ class KPrefColorPicker(builder: KPrefAdapterBuilder,
@StringRes title: Int,
@StringRes description: Int = -1,
iicon: IIcon? = null,
- enabled: Boolean = true,
+ enabler: () -> Boolean = { true },
getter: () -> Int,
setter: (value: Int) -> Unit,
- val configs: Builder.() -> Unit = {}) : KPrefItemBase<Int>(builder, title, description, iicon, enabled, getter, setter) {
+ val configs: Builder.() -> Unit = {}) : KPrefItemBase<Int>(builder, title, description, iicon, enabler, getter, setter) {
- override fun onPostBindView(viewHolder: KPrefItemCore.ViewHolder, builder: KPrefAdapterBuilder) {
- super.onPostBindView(viewHolder, builder)
+ override fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?) {
+ super.onPostBindView(viewHolder, textColor, accentColor)
//TODO add color circle view
}
- override fun onClick(itemView: View): Boolean {
+
+ override fun onClick(itemView: View, innerContent: View?): Boolean {
itemView.context.colorPickerDialog {
titleRes = this@KPrefColorPicker.title
defaultColor = pref
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefHeader.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefHeader.kt
index 1175fc2..0cd5901 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefHeader.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefHeader.kt
@@ -15,12 +15,12 @@ class KPrefHeader(builder: KPrefAdapterBuilder, @StringRes title: Int) : KPrefIt
override fun getLayoutRes(): Int = R.layout.kau_preference_header
- override fun onPostBindView(viewHolder: ViewHolder, builder: KPrefAdapterBuilder) {
+ override fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?) {
viewHolder.itemView.isClickable = false
- if (builder.accentColor != null) viewHolder.title.setTextColor(builder.accentColor!!)
+ if (accentColor != null) viewHolder.title.setTextColor(accentColor)
}
- override fun onClick(itemView: View): Boolean = true
+ override fun onClick(itemView: View, innerContent: View?): Boolean = true
override fun getType() = R.id.kau_item_pref_header
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt
index adcbc8a..3c62b43 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt
@@ -2,9 +2,9 @@ package ca.allanwang.kau.kpref.items
import android.support.annotation.CallSuper
import android.support.annotation.StringRes
-import android.util.Log
import ca.allanwang.kau.R
import ca.allanwang.kau.kpref.KPrefAdapterBuilder
+import ca.allanwang.kau.logging.SL
import com.mikepenz.iconics.typeface.IIcon
/**
@@ -17,7 +17,7 @@ abstract class KPrefItemBase<T>(builder: KPrefAdapterBuilder,
@StringRes title: Int,
@StringRes description: Int = -1,
iicon: IIcon? = null,
- val enabled: Boolean = true,
+ val enabler: () -> Boolean = { true },
private val getter: () -> T,
private val setter: (value: T) -> Unit) : KPrefItemCore(builder, title, description, iicon) {
@@ -28,9 +28,22 @@ abstract class KPrefItemBase<T>(builder: KPrefAdapterBuilder,
}
@CallSuper
- override fun onPostBindView(viewHolder: ViewHolder, builder: KPrefAdapterBuilder) {
- viewHolder.itemView.isEnabled = enabled
- viewHolder.itemView.alpha = if (enabled) 1.0f else 0.3f
+ override fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?) {
+ val enabled = enabler.invoke()
+ with(viewHolder){
+ itemView.isEnabled = enabled
+ itemView.alpha = if (enabled) 1.0f else 0.3f
+ SL.d("Alpha ${itemView.isEnabled} ${itemView.alpha}")
+ }
+ }
+
+ override fun unbindView(holder: ViewHolder) {
+ super.unbindView(holder)
+ with(holder) {
+// itemView.isEnabled = true
+// itemView.alpha = 1.0f
+ SL.d("Unset alpha ${itemView.isEnabled} ${itemView.alpha}")
+ }
}
override final fun getLayoutRes(): Int = R.layout.kau_preference
diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemCore.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemCore.kt
index 98e977e..169c716 100644
--- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemCore.kt
+++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemCore.kt
@@ -13,6 +13,7 @@ import android.widget.TextView
import butterknife.ButterKnife
import ca.allanwang.kau.R
import ca.allanwang.kau.kpref.KPrefAdapterBuilder
+import ca.allanwang.kau.logging.SL
import ca.allanwang.kau.utils.*
import com.mikepenz.fastadapter.items.AbstractItem
import com.mikepenz.iconics.typeface.IIcon
@@ -33,6 +34,7 @@ abstract class KPrefItemCore(val builder: KPrefAdapterBuilder,
@CallSuper
override fun bindView(viewHolder: ViewHolder, payloads: List<Any>) {
super.bindView(viewHolder, payloads)
+ SL.d("BINDVIEW")
with(viewHolder) {
val context = itemView.context
title.text = context.string(this@KPrefItemCore.title)
@@ -45,36 +47,31 @@ abstract class KPrefItemCore(val builder: KPrefAdapterBuilder,
icon?.setIcon(iicon, 48)
} else iconFrame?.gone()
innerFrame?.removeAllViews()
- setColors(this)
- onPostBindView(this, builder)
- }
- }
-
- fun setColors(viewHolder: ViewHolder) {
- with(viewHolder) {
- if (builder.textColor != null) {
- title.setTextColor(builder.textColor!!)
- desc?.setTextColor(builder.textColor!!)
+ val textColor = builder.textColor?.invoke()
+ if (textColor != null) {
+ title.setTextColor(textColor)
+ desc?.setTextColor(textColor)
}
- if (builder.accentColor != null) {
- icon?.drawable?.setTint(builder.accentColor!!)
+ val accentColor = builder.accentColor?.invoke()
+ if (accentColor != null) {
+ icon?.drawable?.setTint(accentColor)
}
+ onPostBindView(this, textColor, accentColor)
}
}
- abstract fun onPostBindView(viewHolder: ViewHolder, builder: KPrefAdapterBuilder)
+ abstract fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?)
- abstract fun onClick(itemView: View): Boolean
+ abstract fun onClick(itemView: View, innerContent: View?): Boolean
override fun unbindView(holder: ViewHolder) {
super.unbindView(holder)
+ SL.d("UNBINDVIEW")
with(holder) {
title.text = null
desc?.text = null
icon?.setImageDrawable(null)
- innerFrame?.removeAllViews()
- itemView.isEnabled = true
- itemView.alpha = 1.0f
+// innerFrame?.removeAllViews()
}
}
@@ -84,15 +81,24 @@ abstract class KPrefItemCore(val builder: KPrefAdapterBuilder,
val icon: ImageView? by bindOptionalView(R.id.kau_pref_icon)
val iconFrame: LinearLayout? by bindOptionalView(R.id.kau_pref_icon_frame)
val innerFrame: LinearLayout? by bindOptionalView(R.id.kau_pref_inner_frame)
+ val innerContent: View?
+ get() = itemView.findViewById(R.id.kau_pref_inner_content)
init {
ButterKnife.bind(v)
}
- fun addInnerView(@LayoutRes id: Int) {
- LayoutInflater.from(innerFrame!!.context).inflate(id, innerFrame)
+ 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)
}
} \ No newline at end of file
diff --git a/library/src/main/res/layout/kau_preference_checkbox.xml b/library/src/main/res/layout/kau_preference_checkbox.xml
index 1f2807b..5ab368b 100644
--- a/library/src/main/res/layout/kau_preference_checkbox.xml
+++ b/library/src/main/res/layout/kau_preference_checkbox.xml
@@ -1,5 +1,5 @@
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/kau_pref_checkbox"
+ android:id="@+id/kau_pref_inner_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
diff --git a/library/src/main/res/values/strings.xml b/library/src/main/res/values/strings.xml
index 98dc0a1..10a73b9 100644
--- a/library/src/main/res/values/strings.xml
+++ b/library/src/main/res/values/strings.xml
@@ -12,4 +12,6 @@
<string name="kau_md_custom">Custom</string>
<string name="kau_md_presets">Presets</string>
<string name="kau_md_color_palette">Color Palette</string>
+
+ <string name="kau_kpref_title_placeholder">Title Placeholder</string>
</resources>
diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt
index db42f9b..914fff8 100644
--- a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt
+++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt
@@ -14,27 +14,24 @@ import ca.allanwang.kau.views.RippleCanvas
class MainActivity : KPrefActivity() {
override fun onCreateKPrefs(savedInstanceState: android.os.Bundle?): KPrefAdapterBuilder.() -> Unit = {
- textColorGetter = { KPrefSample.textColor }
- accentColorGetter = { KPrefSample.accentColor }
+ textColor = { KPrefSample.textColor }
+ accentColor = { KPrefSample.accentColor }
header(R.string.header)
checkbox(title = R.string.checkbox_1, description = R.string.desc,
getter = { KPrefSample.check1 }, setter = { KPrefSample.check1 = it })
checkbox(title = R.string.checkbox_2,
- getter = { KPrefSample.check2 }, setter = { KPrefSample.check2 = it })
- checkbox(title = R.string.checkbox_3, description = R.string.desc_disabled, enabled = false,
+ getter = { KPrefSample.check2 }, setter = { KPrefSample.check2 = it; reloadByTitle(R.string.checkbox_3) })
+ checkbox(title = R.string.checkbox_3, description = R.string.desc_dependent, enabler = { KPrefSample.check2 },
getter = { KPrefSample.check3 }, setter = { KPrefSample.check3 = it })
colorPicker(title = R.string.text_color, description = R.string.color_custom,
- getter = { KPrefSample.textColor }, setter = {
- KPrefSample.textColor = it
- adapter.notifyAdapterDataSetChanged()
- },
+ getter = { KPrefSample.textColor }, setter = { KPrefSample.textColor = it; reload() },
configs = {
allowCustom = true
})
colorPicker(title = R.string.accent_color, description = R.string.color_no_custom,
getter = { KPrefSample.accentColor }, setter = {
KPrefSample.accentColor = it
- adapter.notifyAdapterDataSetChanged()
+ reload()
val darkerColor = it.darken()
this@MainActivity.navigationBarColor = darkerColor
toolbarCanvas.ripple(darkerColor, RippleCanvas.MIDDLE, RippleCanvas.END, duration = 500)
diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml
index 1246baf..56addfd 100644
--- a/sample/src/main/res/values/strings.xml
+++ b/sample/src/main/res/values/strings.xml
@@ -6,7 +6,7 @@
<string name="checkbox_1">Checkbox 1</string>
<string name="checkbox_2">Checkbox 2</string>
<string name="checkbox_3">Checkbox 3</string>
- <string name="desc_disabled">I am disabled</string>
+ <string name="desc_dependent">I am dependent on checkbox 2</string>
<string name="text_color">Text Color</string>
<string name="accent_color">Accent Color</string>
<string name="background_color">Background Color</string>