Fxing issues with the scroll bar

- Removing track from AllApps
- Scrollbar should reach edge of track now
- Fixing flashing when going from AppsCustomize to workspace and switching tabs in AppsCustomize

Change-Id: Id69bd04dc503608566c3a33a1344904e3db383bf
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 2623586..ed408df 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -147,6 +147,10 @@
             anim.setDuration(duration);
             anim.addListener(new AnimatorListenerAdapter() {
                 @Override
+                public void onAnimationStart(android.animation.Animator animation) {
+                    mAppsCustomizePane.hideScrollingIndicator(false);
+                }
+                @Override
                 public void onAnimationEnd(android.animation.Animator animation) {
                     mAppsCustomizePane.setContentType(type);
 
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 489f3fb..7341e71 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2388,12 +2388,6 @@
                     toView.setTranslationY(0.0f);
                     toView.setVisibility(View.VISIBLE);
                     toView.bringToFront();
-
-                    if (!springLoaded && !LauncherApplication.isScreenLarge()) {
-                        // Hide the workspace scrollbar
-                        mWorkspace.hideScrollingIndicator(true);
-                        mWorkspace.hideScrollIndicatorTrack();
-                    }
                 }
                 @Override
                 public void onAnimationEnd(Animator animation) {
@@ -2405,6 +2399,12 @@
                     if (toView instanceof LauncherTransitionable) {
                         ((LauncherTransitionable) toView).onLauncherTransitionEnd(scaleAnim);
                     }
+
+                    if (!springLoaded && !LauncherApplication.isScreenLarge()) {
+                        // Hide the workspace scrollbar
+                        mWorkspace.hideScrollingIndicator(true);
+                        mWorkspace.hideScrollIndicatorTrack();
+                    }
                 }
             });
 
@@ -2484,16 +2484,18 @@
             }
             alphaAnim.addListener(new AnimatorListenerAdapter() {
                 @Override
+                public void onAnimationStart(android.animation.Animator animation) {
+                    if (!springLoaded && !LauncherApplication.isScreenLarge()) {
+                        // Show the workspace scrollbar
+                        mWorkspace.showScrollIndicatorTrack();
+                        mWorkspace.flashScrollingIndicator();
+                    }
+                }
+                @Override
                 public void onAnimationEnd(Animator animation) {
                     fromView.setVisibility(View.GONE);
                     if (fromView instanceof LauncherTransitionable) {
                         ((LauncherTransitionable) fromView).onLauncherTransitionEnd(alphaAnim);
-
-                        if (!springLoaded && !LauncherApplication.isScreenLarge()) {
-                            // Show the workspace scrollbar
-                            mWorkspace.showScrollIndicatorTrack();
-                            mWorkspace.flashScrollingIndicator();
-                        }
                     }
                 }
             });
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 9ef1fa8..bed107a 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -161,11 +161,11 @@
     protected boolean mIsDataReady = false;
 
     // Scrolling indicator
+    private android.animation.ValueAnimator mScrollIndicatorAnimator;
     private ImageView mScrollIndicator;
     private ImageView mScrollTrack;
     private boolean mHasScrollIndicator = true;
     private static final int sScrollIndicatorFadeInDuration = 150;
-    private static final int sScrollIndicatorFastFadeOutDuration = 50;
     private static final int sScrollIndicatorFadeOutDuration = 650;
     private static final int sScrollIndicatorFlashDuration = 650;
 
@@ -260,10 +260,6 @@
         return getChildAt(index);
     }
 
