diff options
author | Adam Cohen <adamcohen@google.com> | 2010-11-11 11:39:53 -0800 |
---|---|---|
committer | Adam Cohen <adamcohen@google.com> | 2010-11-12 11:04:32 -0800 |
commit | 0ac116b688380489c3690f6f65b282990c221f17 (patch) | |
tree | 367c827a3892051d4a7964e3e2348b67eb590c8a /core/java/android/widget | |
parent | 8b83d25222a59a958b702cac03292332befeef50 (diff) | |
download | frameworks_base-0ac116b688380489c3690f6f65b282990c221f17.zip frameworks_base-0ac116b688380489c3690f6f65b282990c221f17.tar.gz frameworks_base-0ac116b688380489c3690f6f65b282990c221f17.tar.bz2 |
-Prevent StackView from advancing while interacting with it
-Fixed null pointer exception
Change-Id: I294a0d055de51573d79219ef469c8df6ab04a297
Diffstat (limited to 'core/java/android/widget')
-rw-r--r-- | core/java/android/widget/AdapterViewAnimator.java | 1 | ||||
-rw-r--r-- | core/java/android/widget/StackView.java | 71 |
2 files changed, 35 insertions, 37 deletions
diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java index 7d78777..695ea6b 100644 --- a/core/java/android/widget/AdapterViewAnimator.java +++ b/core/java/android/widget/AdapterViewAnimator.java @@ -24,7 +24,6 @@ import android.animation.ObjectAnimator; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; -import android.graphics.Rect; import android.os.Handler; import android.os.Looper; import android.os.Parcel; diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index 01044d9..7c38714 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -122,7 +122,7 @@ public class StackView extends AdapterViewAnimator { private boolean mFirstLayoutHappened = false; private int mStackMode; private int mFramePadding; - private final Rect invalidateRect = new Rect(); + private final Rect stackInvalidateRect = new Rect(); public StackView(Context context) { super(context); @@ -243,6 +243,7 @@ public class StackView extends AdapterViewAnimator { @Override @android.view.RemotableViewMethod public void showNext() { + if (mSwipeGestureType != GESTURE_NONE) return; if (!mTransitionIsSetup) { View v = getViewAtRelativeIndex(1); if (v != null) { @@ -257,6 +258,7 @@ public class StackView extends AdapterViewAnimator { @Override @android.view.RemotableViewMethod public void showPrevious() { + if (mSwipeGestureType != GESTURE_NONE) return; if (!mTransitionIsSetup) { View v = getViewAtRelativeIndex(0); if (v != null) { @@ -301,8 +303,11 @@ public class StackView extends AdapterViewAnimator { // Here we need to make sure that the z-order of the children is correct for (int i = mCurrentWindowEnd; i >= mCurrentWindowStart; i--) { int index = modulo(i, getWindowSize()); - View v = mViewsMap.get(index).view; - if (v != null) v.bringToFront(); + ViewAndIndex vi = mViewsMap.get(index); + if (vi != null) { + View v = mViewsMap.get(index).view; + if (v != null) v.bringToFront(); + } } mTransitionIsSetup = false; } @@ -331,16 +336,15 @@ public class StackView extends AdapterViewAnimator { @Override protected void dispatchDraw(Canvas canvas) { - canvas.getClipBounds(invalidateRect); + canvas.getClipBounds(stackInvalidateRect); final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams(); - invalidateRect.union(lp.getInvalidateRect()); + stackInvalidateRect.union(lp.getInvalidateRect()); lp.resetInvalidateRect(); } - canvas.save(Canvas.CLIP_SAVE_FLAG); - canvas.clipRect(invalidateRect, Region.Op.UNION); + canvas.clipRect(stackInvalidateRect, Region.Op.UNION); super.dispatchDraw(canvas); canvas.restore(); } @@ -553,6 +557,10 @@ public class StackView extends AdapterViewAnimator { if (deltaY > mSwipeThreshold && mSwipeGestureType == GESTURE_SLIDE_DOWN && mStackSlider.mMode == StackSlider.NORMAL_MODE) { + // We reset the gesture variable, because otherwise we will ignore showPrevious() / + // showNext(); + mSwipeGestureType = GESTURE_NONE; + // Swipe threshold exceeded, swipe down if (mStackMode == ITEMS_SLIDE_UP) { showPrevious(); @@ -562,6 +570,10 @@ public class StackView extends AdapterViewAnimator { mHighlight.bringToFront(); } else if (deltaY < -mSwipeThreshold && mSwipeGestureType == GESTURE_SLIDE_UP && mStackSlider.mMode == StackSlider.NORMAL_MODE) { + // We reset the gesture variable, because otherwise we will ignore showPrevious() / + // showNext(); + mSwipeGestureType = GESTURE_NONE; + // Swipe threshold exceeded, swipe up if (mStackMode == ITEMS_SLIDE_UP) { showNext(); @@ -897,7 +909,6 @@ public class StackView extends AdapterViewAnimator { int horizontalOffset; int verticalOffset; View mView; - int left, top, right, bottom; private final Rect parentRect = new Rect(); private final Rect invalidateRect = new Rect(); private final RectF invalidateRectf = new RectF(); @@ -952,44 +963,32 @@ public class StackView extends AdapterViewAnimator { } void resetInvalidateRect() { - invalidateRect.set(0, 0, 0, 0); + invalidateRect.set(0, 0, 0, 0); } // This is public so that ObjectAnimator can access it public void setVerticalOffset(int newVerticalOffset) { - int offsetDelta = newVerticalOffset - verticalOffset; - verticalOffset = newVerticalOffset; - - if (mView != null) { - mView.requestLayout(); - int top = Math.min(mView.getTop() + offsetDelta, mView.getTop()); - int bottom = Math.max(mView.getBottom() + offsetDelta, mView.getBottom()); - - invalidateRectf.set(mView.getLeft(), top, mView.getRight(), bottom); - - float xoffset = -invalidateRectf.left; - float yoffset = -invalidateRectf.top; - invalidateRectf.offset(xoffset, yoffset); - mView.getMatrix().mapRect(invalidateRectf); - invalidateRectf.offset(-xoffset, -yoffset); - invalidateRect.union((int) Math.floor(invalidateRectf.left), - (int) Math.floor(invalidateRectf.top), - (int) Math.ceil(invalidateRectf.right), - (int) Math.ceil(invalidateRectf.bottom)); - - invalidateGlobalRegion(mView, invalidateRect); - } + setOffsets(horizontalOffset, newVerticalOffset); } public void setHorizontalOffset(int newHorizontalOffset) { - int offsetDelta = newHorizontalOffset - horizontalOffset; + setOffsets(newHorizontalOffset, verticalOffset); + } + + public void setOffsets(int newHorizontalOffset, int newVerticalOffset) { + int horizontalOffsetDelta = newHorizontalOffset - horizontalOffset; horizontalOffset = newHorizontalOffset; + int verticalOffsetDelta = newVerticalOffset - verticalOffset; + verticalOffset = newVerticalOffset; if (mView != null) { mView.requestLayout(); - int left = Math.min(mView.getLeft() + offsetDelta, mView.getLeft()); - int right = Math.max(mView.getRight() + offsetDelta, mView.getRight()); - invalidateRectf.set(left, mView.getTop(), right, mView.getBottom()); + int left = Math.min(mView.getLeft() + horizontalOffsetDelta, mView.getLeft()); + int right = Math.max(mView.getRight() + horizontalOffsetDelta, mView.getRight()); + int top = Math.min(mView.getTop() + verticalOffsetDelta, mView.getTop()); + int bottom = Math.max(mView.getBottom() + verticalOffsetDelta, mView.getBottom()); + + invalidateRectf.set(left, top, right, bottom); float xoffset = -invalidateRectf.left; float yoffset = -invalidateRectf.top; @@ -997,7 +996,7 @@ public class StackView extends AdapterViewAnimator { mView.getMatrix().mapRect(invalidateRectf); invalidateRectf.offset(-xoffset, -yoffset); - invalidateRect.union((int) Math.floor(invalidateRectf.left), + invalidateRect.set((int) Math.floor(invalidateRectf.left), (int) Math.floor(invalidateRectf.top), (int) Math.ceil(invalidateRectf.right), (int) Math.ceil(invalidateRectf.bottom)); |