Updating widget prediction handling:
When handling widget prediction, first match the full provider names Only if no widgets are found, match any widget in the package Bug: 256202399 Test: atest WidgetsPredicationUpdateTaskTest Change-Id: I5337618d935f8b926803aeefede46059545de72d
This commit is contained in:
@@ -18,22 +18,22 @@ package com.android.launcher3.model;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION;
|
||||
|
||||
import android.app.prediction.AppTarget;
|
||||
import android.content.ComponentName;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
|
||||
import com.android.launcher3.model.QuickstepModelDelegate.PredictorState;
|
||||
import com.android.launcher3.util.ComponentKey;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
import com.android.launcher3.widget.PendingAddWidgetInfo;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Task to update model as a result of predicted widgets update */
|
||||
@@ -59,50 +59,43 @@ public final class WidgetsPredictionUpdateTask extends BaseModelUpdateTask {
|
||||
Set<ComponentKey> widgetsInWorkspace = dataModel.appWidgets.stream().map(
|
||||
widget -> new ComponentKey(widget.providerName, widget.user)).collect(
|
||||
Collectors.toSet());
|
||||
Predicate<WidgetItem> notOnWorkspace = w -> !widgetsInWorkspace.contains(w);
|
||||
Map<PackageUserKey, List<WidgetItem>> allWidgets =
|
||||
dataModel.widgetsModel.getAllWidgetsWithoutShortcuts();
|
||||
|
||||
FixedContainerItems fixedContainerItems =
|
||||
new FixedContainerItems(mPredictorState.containerId);
|
||||
List<WidgetItem> servicePredictedItems = new ArrayList<>();
|
||||
List<WidgetItem> localFilteredWidgets = new ArrayList<>();
|
||||
|
||||
if (FeatureFlags.ENABLE_LOCAL_RECOMMENDED_WIDGETS_FILTER.get()) {
|
||||
for (AppTarget app : mTargets) {
|
||||
PackageUserKey packageUserKey = new PackageUserKey(app.getPackageName(),
|
||||
app.getUser());
|
||||
if (allWidgets.containsKey(packageUserKey)) {
|
||||
List<WidgetItem> notAddedWidgets = allWidgets.get(packageUserKey).stream()
|
||||
.filter(item ->
|
||||
!widgetsInWorkspace.contains(
|
||||
new ComponentKey(item.componentName, item.user)))
|
||||
.collect(Collectors.toList());
|
||||
if (notAddedWidgets.size() > 0) {
|
||||
// Even an apps have more than one widgets, we only include one widget.
|
||||
fixedContainerItems.items.add(
|
||||
new PendingAddWidgetInfo(
|
||||
notAddedWidgets.get(0).widgetInfo,
|
||||
CONTAINER_WIDGETS_PREDICTION));
|
||||
}
|
||||
}
|
||||
for (AppTarget app : mTargets) {
|
||||
PackageUserKey packageUserKey = new PackageUserKey(app.getPackageName(), app.getUser());
|
||||
List<WidgetItem> widgets = allWidgets.get(packageUserKey);
|
||||
if (widgets == null || widgets.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
Map<ComponentKey, WidgetItem> widgetItems =
|
||||
allWidgets.values().stream().flatMap(List::stream).distinct()
|
||||
.collect(Collectors.toMap(widget -> (ComponentKey) widget,
|
||||
widget -> widget));
|
||||
for (AppTarget app : mTargets) {
|
||||
if (TextUtils.isEmpty(app.getClassName())) {
|
||||
String className = app.getClassName();
|
||||
if (!TextUtils.isEmpty(className)) {
|
||||
WidgetItem item = widgets.stream()
|
||||
.filter(w -> className.equals(w.componentName.getClassName()))
|
||||
.filter(notOnWorkspace)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (item != null) {
|
||||
servicePredictedItems.add(item);
|
||||
continue;
|
||||
}
|
||||
ComponentKey targetWidget = new ComponentKey(
|
||||
new ComponentName(app.getPackageName(), app.getClassName()), app.getUser());
|
||||
if (widgetItems.containsKey(targetWidget)) {
|
||||
fixedContainerItems.items.add(
|
||||
new PendingAddWidgetInfo(widgetItems.get(
|
||||
targetWidget).widgetInfo,
|
||||
CONTAINER_WIDGETS_PREDICTION));
|
||||
}
|
||||
}
|
||||
// No widget was added by the service, try local filtering
|
||||
widgets.stream().filter(notOnWorkspace).findFirst()
|
||||
.ifPresent(localFilteredWidgets::add);
|
||||
}
|
||||
if (servicePredictedItems.isEmpty()) {
|
||||
servicePredictedItems.addAll(localFilteredWidgets);
|
||||
}
|
||||
FixedContainerItems fixedContainerItems =
|
||||
new FixedContainerItems(mPredictorState.containerId);
|
||||
servicePredictedItems.forEach(w -> fixedContainerItems.items.add(
|
||||
new PendingAddWidgetInfo(w.widgetInfo, CONTAINER_WIDGETS_PREDICTION)));
|
||||
|
||||
dataModel.extraItems.put(mPredictorState.containerId, fixedContainerItems);
|
||||
bindExtraContainerItems(fixedContainerItems);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user