From e7cb65009e2463929f59377b3f18e57d2b0e2545 Mon Sep 17 00:00:00 2001 From: Pat Manning Date: Tue, 31 Oct 2023 13:23:45 +0000 Subject: [PATCH] Fix focus nav of AllApps when Searching. - Do not focus the Icon in Small Icon Result Rows - Use FocusIndicatorHelper when focusing search result icons Flag: NONE Bug: 296844600 Fix: 310173226 Test: Test: TaplKeyboardFocusTest Change-Id: Icfc82ae41ffc8ef7c7ad42950f98f3d2dc805795 --- .../allapps/ActivityAllAppsContainerView.java | 9 ++++- .../allapps/TaplKeyboardFocusTest.java | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index d822fec4cf..e54eb22662 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -1046,6 +1046,11 @@ public class ActivityAllAppsContainerView 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()) { @@ -1443,6 +1448,7 @@ public class ActivityAllAppsContainerView final AlphabeticalAppsList mAppsList; final Rect mPadding = new Rect(); AllAppsRecyclerView mRecyclerView; + private OnFocusChangeListener mOnFocusChangeListener; AdapterHolder(int type, AlphabeticalAppsList appsList) { mType = type; @@ -1466,7 +1472,8 @@ public class ActivityAllAppsContainerView 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 80f73cb159..fe9464a928 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.assertNotNull; 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 @@ public class TaplKeyboardFocusTest extends AbstractLauncherUiTest { 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(); + } + } }