OSDN Git Service

Fixing issue where the prediction bar apps are not focused.
authorWinson Chung <winsonc@google.com>
Wed, 20 May 2015 22:03:13 +0000 (15:03 -0700)
committerWinson Chung <winsonc@google.com>
Thu, 21 May 2015 00:37:50 +0000 (00:37 +0000)
- Also fixes issue where all apps is not accessible by keyboard
  when there are no other apps in the hotseat.

Bug: 21334471

res/layout/apps_list_view.xml
src/com/android/launcher3/AppsContainerView.java
src/com/android/launcher3/FocusHelper.java
src/com/android/launcher3/Hotseat.java

index 6f9be05..0404983 100644 (file)
@@ -39,6 +39,8 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/apps_search_bar_height"
         android:orientation="horizontal"
+        android:descendantFocusability="afterDescendants"
+        android:focusable="true"
         android:visibility="invisible" >
     </LinearLayout>
 
index 5ccb6c6..76f3c88 100644 (file)
@@ -183,6 +183,7 @@ public class AppsContainerView extends BaseContainerView implements DragSource,
     private int mContainerInset;
     private int mPredictionBarHeight;
     private int mLastRecyclerViewScrollPos = -1;
+    private boolean mFocusPredictionBarOnFirstBind;
 
     private CheckLongPressHelper mPredictionIconCheckForLongPress;
     private View mPredictionIconUnderTouch;
@@ -298,7 +299,17 @@ public class AppsContainerView extends BaseContainerView implements DragSource,
             @Override
             public void onFocusChange(View v, boolean hasFocus) {
                 if (v == mContentView && hasFocus) {
-                    mAppsRecyclerView.requestFocus();
+                    if (!mApps.getPredictedApps().isEmpty()) {
+                        // If the prediction bar is going to be bound, then defer focusing until
+                        // it is first bound
+                        if (mPredictionBarView.getChildCount() == 0) {
+                            mFocusPredictionBarOnFirstBind = true;
+                        } else {
+                            mPredictionBarView.requestFocus();
+                        }
+                    } else {
+                        mAppsRecyclerView.requestFocus();
+                    }
                 }
             }
         });
@@ -387,6 +398,11 @@ public class AppsContainerView extends BaseContainerView implements DragSource,
                 icon.setVisibility(View.INVISIBLE);
             }
         }
+
+        if (mFocusPredictionBarOnFirstBind) {
+            mFocusPredictionBarOnFirstBind = false;
+            mPredictionBarView.requestFocus();
+        }
     }
 
     @Override
index c77d416..678ed0f 100644 (file)
@@ -314,12 +314,14 @@ public class FocusHelper {
         // with the hotseat.
         if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && !profile.isVerticalBarLayout()) {
             matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, true /* horizontal */,
-                    hotseat.getAllAppsButtonRank(), false /* all apps icon is ignored */);
+                    hotseat.getAllAppsButtonRank(),
+                    !hotseat.hasIcons() /* ignore all apps icon, unless there are no other icons */);
             countY = countY + 1;
         } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT &&
                 profile.isVerticalBarLayout()) {
             matrix = FocusLogic.createSparseMatrix(iconLayout, hotseatLayout, false /* horizontal */,
-                    hotseat.getAllAppsButtonRank(), false /* all apps icon is ignored */);
+                    hotseat.getAllAppsButtonRank(),
+                    !hotseat.hasIcons() /* ignore all apps icon, unless there are no other icons */);
             countX = countX + 1;
         } else if (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) {
             workspace.removeWorkspaceItem(v);
index b614bc6..b8337b6 100644 (file)
@@ -65,6 +65,13 @@ public class Hotseat extends FrameLayout {
     }
 
     /**
+     * Returns whether there are other icons than the all apps button in the hotseat.
+     */
+    public boolean hasIcons() {
+        return mContent.getShortcutsAndWidgets().getChildCount() > 1;
+    }
+
+    /**
      * Registers the specified listener on the cell layout of the hotseat.
      */
     @Override
@@ -98,25 +105,6 @@ public class Hotseat extends FrameLayout {
         return rank == mAllAppsButtonRank;
     }
 
-    /** This returns the coordinates of an app in a given cell, relative to the DragLayer */
-    Rect getCellCoordinates(int cellX, int cellY) {
-        Rect coords = new Rect();
-        mContent.cellToRect(cellX, cellY, 1, 1, coords);
-        int[] hotseatInParent = new int[2];
-        Utilities.getDescendantCoordRelativeToParent(this, mLauncher.getDragLayer(),
-                hotseatInParent, false);
-        coords.offset(hotseatInParent[0], hotseatInParent[1]);
-
-        // Center the icon
-        int cWidth = mContent.getShortcutsAndWidgets().getCellContentWidth();
-        int cHeight = mContent.getShortcutsAndWidgets().getCellContentHeight();
-        int cellPaddingX = (int) Math.max(0, ((coords.width() - cWidth) / 2f));
-        int cellPaddingY = (int) Math.max(0, ((coords.height() - cHeight) / 2f));
-        coords.offset(cellPaddingX, cellPaddingY);
-
-        return coords;
-    }
-
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();