Updating the fast scroll bar UI

Bug: 37015359
Change-Id: Iec0748f04ebe9a3eef13ff759da3cab6ff28c3a1
diff --git a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java
index 3039744..9e8d300 100644
--- a/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java
+++ b/src/com/android/launcher3/BaseRecyclerViewFastScrollBar.java
@@ -29,6 +29,7 @@
 import android.widget.TextView;
 
 import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.graphics.FastScrollThumbDrawable;
 import com.android.launcher3.util.Themes;
 
 /**
@@ -52,7 +53,7 @@
 
     private final static int MAX_TRACK_ALPHA = 30;
     private final static int SCROLL_BAR_VIS_DURATION = 150;
-    private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 1.5f;
+    private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 0.75f;
 
     private final Rect mTmpRect = new Rect();
     private final BaseRecyclerView mRv;
@@ -64,12 +65,12 @@
 
     private final int mMinWidth;
     private final int mMaxWidth;
+    private final int mThumbPadding;
 
     // Current width of the track
     private int mWidth;
     private ObjectAnimator mWidthAnimator;
 
-    private final Path mThumbPath = new Path();
     private final Paint mThumbPaint;
     private final int mThumbHeight;
 
@@ -94,7 +95,7 @@
     public BaseRecyclerViewFastScrollBar(BaseRecyclerView rv, Resources res) {
         mRv = rv;
         mTrackPaint = new Paint();
-        mTrackPaint.setColor(rv.getFastScrollerTrackColor(Color.BLACK));
+        mTrackPaint.setColor(Themes.getAttrColor(rv.getContext(), android.R.attr.textColorPrimary));
         mTrackPaint.setAlpha(MAX_TRACK_ALPHA);
 
         mThumbPaint = new Paint();
@@ -102,16 +103,19 @@
         mThumbPaint.setColor(Themes.getColorAccent(rv.getContext()));
         mThumbPaint.setStyle(Paint.Style.FILL);
 
-        mWidth = mMinWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_min_width);
-        mMaxWidth = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_max_width);
-        mThumbHeight = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_height);
-        mTouchInset = res.getDimensionPixelSize(R.dimen.container_fastscroll_thumb_touch_inset);
+        mWidth = mMinWidth = res.getDimensionPixelSize(R.dimen.fastscroll_track_min_width);
+        mMaxWidth = res.getDimensionPixelSize(R.dimen.fastscroll_track_max_width);
+
+        mThumbPadding = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_padding);
+        mThumbHeight = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_height);
+
+        mTouchInset = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_touch_inset);
         mIsRtl = Utilities.isRtl(res);
-        updateThumbPath();
     }
 
     public void setPopupView(View popup) {
         mPopupView = (TextView) popup;
+        mPopupView.setBackground(new FastScrollThumbDrawable(mThumbPaint, mIsRtl));
     }
 
     public void setDetachThumbOnFastScroll() {
@@ -154,24 +158,6 @@
         mRv.invalidate(left, top, left + mMaxWidth, top + mRv.getScrollbarTrackHeight());
 
         mWidth = width;
-        updateThumbPath();
-    }
-
-    /**
-     * Updates the path for the thumb drawable.
-     */
-    private void updateThumbPath() {
-        int smallWidth = mIsRtl ? mWidth : -mWidth;
-        int largeWidth = mIsRtl ? mMaxWidth : -mMaxWidth;
-
-        mThumbPath.reset();
-        mThumbPath.moveTo(0, 0);
-        mThumbPath.lineTo(0, mThumbHeight);             // Left edge
-        mThumbPath.lineTo(smallWidth, mThumbHeight);    // bottom edge
-        mThumbPath.cubicTo(smallWidth, mThumbHeight,    // right edge
-                largeWidth, mThumbHeight / 2,
-                smallWidth, 0);
-        mThumbPath.close();
     }
 
     public int getThumbHeight() {
@@ -265,15 +251,16 @@
         }
         int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
         if (!mIsRtl) {
-            canvas.translate(mRv.getWidth(), 0);
+            canvas.translate(mRv.getWidth() - mWidth, 0);
         }
         canvas.translate(0, mRv.getPaddingTop());
         // Draw the track
-        int thumbWidth = mIsRtl ? mWidth : -mWidth;
-        canvas.drawRect(0, 0, thumbWidth, mRv.getScrollbarTrackHeight(), mTrackPaint);
+        canvas.drawRoundRect(0, 0, mWidth, mRv.getScrollbarTrackHeight(),
+                mWidth, mWidth, mTrackPaint);
 
-        canvas.translate(0, mThumbOffsetY);
-        canvas.drawPath(mThumbPath, mThumbPaint);
+        canvas.translate(-mThumbPadding, mThumbOffsetY);
+        float r = mWidth + mThumbPadding + mThumbPadding;
+        canvas.drawRoundRect(0, 0, r, mThumbHeight, r, r, mThumbPaint);
         canvas.restoreToCount(saveCount);
     }
 
@@ -320,7 +307,8 @@
     private void updatePopupY(int lastTouchY) {
         int height = mPopupView.getHeight();
         float top = lastTouchY - (FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR * height);
-        top = Math.max(mMaxWidth, Math.min(top, mRv.getScrollbarTrackHeight() - mMaxWidth - height));
+        top = Utilities.boundToRange(top,
+                mMaxWidth, mRv.getScrollbarTrackHeight() - mMaxWidth - height);
         mPopupView.setTranslationY(top);
     }
 }