Fixing issue where you couldn't drag an item multiple pages (issue 10754544)

-> This was caused by a strange race condition. The page snap time was equal to
   the delay to recheck whether to snap (in DragController). This meant that
   scrollRight()/Left() would get called, and the scroller would be finished
   however, the final computeScrollHelper() hadn't been called, so the mCurrentPage
   hadn't yet been incremented.
-> Fixed the underlying race condition.
-> Added suitable gap (150 ms) between the two delays.

Change-Id: If700eb9e14d77a174e4395ca6933119bdb0da768
This commit is contained in:
Adam Cohen
2013-09-29 17:46:49 -07:00
parent 4ef75f523c
commit 2bf63d5205
3 changed files with 5 additions and 21 deletions
@@ -50,7 +50,7 @@ public class DragController {
public static int DRAG_ACTION_COPY = 1; public static int DRAG_ACTION_COPY = 1;
private static final int SCROLL_DELAY = 500; private static final int SCROLL_DELAY = 500;
private static final int RESCROLL_DELAY = 750; private static final int RESCROLL_DELAY = PagedView.PAGE_SNAP_ANIMATION_DURATION + 150;
private static final boolean PROFILE_DRAWING_DURING_DRAG = false; private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
+2 -10
View File
@@ -2153,19 +2153,11 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
} }
public void scrollLeft() { public void scrollLeft() {
if (mScroller.isFinished()) { if (getNextPage() > 0) snapToPage(getNextPage() - 1);
if (mCurrentPage > 0) snapToPage(mCurrentPage - 1);
} else {
if (mNextPage > 0) snapToPage(mNextPage - 1);
}
} }
public void scrollRight() { public void scrollRight() {
if (mScroller.isFinished()) { if (getNextPage() < getChildCount() -1) snapToPage(getNextPage() + 1);
if (mCurrentPage < getChildCount() -1) snapToPage(mCurrentPage + 1);
} else {
if (mNextPage < getChildCount() -1) snapToPage(mNextPage + 1);
}
} }
public int getPageForView(View v) { public int getPageForView(View v) {
+2 -10
View File
@@ -1748,25 +1748,17 @@ public class Workspace extends SmoothPagedView
protected void onStartReordering() { protected void onStartReordering() {
super.onStartReordering(); super.onStartReordering();
int count = getChildCount();
for (int i = 0; i < count; i++) {
((CellLayout) getChildAt(i)).setUseActiveGlowBackground(true);
}
showOutlines(); showOutlines();
// Reordering handles its own animations, disable the automatic ones. // Reordering handles its own animations, disable the automatic ones.
setLayoutTransition(null); setLayoutTransition(null);
} }
protected void onEndReordering() { protected void onEndReordering() {
super.onEndReordering(); super.onEndReordering();
int count = getChildCount();
for (int i = 0; i < count; i++) {
((CellLayout) getChildAt(i)).setUseActiveGlowBackground(false);
}
hideOutlines();
hideOutlines();
mScreenOrder.clear(); mScreenOrder.clear();
int count = getChildCount();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
CellLayout cl = ((CellLayout) getChildAt(i)); CellLayout cl = ((CellLayout) getChildAt(i));
mScreenOrder.add(getIdForScreen(cl)); mScreenOrder.add(getIdForScreen(cl));