summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2010-11-11 11:39:53 -0800
committerAdam Cohen <adamcohen@google.com>2010-11-12 11:04:32 -0800
commit0ac116b688380489c3690f6f65b282990c221f17 (patch)
tree367c827a3892051d4a7964e3e2348b67eb590c8a /core/java/android/widget
parent8b83d25222a59a958b702cac03292332befeef50 (diff)
downloadframeworks_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.java1
-rw-r--r--core/java/android/widget/StackView.java71
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));