From 77e42868da93124a011f869fe160b34d7bfc2ea5 Mon Sep 17 00:00:00 2001 From: Shamali P Date: Thu, 6 Jun 2024 20:02:52 +0000 Subject: [PATCH] Consider WidgetSections for suggestions in standalone picker This cl address the problem for standalone picker (follow up to match ag/27720721) to ensure widgets that aren't in section of their owning package didn't appear in suggestions Bug: 345520128 Test: Unit tests Flag: EXEMPT bugfix Change-Id: Ia0ef96c5be77db56b84c76ace498125d07f4be42 --- .../launcher3/WidgetPickerActivity.java | 19 +++++++----- .../model/WidgetPredictionsRequester.java | 31 +++++-------------- .../model/WidgetsPredictionsRequesterTest.kt | 15 +++++---- 3 files changed, 26 insertions(+), 39 deletions(-) diff --git a/quickstep/src/com/android/launcher3/WidgetPickerActivity.java b/quickstep/src/com/android/launcher3/WidgetPickerActivity.java index 943c08c786..7e52ea1372 100644 --- a/quickstep/src/com/android/launcher3/WidgetPickerActivity.java +++ b/quickstep/src/com/android/launcher3/WidgetPickerActivity.java @@ -43,17 +43,18 @@ import com.android.launcher3.model.WidgetPredictionsRequester; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.popup.PopupDataProvider; -import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.util.ComponentKey; import com.android.launcher3.widget.BaseWidgetSheet; import com.android.launcher3.widget.WidgetCell; import com.android.launcher3.widget.model.WidgetsListBaseEntry; -import com.android.launcher3.widget.model.WidgetsListHeaderEntry; +import com.android.launcher3.widget.model.WidgetsListContentEntry; import com.android.launcher3.widget.picker.WidgetsFullSheet; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -240,14 +241,16 @@ public class WidgetPickerActivity extends BaseActivity { ); bindWidgets(allWidgets); if (mUiSurface != null) { - Map> allWidgetsMap = allWidgets.stream() - .filter(WidgetsListHeaderEntry.class::isInstance) + Map allWidgetItems = allWidgets.stream() + .filter(entry -> entry instanceof WidgetsListContentEntry) + .flatMap(entry -> entry.mWidgets.stream()) + .distinct() .collect(Collectors.toMap( - entry -> PackageUserKey.fromPackageItemInfo(entry.mPkgItem), - entry -> entry.mWidgets) - ); + widget -> new ComponentKey(widget.componentName, widget.user), + Function.identity() + )); mWidgetPredictionsRequester = new WidgetPredictionsRequester(app.getContext(), - mUiSurface, allWidgetsMap); + mUiSurface, allWidgetItems); mWidgetPredictionsRequester.request(mAddedWidgets, this::bindRecommendedWidgets); } }); diff --git a/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java b/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java index 84313965e6..5730273d88 100644 --- a/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java +++ b/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java @@ -40,7 +40,6 @@ import androidx.annotation.WorkerThread; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.util.ComponentKey; -import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.widget.PendingAddWidgetInfo; import com.android.launcher3.widget.picker.WidgetRecommendationCategoryProvider; @@ -67,10 +66,10 @@ public class WidgetPredictionsRequester { @NonNull private final String mUiSurface; @NonNull - private final Map> mAllWidgets; + private final Map mAllWidgets; public WidgetPredictionsRequester(Context context, @NonNull String uiSurface, - @NonNull Map> allWidgets) { + @NonNull Map allWidgets) { mContext = context; mUiSurface = uiSurface; mAllWidgets = Collections.unmodifiableMap(allWidgets); @@ -172,33 +171,19 @@ public class WidgetPredictionsRequester { */ @VisibleForTesting static List filterPredictions(List predictions, - Map> allWidgets, Predicate filter) { + Map allWidgets, Predicate filter) { List servicePredictedItems = new ArrayList<>(); - List localFilteredWidgets = new ArrayList<>(); for (AppTarget prediction : predictions) { - List widgetsInPackage = allWidgets.get( - new PackageUserKey(prediction.getPackageName(), prediction.getUser())); - if (widgetsInPackage == null || widgetsInPackage.isEmpty()) { - continue; - } String className = prediction.getClassName(); if (!TextUtils.isEmpty(className)) { - WidgetItem item = widgetsInPackage.stream() - .filter(w -> className.equals(w.componentName.getClassName())) - .filter(filter) - .findFirst().orElse(null); - if (item != null) { - servicePredictedItems.add(item); - continue; + WidgetItem widgetItem = allWidgets.get( + new ComponentKey(new ComponentName(prediction.getPackageName(), className), + prediction.getUser())); + if (widgetItem != null && filter.test(widgetItem)) { + servicePredictedItems.add(widgetItem); } } - // No widget was added by the service, try local filtering - widgetsInPackage.stream().filter(filter).findFirst() - .ifPresent(localFilteredWidgets::add); - } - if (servicePredictedItems.isEmpty()) { - servicePredictedItems.addAll(localFilteredWidgets); } return servicePredictedItems; diff --git a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt index 5c7b4aba4d..039dce4393 100644 --- a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt +++ b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt @@ -34,7 +34,7 @@ import com.android.launcher3.model.WidgetPredictionsRequester.buildBundleForPred import com.android.launcher3.model.WidgetPredictionsRequester.filterPredictions import com.android.launcher3.model.WidgetPredictionsRequester.notOnUiSurfaceFilter import com.android.launcher3.util.ActivityContextWrapper -import com.android.launcher3.util.PackageUserKey +import com.android.launcher3.util.ComponentKey import com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo import com.android.launcher3.widget.LauncherAppWidgetProviderInfo import com.google.common.truth.Truth.assertThat @@ -62,7 +62,7 @@ class WidgetsPredictionsRequesterTest { private lateinit var widgetItem1b: WidgetItem private lateinit var widgetItem2: WidgetItem - private lateinit var allWidgets: Map> + private lateinit var allWidgets: Map @Mock private lateinit var iconCache: IconCache @@ -93,9 +93,9 @@ class WidgetsPredictionsRequesterTest { allWidgets = mapOf( - PackageUserKey(APP_1_PACKAGE_NAME, mUserHandle) to - listOf(widgetItem1a, widgetItem1b), - PackageUserKey(APP_2_PACKAGE_NAME, mUserHandle) to listOf(widgetItem2), + ComponentKey(widgetItem1a.componentName, widgetItem1a.user) to widgetItem1a, + ComponentKey(widgetItem1b.componentName, widgetItem1b.user) to widgetItem1b, + ComponentKey(widgetItem2.componentName, widgetItem2.user) to widgetItem2, ) } @@ -156,7 +156,7 @@ class WidgetsPredictionsRequesterTest { } @Test - fun filterPredictions_appPredictions_returnsWidgetFromPackage() { + fun filterPredictions_appPredictions_returnsEmptyList() { val widgetsAlreadyOnSurface = arrayListOf(widget1bInfo) val filter: Predicate = notOnUiSurfaceFilter(widgetsAlreadyOnSurface) @@ -176,8 +176,7 @@ class WidgetsPredictionsRequesterTest { ), ) - assertThat(filterPredictions(predictions, allWidgets, filter)) - .containsExactly(widgetItem1a, widgetItem2) + assertThat(filterPredictions(predictions, allWidgets, filter)).isEmpty() } private fun createWidgetItem(