From 02e1dbc84425b0ac7f771c82f70444f742397452 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Mon, 7 Aug 2017 22:20:57 -0700 Subject: Release 3.3.0 (#32) * Rewrite Logger (#29) * Remove dependency on timber * Update logger * Reorder throwabl * Fix lint * Update readme * Blank target * Create Zip (#30) * Finish zips with tests * Finalize * Update changelog * Add log hooks * Open most logging functions * Remap kpref items (#31) * Update readme * Generate files and prepare release * Kpref - --- kpref-activity/README.md | 16 +++- kpref-activity/build.gradle | 1 - .../allanwang/kau/kpref/activity/KPrefActivity.kt | 98 ++++++++++------------ .../ca/allanwang/kau/kpref/activity/KPrefBinder.kt | 29 +------ .../src/main/res/layout/kau_pref_activity.xml | 16 +--- 5 files changed, 64 insertions(+), 96 deletions(-) (limited to 'kpref-activity') diff --git a/kpref-activity/README.md b/kpref-activity/README.md index 5ec94a6..015d0d8 100644 --- a/kpref-activity/README.md +++ b/kpref-activity/README.md @@ -39,9 +39,6 @@ An example of the adapter builder: ```kotlin override fun onCreateKPrefs(savedInstanceState: android.os.Bundle?): KPrefAdapterBuilder.() -> Unit = { - - textColor = { KPrefSample.textColor } // getter function so the new text color will be retrieved for every reload - accentColor = { KPrefSample.accentColor } header(R.string.header) @@ -66,4 +63,17 @@ override fun onCreateKPrefs(savedInstanceState: android.os.Bundle?): KPrefAdapte } } } +``` + +On top of per item configurations, `KPrefActivity` has some core attributes that you can define on creation. +It is done through the abstract function: + +```kotlin + + override fun kPrefCoreAttributes(): CoreAttributeContract.() -> Unit = { + textColor = { Prefs.textColor } // text color getter; refreshes automatically on reload + accentColor = { Prefs.accentColor } // accent color getter + // background color does not exist as it is done through the ripple canvas + } + ``` \ No newline at end of file diff --git a/kpref-activity/build.gradle b/kpref-activity/build.gradle index ab2a7de..e0849d4 100644 --- a/kpref-activity/build.gradle +++ b/kpref-activity/build.gradle @@ -5,7 +5,6 @@ ext.kauSubModuleResourcePrefix = "kau_pref_" apply from: '../android-lib.gradle' dependencies { - compile project(':core-ui') compile project(':adapter') compile project(':colorpicker') } diff --git a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefActivity.kt b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefActivity.kt index 3e1596f..900b004 100644 --- a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefActivity.kt +++ b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefActivity.kt @@ -3,49 +3,43 @@ package ca.allanwang.kau.kpref.activity import android.annotation.SuppressLint import android.os.Bundle import android.support.annotation.StringRes -import android.support.constraint.ConstraintLayout -import android.support.v7.app.AppCompatActivity import android.support.v7.widget.RecyclerView import android.support.v7.widget.Toolbar import android.view.View -import android.view.animation.Animation -import android.view.animation.AnimationUtils -import android.widget.FrameLayout -import android.widget.ViewAnimator +import ca.allanwang.kau.animators.KauAnimator +import ca.allanwang.kau.animators.SlideAnimatorAdd +import ca.allanwang.kau.animators.SlideAnimatorRemove import ca.allanwang.kau.internal.KauBaseActivity import ca.allanwang.kau.kpref.activity.items.KPrefItemCore import ca.allanwang.kau.ui.views.RippleCanvas -import ca.allanwang.kau.ui.widgets.TextSlider -import ca.allanwang.kau.utils.bindView -import ca.allanwang.kau.utils.resolveColor -import ca.allanwang.kau.utils.statusBarColor -import ca.allanwang.kau.utils.string +import ca.allanwang.kau.utils.* import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter +import org.jetbrains.anko.doAsync +import org.jetbrains.anko.uiThread +import java.util.* abstract class KPrefActivity : KauBaseActivity(), KPrefActivityContract { - val adapter: FastItemAdapter - @Suppress("UNCHECKED_CAST") - get() = recycler.adapter as FastItemAdapter - val recycler: RecyclerView - get() = prefHolder.currentView as RecyclerView - val container: ConstraintLayout by bindView(R.id.kau_container) + private val adapter: FastItemAdapter = FastItemAdapter() + private val recycler: RecyclerView by bindView(R.id.kau_recycler) val bgCanvas: RippleCanvas by bindView(R.id.kau_ripple) val toolbarCanvas: RippleCanvas by bindView(R.id.kau_toolbar_ripple) val toolbar: Toolbar by bindView(R.id.kau_toolbar) - val toolbarTitle: TextSlider by bindView(R.id.kau_toolbar_text) - val prefHolder: ViewAnimator by bindView(R.id.kau_holder) private lateinit var globalOptions: GlobalOptions + private val kprefStack = Stack>>() + /** + * Toggle sliding animations for the kpref items + */ var animate: Boolean = true - set(value) { - field = value - toolbarTitle.animationType = if (value) TextSlider.ANIMATION_SLIDE_HORIZONTAL else TextSlider.ANIMATION_NONE - } - private val SLIDE_IN_LEFT_ITEMS: Animation by lazy { AnimationUtils.loadAnimation(this, R.anim.kau_slide_in_left) } - private val SLIDE_IN_RIGHT_ITEMS: Animation by lazy { AnimationUtils.loadAnimation(this, R.anim.kau_slide_in_right) } - private val SLIDE_OUT_LEFT_ITEMS: Animation by lazy { AnimationUtils.loadAnimation(this, R.anim.kau_slide_out_left) } - private val SLIDE_OUT_RIGHT_ITEMS: Animation by lazy { AnimationUtils.loadAnimation(this, R.anim.kau_slide_out_right) } + private val recyclerAnimatorNext: KauAnimator by lazy { + KauAnimator(SlideAnimatorAdd(KAU_RIGHT, itemDelayFactor = 0f), + SlideAnimatorRemove(KAU_LEFT, itemDelayFactor = 0f)) + } + private val recyclerAnimatorPrev: KauAnimator by lazy { + KauAnimator(SlideAnimatorAdd(KAU_LEFT, itemDelayFactor = 0f), + SlideAnimatorRemove(KAU_RIGHT, itemDelayFactor = 0f)) + } /** * Core attribute builder that is consistent throughout all items @@ -69,43 +63,41 @@ abstract class KPrefActivity : KauBaseActivity(), KPrefActivityContract { statusBarColor = 0x30000000 toolbarCanvas.set(resolveColor(R.attr.colorPrimary)) bgCanvas.set(resolveColor(android.R.attr.colorBackground)) - prefHolder.animateFirstView = false //setup prefs val core = CoreAttributeBuilder() val builder = kPrefCoreAttributes() core.builder() globalOptions = GlobalOptions(core, this) - showNextPrefs(R.string.kau_settings, onCreateKPrefs(savedInstanceState)) + recycler.withLinearAdapter(adapter) + adapter.withSelectable(false) + .withOnClickListener { v, _, item, _ -> item.onClick(v, v.findViewById(R.id.kau_pref_inner_content)) } + showNextPrefs(R.string.kau_settings, onCreateKPrefs(savedInstanceState), true) } - override fun onPostCreate(savedInstanceState: Bundle?) { - super.onPostCreate(savedInstanceState) - } + override fun showNextPrefs(@StringRes toolbarTitleRes: Int, builder: KPrefAdapterBuilder.() -> Unit) + = showNextPrefs(toolbarTitleRes, builder, false) - override fun showNextPrefs(@StringRes toolbarTitleRes: Int, builder: KPrefAdapterBuilder.() -> Unit) { - val rv = RecyclerView(this).apply { - layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) - setKPrefAdapter(globalOptions, builder) + private fun showNextPrefs(@StringRes toolbarTitleRes: Int, builder: KPrefAdapterBuilder.() -> Unit, first: Boolean) { + doAsync { + val items = KPrefAdapterBuilder(globalOptions) + builder(items) + kprefStack.push(toolbarTitleRes to items.list) + recycler.itemAnimator = if (animate && !first) recyclerAnimatorNext else null + uiThread { + adapter.clear() + adapter.add(items.list) + toolbar.setTitle(toolbarTitleRes) + } } - with(prefHolder) { - inAnimation = if (animate) SLIDE_IN_RIGHT_ITEMS else null - outAnimation = if (animate) SLIDE_OUT_LEFT_ITEMS else null - addView(rv) - showNext() - } - toolbarTitle.setNextText(string(toolbarTitleRes)) } override fun showPrevPrefs() { - val current = prefHolder.currentView - with(prefHolder) { - inAnimation = if (animate) SLIDE_IN_LEFT_ITEMS else null - outAnimation = if (animate) SLIDE_OUT_RIGHT_ITEMS else null - showPrevious() - removeView(current) - adapter.notifyAdapterDataSetChanged() - } - toolbarTitle.setPrevText() + kprefStack.pop() + val (title, list) = kprefStack.peek() + recycler.itemAnimator = if (animate) recyclerAnimatorPrev else null + adapter.clear() + adapter.add(list) + toolbar.setTitle(title) } fun reload(vararg index: Int) { @@ -128,7 +120,7 @@ abstract class KPrefActivity : KauBaseActivity(), KPrefActivityContract { } fun backPress(): Boolean { - if (!toolbarTitle.isRoot) { + if (kprefStack.size > 1) { showPrevPrefs() return true } diff --git a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefBinder.kt b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefBinder.kt index 6048c1a..b45e406 100644 --- a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefBinder.kt +++ b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/KPrefBinder.kt @@ -1,39 +1,13 @@ package ca.allanwang.kau.kpref.activity 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.kpref.activity.items.* -import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter -import org.jetbrains.anko.doAsync -import org.jetbrains.anko.uiThread /** * Created by Allan Wang on 2017-06-08. * * Houses all the components that can be called externally to setup the kpref mainAdapter */ - -/** - * Base extension that will register the layout manager and mainAdapter with the given items - * Returns FastAdapter - */ -fun RecyclerView.setKPrefAdapter(globalOptions: GlobalOptions, builder: KPrefAdapterBuilder.() -> Unit): FastItemAdapter { - layoutManager = LinearLayoutManager(context) - val adapter = FastItemAdapter() - adapter.withOnClickListener { v, _, item, _ -> item.onClick(v, v.findViewById(R.id.kau_pref_inner_content)) } - this.adapter = adapter - doAsync { - val items = KPrefAdapterBuilder(globalOptions) - builder.invoke(items) - uiThread { - adapter.add(items.list) - } - } - return adapter -} - @DslMarker annotation class KPrefMarker @@ -70,6 +44,9 @@ class GlobalOptions(core: CoreAttributeContract, activity: KPrefActivityContract * Contains DSLs for every possible item * The arguments are all the mandatory values plus an optional builder housing all the possible configurations * The mandatory values are final so they cannot be edited in the builder + * + * This function will be called asynchronously, so don't worry about blocking the thread + * The recycler will only animate once this is completed though */ @KPrefMarker class KPrefAdapterBuilder(val globalOptions: GlobalOptions) { diff --git a/kpref-activity/src/main/res/layout/kau_pref_activity.xml b/kpref-activity/src/main/res/layout/kau_pref_activity.xml index 19320b8..7651e5a 100644 --- a/kpref-activity/src/main/res/layout/kau_pref_activity.xml +++ b/kpref-activity/src/main/res/layout/kau_pref_activity.xml @@ -1,7 +1,6 @@ @@ -22,16 +21,7 @@ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - - - + app:layout_constraintTop_toTopOf="parent" /> -