Add a widget conversations category for grouping widgets in the picker
Bug: 184878454 Test: Open the full widget picker and observe the conversation widget from SystemUi is listed under conversations. Change-Id: I53cd74d80ce3c4ff77a92cd660ca9283416e9fd3
This commit is contained in:
parent
d69407c02e
commit
833a0b9fa9
|
@ -91,6 +91,9 @@
|
|||
[CHAR_LIMIT=none] -->
|
||||
<string name="no_search_results">No search results</string>
|
||||
|
||||
<!-- A widget category label for grouping widgets related to conversations. [CHAR_LIMIT=30] -->
|
||||
<string name="widget_category_conversations">Conversations</string>
|
||||
|
||||
<!-- All Apps -->
|
||||
<!-- Search bar text in the apps view. [CHAR_LIMIT=50] -->
|
||||
<string name="all_apps_search_bar_hint">Search apps</string>
|
||||
|
|
|
@ -39,6 +39,7 @@ import androidx.annotation.NonNull;
|
|||
|
||||
import com.android.launcher3.InvariantDeviceProfile;
|
||||
import com.android.launcher3.LauncherFiles;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.icons.ComponentWithLabel.ComponentCachingLogic;
|
||||
|
@ -304,6 +305,11 @@ public class IconCache extends BaseIconCache {
|
|||
CacheEntry entry = getEntryForPackageLocked(
|
||||
infoInOut.packageName, infoInOut.user, useLowResIcon);
|
||||
applyCacheEntry(entry, infoInOut);
|
||||
if (infoInOut.category == PackageItemInfo.CONVERSATIONS) {
|
||||
infoInOut.title = mContext.getString(R.string.widget_category_conversations);
|
||||
infoInOut.contentDescription = mPackageManager.getUserBadgedLabel(
|
||||
infoInOut.title, infoInOut.user);
|
||||
}
|
||||
}
|
||||
|
||||
protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) {
|
||||
|
|
|
@ -16,27 +16,47 @@
|
|||
|
||||
package com.android.launcher3.model.data;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import com.android.launcher3.LauncherSettings;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Represents a {@link Package} in the widget tray section.
|
||||
*/
|
||||
public class PackageItemInfo extends ItemInfoWithIcon {
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({NO_CATEGORY, CONVERSATIONS})
|
||||
public @interface Category{}
|
||||
/** The package is not categorized in the widget tray. */
|
||||
public static final int NO_CATEGORY = 0;
|
||||
/** The package is categorized to conversations widget in the widget tray. */
|
||||
public static final int CONVERSATIONS = 1;
|
||||
|
||||
/**
|
||||
* Package name of the {@link PackageItemInfo}.
|
||||
*/
|
||||
public String packageName;
|
||||
public final String packageName;
|
||||
|
||||
/** Represents a widget category shown in the widget tray section. */
|
||||
@Category public final int category;
|
||||
|
||||
public PackageItemInfo(String packageName) {
|
||||
this(packageName, NO_CATEGORY);
|
||||
}
|
||||
|
||||
public PackageItemInfo(String packageName, @Category int category) {
|
||||
this.packageName = packageName;
|
||||
this.category = category;
|
||||
this.itemType = LauncherSettings.Favorites.ITEM_TYPE_NON_ACTIONABLE;
|
||||
}
|
||||
|
||||
public PackageItemInfo(PackageItemInfo copy) {
|
||||
this.packageName = copy.packageName;
|
||||
this.category = copy.category;
|
||||
this.itemType = LauncherSettings.Favorites.ITEM_TYPE_NON_ACTIONABLE;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ import com.android.launcher3.widget.model.WidgetsListHeaderEntry;
|
|||
import com.android.launcher3.widget.picker.WidgetsDiffReporter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -58,6 +59,9 @@ public class WidgetsModel {
|
|||
private static final String TAG = "WidgetsModel";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private static final ComponentName CONVERSATION_WIDGET = ComponentName.createRelative(
|
||||
"com.android.systemui", ".people.widget.PeopleSpaceWidgetProvider");
|
||||
|
||||
/* Map of widgets and shortcuts that are tracked per package. */
|
||||
private final Map<PackageItemInfo, List<WidgetItem>> mWidgetsList = new HashMap<>();
|
||||
|
||||
|
@ -156,7 +160,7 @@ public class WidgetsModel {
|
|||
|
||||
// Temporary list for {@link PackageItemInfos} to avoid having to go through
|
||||
// {@link mPackageItemInfos} to locate the key to be used for {@link #mWidgetsList}
|
||||
HashMap<PackageUserKey, PackageItemInfo> tmpPackageItemInfos = new HashMap<>();
|
||||
HashMap<WidgetPackageOrCategoryKey, PackageItemInfo> tmpPackageItemInfos = new HashMap<>();
|
||||
|
||||
// Clear the lists only if this is an update on all widgets and shortcuts. If packageUser
|
||||
// isn't null, only updates the shortcuts and widgets for the app represented in
|
||||
|
@ -168,11 +172,11 @@ public class WidgetsModel {
|
|||
mWidgetsList.putAll(rawWidgetsShortcuts.stream()
|
||||
.filter(new WidgetValidityCheck(app))
|
||||
.collect(Collectors.groupingBy(item -> {
|
||||
PackageUserKey packageUserKey = new PackageUserKey(
|
||||
item.componentName.getPackageName(), item.user);
|
||||
WidgetPackageOrCategoryKey packageUserKey = getWidgetPackageOrCategoryKey(item);
|
||||
PackageItemInfo pInfo = tmpPackageItemInfos.get(packageUserKey);
|
||||
if (pInfo == null) {
|
||||
pInfo = new PackageItemInfo(packageUserKey.mPackageName);
|
||||
pInfo = new PackageItemInfo(item.componentName.getPackageName(),
|
||||
packageUserKey.mCategory);
|
||||
pInfo.user = item.user;
|
||||
tmpPackageItemInfos.put(packageUserKey, pInfo);
|
||||
}
|
||||
|
@ -224,6 +228,13 @@ public class WidgetsModel {
|
|||
return null;
|
||||
}
|
||||
|
||||
private WidgetPackageOrCategoryKey getWidgetPackageOrCategoryKey(WidgetItem item) {
|
||||
if (CONVERSATION_WIDGET.equals(item.componentName)) {
|
||||
return new WidgetPackageOrCategoryKey(PackageItemInfo.CONVERSATIONS, item.user);
|
||||
}
|
||||
return new WidgetPackageOrCategoryKey(item.componentName.getPackageName(), item.user);
|
||||
}
|
||||
|
||||
private static class WidgetValidityCheck implements Predicate<WidgetItem> {
|
||||
|
||||
private final InvariantDeviceProfile mIdp;
|
||||
|
@ -265,4 +276,40 @@ public class WidgetsModel {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/** A hash key for grouping widgets by package name or category. */
|
||||
private static class WidgetPackageOrCategoryKey {
|
||||
/**
|
||||
* The package name of the widget provider.
|
||||
*
|
||||
* <p>This shouldn't be empty if {@link #mCategory} has a value,
|
||||
* {@link PackageItemInfo#NO_CATEGORY}.
|
||||
*/
|
||||
public final String mPackage;
|
||||
/** A widget category. */
|
||||
@PackageItemInfo.Category public final int mCategory;
|
||||
public final UserHandle mUser;
|
||||
private final int mHashCode;
|
||||
|
||||
WidgetPackageOrCategoryKey(String packageName, UserHandle user) {
|
||||
this(packageName, PackageItemInfo.NO_CATEGORY, user);
|
||||
}
|
||||
|
||||
WidgetPackageOrCategoryKey(@PackageItemInfo.Category int category, UserHandle user) {
|
||||
this("", category, user);
|
||||
}
|
||||
|
||||
private WidgetPackageOrCategoryKey(String packageName,
|
||||
@PackageItemInfo.Category int category, UserHandle user) {
|
||||
mPackage = packageName;
|
||||
mCategory = category;
|
||||
mUser = user;
|
||||
mHashCode = Arrays.hashCode(new Object[]{mPackage, mCategory, mUser});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return mHashCode;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue