From bd2254668341fff85ab871a43f469c5eab36060a Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 24 Feb 2020 13:50:29 -0800 Subject: [PATCH] Render user's actual workspace in ThemePicker preview (Part 6) Didn't test out widgets in Part 5. So in this change, - Added some widget classes to the PreviewContext WHITELIST - Manually update widget model after loading workspace since we do not attach widget listeners to the LauncherAppModel for preview. Change-Id: I0a555b2319b2e91432dbd58289ddb66aca1384df --- .../graphics/LauncherPreviewRenderer.java | 24 +++++++++++++++++-- .../android/launcher3/model/LoaderTask.java | 2 +- .../widget/custom/CustomWidgetManager.java | 6 +++++ .../android/launcher3/model/WidgetsModel.java | 4 ++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index 0927b26505..02e98e80df 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -87,9 +87,11 @@ import com.android.launcher3.model.WidgetItem; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.pm.InstallSessionHelper; import com.android.launcher3.pm.UserCache; +import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.BaseDragLayer; +import com.android.launcher3.widget.custom.CustomWidgetManager; import java.util.ArrayList; import java.util.Arrays; @@ -128,7 +130,8 @@ public class LauncherPreviewRenderer implements Callable { private static final Set WHITELIST = new HashSet<>( Arrays.asList(UserCache.INSTANCE, InstallSessionHelper.INSTANCE, - LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE)); + LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE, + CustomWidgetManager.INSTANCE, PluginManagerWrapper.INSTANCE)); private final InvariantDeviceProfile mIdp; private final Map mObjectMap = new HashMap<>(); @@ -145,6 +148,14 @@ public class LauncherPreviewRenderer implements Callable { return this; } + public void onDestroy() { + CustomWidgetManager customWidgetManager = (CustomWidgetManager) mObjectMap.get( + CustomWidgetManager.INSTANCE); + if (customWidgetManager != null) { + customWidgetManager.onDestroy(); + } + } + /** * Find a cached object from mObjectMap if we have already created one. If not, generate * an object using the provider. @@ -349,6 +360,9 @@ public class LauncherPreviewRenderer implements Callable { private void inflateAndAddWidgets(LauncherAppWidgetInfo info, WidgetsModel widgetsModel) { WidgetItem widgetItem = widgetsModel.getWidgetProviderInfoByProviderName( info.providerName); + if (widgetItem == null) { + return; + } AppWidgetHostView view = new AppWidgetHostView(mContext); view.setAppWidget(-1, widgetItem.widgetInfo); view.updateAppWidget(null); @@ -385,9 +399,11 @@ public class LauncherPreviewRenderer implements Callable { } WorkspaceFetcher fetcher; + PreviewContext previewContext = null; if (needsToMigrate && success) { + previewContext = new PreviewContext(mContext, mIdp); LauncherAppState appForPreview = new LauncherAppState( - new PreviewContext(mContext, mIdp), null /* iconCacheFileName */); + previewContext, null /* iconCacheFileName */); fetcher = new WorkspaceItemsInfoFromPreviewFetcher(appForPreview); MODEL_EXECUTOR.execute(fetcher); } else { @@ -396,6 +412,9 @@ public class LauncherPreviewRenderer implements Callable { (LauncherModel.ModelUpdateTask) fetcher); } WorkspaceResult workspaceResult = fetcher.get(); + if (previewContext != null) { + previewContext.onDestroy(); + } if (workspaceResult == null) { return; @@ -557,6 +576,7 @@ public class LauncherPreviewRenderer implements Callable { public WorkspaceResult call() throws Exception { List allShortcuts = new ArrayList<>(); loadWorkspace(allShortcuts, LauncherSettings.Favorites.PREVIEW_CONTENT_URI); + mBgDataModel.widgetsModel.update(mApp, null); return new WorkspaceResult(mBgDataModel.workspaceItems, mBgDataModel.appWidgets, mBgDataModel.widgetsModel); } diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index fbf01fc777..62904ae4a4 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -104,7 +104,7 @@ import java.util.concurrent.CancellationException; public class LoaderTask implements Runnable { private static final String TAG = "LoaderTask"; - private final LauncherAppState mApp; + protected final LauncherAppState mApp; private final AllAppsList mBgAllAppsList; protected final BgDataModel mBgDataModel; diff --git a/src/com/android/launcher3/widget/custom/CustomWidgetManager.java b/src/com/android/launcher3/widget/custom/CustomWidgetManager.java index 2aed9369e3..0ea7d854ee 100644 --- a/src/com/android/launcher3/widget/custom/CustomWidgetManager.java +++ b/src/com/android/launcher3/widget/custom/CustomWidgetManager.java @@ -51,6 +51,7 @@ public class CustomWidgetManager implements PluginListener { public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(CustomWidgetManager::new); + private final Context mContext; /** * auto provider Id is an ever-increasing number that serves as the providerId whenever a new * custom widget has been connected. @@ -62,6 +63,7 @@ public class CustomWidgetManager implements PluginListener { private Consumer mWidgetRefreshCallback; private CustomWidgetManager(Context context) { + mContext = context; mPlugins = new SparseArray<>(); mCustomWidgets = new ArrayList<>(); mWidgetsIdMap = new SparseArray<>(); @@ -69,6 +71,10 @@ public class CustomWidgetManager implements PluginListener { .addPluginListener(this, CustomWidgetPlugin.class, true); } + public void onDestroy() { + PluginManagerWrapper.INSTANCE.get(mContext).removePluginListener(this); + } + @Override public void onPluginConnected(CustomWidgetPlugin plugin, Context context) { mPlugins.put(mAutoProviderId, plugin); diff --git a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java index ae32692809..0b99e7a898 100644 --- a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java +++ b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java @@ -249,6 +249,10 @@ public class WidgetsModel { ComponentName providerName) { ArrayList widgetsList = mWidgetsList.get( new PackageItemInfo(providerName.getPackageName())); + if (widgetsList == null) { + return null; + } + for (WidgetItem item : widgetsList) { if (item.componentName.equals(providerName)) { return item;