Fixing transition animation in landscape on tablets (Bug 16867731)

- Also fixing the scroller, initial scroll state, and scroll bounds on large tablets

Change-Id: I886153748156fb442e4dc2b7ec6cf052da43ab88
diff --git a/packages/SystemUI/res/values-sw720dp/config.xml b/packages/SystemUI/res/values-sw720dp/config.xml
index d8bb8d7d..fbc0d1d 100644
--- a/packages/SystemUI/res/values-sw720dp/config.xml
+++ b/packages/SystemUI/res/values-sw720dp/config.xml
@@ -39,5 +39,8 @@
     <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
          card. -->
     <integer name="keyguard_max_notification_count">5</integer>
+
+    <!-- Transposes the recents layout in landscape. -->
+    <bool name="recents_transpose_layout_with_orientation">false</bool>
 </resources>
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index 980a4aea..dabeadf 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -37,8 +37,6 @@
     static RecentsConfiguration sInstance;
     static int sPrevConfigurationHashCode;
 
-    DisplayMetrics mDisplayMetrics;
-
     /** Animations */
     public float animationPxMovementPerSecond;
 
@@ -156,7 +154,6 @@
         SharedPreferences settings = context.getSharedPreferences(context.getPackageName(), 0);
         Resources res = context.getResources();
         DisplayMetrics dm = res.getDisplayMetrics();
-        mDisplayMetrics = dm;
 
         // Debug mode
         debugModeEnabled = settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false);
@@ -164,6 +161,15 @@
             Console.Enabled = true;
         }
 
+        // Layout
+        isLandscape = res.getConfiguration().orientation ==
+                Configuration.ORIENTATION_LANDSCAPE;
+        transposeRecentsLayoutWithOrientation =
+                res.getBoolean(R.bool.recents_transpose_layout_with_orientation);
+
+        // Insets
+        displayRect.set(0, 0, dm.widthPixels, dm.heightPixels);
+
         // Animations
         animationPxMovementPerSecond =
                 res.getDimensionPixelSize(R.dimen.recents_animation_movement_in_dps_per_second);
@@ -174,15 +180,6 @@
         filteringNewViewsAnimDuration =
                 res.getInteger(R.integer.recents_filter_animate_new_views_duration);
 
-        // Insets
-        displayRect.set(0, 0, dm.widthPixels, dm.heightPixels);
-
-        // Layout
-        isLandscape = res.getConfiguration().orientation ==
-                Configuration.ORIENTATION_LANDSCAPE;
-        transposeRecentsLayoutWithOrientation =
-                res.getBoolean(R.bool.recents_transpose_layout_with_orientation);
-
         // Search Bar
         searchBarSpaceHeightPx = res.getDimensionPixelSize(R.dimen.recents_search_bar_space_height);
         searchBarAppWidgetId = settings.getInt(Constants.Values.App.Key_SearchAppWidgetId, -1);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
index 633e6fa..6c8de72 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
@@ -60,8 +60,6 @@
 
     public TaskStackViewLayoutAlgorithm(RecentsConfiguration config) {
         mConfig = config;
-        mWithinAffiliationOffset = mConfig.taskBarHeight;
-        mBetweenAffiliationOffset = 4 * mConfig.taskBarHeight;
 
         // Precompute the path
         initializeCurve();
@@ -84,6 +82,11 @@
         int left = mStackRect.left + (mStackRect.width() - size) / 2;
         mTaskRect.set(left, mStackRect.top,
                 left + size, mStackRect.top + size);
+
+        // Update the affiliation offsets
+        float visibleTaskPct = 0.55f;
+        mWithinAffiliationOffset = mConfig.taskBarHeight;
+        mBetweenAffiliationOffset = (int) (visibleTaskPct * mTaskRect.height());
     }
 
     /** Computes the minimum and maximum scroll progress values.  This method may be called before
@@ -110,8 +113,7 @@
                 screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom));
 
         // Update the task offsets
-        float pAtBackMostCardTop = screenYToCurveProgress(mStackVisibleRect.top +
-                (mStackVisibleRect.height() - taskHeight) / 2);
+        float pAtBackMostCardTop = 0.5f;
         float pAtFrontMostCardTop = pAtBackMostCardTop;
         float pAtSecondFrontMostCardTop = pAtBackMostCardTop;
         int taskCount = tasks.size();
@@ -128,14 +130,15 @@
             }
         }
 
-        mMinScrollP = 0f;
         mMaxScrollP = pAtFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
+        mMinScrollP = tasks.size() == 1 ? Math.max(mMaxScrollP, 0f) : 0f;
         if (launchedWithAltTab) {
             // Center the second most task, since that will be focused first
             mInitialScrollP = pAtSecondFrontMostCardTop - 0.5f;
         } else {
-            mInitialScrollP = pAtSecondFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
+            mInitialScrollP = pAtFrontMostCardTop - 0.825f;
         }
+        mInitialScrollP = Math.max(0, mInitialScrollP);
     }
 
     /** Update/get the transform */