diff --git a/app/src/main/java/com/afollestad/nocknock/adapter/ServerAdapter.kt b/app/src/main/java/com/afollestad/nocknock/adapter/ServerAdapter.kt index c390b81..9792b86 100644 --- a/app/src/main/java/com/afollestad/nocknock/adapter/ServerAdapter.kt +++ b/app/src/main/java/com/afollestad/nocknock/adapter/ServerAdapter.kt @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView import com.afollestad.nocknock.R import com.afollestad.nocknock.data.ServerModel import com.afollestad.nocknock.data.textRes +import com.afollestad.nocknock.utilities.ui.onDebouncedClick import kotlinx.android.synthetic.main.list_item_server.view.iconStatus import kotlinx.android.synthetic.main.list_item_server.view.textInterval import kotlinx.android.synthetic.main.list_item_server.view.textName @@ -24,10 +25,12 @@ typealias Listener = (model: ServerModel, longClick: Boolean) -> Unit class ServerVH constructor( itemView: View, private val adapter: ServerAdapter -) : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnLongClickListener { +) : RecyclerView.ViewHolder(itemView), View.OnLongClickListener { init { - itemView.setOnClickListener(this) + itemView.onDebouncedClick { + adapter.performClick(adapterPosition, false) + } itemView.setOnLongClickListener(this) } @@ -46,10 +49,6 @@ class ServerVH constructor( itemView.textInterval.text = model.intervalText() } - override fun onClick(view: View) { - adapter.performClick(adapterPosition, false) - } - override fun onLongClick(view: View): Boolean { adapter.performClick(adapterPosition, true) return false diff --git a/utilities/src/main/java/com/afollestad/nocknock/utilities/ui/DebouncedOnClickListener.kt b/utilities/src/main/java/com/afollestad/nocknock/utilities/ui/DebouncedOnClickListener.kt new file mode 100644 index 0000000..1446bbf --- /dev/null +++ b/utilities/src/main/java/com/afollestad/nocknock/utilities/ui/DebouncedOnClickListener.kt @@ -0,0 +1,45 @@ +/* + * Licensed under Apache-2.0 + * + * Designed and developed by Aidan Follestad (@afollestad) + */ +package com.afollestad.nocknock.utilities.ui + +import android.view.View +import java.lang.System.currentTimeMillis + +private const val DEFAULT_DEBOUNCE_INTERVAL = 750L + +/** @author Aidan Follestad (@afollestad) */ +abstract class DebouncedOnClickListener( + private val delayBetweenClicks: Long = DEFAULT_DEBOUNCE_INTERVAL +) : View.OnClickListener { + + private var lastClickTimestamp = -1L + + @Deprecated( + message = "onDebouncedClick should be overridden instead.", + replaceWith = ReplaceWith("onDebouncedClick(v)") + ) + override fun onClick(v: View) { + val now = currentTimeMillis() + if (lastClickTimestamp == -1L || now >= (lastClickTimestamp + delayBetweenClicks)) { + onDebouncedClick(v) + } + lastClickTimestamp = now + } + + abstract fun onDebouncedClick(v: View) +} + +/** @author Aidan Follestad (@afollestad) */ +fun View.onDebouncedClick( + delayBetweenClicks: Long = DEFAULT_DEBOUNCE_INTERVAL, + click: (view: View) -> Unit +) { + setOnClickListener(object : DebouncedOnClickListener(delayBetweenClicks) { + override fun onDebouncedClick(v: View) { + click(v) + } + }) +}