am e7c02ef4: Merge "Fix bug 2973252 - Make overscroll glow respect ifContentScrolls" into gingerbread
Merge commit 'e7c02ef40a10c599b13684a6f99a91eabd0f258f' into gingerbread-plus-aosp
* commit 'e7c02ef40a10c599b13684a6f99a91eabd0f258f':
Fix bug 2973252 - Make overscroll glow respect ifContentScrolls
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index fe2a43b..8f5c35e 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -659,6 +659,18 @@
}
/**
+ * @return true if all list content currently fits within the view boundaries
+ */
+ private boolean contentFits() {
+ final int childCount = getChildCount();
+ if (childCount != mItemCount) {
+ return false;
+ }
+
+ return getChildAt(0).getTop() >= 0 && getChildAt(childCount - 1).getBottom() <= mBottom;
+ }
+
+ /**
* Enables fast scrolling by letting the user quickly scroll through lists by
* dragging the fast scroll thumb. The adapter attached to the list may want
* to implement {@link SectionIndexer} if it wishes to display alphabet preview and
@@ -2221,8 +2233,12 @@
// Don't allow overfling if we're at the edge.
mVelocityTracker.clear();
}
- mTouchMode = TOUCH_MODE_OVERSCROLL;
- if (mEdgeGlowTop != null) {
+
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS &&
+ !contentFits())) {
+ mTouchMode = TOUCH_MODE_OVERSCROLL;
if (rawDeltaY > 0) {
mEdgeGlowTop.onPull((float) overscroll / getHeight());
} else if (rawDeltaY < 0) {
@@ -2275,7 +2291,10 @@
} else {
overscrollBy(0, -incrementalDeltaY, 0, mScrollY, 0, 0,
0, mOverscrollDistance, true);
- if (mEdgeGlowTop != null) {
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS &&
+ !contentFits())) {
if (rawDeltaY > 0) {
mEdgeGlowTop.onPull((float) -incrementalDeltaY / getHeight());
} else if (rawDeltaY < 0) {
@@ -2757,8 +2776,10 @@
void edgeReached(int delta) {
mScroller.notifyVerticalEdgeReached(mScrollY, 0, mOverflingDistance);
- mTouchMode = TOUCH_MODE_OVERFLING;
- if (mEdgeGlowTop != null) {
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && !contentFits())) {
+ mTouchMode = TOUCH_MODE_OVERFLING;
final int vel = (int) mScroller.getCurrVelocity();
if (delta > 0) {
mEdgeGlowTop.onAbsorb(vel);
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 129ad8a..0bb97dd 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -538,11 +538,15 @@
}
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int pulledToX = oldX + deltaX;
- if (pulledToX < 0) {
- mEdgeGlowLeft.onPull((float) deltaX / getWidth());
- } else if (pulledToX > range) {
- mEdgeGlowRight.onPull((float) deltaX / getWidth());
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ final int pulledToX = oldX + deltaX;
+ if (pulledToX < 0) {
+ mEdgeGlowLeft.onPull((float) deltaX / getWidth());
+ } else if (pulledToX > range) {
+ mEdgeGlowRight.onPull((float) deltaX / getWidth());
+ }
}
}
break;
@@ -1091,10 +1095,14 @@
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int range = getScrollRange();
- if (x < 0 && oldX >= 0) {
- mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity());
- } else if (x > range && oldX <= range) {
- mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity());
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (x < 0 && oldX >= 0) {
+ mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity());
+ } else if (x > range && oldX <= range) {
+ mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity());
+ }
}
}
awakenScrollBars();
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 7b5e412..2ba1c47 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -533,11 +533,15 @@
}
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int pulledToY = oldY + deltaY;
- if (pulledToY < 0) {
- mEdgeGlowTop.onPull((float) deltaY / getHeight());
- } else if (pulledToY > range) {
- mEdgeGlowBottom.onPull((float) deltaY / getHeight());
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ final int pulledToY = oldY + deltaY;
+ if (pulledToY < 0) {
+ mEdgeGlowTop.onPull((float) deltaY / getHeight());
+ } else if (pulledToY > range) {
+ mEdgeGlowBottom.onPull((float) deltaY / getHeight());
+ }
}
}
break;
@@ -1090,10 +1094,14 @@
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
final int range = getScrollRange();
- if (y < 0 && oldY >= 0) {
- mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
- } else if (y > range && oldY <= range) {
- mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity());
+ final int overscrollMode = getOverscrollMode();
+ if (overscrollMode == OVERSCROLL_ALWAYS ||
+ (overscrollMode == OVERSCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (y < 0 && oldY >= 0) {
+ mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
+ } else if (y > range && oldY <= range) {
+ mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity());
+ }
}
}
awakenScrollBars();