key event focus logic should support large tablets

TL;DR;; On smaller tablets, landscape = vertical hotseat bar, and
portrait = horizontal hotseat bar. However, in larger tablets, hotseat bar is
always horizontal. This is now correctly handled using DeviceProfile.isVerticalBar
method.

b/19732584

Change-Id: I1035c89b4685be12dbc863f8a1465047a5fec6a6
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index ddd3002..bc9ef76 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -81,6 +81,7 @@
     boolean isTablet;
     boolean isLargeTablet;
     boolean isLayoutRtl;
+
     boolean transposeLayoutWithOrientation;
 
     int desiredWorkspaceLeftRightMarginPx;
@@ -699,6 +700,10 @@
         return isLargeTablet;
     }
 
+    /**
+     * When {@code true}, hotseat is on the bottom row when in landscape mode.
+     * If {@code false}, hotseat is on the right column when in landscape mode.
+     */
     boolean isVerticalBarLayout() {
         return isLandscape && transposeLayoutWithOrientation;
     }
diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java
index b090a7c..fc68952 100644
--- a/src/com/android/launcher3/FocusHelper.java
+++ b/src/com/android/launcher3/FocusHelper.java
@@ -207,12 +207,13 @@
         if (e.getAction() == KeyEvent.ACTION_UP || !consume) {
             return consume;
         }
-        int orientation = v.getResources().getConfiguration().orientation;
 
+        LauncherAppState app = LauncherAppState.getInstance();
+        DeviceProfile profile = app.getDynamicGrid().getDeviceProfile();
         if (DEBUG) {
             Log.v(TAG, String.format(
-                    "Handle HOTSEAT BUTTONS keyevent=[%s] on hotseat buttons, orientation=%d",
-                    KeyEvent.keyCodeToString(keyCode), orientation));
+                    "Handle HOTSEAT BUTTONS keyevent=[%s] on hotseat buttons, isVertical=%s",
+                    KeyEvent.keyCodeToString(keyCode), profile.isVerticalBarLayout()));
         }
 
         // Initialize the variables.
@@ -226,6 +227,8 @@
         int countX = -1;
         int countY = -1;
         int iconIndex = findIndexOfView(hotseatParent, v);
+        int iconRank = ((CellLayout.LayoutParams) hotseatLayout.getShortcutsAndWidgets()
+                .getChildAt(iconIndex).getLayoutParams()).cellX;
 
         final CellLayout iconLayout = (CellLayout) workspace.getChildAt(pageIndex);
         final ViewGroup iconParent = iconLayout.getShortcutsAndWidgets();
@@ -234,23 +237,25 @@
         int[][] matrix = null;
 
         if (keyCode == KeyEvent.KEYCODE_DPAD_UP &&
-                orientation == Configuration.ORIENTATION_PORTRAIT) {
-            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, orientation,
-                    hotseat.getAllAppsButtonRank(), true /* include all apps icon */);
+                !profile.isVerticalBarLayout()) {
+            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout,
+                    true /* hotseat horizontal */, hotseat.getAllAppsButtonRank(),
+                    iconRank == hotseat.getAllAppsButtonRank() /* include all apps icon */);
             iconIndex += iconParent.getChildCount();
             countX = iconLayout.getCountX();
             countY = iconLayout.getCountY() + hotseatLayout.getCountY();
             parent = iconParent;
         } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT &&
-                orientation == Configuration.ORIENTATION_LANDSCAPE) {
-            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, orientation,
-                    hotseat.getAllAppsButtonRank(), true /* include all apps icon */);
+                profile.isVerticalBarLayout()) {
+            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout,
+                    false /* hotseat horizontal */, hotseat.getAllAppsButtonRank(),
+                    iconRank == hotseat.getAllAppsButtonRank() /* include all apps icon */);
             iconIndex += iconParent.getChildCount();
             countX = iconLayout.getCountX() + hotseatLayout.getCountX();
             countY = iconLayout.getCountY();
             parent = iconParent;
         } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT &&