-    int getScrollWidth() {
-        return getWidth();
-    }
-
     /**
      * Updates the scroll of the current page immediately to its final scroll position.  We use this
      * in CustomizePagedView to allow tabs to share the same PagedView while resetting the scroll of
@@ -1676,7 +1672,13 @@
         if (mScrollIndicator != null) {
             // Fade the indicator in
             updateScrollingIndicatorPosition();
-            mScrollIndicator.animate().alpha(1f).setDuration(sScrollIndicatorFadeInDuration).start();
+            mScrollIndicator.setVisibility(View.VISIBLE);
+            if (mScrollIndicatorAnimator != null) {
+                mScrollIndicatorAnimator.cancel();
+            }
+            mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 1f);
+            mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeInDuration);
+            mScrollIndicatorAnimator.start();
         }
     }
 
@@ -1688,11 +1690,41 @@
         if (mScrollIndicator != null) {
             // Fade the indicator out
             updateScrollingIndicatorPosition();
-            mScrollIndicator.animate().alpha(0f).setDuration(immediately ?
-                    sScrollIndicatorFastFadeOutDuration : sScrollIndicatorFadeOutDuration).start();
+            if (mScrollIndicatorAnimator != null) {
+                mScrollIndicatorAnimator.cancel();
+            }
+            if (immediately) {
+                mScrollIndicator.setVisibility(View.GONE);
+                mScrollIndicator.setAlpha(0f);
+            } else {
+                mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 0f);
+                mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeOutDuration);
+                mScrollIndicatorAnimator.addListener(new AnimatorListenerAdapter() {
+                    private boolean cancelled = false;
+                    @Override
+                    public void onAnimationCancel(android.animation.Animator animation) {
+                        cancelled = true;
+                    }
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        if (!cancelled) {
+                            mScrollIndicator.setVisibility(View.GONE);
+                        }
+                    }
+                });
+                mScrollIndicatorAnimator.start();
+            }
         }
     }
 
+    /**
+     * To be overridden by subclasses to determine whether the scroll indicator should stretch to
+     * fill its space on the track or not.
+     */
+    protected boolean hasElasticScrollIndicator() {
+        return false;
+    }
+
     private void updateScrollingIndicator() {
         if (getChildCount() <= 1) return;
         if (!isScrollingIndicatorEnabled()) return;
@@ -1706,16 +1738,35 @@
     private void updateScrollingIndicatorPosition() {
         if (!isScrollingIndicatorEnabled()) return;
 
-        // We can make the page width smaller to make it look more centered
+        int numPages = getChildCount();
+        int pageWidth = getMeasuredWidth();
+        int maxPageWidth = (numPages * getMeasuredWidth()) + ((numPages - 1) * mPageSpacing);
+        int trackWidth = pageWidth;
+        int indicatorWidth = mScrollIndicator.getMeasuredWidth() -
+                mScrollIndicator.getPaddingLeft() - mScrollIndicator.getPaddingRight();
+        int paddingLeft = 0;
+        int paddingRight = 0;
+
+        // Get the track properties
         getScrollingIndicatorTrack();
-        int pageWidth = mScrollTrack.getMeasuredWidth() - mScrollTrack.getPaddingLeft() -
-                mScrollTrack.getPaddingRight();
-        int maxPageWidth = getChildCount() * getMeasuredWidth();
+        if (mScrollTrack != null) {
+            paddingLeft = mScrollTrack.getPaddingLeft();
+            paddingRight = mScrollTrack.getPaddingRight();
+            trackWidth = mScrollTrack.getMeasuredWidth() - paddingLeft - paddingRight;
+        }
+
         float offset = (float) getScrollX() / maxPageWidth;
-        int indicatorWidth = pageWidth / getChildCount();
-        int indicatorCenterOffset = indicatorWidth / 2 - mScrollIndicator.getMeasuredWidth() / 2;
-        int indicatorPos = (int) (offset * pageWidth) + mScrollTrack.getPaddingLeft() +
-                indicatorCenterOffset;
+        int indicatorSpace = trackWidth / numPages;
+        int indicatorPos = (int) (offset * trackWidth) + paddingLeft;
+        if (hasElasticScrollIndicator()) {
+            if (mScrollIndicator.getMeasuredWidth() != indicatorSpace) {
+                mScrollIndicator.getLayoutParams().width = indicatorSpace;
+                mScrollIndicator.requestLayout();
+            }
+        } else {
+            int indicatorCenterOffset = indicatorSpace / 2 - indicatorWidth / 2;
+            indicatorPos += indicatorCenterOffset;
+        }
         mScrollIndicator.setTranslationX(indicatorPos);
         mScrollIndicator.invalidate();
     }
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index ba290d3..d79158d 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -3339,4 +3339,11 @@
     public void getLocationInDragLayer(int[] loc) {
         mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
     }
+
+    /**
+     * Return true because we want the scrolling indicator to stretch to fit the space.
+     */
+    protected boolean hasElasticScrollIndicator() {
+        return true;
+    }
 }