setOnRippleClickListener moved to extension

This commit is contained in:
Denis Karmyshakov 2018-03-30 15:25:22 +03:00
parent cd9db1203a
commit 496abde610
3 changed files with 25 additions and 70 deletions

View File

@ -5,6 +5,7 @@ import android.support.v7.recyclerview.extensions.AsyncListDiffer
import android.support.v7.util.DiffUtil import android.support.v7.util.DiffUtil
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.ViewGroup import android.view.ViewGroup
import ru.touchin.roboswag.components.extensions.setOnRippleClickListener
/** /**
* Base adapter with delegation and diff computing on background thread. * Base adapter with delegation and diff computing on background thread.
@ -34,7 +35,7 @@ open class DelegationListAdapter<TItem>(config: AsyncDifferConfig<TItem>) : Recy
val collectionPosition = getCollectionPosition(position) val collectionPosition = getCollectionPosition(position)
if (collectionPosition in 0 until getList().size) { if (collectionPosition in 0 until getList().size) {
if (itemClickListener != null) { if (itemClickListener != null) {
holder.itemView.setOnClickListener { itemClickListener?.invoke(getList()[collectionPosition], holder) } holder.itemView.setOnRippleClickListener { itemClickListener?.invoke(getList()[collectionPosition], holder) }
} else { } else {
holder.itemView.setOnClickListener(null) holder.itemView.setOnClickListener(null)
} }

View File

@ -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)
}
}

View File

@ -21,17 +21,12 @@ package ru.touchin.roboswag.components.utils;
import android.app.Activity; import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Display; import android.view.Display;
@ -43,9 +38,6 @@ import android.view.ViewConfiguration;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager; 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; 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.). * Logging group to log UI lifecycle (onCreate, onStart, onResume etc.).
*/ */
public static final LcGroup UI_LIFECYCLE_LC_GROUP = new LcGroup("UI_LIFECYCLE"); 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. * 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); 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<View> 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() { private UiUtils() {
} }