diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java index 5a6ff7e781d..06c74bc3432 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java +++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java @@ -1,9 +1,14 @@ package com.android.settings.notification.history; +import static android.view.HapticFeedbackConstants.CLOCK_TICK; + import android.annotation.Nullable; import android.content.Context; +import android.graphics.Canvas; import android.util.AttributeSet; +import android.view.View; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; @@ -15,6 +20,9 @@ public class NotificationHistoryRecyclerView extends RecyclerView { private OnItemSwipeDeleteListener listener; + /** The amount of horizontal displacement caused by user's action, used to track the swiping. */ + private float dXLast; + public NotificationHistoryRecyclerView(Context context) { this(context, null); } @@ -57,6 +65,27 @@ public class NotificationHistoryRecyclerView extends RecyclerView { listener.onItemSwipeDeleted(viewHolder.getAdapterPosition()); } } + + /** Performs haptic effect once the swiping goes past a certain location. */ + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, + @NonNull ViewHolder viewHolder, float dX, float dY, int actionState, + boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + if (isCurrentlyActive) { + View view = viewHolder.itemView; + float swipeThreshold = getSwipeThreshold(viewHolder); + float snapOffset = swipeThreshold * view.getWidth(); + boolean snapIntoNewLocation = dX < -snapOffset || dX > snapOffset; + boolean snapIntoNewLocationLast = dXLast < -snapOffset || dXLast > snapOffset; + if (snapIntoNewLocation != snapIntoNewLocationLast) { + view.performHapticFeedback(CLOCK_TICK); + } + dXLast = dX; + } else { + dXLast = 0; + } + } } public interface OnItemSwipeDeleteListener {