Merge "Fix focus nav of AllApps when Searching." into main
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index 5b4d2b8..095cfa9 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -1046,6 +1046,11 @@
         return getActiveAppsRecyclerView();
     }
 
+    /** The current focus change listener in the search container. */
+    public OnFocusChangeListener getSearchFocusChangeListener() {
+        return mAH.get(AdapterHolder.SEARCH).mOnFocusChangeListener;
+    }
+
     /** The current apps recycler view in the container. */
     private AllAppsRecyclerView getActiveAppsRecyclerView() {
         if (!mUsingTabs || isPersonalTab()) {
@@ -1442,6 +1447,7 @@
         final AlphabeticalAppsList<T> mAppsList;
         final Rect mPadding = new Rect();
         AllAppsRecyclerView mRecyclerView;
+        private OnFocusChangeListener mOnFocusChangeListener;
 
         AdapterHolder(int type, AlphabeticalAppsList<T> appsList) {
             mType = type;
@@ -1465,7 +1471,8 @@
             onInitializeRecyclerView(mRecyclerView);
             FocusedItemDecorator focusedItemDecorator = new FocusedItemDecorator(mRecyclerView);
             mRecyclerView.addItemDecoration(focusedItemDecorator);
-            mAdapter.setIconFocusListener(focusedItemDecorator.getFocusListener());
+            mOnFocusChangeListener = focusedItemDecorator.getFocusListener();
+            mAdapter.setIconFocusListener(mOnFocusChangeListener);
             applyPadding();
         }
 
diff --git a/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java b/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
index 80f73cb..fe9464a 100644
--- a/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
+++ b/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
@@ -21,6 +21,8 @@
 import static org.junit.Assert.assertTrue;
 
 import android.view.KeyEvent;
+import android.view.View;
+import android.view.WindowInsets;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
@@ -76,4 +78,39 @@
             allApps.unfreeze();
         }
     }
+
+    @Test
+    public void testAllAppsExitSearchAndFocusSearchResults() {
+        final HomeAllApps allApps = mLauncher.goHome().switchToAllApps();
+        assertTrue("Launcher internal state is not All Apps",
+                isInState(() -> LauncherState.ALL_APPS));
+        allApps.freeze();
+        try {
+            executeOnLauncher(launcher -> launcher.getAppsView().getSearchView().requestFocus());
+            waitForLauncherCondition("Search view does not have focus.",
+                    launcher -> launcher.getAppsView().getSearchView().hasFocus());
+
+            mLauncher.pressAndHoldKeyCode(KeyEvent.KEYCODE_C, 0);
+            waitForLauncherCondition("Search view not active.",
+                    launcher -> launcher.getAppsView().getActiveRecyclerView()
+                            instanceof SearchRecyclerView);
+            mLauncher.unpressKeyCode(KeyEvent.KEYCODE_C, 0);
+
+            executeOnLauncher(launcher -> launcher.getAppsView().getSearchUiManager().getEditText()
+                    .hideKeyboard(/* clearFocus= */ false));
+            waitForLauncherCondition("Keyboard still visible.", launcher -> {
+                View root = launcher.getDragLayer();
+                WindowInsets insets = root.getRootWindowInsets();
+                return insets != null && !insets.isVisible(WindowInsets.Type.ime());
+            });
+
+            mLauncher.pressAndHoldKeyCode(KeyEvent.KEYCODE_DPAD_DOWN, 0);
+            mLauncher.unpressKeyCode(KeyEvent.KEYCODE_DPAD_DOWN, 0);
+            waitForLauncherCondition("No focused child", launcher ->
+                    launcher.getAppsView().getActiveRecyclerView().getApps().getFocusedChild()
+                            != null);
+        } finally {
+            allApps.unfreeze();
+        }
+    }
 }