From 496abde610653ebb5d6553c6b95a042db8d0d868 Mon Sep 17 00:00:00 2001 From: Denis Karmyshakov Date: Fri, 30 Mar 2018 15:25:22 +0300 Subject: [PATCH] setOnRippleClickListener moved to extension --- .../adapters/DelegationListAdapter.kt | 3 +- .../roboswag/components/extensions/View.kt | 23 +++++++ .../roboswag/components/utils/UiUtils.java | 69 ------------------- 3 files changed, 25 insertions(+), 70 deletions(-) create mode 100644 src/main/java/ru/touchin/roboswag/components/extensions/View.kt diff --git a/src/main/java/ru/touchin/roboswag/components/adapters/DelegationListAdapter.kt b/src/main/java/ru/touchin/roboswag/components/adapters/DelegationListAdapter.kt index 8f22d28..b8115d1 100644 --- a/src/main/java/ru/touchin/roboswag/components/adapters/DelegationListAdapter.kt +++ b/src/main/java/ru/touchin/roboswag/components/adapters/DelegationListAdapter.kt @@ -5,6 +5,7 @@ import android.support.v7.recyclerview.extensions.AsyncListDiffer import android.support.v7.util.DiffUtil import android.support.v7.widget.RecyclerView import android.view.ViewGroup +import ru.touchin.roboswag.components.extensions.setOnRippleClickListener /** * Base adapter with delegation and diff computing on background thread. @@ -34,7 +35,7 @@ open class DelegationListAdapter(config: AsyncDifferConfig) : Recy val collectionPosition = getCollectionPosition(position) if (collectionPosition in 0 until getList().size) { if (itemClickListener != null) { - holder.itemView.setOnClickListener { itemClickListener?.invoke(getList()[collectionPosition], holder) } + holder.itemView.setOnRippleClickListener { itemClickListener?.invoke(getList()[collectionPosition], holder) } } else { holder.itemView.setOnClickListener(null) } diff --git a/src/main/java/ru/touchin/roboswag/components/extensions/View.kt b/src/main/java/ru/touchin/roboswag/components/extensions/View.kt new file mode 100644 index 0000000..89744f6 --- /dev/null +++ b/src/main/java/ru/touchin/roboswag/components/extensions/View.kt @@ -0,0 +1,23 @@ +package ru.touchin.roboswag.components.extensions + +import android.os.Build +import android.view.View + +private const val RIPPLE_EFFECT_DELAY = 150L + +/** + * Sets click listener to view. On click it will call something after delay. + * + * @param delay Delay after which click listener will be called; + * @param listener Click listener. + */ +fun View.setOnRippleClickListener(delay: Long = RIPPLE_EFFECT_DELAY, listener: (View) -> Unit) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setOnClickListener { view -> + handler?.removeCallbacksAndMessages(null) + postDelayed({ if (hasWindowFocus()) listener(view) }, delay) + } + } else { + setOnClickListener(listener) + } +} diff --git a/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.java b/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.java index 9343d00..b6eb724 100644 --- a/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.java +++ b/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.java @@ -21,17 +21,12 @@ package ru.touchin.roboswag.components.utils; import android.app.Activity; import android.app.Application; -import android.arch.lifecycle.Lifecycle; -import android.arch.lifecycle.LifecycleOwner; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.os.Build; -import android.os.Handler; -import android.os.Looper; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Display; @@ -43,9 +38,6 @@ import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; -import io.reactivex.functions.Action; -import io.reactivex.functions.Consumer; -import ru.touchin.roboswag.core.log.Lc; import ru.touchin.roboswag.core.log.LcGroup; /** @@ -62,12 +54,6 @@ public final class UiUtils { * Logging group to log UI lifecycle (onCreate, onStart, onResume etc.). */ public static final LcGroup UI_LIFECYCLE_LC_GROUP = new LcGroup("UI_LIFECYCLE"); - /** - * Delay to let user view ripple effect before screen changed. - */ - public static final long RIPPLE_EFFECT_DELAY = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 150 : 0; - - private static final Handler RIPPLE_HANDLER = new Handler(Looper.getMainLooper()); /** * Method to inflate view with right layout parameters based on container and add inflated view as a child to it. @@ -94,61 +80,6 @@ public final class UiUtils { return LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); } - /** - * Sets click listener to view. On click it will call something after delay. - * - * @param targetView View to set click listener to; - * @param onClickListener Click listener; - * @param delay Delay after which click listener will be called. - */ - public static void setOnRippleClickListener(@NonNull final View targetView, @Nullable final Action onClickListener, final long delay) { - setOnRippleClickListener(targetView, onClickListener != null ? view -> onClickListener.run() : null, delay); - } - - /** - * Sets click listener to view. On click it will call something with {@link #RIPPLE_EFFECT_DELAY}. - * - * @param targetView View to set click listener to; - * @param onClickListener Click listener. - */ - public static void setOnRippleClickListener(@NonNull final View targetView, @Nullable final Action onClickListener) { - setOnRippleClickListener(targetView, onClickListener != null ? view -> onClickListener.run() : null, RIPPLE_EFFECT_DELAY); - } - - /** - * Sets click listener to view. On click it will call something after delay. - * - * @param targetView View to set click listener to; - * @param onClickListener Click listener; - * @param delay Delay after which click listener will be called. - */ - public static void setOnRippleClickListener(@NonNull final View targetView, @Nullable final Consumer onClickListener, final long delay) { - if (onClickListener == null) { - targetView.setOnClickListener(null); - return; - } - - final Runnable runnable = () -> { - final Context context = targetView.getContext(); - if (targetView.getWindowVisibility() != View.VISIBLE - || !targetView.hasWindowFocus() - || (context instanceof LifecycleOwner - && !((LifecycleOwner) context).getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED))) { - return; - } - try { - onClickListener.accept(targetView); - } catch (final Exception exception) { - Lc.assertion(exception); - } - }; - - targetView.setOnClickListener(v -> { - RIPPLE_HANDLER.removeCallbacksAndMessages(null); - RIPPLE_HANDLER.postDelayed(runnable, delay); - }); - } - private UiUtils() { }