From 8f2b5ac043f47cc44f43c3788d1377083fb339a2 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Tue, 18 Jul 2017 20:16:23 -0700 Subject: Dev 2.1 (#8) * Rewrite animation interfaces * Update changelog * Add scale factor for slide * Remove margins in iitems and replace with decorators * Remove mutable list * Switch cardiitem to use lambdas for click * status * Utils update and imagepicker fixes * Remove stringholder * Add fade in fade out * Increment about version * Rename fromedge to direction in javadocs * More logging * Add logging and docs * Make card icons visible * Update email builder and icon padding * Create elastic recycler activity * Fix card iitem * Add lint check and plurals * Inline all the things * Format and sort xml * Update dependencies and increment version --- .../kau/ui/activities/ElasticRecyclerActivity.kt | 81 ++++++++++++++++++++++ .../ca/allanwang/kau/ui/views/BoundedCardView.kt | 8 ++- .../kotlin/ca/allanwang/kau/ui/views/CutoutView.kt | 6 +- .../ca/allanwang/kau/ui/views/MeasuredImageView.kt | 23 ++++++ .../src/main/res/drawable/kau_selectable_white.xml | 6 ++ .../res/layout/kau_elastic_recycler_activity.xml | 51 ++++++++++++++ core-ui/src/main/res/values/attr.xml | 58 ++++++++-------- core-ui/src/main/res/values/colors.xml | 4 +- core-ui/src/main/res/values/strings.xml | 4 ++ core-ui/src/main/res/values/styles.xml | 16 +++-- 10 files changed, 217 insertions(+), 40 deletions(-) create mode 100644 core-ui/src/main/kotlin/ca/allanwang/kau/ui/activities/ElasticRecyclerActivity.kt create mode 100644 core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/MeasuredImageView.kt create mode 100644 core-ui/src/main/res/drawable/kau_selectable_white.xml create mode 100644 core-ui/src/main/res/layout/kau_elastic_recycler_activity.xml create mode 100644 core-ui/src/main/res/values/strings.xml (limited to 'core-ui') diff --git a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/activities/ElasticRecyclerActivity.kt b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/activities/ElasticRecyclerActivity.kt new file mode 100644 index 0000000..1dcf14b --- /dev/null +++ b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/activities/ElasticRecyclerActivity.kt @@ -0,0 +1,81 @@ +package ca.allanwang.kau.ui.activities + +import android.os.Bundle +import android.support.design.widget.AppBarLayout +import android.support.design.widget.CoordinatorLayout +import android.support.design.widget.FloatingActionButton +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.RecyclerView +import android.support.v7.widget.Toolbar +import android.transition.TransitionInflater +import ca.allanwang.kau.ui.R +import ca.allanwang.kau.ui.widgets.ElasticDragDismissFrameLayout +import ca.allanwang.kau.utils.bindView + +/** + * Created by Allan Wang on 2017-07-17. + * + * A generic activity comprised of an ElasticDragDismissFrameLayout, CoordinatorLayout, Toolbar, RecyclerView, and Fab + * [ca.allanwang.kau.ui.widgets.ElasticDragDismissFrameLayout] + * [android.support.v7.widget.RecyclerView] + * + * The recyclerview defaults to a linearlayoutmanager, and the adapter is automatically bounded + * + * The exit animation is set to slide out, but the entrance must be defined yourself + */ +abstract class ElasticRecyclerActivity() : AppCompatActivity() { + + val appBar: AppBarLayout by bindView(R.id.kau_appbar) + val toolbar: Toolbar by bindView(R.id.kau_toolbar) + val coordinator: CoordinatorLayout by bindView(R.id.kau_coordinator) + val draggableFrame: ElasticDragDismissFrameLayout by bindView(R.id.kau_draggable) + val recycler: RecyclerView by bindView(R.id.kau_recycler) + val fab: FloatingActionButton by bindView(R.id.kau_fab) + val configs = Configs() + + class Configs { + var exitTransitionBottom = R.transition.kau_exit_slide_bottom + var exitTransitionTop = R.transition.kau_exit_slide_top + } + + override final fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.kau_elastic_recycler_activity) + setSupportActionBar(toolbar) + if (!onCreate(savedInstanceState, configs)) return + draggableFrame.addListener(object : ElasticDragDismissFrameLayout.SystemChromeFader(this) { + override fun onDragDismissed() { + window.returnTransition = TransitionInflater.from(this@ElasticRecyclerActivity) + .inflateTransition(if (draggableFrame.translationY > 0) configs.exitTransitionBottom else configs.exitTransitionTop) + recycler.stopScroll() + finishAfterTransition() + } + }) + } + + /** + * The replacement method for the original [onCreate] + * The configurations are passed and can be customized here + * Returns true (default) if we wish to continue with the remaining optional setup + * Return false if we wish to skip this (usually if we have more complez requirements) + */ + abstract fun onCreate(savedInstanceState: Bundle?, configs: Configs): Boolean + + /** + * Receive actions when the a click event is received outside of the coordinator + */ + fun setOutsideTapListener(listener: () -> Unit) { + draggableFrame.setOnClickListener { listener() } + } + + fun hideFabOnUpwardsScroll() { + recycler.addOnScrollListener(object :RecyclerView.OnScrollListener(){ + override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { + if (dy > 0 && fab.isShown) fab.hide() + else if (dy < 0 && !fab.isShown) fab.show() + } + }) + } + +} + diff --git a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/BoundedCardView.kt b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/BoundedCardView.kt index db002b9..5fc3e06 100644 --- a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/BoundedCardView.kt +++ b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/BoundedCardView.kt @@ -1,10 +1,11 @@ package ca.allanwang.kau.ui.views import android.content.Context +import android.graphics.Rect import android.support.v7.widget.CardView import android.util.AttributeSet import ca.allanwang.kau.ui.R -import ca.allanwang.kau.utils.parentVisibleHeight +import ca.allanwang.kau.utils.parentViewGroup /** @@ -29,6 +30,8 @@ class BoundedCardView @JvmOverloads constructor( */ var maxHeightPercent: Float = -1.0f + private val parentFrame = Rect() + init { if (attrs != null) { val styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.BoundedCardView) @@ -39,7 +42,8 @@ class BoundedCardView @JvmOverloads constructor( } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - var maxMeasureHeight = if (maxHeight > 0) maxHeight else parentVisibleHeight + parentViewGroup.getWindowVisibleDisplayFrame(parentFrame) + var maxMeasureHeight = if (maxHeight > 0) maxHeight else parentFrame.height() if (maxHeightPercent > 0f) maxMeasureHeight = (maxMeasureHeight * maxHeightPercent).toInt() val trueHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxMeasureHeight, MeasureSpec.AT_MOST) super.onMeasure(widthMeasureSpec, trueHeightMeasureSpec) diff --git a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/CutoutView.kt b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/CutoutView.kt index 42f19b9..9e8ac11 100644 --- a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/CutoutView.kt +++ b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/CutoutView.kt @@ -27,7 +27,7 @@ import android.view.View import ca.allanwang.kau.ui.R import ca.allanwang.kau.utils.dimenPixelSize import ca.allanwang.kau.utils.getFont -import ca.allanwang.kau.utils.parentVisibleHeight +import ca.allanwang.kau.utils.parentViewGroup import ca.allanwang.kau.utils.toBitmap /** @@ -66,6 +66,7 @@ class CutoutView @JvmOverloads constructor( private var heightPercentage: Float = 0f private var minHeight: Float = 0f private val maxTextSize: Float + private val parentFrame = Rect() init { if (attrs != null) { @@ -121,7 +122,8 @@ class CutoutView @JvmOverloads constructor( * If height percent is specified, ensure it is met */ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val minHeight = Math.max(minHeight, heightPercentage * parentVisibleHeight) + parentViewGroup.getWindowVisibleDisplayFrame(parentFrame) + val minHeight = Math.max(minHeight, heightPercentage * parentFrame.height()) val trueHeightMeasureSpec = if (minHeight > 0) MeasureSpec.makeMeasureSpec(Math.max(minHeight.toInt(), measuredHeight), MeasureSpec.EXACTLY) else heightMeasureSpec diff --git a/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/MeasuredImageView.kt b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/MeasuredImageView.kt new file mode 100644 index 0000000..2627d13 --- /dev/null +++ b/core-ui/src/main/kotlin/ca/allanwang/kau/ui/views/MeasuredImageView.kt @@ -0,0 +1,23 @@ +package ca.allanwang.kau.ui.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.ImageView + +/** + * Created by Allan Wang on 2017-07-14. + */ +class MeasuredImageView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0 +) : ImageView(context, attrs, defStyleAttr, defStyleRes), MeasureSpecContract by MeasureSpecDelegate() { + + init { + initAttrs(context, attrs) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val result = onMeasure(this, widthMeasureSpec, heightMeasureSpec) + super.onMeasure(result.first, result.second) + } + +} \ No newline at end of file diff --git a/core-ui/src/main/res/drawable/kau_selectable_white.xml b/core-ui/src/main/res/drawable/kau_selectable_white.xml new file mode 100644 index 0000000..942f149 --- /dev/null +++ b/core-ui/src/main/res/drawable/kau_selectable_white.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core-ui/src/main/res/layout/kau_elastic_recycler_activity.xml b/core-ui/src/main/res/layout/kau_elastic_recycler_activity.xml new file mode 100644 index 0000000..055d61d --- /dev/null +++ b/core-ui/src/main/res/layout/kau_elastic_recycler_activity.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-ui/src/main/res/values/attr.xml b/core-ui/src/main/res/values/attr.xml index 49be8d9..271d132 100644 --- a/core-ui/src/main/res/values/attr.xml +++ b/core-ui/src/main/res/values/attr.xml @@ -1,41 +1,39 @@ - + - - - + + - - - - - - - - - - - - - - + + + + + + + - - - - + + + + - - - - - - - + + + + + + - \ No newline at end of file + + + + + + + + diff --git a/core-ui/src/main/res/values/colors.xml b/core-ui/src/main/res/values/colors.xml index 6d51597..273d6f1 100644 --- a/core-ui/src/main/res/values/colors.xml +++ b/core-ui/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ + - #80000000 - #80ffffff #fff + #80000000 diff --git a/core-ui/src/main/res/values/strings.xml b/core-ui/src/main/res/values/strings.xml new file mode 100644 index 0000000..80e6233 --- /dev/null +++ b/core-ui/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Blurrable ImageView + \ No newline at end of file diff --git a/core-ui/src/main/res/values/styles.xml b/core-ui/src/main/res/values/styles.xml index f9fd7d4..dfbb6d3 100644 --- a/core-ui/src/main/res/values/styles.xml +++ b/core-ui/src/main/res/values/styles.xml @@ -1,7 +1,6 @@ - + - - - \ No newline at end of file + + + + -- cgit v1.2.3