From 2f2cbce8186a8a15f55b522f36a0ce1ff740f848 Mon Sep 17 00:00:00 2001 From: Steven Ng Date: Tue, 18 May 2021 20:54:18 +0100 Subject: [PATCH] Reset visible entries when the app tile of the same app no longer match Test: Switch language and then go to full widgets picker. Expand apps. Expanded entry is shown underneath the expanded app. Bug: 187529983 Change-Id: Ib438cf01656d3a177309e7f22796d0fa0c11881f --- .../widget/picker/WidgetsListAdapter.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java index 0504e74695..8345a0eaec 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java @@ -33,6 +33,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.android.launcher3.R; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.icons.IconCache; +import com.android.launcher3.model.data.PackageItemInfo; import com.android.launcher3.recyclerview.ViewHolderBinder; import com.android.launcher3.util.LabelComparator; import com.android.launcher3.util.PackageUserKey; @@ -47,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -153,6 +155,9 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC public void setWidgets(List tempEntries) { mAllEntries = tempEntries.stream().sorted(mRowComparator) .collect(Collectors.toList()); + if (shouldClearVisibleEntries()) { + mVisibleEntries.clear(); + } updateVisibleEntries(); } @@ -272,6 +277,30 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC mWidgetsListTableViewHolderBinder.setMaxSpansPerRow(maxHorizontalSpans); } + /** + * Returns {@code true} if there is a change in {@link #mAllEntries} that results in an + * invalidation of {@link #mVisibleEntries}. e.g. there is change in the device language. + */ + private boolean shouldClearVisibleEntries() { + Map packagesInfo = + mAllEntries.stream() + .filter(entry -> entry instanceof WidgetsListHeaderEntry) + .map(entry -> entry.mPkgItem) + .collect(Collectors.toMap( + entry -> new PackageUserKey(entry.packageName, entry.user), + entry -> entry)); + for (WidgetsListBaseEntry visibleEntry: mVisibleEntries) { + PackageUserKey key = new PackageUserKey(visibleEntry.mPkgItem.packageName, + visibleEntry.mPkgItem.user); + PackageItemInfo packageItemInfo = packagesInfo.get(key); + if (packageItemInfo != null + && !visibleEntry.mPkgItem.title.equals(packageItemInfo.title)) { + return true; + } + } + return false; + } + /** Comparator for sorting WidgetListRowEntry based on package title. */ public static class WidgetListBaseRowEntryComparator implements Comparator {