From 2563095d2d2798c05ebef81290c592826a1758f0 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Mon, 26 Jan 2015 10:24:08 -0800 Subject: [PATCH] Prevent drag-to-open from cycling pressed state, propagate hotspot Avoids unnecessary changes to pressed state. Ensures hotspot propagates to both the list view and the list item view since both receive the pressed state. Bug: 19134424 Change-Id: If2496ce2042e43fe1c1efd527eeca10dc53e1f4a --- core/java/android/widget/ListPopupWindow.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index fe8b08bea78b0..d85bbb9e15716 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -1648,19 +1648,32 @@ public class ListPopupWindow { private void setPressedItem(View child, int position, float x, float y) { mDrawsInPressedState = true; - // Ordering is essential. First update the pressed state and layout - // the children. This will ensure the selector actually gets drawn. - setPressed(true); - layoutChildren(); + // Ordering is essential. First, update the container's pressed state. + drawableHotspotChanged(x, y); + if (!isPressed()) { + setPressed(true); + } + + // Next, run layout if we need to stabilize child positions. + if (mDataChanged) { + layoutChildren(); + } // Manage the pressed view based on motion position. This allows us to // play nicely with actual touch and scroll events. final View motionView = getChildAt(mMotionPosition - mFirstPosition); - if (motionView != null) { + if (motionView != null && motionView != child && motionView.isPressed()) { motionView.setPressed(false); } mMotionPosition = position; - child.setPressed(true); + + // Offset for child coordinates. + final float childX = x - child.getLeft(); + final float childY = y - child.getTop(); + child.drawableHotspotChanged(childX, childY); + if (!child.isPressed()) { + child.setPressed(true); + } // Ensure that keyboard focus starts from the last touched position. setSelectedPositionInt(position);