summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android (Google) Code Review <android-gerrit@google.com> 2009-07-10 14:12:17 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2009-07-10 14:12:17 -0700
commita11fe86d77e0fd57944e5615acb58b41a4fb4e93 (patch)
tree8e9f05745090274b9b09437121cfc212cacf75f7
parent59d299ce8d66f6f3091fca33d3741c0b24d678f6 (diff)
parentef0e9ae0ddbf70f5e30fbfbffe379e3026b9dc13 (diff)
Merge change 6813 into donut
* changes: Fixes #1972421. Prevents crash in ScrollView/HorizontalScrollView.
-rwxr-xr-xcore/java/android/gesture/Gesture.java5
-rw-r--r--core/java/android/widget/HorizontalScrollView.java81
-rw-r--r--core/java/android/widget/ScrollView.java100
3 files changed, 92 insertions, 94 deletions
diff --git a/core/java/android/gesture/Gesture.java b/core/java/android/gesture/Gesture.java
index c92f66568955..62330e1fe3eb 100755
--- a/core/java/android/gesture/Gesture.java
+++ b/core/java/android/gesture/Gesture.java
@@ -31,6 +31,7 @@ import java.io.DataInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A gesture can have a single or multiple strokes
@@ -44,7 +45,7 @@ public class Gesture implements Parcelable {
private static final boolean BITMAP_RENDERING_ANTIALIAS = true;
private static final boolean BITMAP_RENDERING_DITHER = true;
- private static int sGestureCount = 0;
+ private static final AtomicInteger sGestureCount = new AtomicInteger(0);
private final RectF mBoundingBox = new RectF();
@@ -54,7 +55,7 @@ public class Gesture implements Parcelable {
private final ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>();
public Gesture() {
- mGestureID = GESTURE_ID_BASE + sGestureCount++;
+ mGestureID = GESTURE_ID_BASE + sGestureCount.incrementAndGet();
}
/**
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index f86b37cf8b3a..46e514c8b44e 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -286,18 +286,20 @@ public class HorizontalScrollView extends FrameLayout {
return;
}
- final View child = getChildAt(0);
- int width = getMeasuredWidth();
- if (child.getMeasuredWidth() < width) {
- final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, mPaddingTop
- + mPaddingBottom, lp.height);
- width -= mPaddingLeft;
- width -= mPaddingRight;
- int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ if (getChildCount() > 0) {
+ final View child = getChildAt(0);
+ int width = getMeasuredWidth();
+ if (child.getMeasuredWidth() < width) {
+ final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, mPaddingTop
+ + mPaddingBottom, lp.height);
+ width -= mPaddingLeft;
+ width -= mPaddingRight;
+ int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
+
+ child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ }
}
}
@@ -636,7 +638,7 @@ public class HorizontalScrollView extends FrameLayout {
mTempRect.left = getScrollX() + width;
int count = getChildCount();
if (count > 0) {
- View view = getChildAt(count - 1);
+ View view = getChildAt(0);
if (mTempRect.left + width > view.getRight()) {
mTempRect.left = view.getRight() - width;
}
@@ -674,7 +676,7 @@ public class HorizontalScrollView extends FrameLayout {
if (right) {
int count = getChildCount();
if (count > 0) {
- View view = getChildAt(count - 1);
+ View view = getChildAt(0);
mTempRect.right = view.getRight();
mTempRect.left = mTempRect.right - width;
}
@@ -751,9 +753,9 @@ public class HorizontalScrollView extends FrameLayout {
if (direction == View.FOCUS_LEFT && getScrollX() < scrollDelta) {
scrollDelta = getScrollX();
- } else if (direction == View.FOCUS_RIGHT) {
-
- int daRight = getChildAt(getChildCount() - 1).getRight();
+ } else if (direction == View.FOCUS_RIGHT && getChildCount() > 0) {
+
+ int daRight = getChildAt(0).getRight();
int screenRight = getScrollX() + getWidth();
@@ -975,6 +977,7 @@ public class HorizontalScrollView extends FrameLayout {
* @return The scroll delta.
*/
protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+ if (getChildCount() == 0) return 0;
int width = getWidth();
int screenLeft = getScrollX();
@@ -1008,7 +1011,7 @@ public class HorizontalScrollView extends FrameLayout {
}
// make sure we aren't scrolling beyond the end of our content
- int right = getChildAt(getChildCount() - 1).getRight();
+ int right = getChildAt(0).getRight();
int distanceToRight = right - screenRight;
scrollXDelta = Math.min(scrollXDelta, distanceToRight);
@@ -1148,27 +1151,29 @@ public class HorizontalScrollView extends FrameLayout {
* which means we want to scroll towards the left.
*/
public void fling(int velocityX) {
- int width = getWidth() - mPaddingRight - mPaddingLeft;
- int right = getChildAt(0).getWidth();
-
- mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, right - width, 0, 0);
-
- final boolean movingRight = velocityX > 0;
-
- View newFocused = findFocusableViewInMyBounds(movingRight,
- mScroller.getFinalX(), findFocus());
-
- if (newFocused == null) {
- newFocused = this;
- }
-
- if (newFocused != findFocus()
- && newFocused.requestFocus(movingRight ? View.FOCUS_RIGHT : View.FOCUS_LEFT)) {
- mScrollViewMovedFocus = true;
- mScrollViewMovedFocus = false;
+ if (getChildCount() > 0) {
+ int width = getWidth() - mPaddingRight - mPaddingLeft;
+ int right = getChildAt(0).getWidth();
+
+ mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, right - width, 0, 0);
+
+ final boolean movingRight = velocityX > 0;
+
+ View newFocused = findFocusableViewInMyBounds(movingRight,
+ mScroller.getFinalX(), findFocus());
+
+ if (newFocused == null) {
+ newFocused = this;
+ }
+
+ if (newFocused != findFocus()
+ && newFocused.requestFocus(movingRight ? View.FOCUS_RIGHT : View.FOCUS_LEFT)) {
+ mScrollViewMovedFocus = true;
+ mScrollViewMovedFocus = false;
+ }
+
+ invalidate();
}
-
- invalidate();
}
/**
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 90e1242396f3..703cd8e278b7 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -20,8 +20,6 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.util.AttributeSet;
-import android.util.Config;
-import android.util.Log;
import android.view.FocusFinder;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -54,7 +52,6 @@ import java.util.List;
*/
public class ScrollView extends FrameLayout {
static final String TAG = "ScrollView";
- static final boolean localLOGV = false || Config.LOGV;
static final int ANIMATED_SCROLL_GAP = 250;
@@ -287,18 +284,21 @@ public class ScrollView extends FrameLayout {
return;
}
- final View child = getChildAt(0);
- int height = getMeasuredHeight();
- if (child.getMeasuredHeight() < height) {
- final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, mPaddingLeft
- + mPaddingRight, lp.width);
- height -= mPaddingTop;
- height -= mPaddingBottom;
- int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ if (getChildCount() > 0) {
+ final View child = getChildAt(0);
+ int height = getMeasuredHeight();
+ if (child.getMeasuredHeight() < height) {
+ final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, mPaddingLeft
+ + mPaddingRight, lp.width);
+ height -= mPaddingTop;
+ height -= mPaddingBottom;
+ int childHeightMeasureSpec =
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+
+ child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ }
}
}
@@ -756,13 +756,14 @@ public class ScrollView extends FrameLayout {
if (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {
scrollDelta = getScrollY();
} else if (direction == View.FOCUS_DOWN) {
-
- int daBottom = getChildAt(getChildCount() - 1).getBottom();
-
- int screenBottom = getScrollY() + getHeight();
-
- if (daBottom - screenBottom < maxJump) {
- scrollDelta = daBottom - screenBottom;
+ if (getChildCount() > 0) {
+ int daBottom = getChildAt(0).getBottom();
+
+ int screenBottom = getScrollY() + getHeight();
+
+ if (daBottom - screenBottom < maxJump) {
+ scrollDelta = daBottom - screenBottom;
+ }
}
}
if (scrollDelta == 0) {
@@ -830,16 +831,12 @@ public class ScrollView extends FrameLayout {
public final void smoothScrollBy(int dx, int dy) {
long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
if (duration > ANIMATED_SCROLL_GAP) {
- if (localLOGV) Log.v(TAG, "Smooth scroll: mScrollY=" + mScrollY
- + " dy=" + dy);
mScroller.startScroll(mScrollX, mScrollY, dx, dy);
invalidate();
} else {
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
}
- if (localLOGV) Log.v(TAG, "Immediate scroll: mScrollY=" + mScrollY
- + " dy=" + dy);
scrollBy(dx, dy);
}
mLastScroll = AnimationUtils.currentAnimationTimeMillis();
@@ -922,9 +919,6 @@ public class ScrollView extends FrameLayout {
View child = getChildAt(0);
mScrollX = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth());
mScrollY = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight());
- if (localLOGV) Log.v(TAG, "mScrollY=" + mScrollY + " y=" + y
- + " height=" + this.getHeight()
- + " child height=" + child.getHeight());
} else {
mScrollX = x;
mScrollY = y;
@@ -986,6 +980,7 @@ public class ScrollView extends FrameLayout {
* @return The scroll delta.
*/
protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+ if (getChildCount() == 0) return 0;
int height = getHeight();
int screenTop = getScrollY();
@@ -1005,9 +1000,6 @@ public class ScrollView extends FrameLayout {
int scrollYDelta = 0;
- if (localLOGV) Log.v(TAG, "child=" + rect.toShortString()
- + " screenTop=" + screenTop + " screenBottom=" + screenBottom
- + " height=" + height);
if (rect.bottom > screenBottom && rect.top > screenTop) {
// need to move down to get it in view: move down just enough so
// that the entire rectangle is in view (or at least the first
@@ -1022,10 +1014,8 @@ public class ScrollView extends FrameLayout {
}
// make sure we aren't scrolling beyond the end of our content
- int bottom = getChildAt(getChildCount() - 1).getBottom();
+ int bottom = getChildAt(0).getBottom();
int distanceToBottom = bottom - screenBottom;
- if (localLOGV) Log.v(TAG, "scrollYDelta=" + scrollYDelta
- + " distanceToBottom=" + distanceToBottom);
scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
} else if (rect.top < screenTop && rect.bottom < screenBottom) {
@@ -1164,26 +1154,28 @@ public class ScrollView extends FrameLayout {
* which means we want to scroll towards the top.
*/
public void fling(int velocityY) {
- int height = getHeight() - mPaddingBottom - mPaddingTop;
- int bottom = getChildAt(0).getHeight();
-
- mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, bottom - height);
-
- final boolean movingDown = velocityY > 0;
-
- View newFocused =
- findFocusableViewInMyBounds(movingDown, mScroller.getFinalY(), findFocus());
- if (newFocused == null) {
- newFocused = this;
- }
-
- if (newFocused != findFocus()
- && newFocused.requestFocus(movingDown ? View.FOCUS_DOWN : View.FOCUS_UP)) {
- mScrollViewMovedFocus = true;
- mScrollViewMovedFocus = false;
+ if (getChildCount() > 0) {
+ int height = getHeight() - mPaddingBottom - mPaddingTop;
+ int bottom = getChildAt(0).getHeight();
+
+ mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, bottom - height);
+
+ final boolean movingDown = velocityY > 0;
+
+ View newFocused =
+ findFocusableViewInMyBounds(movingDown, mScroller.getFinalY(), findFocus());
+ if (newFocused == null) {
+ newFocused = this;
+ }
+
+ if (newFocused != findFocus()
+ && newFocused.requestFocus(movingDown ? View.FOCUS_DOWN : View.FOCUS_UP)) {
+ mScrollViewMovedFocus = true;
+ mScrollViewMovedFocus = false;
+ }
+
+ invalidate();
}
-
- invalidate();
}
/**