Unifying the workspace translation logic

Change-Id: I82430734c222d43222763fc6edcadac33dc3e076
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index b981b55..85ba57c 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -45,6 +45,7 @@
 import android.os.Parcelable;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.Property;
 import android.util.SparseArray;
 import android.view.MotionEvent;
 import android.view.View;
@@ -1386,18 +1387,52 @@
         // TODO(adamcohen): figure out a final effect here. We may need to recommend
         // different effects based on device performance. On at least one relatively high-end
         // device I've tried, translating the launcher causes things to get quite laggy.
-        setTranslationAndAlpha(getPageIndicator(), transX, alpha);
-        setTranslationAndAlpha(getChildAt(getCurrentPage()), transX, alpha);
-        setTranslationAndAlpha(mLauncher.getHotseat(), transX, alpha);
+        setWorkspaceTranslation(TRANSLATION_X, transX, alpha);
+        setHotseatTranslation(TRANSLATION_X, transX, alpha);
+    }
+
+    /**
+     * Moves the workspace UI in the provided direction.
+     * @param direction either {@link #TRANSLATION_X} or {@link #TRANSLATION_Y}
+     * @param translation the amound of shift.
+     * @param alpha the alpha for the workspace page
+     */
+    public void setWorkspaceTranslation(
+            Property<View, Float> direction, float translation, float alpha) {
+        View currentChild = getChildAt(getCurrentPage());
+        if (currentChild != null) {
+            direction.set(currentChild, translation);
+            currentChild.setAlpha(alpha);
+        }
 
         // When the animation finishes, reset all pages, just in case we missed a page.
-        if (transX == 0) {
+        if (Float.compare(translation, 0) == 0) {
             for (int i = getChildCount() - 1; i >= 0; i--) {
-                setTranslationAndAlpha(getChildAt(i), 0, alpha);
+                View child = getChildAt(i);
+                direction.set(child, translation);
+                child.setAlpha(alpha);
             }
         }
     }
 
+    /**
+     * Moves the Hotseat UI in the provided direction.
+     * @param direction either {@link #TRANSLATION_X} or {@link #TRANSLATION_Y}
+     * @param translation the amound of shift.
+     * @param alpha the alpha for the hotseat page
+     */
+    public void setHotseatTranslation(
+            Property<View, Float> direction, float translation, float alpha) {
+        View pageIndicator = getPageIndicator();
+        if (pageIndicator != null) {
+            direction.set(pageIndicator, translation);
+            pageIndicator.setAlpha(alpha);
+        }
+
+        direction.set(mLauncher.getHotseat(), translation);
+        mLauncher.getHotseat().setAlpha(alpha);
+    }
+
     @Override
     protected Matrix getPageShiftMatrix() {
         if (Float.compare(mOverlayTranslation, 0) != 0) {
@@ -1410,13 +1445,6 @@
         return super.getPageShiftMatrix();
     }
 
-    private void setTranslationAndAlpha(View v, float transX, float alpha) {
-        if (v != null) {
-            v.setTranslationX(transX);
-            v.setAlpha(alpha);
-        }
-    }
-
     @Override
     protected void getEdgeVerticalPostion(int[] pos) {
         View child = getChildAt(getPageCount() - 1);
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 53a517c..829a566 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -18,6 +18,7 @@
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAnimUtils;
 import com.android.launcher3.PagedView;
+import com.android.launcher3.Workspace;
 import com.android.launcher3.util.TouchController;
 
 /**
@@ -41,10 +42,10 @@
     private static final float FINAL_ALPHA = .6f;
 
     private AllAppsContainerView mAppsView;
+    private Workspace mWorkspace;
     private Hotseat mHotseat;
     private Drawable mHotseatBackground;
     private float mHotseatAlpha;
-    private View mWorkspaceCurPage;
 
     private final Launcher mLauncher;
     private final VerticalPullDetector mDetector;
@@ -69,8 +70,7 @@
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         init();
-        if (mLauncher.getWorkspace().isInOverviewMode() ||
-                mLauncher.isWidgetsViewVisible()) {
+        if (mWorkspace.isInOverviewMode() || mLauncher.isWidgetsViewVisible()) {
             return false;
         }
         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
@@ -91,6 +91,7 @@
         }
         mAppsView = mLauncher.getAppsView();
         mHotseat = mLauncher.getHotseat();
+        mWorkspace = mLauncher.getWorkspace();
 
         if (mHotseatBackground == null) {
             mHotseatBackground = mHotseat.getBackground();
@@ -110,9 +111,6 @@
      * @param start {@code true} if start of new drag.
      */
     public void preparePull(boolean start) {
-        // TODO: create a method inside workspace to fetch this easily.
-        mWorkspaceCurPage = mLauncher.getWorkspace().getChildAt(
-                mLauncher.getWorkspace().getNextPage());
         mHotseat.setVisibility(View.VISIBLE);
         mHotseat.bringToFront();
         if (start) {
@@ -130,10 +128,13 @@
                     setProgress(mTranslation);
                 }
             } else {
-                mLauncher.getWorkspace().onLauncherTransitionPrepare(mLauncher, false, false);
-                mWorkspaceCurPage.setVisibility(View.VISIBLE);
-                ((CellLayout) mWorkspaceCurPage).getShortcutsAndWidgets().setVisibility(View.VISIBLE);
-                ((CellLayout) mWorkspaceCurPage).getShortcutsAndWidgets().setAlpha(1f);
+                // TODO: get rid of this workaround to override state change by workspace transition
+                mWorkspace.onLauncherTransitionPrepare(mLauncher, false, false);
+                View child = ((CellLayout) mWorkspace.getChildAt(mWorkspace.getNextPage()))
+                        .getShortcutsAndWidgets();
+                child.setVisibility(View.VISIBLE);
+                child.setAlpha(1f);
+
                 mAppsView.setSearchBarVisible(false);
                 setLightStatusBar(false);
             }
@@ -175,8 +176,10 @@
         mAppsView.getRevealView().setAlpha(Math.min(FINAL_ALPHA, Math.max(mHotseatAlpha, alpha)));
         mAppsView.getContentView().setAlpha(alpha);
         mAppsView.setTranslationY(progress);
-        setTransAndAlpha(mWorkspaceCurPage, -mTranslation + progress, mAccelInterpolator.getInterpolation(workspaceHotseatAlpha));
-        setTransAndAlpha(mHotseat, -mTranslation + progress, workspaceHotseatAlpha);
+        mWorkspace.setWorkspaceTranslation(View.TRANSLATION_Y, -mTranslation + progress,
+                mAccelInterpolator.getInterpolation(workspaceHotseatAlpha));
+        mWorkspace.setHotseatTranslation(
+                View.TRANSLATION_Y, -mTranslation + progress, workspaceHotseatAlpha);
     }
 
     public float getProgress() {
@@ -187,13 +190,6 @@
         return ((mTranslation - progress)/mTranslation);
     }
 
-    private void setTransAndAlpha(View v, float transY, float alpha) {
-        if (v != null) {
-            v.setTranslationY(transY);
-            v.setAlpha(alpha);
-        }
-    }
-
     @Override
     public void onScrollEnd(float velocity, boolean fling) {
         if (mAppsView == null) {