diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java index e1214ff39f..6b5678cb8a 100644 --- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java +++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListAdapterTest.java @@ -82,7 +82,7 @@ public final class WidgetsListAdapterTest { mTestProfile.numColumns = 5; mUserHandle = Process.myUserHandle(); mAdapter = new WidgetsListAdapter(mContext, mMockLayoutInflater, mMockWidgetCache, - mIconCache, null, null); + mIconCache, null, null, null); mAdapter.registerAdapterDataObserver(mListener); doAnswer(invocation -> ((ComponentWithLabel) invocation.getArgument(0)) diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java index 84a03d572c..12a092dafe 100644 --- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java +++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java @@ -105,7 +105,8 @@ public final class WidgetsListHeaderViewHolderBinderTest { mWidgetPreviewLoader, mIconCache, /* iconClickListener= */ view -> {}, - /* iconLongClickListener= */ view -> false); + /* iconLongClickListener= */ view -> false, + /* searchBarUIHelper= */ null); mViewHolderBinder = new WidgetsListHeaderViewHolderBinder( LayoutInflater.from(mTestActivity), mOnHeaderClickListener, widgetsListAdapter); } diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java index 075c58db6b..e09034132c 100644 --- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java +++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderViewHolderBinderTest.java @@ -105,7 +105,8 @@ public final class WidgetsListSearchHeaderViewHolderBinderTest { mWidgetPreviewLoader, mIconCache, /* iconClickListener= */ view -> {}, - /* iconLongClickListener= */ view -> false); + /* iconLongClickListener= */ view -> false, + /* searchBarUIHelper= */ null); mViewHolderBinder = new WidgetsListSearchHeaderViewHolderBinder( LayoutInflater.from(mTestActivity), mOnHeaderClickListener, widgetsListAdapter); } diff --git a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java index 0c6e71711d..0935d1cfc4 100644 --- a/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java +++ b/robolectric_tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java @@ -111,7 +111,8 @@ public final class WidgetsListTableViewHolderBinderTest { mWidgetPreviewLoader, mIconCache, /* iconClickListener= */ view -> {}, - /* iconLongClickListener= */ view -> false); + /* iconLongClickListener= */ view -> false, + /* searchBarUIHelper= */ null); mViewHolderBinder = new WidgetsListTableViewHolderBinder( mContext, LayoutInflater.from(mTestActivity), diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java index dc7d341546..29c00b209f 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java @@ -58,6 +58,7 @@ import com.android.launcher3.widget.LauncherAppWidgetHost.ProviderChangedListene import com.android.launcher3.widget.model.WidgetsListBaseEntry; import com.android.launcher3.widget.picker.search.SearchModeListener; import com.android.launcher3.widget.picker.search.WidgetsSearchBar; +import com.android.launcher3.widget.picker.search.WidgetsSearchBarUIHelper; import com.android.launcher3.widget.util.WidgetsTableUtils; import com.android.launcher3.workprofile.PersonalWorkPagedView; import com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.OnActivePageChangedListener; @@ -71,7 +72,8 @@ import java.util.function.Predicate; */ public class WidgetsFullSheet extends BaseWidgetSheet implements Insettable, ProviderChangedListener, OnActivePageChangedListener, - WidgetsRecyclerView.HeaderViewDimensionsProvider, SearchModeListener { + WidgetsRecyclerView.HeaderViewDimensionsProvider, SearchModeListener, + WidgetsSearchBarUIHelper { private static final String TAG = WidgetsFullSheet.class.getSimpleName(); private static final long DEFAULT_OPEN_DURATION = 267; @@ -561,6 +563,11 @@ public class WidgetsFullSheet extends BaseWidgetSheet getWindowInsetsController().hide(WindowInsets.Type.ime()); } + @Override + public void clearSearchBarFocus() { + mSearchAndRecommendationViewHolder.mSearchBar.clearSearchBarFocus(); + } + /** A holder class for holding adapters & their corresponding recycler view. */ private final class AdapterHolder { static final int PRIMARY = 0; @@ -583,7 +590,9 @@ public class WidgetsFullSheet extends BaseWidgetSheet apps.getWidgetCache(), apps.getIconCache(), /* iconClickListener= */ WidgetsFullSheet.this, - /* iconLongClickListener= */ WidgetsFullSheet.this); + /* iconLongClickListener= */ WidgetsFullSheet.this, + /* WidgetsSearchBarUIHelper= */ + mAdapterType == SEARCH ? WidgetsFullSheet.this : null); mWidgetsListAdapter.setHasStableIds(true); switch (mAdapterType) { case PRIMARY: diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java index d841c64a3c..d9c9d4d71b 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java @@ -41,6 +41,7 @@ import com.android.launcher3.widget.model.WidgetsListBaseEntry; import com.android.launcher3.widget.model.WidgetsListContentEntry; import com.android.launcher3.widget.model.WidgetsListHeaderEntry; import com.android.launcher3.widget.model.WidgetsListSearchHeaderEntry; +import com.android.launcher3.widget.picker.search.WidgetsSearchBarUIHelper; import java.util.ArrayList; import java.util.Arrays; @@ -69,6 +70,7 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC private static final int VIEW_TYPE_WIDGETS_HEADER = R.id.view_type_widgets_header; private static final int VIEW_TYPE_WIDGETS_SEARCH_HEADER = R.id.view_type_widgets_search_header; + @Nullable private final WidgetsSearchBarUIHelper mSearchBarUIHelper; private final WidgetsDiffReporter mDiffReporter; private final SparseArray mViewHolderBinders = new SparseArray<>(); private final WidgetsListTableViewHolderBinder mWidgetsListTableViewHolderBinder; @@ -88,7 +90,9 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC public WidgetsListAdapter(Context context, LayoutInflater layoutInflater, WidgetPreviewLoader widgetPreviewLoader, IconCache iconCache, - OnClickListener iconClickListener, OnLongClickListener iconLongClickListener) { + OnClickListener iconClickListener, OnLongClickListener iconLongClickListener, + @Nullable WidgetsSearchBarUIHelper searchBarUIHelper) { + mSearchBarUIHelper = searchBarUIHelper; mDiffReporter = new WidgetsDiffReporter(iconCache, this); mWidgetsListTableViewHolderBinder = new WidgetsListTableViewHolderBinder(context, layoutInflater, iconClickListener, iconLongClickListener, @@ -237,6 +241,9 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC @Override public void onHeaderClicked(boolean showWidgets, PackageUserKey packageUserKey) { + if (mSearchBarUIHelper != null) { + mSearchBarUIHelper.clearSearchBarFocus(); + } if (showWidgets) { mWidgetsContentVisiblePackageUserKey = packageUserKey; updateVisibleEntries(); diff --git a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java index cc336196ae..56a08b16fb 100644 --- a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java +++ b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java @@ -79,4 +79,9 @@ public class LauncherWidgetsSearchBar extends LinearLayout implements WidgetsSea super.onDetachedFromWindow(); mController.onDestroy(); } + + @Override + public void clearSearchBarFocus() { + mController.clearFocus(); + } } diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java index ef7bf23226..3ac82c0ca7 100644 --- a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java +++ b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBar.java @@ -34,6 +34,11 @@ public interface WidgetsSearchBar { */ void reset(); + /** + * Clears focus from search bar. + */ + void clearSearchBarFocus(); + /** * Sets the vertical location, in pixels, of this search bar relative to its top position. */ diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java index 60110977ed..d35a75b80a 100644 --- a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java +++ b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarController.java @@ -103,8 +103,7 @@ public class WidgetsSearchBarController implements TextWatcher, public void clearSearchResult() { mSearchAlgorithm.cancel(/* interruptActiveRequests= */ true); mInput.getText().clear(); - mInput.clearFocus(); - mInput.hideKeyboard(); + clearFocus(); mSearchModeListener.exitSearchMode(); } @@ -117,18 +116,24 @@ public class WidgetsSearchBarController implements TextWatcher, @Override public boolean onBackKey() { - mInput.clearFocus(); - mInput.hideKeyboard(); + clearFocus(); return true; } @Override public boolean onKey(View view, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { - mInput.clearFocus(); - mInput.hideKeyboard(); + clearFocus(); return true; } return false; } + + /** + * Clears focus from edit text. + */ + public void clearFocus() { + mInput.clearFocus(); + mInput.hideKeyboard(); + } } diff --git a/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java new file mode 100644 index 0000000000..edfdc655ed --- /dev/null +++ b/src/com/android/launcher3/widget/picker/search/WidgetsSearchBarUIHelper.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.widget.picker.search; + +/** + * UI helper for {@link WidgetsSearchBar}. + */ +public interface WidgetsSearchBarUIHelper { + /** + * Clears focus from the search bar. + */ + void clearSearchBarFocus(); +}