OSDN Git Service

Prevent race condition when cancelling long-press for scroll.
authorJeff Sharkey <jsharkey@android.com>
Tue, 21 Apr 2009 04:03:13 +0000 (21:03 -0700)
committerJeff Sharkey <jsharkey@android.com>
Tue, 12 May 2009 01:18:16 +0000 (18:18 -0700)
When dragging between workspaces in rapid succession, the canceling of the
original long-press timer wasn't being triggered correctly.  (When the timer
fires, it might read an invalid Workspace.allowLongPress() value.)

This patchset correctly cancels any pending long-press timers once a desktop
scroll begins, and we don't need to rely on the allowLongPress() value.

src/com/android/launcher/CellLayout.java
src/com/android/launcher/LauncherAppWidgetHostView.java

index 157bf56..160dd18 100644 (file)
@@ -98,6 +98,18 @@ public class CellLayout extends ViewGroup {
         }
     }
 
+    @Override
+    public void cancelLongPress() {
+        super.cancelLongPress();
+
+        // Cancel long press for all children
+        final int count = getChildCount();
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            child.cancelLongPress();
+        }
+    }
+
     int getCountX() {
         return mPortrait ? mShortAxisCells : mLongAxisCells;
     }
index 1e21a19..da5b3a0 100644 (file)
@@ -98,4 +98,14 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView {
         mPendingCheckForLongPress.rememberWindowAttachCount();
         postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
     }
+
+    @Override
+    public void cancelLongPress() {
+        super.cancelLongPress();
+
+        mHasPerformedLongPress = false;
+        if (mPendingCheckForLongPress != null) {
+            removeCallbacks(mPendingCheckForLongPress);
+        }
+    }
 }