From bbaddee2ed4c5f2e534683d9687392d254c37d67 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Wed, 27 Dec 2017 00:16:09 -0500 Subject: Feature/fast adapter (#119) * Update fast adapter implementation * Add repeated click listener --- .../ca/allanwang/kau/adapters/AdapterUtils.kt | 8 +--- .../kau/adapters/RepeatedClickListener.kt | 53 ++++++++++++++++++++++ docs/Changelog.md | 1 + gradle.properties | 2 +- .../kau/mediapicker/MediaPickerActivityBase.kt | 11 +++-- .../mediapicker/MediaPickerActivityOverlayBase.kt | 2 +- .../allanwang/kau/mediapicker/MediaPickerCore.kt | 2 +- sample/src/main/res/xml/kau_changelog.xml | 1 + 8 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt diff --git a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt index 206c66b..dae2862 100644 --- a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt +++ b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt @@ -13,10 +13,4 @@ import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter * Add kotlin's generic syntax to better support out types */ fun > fastAdapter(vararg adapter: IAdapter) = - FastAdapter.with>(adapter.toList())!! - -/** - * Helper to get an [IAdapter] directly from a [FastItemAdapter] - */ -fun > fastAdapter(adapter: IAdapter, fastAdapter: FastItemAdapter) = - fastAdapter(adapter, fastAdapter.itemAdapter) \ No newline at end of file + FastAdapter.with>(adapter.toList())!! \ No newline at end of file diff --git a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt new file mode 100644 index 0000000..d864a55 --- /dev/null +++ b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt @@ -0,0 +1,53 @@ +package ca.allanwang.kau.adapters + +import android.support.annotation.IntRange +import android.view.View +import com.mikepenz.fastadapter.FastAdapter +import com.mikepenz.fastadapter.IAdapter +import com.mikepenz.fastadapter.IItem +import com.mikepenz.fastadapter.listeners.OnClickListener + +/** + * Created by Allan Wang on 26/12/17. + */ +fun > FastAdapter.withOnRepeatedClickListener(count: Int, + duration: Long, + event: OnClickListener) = + withOnClickListener(RepeatedClickListener(count, duration, event)) + +/** + * Registers and skips each click until the designated [count] clicks are triggered, + * each within [duration] from each other. + * Only then will the [event] be fired, and everything will be reset. + */ +private class RepeatedClickListener>( + @IntRange(from = 1) val count: Int, + @IntRange(from = 1) val duration: Long, + val event: OnClickListener) : OnClickListener { + + init { + if (count <= 0) + throw IllegalArgumentException("RepeatedClickListener's count must be > 1") + if (duration <= 0) + throw IllegalArgumentException("RepeatedClickListener's duration must be > 1L") + } + + private var chain = 0 + private var time = -1L + + override fun onClick(v: View, adapter: IAdapter, item: Item, position: Int): Boolean { + val now = System.currentTimeMillis() + if (time - now < duration) + chain++ + else + chain = 0 + time = now + if (chain == count) { + chain = 0 + time = -1 + event.onClick(v, adapter, item, position) + return true + } + return false + } +} \ No newline at end of file diff --git a/docs/Changelog.md b/docs/Changelog.md index 2d09855..238294e 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -1,6 +1,7 @@ # Changelog ## v3.6.0 +* :core: Create kotlin flyweight * :core: Created BundleUtils * :core: [Breaking] Refactored startActivity functions * :kpref-activity: [Breaking] Simplified listener function parameters diff --git a/gradle.properties b/gradle.properties index 2dd7002..5c72b0e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ ANDROID_SUPPORT_LIBS=27.0.2 VERSION_NAME=3.5.1.0 -KOTLIN=1.2.0 +KOTLIN=1.2.10 ABOUT_LIBRARIES=6.0.0 ANKO=0.10.3 BLURRY=2.1.1 diff --git a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityBase.kt b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityBase.kt index c3b6396..464c85e 100644 --- a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityBase.kt +++ b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityBase.kt @@ -48,14 +48,16 @@ abstract class MediaPickerActivityBase( initializeRecycler(recycler) - MediaItem.bindEvents(adapter) - adapter.withSelectionListener({ _, _ -> selectionCount.text = adapter.selections.size.toString() }) + MediaItem.bindEvents(adapter.fastAdapter) + adapter.fastAdapter.withSelectionListener { _, _ -> + selectionCount.text = adapter.fastAdapter.selections.size.toString() + } fab.apply { show() setIcon(GoogleMaterial.Icon.gmd_send) setOnClickListener { - val selection = adapter.selectedItems + val selection = adapter.fastAdapter.selectedItems if (selection.isEmpty()) { toast(R.string.kau_no_items_selected) } else { @@ -88,7 +90,8 @@ abstract class MediaPickerActivityBase( override fun onLoadFinished(loader: Loader?, data: Cursor?) { super.onLoadFinished(loader, data) - setToolbarScrollable((recycler.layoutManager as LinearLayoutManager).findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1) + setToolbarScrollable((recycler.layoutManager as LinearLayoutManager) + .findLastCompletelyVisibleItemPosition() < adapter.adapterItemCount - 1) } override fun onStatusChange(loaded: Boolean) { diff --git a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityOverlayBase.kt b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityOverlayBase.kt index 67f9577..9516eab 100644 --- a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityOverlayBase.kt +++ b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerActivityOverlayBase.kt @@ -29,7 +29,7 @@ abstract class MediaPickerActivityOverlayBase( super.onCreate(savedInstanceState) setContentView(R.layout.kau_activity_image_picker_overlay) initializeRecycler(recycler) - MediaItemBasic.bindEvents(this, adapter) + MediaItemBasic.bindEvents(this, adapter.fastAdapter) draggable.addExitListener(this, R.transition.kau_image_exit_bottom, R.transition.kau_image_exit_top) draggable.setOnClickListener { finishAfterTransition() } diff --git a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt index 9bab4c4..af90fdc 100644 --- a/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt +++ b/mediapicker/src/main/kotlin/ca/allanwang/kau/mediapicker/MediaPickerCore.kt @@ -109,7 +109,7 @@ abstract class MediaPickerCore>( private var hasPreloaded = false private var prefetcher: Future<*>? = null - val adapter = FastItemAdapter() + val adapter = ItemAdapter() /** * Further improve preloading by extending the layout space diff --git a/sample/src/main/res/xml/kau_changelog.xml b/sample/src/main/res/xml/kau_changelog.xml index f57f8c4..55e110d 100644 --- a/sample/src/main/res/xml/kau_changelog.xml +++ b/sample/src/main/res/xml/kau_changelog.xml @@ -7,6 +7,7 @@ --> + -- cgit v1.2.3