-                orientation == Configuration.ORIENTATION_LANDSCAPE) {
+                profile.isVerticalBarLayout()) {
             keyCode = KeyEvent.KEYCODE_PAGE_DOWN;
         }else {
             // For other KEYCODE_DPAD_LEFT and KEYCODE_DPAD_RIGHT navigation, do not use the
@@ -296,10 +301,13 @@
         if (e.getAction() == KeyEvent.ACTION_UP || !consume) {
             return consume;
         }
-        int orientation = v.getResources().getConfiguration().orientation;
+
+        LauncherAppState app = LauncherAppState.getInstance();
+        DeviceProfile profile = app.getDynamicGrid().getDeviceProfile();
+
         if (DEBUG) {
-            Log.v(TAG, String.format("Handle WORKSPACE ICONS keyevent=[%s] orientation=%d",
-                    KeyEvent.keyCodeToString(keyCode), orientation));
+            Log.v(TAG, String.format("Handle WORKSPACE ICONS keyevent=[%s] isVerticalBar=%s",
+                    KeyEvent.keyCodeToString(keyCode), profile.isVerticalBarLayout()));
         }
 
         // Initialize the variables.
@@ -322,14 +330,13 @@
         // KEYCODE_DPAD_DOWN in portrait (KEYCODE_DPAD_RIGHT in landscape) is the only key allowed
         // to take a user to the hotseat. For other dpad navigation, do not use the matrix extended
         // with the hotseat.
-        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&
-                orientation == Configuration.ORIENTATION_PORTRAIT) {
-            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, orientation,
+        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && !profile.isVerticalBarLayout()) {
+            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, true /* horizontal */,
                     hotseat.getAllAppsButtonRank(), false /* all apps icon is ignored */);
             countY = countY + 1;
         } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT &&
-                orientation == Configuration.ORIENTATION_LANDSCAPE) {
-            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, orientation,
+                profile.isVerticalBarLayout()) {
+            matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, false /* horizontal */,
                     hotseat.getAllAppsButtonRank(), false /* all apps icon is ignored */);
             countX = countX + 1;
         } else if (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) {
diff --git a/src/com/android/launcher3/util/FocusLogic.java b/src/com/android/launcher3/util/FocusLogic.java
index 0c6bfbf..6e80c2f 100644
--- a/src/com/android/launcher3/util/FocusLogic.java
+++ b/src/com/android/launcher3/util/FocusLogic.java
@@ -184,21 +184,18 @@
      */
     // TODO: get rid of the dynamic matrix creation
     public static int[][] createSparseMatrix(CellLayout iconLayout, CellLayout hotseatLayout,
-            int orientation, int allappsiconRank, boolean includeAllappsicon) {
+            boolean isHorizontal, int allappsiconRank, boolean includeAllappsicon) {
 
         ViewGroup iconParent = iconLayout.getShortcutsAndWidgets();
         ViewGroup hotseatParent = hotseatLayout.getShortcutsAndWidgets();
 
         int m, n;
-        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+        if (isHorizontal) {
             m = iconLayout.getCountX();
             n = iconLayout.getCountY() + hotseatLayout.getCountY();
-        } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+        } else {
             m = iconLayout.getCountX() + hotseatLayout.getCountX();
             n = iconLayout.getCountY();
-        } else {
-            throw new IllegalStateException(String.format(
-                    "orientation type=%d is not supported for key board events.", orientation));
         }
         int[][] matrix = createFullMatrix(m, n, false /* set all cell to empty */);
 
@@ -215,7 +212,7 @@
         // is truncated. If it is negative, then all apps icon index is not inserted.
         for(int i = hotseatParent.getChildCount() - 1; i >= (includeAllappsicon ? 0 : 1); i--) {
             int delta = 0;
-            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+            if (isHorizontal) {
                 int cx = ((CellLayout.LayoutParams)
                         hotseatParent.getChildAt(i).getLayoutParams()).cellX;
                 if ((includeAllappsicon && cx >= allappsiconRank) ||
@@ -223,7 +220,7 @@
                         delta = -1;
                 }
                 matrix[cx + delta][iconLayout.getCountY()] = iconParent.getChildCount() + i;
-            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            } else {
                 int cy = ((CellLayout.LayoutParams)
                         hotseatParent.getChildAt(i).getLayoutParams()).cellY;
                 if ((includeAllappsicon && cy >= allappsiconRank) ||