Loading core/java/android/widget/AbsListView.java +12 −4 Original line number Diff line number Diff line Loading @@ -1250,7 +1250,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mFastScroller.setEnabled(true); } recomputePadding(); resolvePadding(); if (mFastScroller != null) { mFastScroller.updateLayout(); Loading Loading @@ -1312,7 +1312,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te * @see #setFastScrollAlwaysVisible(boolean) */ public boolean isFastScrollAlwaysVisible() { if (mFastScroller == null) { return mFastScrollEnabled && mFastScrollAlwaysVisible; } else { return mFastScroller.isEnabled() && mFastScroller.isAlwaysShowEnabled(); } } @Override Loading @@ -1331,7 +1335,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @ViewDebug.ExportedProperty public boolean isFastScrollEnabled() { if (mFastScroller == null) { return mFastScrollEnabled; } else { return mFastScroller.isEnabled(); } } @Override Loading @@ -1356,7 +1364,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @Override protected boolean isVerticalScrollBarHidden() { return mFastScrollEnabled; return isFastScrollEnabled(); } /** Loading core/java/android/widget/FastScroller.java +51 −44 Original line number Diff line number Diff line Loading @@ -152,9 +152,6 @@ class FastScroller { /** The number of headers at the top of the view. */ private int mHeaderCount; /** The number of items in the list. */ private int mItemCount = -1; /** The index of the current section. */ private int mCurrentSection = -1; Loading Loading @@ -324,6 +321,7 @@ class FastScroller { getSectionsFromIndexer(); refreshDrawablePressedState(); updateLongList(listView.getChildCount(), listView.getCount()); setScrollbarPosition(mList.getVerticalScrollbarPosition()); postAutoHide(); } Loading @@ -343,14 +341,10 @@ class FastScroller { * @param enabled Whether the fast scroll thumb is enabled. */ public void setEnabled(boolean enabled) { if (mEnabled != enabled) { mEnabled = enabled; if (enabled) { if (mAlwaysShow) { setState(STATE_VISIBLE); } } else { stop(); onStateDependencyChanged(); } } Loading @@ -358,19 +352,17 @@ class FastScroller { * @return Whether the fast scroll thumb is enabled. */ public boolean isEnabled() { return mEnabled; return mEnabled && (mLongList || mAlwaysShow); } /** * @param alwaysShow Whether the fast scroll thumb should always be shown */ public void setAlwaysShow(boolean alwaysShow) { if (mAlwaysShow != alwaysShow) { mAlwaysShow = alwaysShow; if (alwaysShow) { setState(STATE_VISIBLE); } else if (mState == STATE_VISIBLE) { postAutoHide(); onStateDependencyChanged(); } } Loading @@ -382,6 +374,23 @@ class FastScroller { return mAlwaysShow; } /** * Called when one of the variables affecting enabled state changes. */ private void onStateDependencyChanged() { if (isEnabled()) { if (isAlwaysShowEnabled()) { setState(STATE_VISIBLE); } else if (mState == STATE_VISIBLE) { postAutoHide(); } } else { stop(); } mList.resolvePadding(); } public void setScrollBarStyle(int style) { if (mScrollBarStyle != style) { mScrollBarStyle = style; Loading Loading @@ -439,6 +448,18 @@ class FastScroller { final int firstVisibleItem = mList.getFirstVisiblePosition(); setThumbPos(getPosFromItemCount(firstVisibleItem, visibleItemCount, totalItemCount)); } updateLongList(visibleItemCount, totalItemCount); } private void updateLongList(int visibleItemCount, int totalItemCount) { final boolean longList = visibleItemCount > 0 && totalItemCount / visibleItemCount >= MIN_PAGES; if (mLongList != longList) { mLongList = longList; onStateDependencyChanged(); } } /** Loading Loading @@ -795,19 +816,8 @@ class FastScroller { mList.postDelayed(mDeferHide, FADE_TIMEOUT); } private boolean isLongList(int visibleItemCount, int totalItemCount) { // Are there enough pages to require fast scroll? Recompute only if // total count changes. if (mItemCount != totalItemCount && visibleItemCount > 0) { mItemCount = totalItemCount; mLongList = mItemCount / visibleItemCount >= MIN_PAGES; } return mLongList; } public void onScroll(int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (!mEnabled || !mAlwaysShow && !isLongList(visibleItemCount, totalItemCount)) { if (!isEnabled()) { setState(STATE_NONE); return; } Loading Loading @@ -1221,7 +1231,7 @@ class FastScroller { } public boolean onInterceptTouchEvent(MotionEvent ev) { if (!mEnabled) { if (!isEnabled()) { return false; } Loading @@ -1233,14 +1243,18 @@ class FastScroller { // need to allow the parent time to decide whether it wants // to intercept events. If it does, we will receive a CANCEL // event. if (mList.isInScrollingContainer()) { if (!mList.isInScrollingContainer()) { beginDrag(); return true; } mInitialTouchY = ev.getY(); startPendingDrag(); return false; } beginDrag(); return true; break; case MotionEvent.ACTION_MOVE: if (!isPointInside(ev.getX(), ev.getY())) { cancelPendingDrag(); } break; case MotionEvent.ACTION_UP: Loading @@ -1253,7 +1267,7 @@ class FastScroller { } public boolean onInterceptHoverEvent(MotionEvent ev) { if (!mEnabled) { if (!isEnabled()) { return false; } Loading @@ -1269,18 +1283,11 @@ class FastScroller { } public boolean onTouchEvent(MotionEvent me) { if (!mEnabled) { if (!isEnabled()) { return false; } switch (me.getActionMasked()) { case MotionEvent.ACTION_DOWN: { if (isPointInside(me.getX(), me.getY())) { beginDrag(); return true; } } break; case MotionEvent.ACTION_UP: { if (mHasPendingDrag) { // Allow a tap to scroll. Loading Loading
core/java/android/widget/AbsListView.java +12 −4 Original line number Diff line number Diff line Loading @@ -1250,7 +1250,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mFastScroller.setEnabled(true); } recomputePadding(); resolvePadding(); if (mFastScroller != null) { mFastScroller.updateLayout(); Loading Loading @@ -1312,7 +1312,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te * @see #setFastScrollAlwaysVisible(boolean) */ public boolean isFastScrollAlwaysVisible() { if (mFastScroller == null) { return mFastScrollEnabled && mFastScrollAlwaysVisible; } else { return mFastScroller.isEnabled() && mFastScroller.isAlwaysShowEnabled(); } } @Override Loading @@ -1331,7 +1335,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @ViewDebug.ExportedProperty public boolean isFastScrollEnabled() { if (mFastScroller == null) { return mFastScrollEnabled; } else { return mFastScroller.isEnabled(); } } @Override Loading @@ -1356,7 +1364,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @Override protected boolean isVerticalScrollBarHidden() { return mFastScrollEnabled; return isFastScrollEnabled(); } /** Loading
core/java/android/widget/FastScroller.java +51 −44 Original line number Diff line number Diff line Loading @@ -152,9 +152,6 @@ class FastScroller { /** The number of headers at the top of the view. */ private int mHeaderCount; /** The number of items in the list. */ private int mItemCount = -1; /** The index of the current section. */ private int mCurrentSection = -1; Loading Loading @@ -324,6 +321,7 @@ class FastScroller { getSectionsFromIndexer(); refreshDrawablePressedState(); updateLongList(listView.getChildCount(), listView.getCount()); setScrollbarPosition(mList.getVerticalScrollbarPosition()); postAutoHide(); } Loading @@ -343,14 +341,10 @@ class FastScroller { * @param enabled Whether the fast scroll thumb is enabled. */ public void setEnabled(boolean enabled) { if (mEnabled != enabled) { mEnabled = enabled; if (enabled) { if (mAlwaysShow) { setState(STATE_VISIBLE); } } else { stop(); onStateDependencyChanged(); } } Loading @@ -358,19 +352,17 @@ class FastScroller { * @return Whether the fast scroll thumb is enabled. */ public boolean isEnabled() { return mEnabled; return mEnabled && (mLongList || mAlwaysShow); } /** * @param alwaysShow Whether the fast scroll thumb should always be shown */ public void setAlwaysShow(boolean alwaysShow) { if (mAlwaysShow != alwaysShow) { mAlwaysShow = alwaysShow; if (alwaysShow) { setState(STATE_VISIBLE); } else if (mState == STATE_VISIBLE) { postAutoHide(); onStateDependencyChanged(); } } Loading @@ -382,6 +374,23 @@ class FastScroller { return mAlwaysShow; } /** * Called when one of the variables affecting enabled state changes. */ private void onStateDependencyChanged() { if (isEnabled()) { if (isAlwaysShowEnabled()) { setState(STATE_VISIBLE); } else if (mState == STATE_VISIBLE) { postAutoHide(); } } else { stop(); } mList.resolvePadding(); } public void setScrollBarStyle(int style) { if (mScrollBarStyle != style) { mScrollBarStyle = style; Loading Loading @@ -439,6 +448,18 @@ class FastScroller { final int firstVisibleItem = mList.getFirstVisiblePosition(); setThumbPos(getPosFromItemCount(firstVisibleItem, visibleItemCount, totalItemCount)); } updateLongList(visibleItemCount, totalItemCount); } private void updateLongList(int visibleItemCount, int totalItemCount) { final boolean longList = visibleItemCount > 0 && totalItemCount / visibleItemCount >= MIN_PAGES; if (mLongList != longList) { mLongList = longList; onStateDependencyChanged(); } } /** Loading Loading @@ -795,19 +816,8 @@ class FastScroller { mList.postDelayed(mDeferHide, FADE_TIMEOUT); } private boolean isLongList(int visibleItemCount, int totalItemCount) { // Are there enough pages to require fast scroll? Recompute only if // total count changes. if (mItemCount != totalItemCount && visibleItemCount > 0) { mItemCount = totalItemCount; mLongList = mItemCount / visibleItemCount >= MIN_PAGES; } return mLongList; } public void onScroll(int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (!mEnabled || !mAlwaysShow && !isLongList(visibleItemCount, totalItemCount)) { if (!isEnabled()) { setState(STATE_NONE); return; } Loading Loading @@ -1221,7 +1231,7 @@ class FastScroller { } public boolean onInterceptTouchEvent(MotionEvent ev) { if (!mEnabled) { if (!isEnabled()) { return false; } Loading @@ -1233,14 +1243,18 @@ class FastScroller { // need to allow the parent time to decide whether it wants // to intercept events. If it does, we will receive a CANCEL // event. if (mList.isInScrollingContainer()) { if (!mList.isInScrollingContainer()) { beginDrag(); return true; } mInitialTouchY = ev.getY(); startPendingDrag(); return false; } beginDrag(); return true; break; case MotionEvent.ACTION_MOVE: if (!isPointInside(ev.getX(), ev.getY())) { cancelPendingDrag(); } break; case MotionEvent.ACTION_UP: Loading @@ -1253,7 +1267,7 @@ class FastScroller { } public boolean onInterceptHoverEvent(MotionEvent ev) { if (!mEnabled) { if (!isEnabled()) { return false; } Loading @@ -1269,18 +1283,11 @@ class FastScroller { } public boolean onTouchEvent(MotionEvent me) { if (!mEnabled) { if (!isEnabled()) { return false; } switch (me.getActionMasked()) { case MotionEvent.ACTION_DOWN: { if (isPointInside(me.getX(), me.getY())) { beginDrag(); return true; } } break; case MotionEvent.ACTION_UP: { if (mHasPendingDrag) { // Allow a tap to scroll. Loading