Fix issues with ListView.smoothScrollBy

Change-Id: I4a2752c56a1d2ad3227644f764d6be7a02c9eb8d
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 06880a1..e87455c 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2849,8 +2849,9 @@
                 final int lastViewHeight = lastView.getHeight();
                 final int lastViewTop = lastView.getTop();
                 final int lastViewPixelsShowing = listHeight - lastViewTop;
+                final int extraScroll = lastPos < mItemCount - 1 ? mExtraScroll : mListPadding.bottom;
 
-                smoothScrollBy(lastViewHeight - lastViewPixelsShowing + mExtraScroll,
+                smoothScrollBy(lastViewHeight - lastViewPixelsShowing + extraScroll,
                         mScrollDuration);
 
                 mLastSeenPos = lastPos;
@@ -2862,7 +2863,10 @@
                 
             case MOVE_DOWN_BOUND: {
                 final int nextViewIndex = 1;
-                if (firstPos == mBoundPos || getChildCount() <= nextViewIndex) {
+                final int childCount = getChildCount();
+                
+                if (firstPos == mBoundPos || childCount <= nextViewIndex
+                        || firstPos + childCount >= mItemCount) {
                     return;
                 }
                 final int nextPos = firstPos + nextViewIndex;
@@ -2904,8 +2908,9 @@
                     return;
                 }
                 final int firstViewTop = firstView.getTop();
+                final int extraScroll = firstPos > 0 ? mExtraScroll : mListPadding.top;
 
-                smoothScrollBy(firstViewTop - mExtraScroll, mScrollDuration);
+                smoothScrollBy(firstViewTop - extraScroll, mScrollDuration);
 
                 mLastSeenPos = firstPos;
 
@@ -3075,7 +3080,10 @@
 
         final boolean down = incrementalDeltaY < 0;
 
-        hideSelector();
+        final boolean inTouchMode = isInTouchMode();
+        if (inTouchMode) {
+            hideSelector();
+        }
 
         final int headerViewsCount = getHeaderViewsCount();
         final int footerViewsStart = mItemCount - getFooterViewsCount();
@@ -3138,7 +3146,7 @@
         if (down) {
             mFirstPosition += count;
         }
-
+        
         invalidate();
 
         final int absIncrementalDeltaY = Math.abs(incrementalDeltaY);
@@ -3146,6 +3154,10 @@
             fillGap(down);
         }
 
+        if (!inTouchMode && mSelectedPosition != INVALID_POSITION) {
+            positionSelector(getChildAt(mSelectedPosition - mFirstPosition));
+        }
+
         mBlockLayoutRequests = false;
 
         invokeOnItemScrollListener();