Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,7 @@ android_library { "animationlib", "com_android_launcher3_flags_lib", "com_android_wm_shell_flags_lib", "android.appwidget.flags-aconfig-java", ], sdk_version: "current", min_sdk_version: min_launcher3_sdk_version, Loading aconfig/launcher.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,13 @@ flag { bug: "297057373" } flag { name: "enable_generated_previews" namespace: "launcher" description: "Enables support for RemoteViews previews in the widget picker." bug: "306546610" } flag { name: "enable_categorized_widget_suggestions" namespace: "launcher" Loading src/com/android/launcher3/model/WidgetItem.java +46 −1 Original line number Diff line number Diff line package com.android.launcher3.model; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX; import static com.android.launcher3.Utilities.ATLEAST_S; import android.annotation.SuppressLint; Loading @@ -7,13 +11,19 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.util.SparseArray; import android.widget.RemoteViews; import androidx.core.os.BuildCompat; import com.android.launcher3.Flags; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.icons.IconCache; import com.android.launcher3.pm.ShortcutConfigActivityInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.WidgetManagerHelper; /** * An wrapper over various items displayed in a widget picker, Loading @@ -28,9 +38,11 @@ public class WidgetItem extends ComponentKey { public final String label; public final CharSequence description; public final int spanX, spanY; public final SparseArray<RemoteViews> generatedPreviews; public WidgetItem(LauncherAppWidgetProviderInfo info, InvariantDeviceProfile idp, IconCache iconCache, Context context) { InvariantDeviceProfile idp, IconCache iconCache, Context context, WidgetManagerHelper helper) { super(info.provider, info.getProfile()); label = iconCache.getTitleNoCache(info); Loading @@ -40,6 +52,27 @@ public class WidgetItem extends ComponentKey { spanX = Math.min(info.spanX, idp.numColumns); spanY = Math.min(info.spanY, idp.numRows); if (BuildCompat.isAtLeastV() && Flags.enableGeneratedPreviews()) { generatedPreviews = new SparseArray<>(3); for (int widgetCategory : new int[] { WIDGET_CATEGORY_HOME_SCREEN, WIDGET_CATEGORY_KEYGUARD, WIDGET_CATEGORY_SEARCHBOX, }) { if ((widgetCategory & widgetInfo.generatedPreviewCategories) != 0) { generatedPreviews.put(widgetCategory, helper.loadGeneratedPreview(widgetInfo, widgetCategory)); } } } else { generatedPreviews = null; } } public WidgetItem(LauncherAppWidgetProviderInfo info, InvariantDeviceProfile idp, IconCache iconCache, Context context) { this(info, idp, iconCache, context, new WidgetManagerHelper(context)); } public WidgetItem(ShortcutConfigActivityInfo info, IconCache iconCache, PackageManager pm) { Loading @@ -50,6 +83,7 @@ public class WidgetItem extends ComponentKey { widgetInfo = null; activityInfo = info; spanX = spanY = 1; generatedPreviews = null; } /** Loading Loading @@ -78,4 +112,15 @@ public class WidgetItem extends ComponentKey { public boolean isShortcut() { return activityInfo != null; } /** * Returns whether this {@link WidgetItem} has a generated preview for the given widget * category. */ public boolean hasGeneratedPreview(int widgetCategory) { if (!Flags.enableGeneratedPreviews() || generatedPreviews == null) { return false; } return generatedPreviews.contains(widgetCategory); } } src/com/android/launcher3/widget/WidgetCell.java +8 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.launcher3.widget; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_TRAY; import static com.android.launcher3.widget.LauncherAppWidgetProviderInfo.fromProviderInfo; import static com.android.launcher3.widget.util.WidgetSizes.getWidgetItemSizePx; Loading Loading @@ -44,6 +46,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.Flags; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.icons.FastBitmapDrawable; Loading Loading @@ -241,6 +244,11 @@ public class WidgetCell extends LinearLayout { mAppWidgetHostViewPreview = createAppWidgetHostView(context); setAppWidgetHostViewPreview(mAppWidgetHostViewPreview, item.widgetInfo, mRemoteViewsPreview); } else if (Flags.enableGeneratedPreviews() && item.hasGeneratedPreview(WIDGET_CATEGORY_HOME_SCREEN)) { mAppWidgetHostViewPreview = createAppWidgetHostView(context); setAppWidgetHostViewPreview(mAppWidgetHostViewPreview, item.widgetInfo, item.generatedPreviews.get(WIDGET_CATEGORY_HOME_SCREEN)); } else if (item.hasPreviewLayout()) { // If the context is a Launcher activity, DragView will show mAppWidgetHostViewPreview // as a preview during drag & drop. And thus, we should use LauncherAppWidgetHostView, Loading src/com/android/launcher3/widget/WidgetManagerHelper.java +20 −0 Original line number Diff line number Diff line Loading @@ -24,8 +24,11 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.UserHandle; import android.widget.RemoteViews; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.model.data.LauncherAppWidgetInfo; Loading Loading @@ -130,6 +133,23 @@ public class WidgetManagerHelper { appWidgetId).getBoolean(WIDGET_OPTION_RESTORE_COMPLETED); } /** * Load RemoteViews preview for this provider if available. * * @param info The provider info for the widget you want to preview. * @param widgetCategory The widget category for which you want to display previews. * * @return Returns the widget preview that matches selected category, if available. */ @Nullable @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public RemoteViews loadGeneratedPreview(@NonNull AppWidgetProviderInfo info, int widgetCategory) { if (!android.appwidget.flags.Flags.generatedPreviews()) return null; return mAppWidgetManager.getWidgetPreview(info.provider, info.getProfile(), widgetCategory); } private static Stream<AppWidgetProviderInfo> allWidgetsSteam(Context context) { AppWidgetManager awm = context.getSystemService(AppWidgetManager.class); return Stream.concat( Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,7 @@ android_library { "animationlib", "com_android_launcher3_flags_lib", "com_android_wm_shell_flags_lib", "android.appwidget.flags-aconfig-java", ], sdk_version: "current", min_sdk_version: min_launcher3_sdk_version, Loading
aconfig/launcher.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,13 @@ flag { bug: "297057373" } flag { name: "enable_generated_previews" namespace: "launcher" description: "Enables support for RemoteViews previews in the widget picker." bug: "306546610" } flag { name: "enable_categorized_widget_suggestions" namespace: "launcher" Loading
src/com/android/launcher3/model/WidgetItem.java +46 −1 Original line number Diff line number Diff line package com.android.launcher3.model; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX; import static com.android.launcher3.Utilities.ATLEAST_S; import android.annotation.SuppressLint; Loading @@ -7,13 +11,19 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.util.SparseArray; import android.widget.RemoteViews; import androidx.core.os.BuildCompat; import com.android.launcher3.Flags; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.icons.IconCache; import com.android.launcher3.pm.ShortcutConfigActivityInfo; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.WidgetManagerHelper; /** * An wrapper over various items displayed in a widget picker, Loading @@ -28,9 +38,11 @@ public class WidgetItem extends ComponentKey { public final String label; public final CharSequence description; public final int spanX, spanY; public final SparseArray<RemoteViews> generatedPreviews; public WidgetItem(LauncherAppWidgetProviderInfo info, InvariantDeviceProfile idp, IconCache iconCache, Context context) { InvariantDeviceProfile idp, IconCache iconCache, Context context, WidgetManagerHelper helper) { super(info.provider, info.getProfile()); label = iconCache.getTitleNoCache(info); Loading @@ -40,6 +52,27 @@ public class WidgetItem extends ComponentKey { spanX = Math.min(info.spanX, idp.numColumns); spanY = Math.min(info.spanY, idp.numRows); if (BuildCompat.isAtLeastV() && Flags.enableGeneratedPreviews()) { generatedPreviews = new SparseArray<>(3); for (int widgetCategory : new int[] { WIDGET_CATEGORY_HOME_SCREEN, WIDGET_CATEGORY_KEYGUARD, WIDGET_CATEGORY_SEARCHBOX, }) { if ((widgetCategory & widgetInfo.generatedPreviewCategories) != 0) { generatedPreviews.put(widgetCategory, helper.loadGeneratedPreview(widgetInfo, widgetCategory)); } } } else { generatedPreviews = null; } } public WidgetItem(LauncherAppWidgetProviderInfo info, InvariantDeviceProfile idp, IconCache iconCache, Context context) { this(info, idp, iconCache, context, new WidgetManagerHelper(context)); } public WidgetItem(ShortcutConfigActivityInfo info, IconCache iconCache, PackageManager pm) { Loading @@ -50,6 +83,7 @@ public class WidgetItem extends ComponentKey { widgetInfo = null; activityInfo = info; spanX = spanY = 1; generatedPreviews = null; } /** Loading Loading @@ -78,4 +112,15 @@ public class WidgetItem extends ComponentKey { public boolean isShortcut() { return activityInfo != null; } /** * Returns whether this {@link WidgetItem} has a generated preview for the given widget * category. */ public boolean hasGeneratedPreview(int widgetCategory) { if (!Flags.enableGeneratedPreviews() || generatedPreviews == null) { return false; } return generatedPreviews.contains(widgetCategory); } }
src/com/android/launcher3/widget/WidgetCell.java +8 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.launcher3.widget; import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_TRAY; import static com.android.launcher3.widget.LauncherAppWidgetProviderInfo.fromProviderInfo; import static com.android.launcher3.widget.util.WidgetSizes.getWidgetItemSizePx; Loading Loading @@ -44,6 +46,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.Flags; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.icons.FastBitmapDrawable; Loading Loading @@ -241,6 +244,11 @@ public class WidgetCell extends LinearLayout { mAppWidgetHostViewPreview = createAppWidgetHostView(context); setAppWidgetHostViewPreview(mAppWidgetHostViewPreview, item.widgetInfo, mRemoteViewsPreview); } else if (Flags.enableGeneratedPreviews() && item.hasGeneratedPreview(WIDGET_CATEGORY_HOME_SCREEN)) { mAppWidgetHostViewPreview = createAppWidgetHostView(context); setAppWidgetHostViewPreview(mAppWidgetHostViewPreview, item.widgetInfo, item.generatedPreviews.get(WIDGET_CATEGORY_HOME_SCREEN)); } else if (item.hasPreviewLayout()) { // If the context is a Launcher activity, DragView will show mAppWidgetHostViewPreview // as a preview during drag & drop. And thus, we should use LauncherAppWidgetHostView, Loading
src/com/android/launcher3/widget/WidgetManagerHelper.java +20 −0 Original line number Diff line number Diff line Loading @@ -24,8 +24,11 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.UserHandle; import android.widget.RemoteViews; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.model.data.LauncherAppWidgetInfo; Loading Loading @@ -130,6 +133,23 @@ public class WidgetManagerHelper { appWidgetId).getBoolean(WIDGET_OPTION_RESTORE_COMPLETED); } /** * Load RemoteViews preview for this provider if available. * * @param info The provider info for the widget you want to preview. * @param widgetCategory The widget category for which you want to display previews. * * @return Returns the widget preview that matches selected category, if available. */ @Nullable @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) public RemoteViews loadGeneratedPreview(@NonNull AppWidgetProviderInfo info, int widgetCategory) { if (!android.appwidget.flags.Flags.generatedPreviews()) return null; return mAppWidgetManager.getWidgetPreview(info.provider, info.getProfile(), widgetCategory); } private static Stream<AppWidgetProviderInfo> allWidgetsSteam(Context context) { AppWidgetManager awm = context.getSystemService(AppWidgetManager.class); return Stream.concat( Loading