Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd225466 authored by Tracy Zhou's avatar Tracy Zhou
Browse files

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
parent 2fe6fb96
Loading
Loading
Loading
Loading
+22 −2
Original line number Original line Diff line number Diff line
@@ -87,9 +87,11 @@ import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.pm.InstallSessionHelper;
import com.android.launcher3.pm.InstallSessionHelper;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.BaseDragLayer;
import com.android.launcher3.views.BaseDragLayer;
import com.android.launcher3.widget.custom.CustomWidgetManager;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
@@ -128,7 +130,8 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {


        private static final Set<MainThreadInitializedObject> WHITELIST = new HashSet<>(
        private static final Set<MainThreadInitializedObject> WHITELIST = new HashSet<>(
                Arrays.asList(UserCache.INSTANCE, InstallSessionHelper.INSTANCE,
                Arrays.asList(UserCache.INSTANCE, InstallSessionHelper.INSTANCE,
                        LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE));
                        LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE,
                        CustomWidgetManager.INSTANCE, PluginManagerWrapper.INSTANCE));


        private final InvariantDeviceProfile mIdp;
        private final InvariantDeviceProfile mIdp;
        private final Map<MainThreadInitializedObject, Object> mObjectMap = new HashMap<>();
        private final Map<MainThreadInitializedObject, Object> mObjectMap = new HashMap<>();
@@ -145,6 +148,14 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {
            return this;
            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
         * Find a cached object from mObjectMap if we have already created one. If not, generate
         * an object using the provider.
         * an object using the provider.
@@ -349,6 +360,9 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {
        private void inflateAndAddWidgets(LauncherAppWidgetInfo info, WidgetsModel widgetsModel) {
        private void inflateAndAddWidgets(LauncherAppWidgetInfo info, WidgetsModel widgetsModel) {
            WidgetItem widgetItem = widgetsModel.getWidgetProviderInfoByProviderName(
            WidgetItem widgetItem = widgetsModel.getWidgetProviderInfoByProviderName(
                    info.providerName);
                    info.providerName);
            if (widgetItem == null) {
                return;
            }
            AppWidgetHostView view = new AppWidgetHostView(mContext);
            AppWidgetHostView view = new AppWidgetHostView(mContext);
            view.setAppWidget(-1, widgetItem.widgetInfo);
            view.setAppWidget(-1, widgetItem.widgetInfo);
            view.updateAppWidget(null);
            view.updateAppWidget(null);
@@ -385,9 +399,11 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {
                }
                }


                WorkspaceFetcher fetcher;
                WorkspaceFetcher fetcher;
                PreviewContext previewContext = null;
                if (needsToMigrate && success) {
                if (needsToMigrate && success) {
                    previewContext = new PreviewContext(mContext, mIdp);
                    LauncherAppState appForPreview = new LauncherAppState(
                    LauncherAppState appForPreview = new LauncherAppState(
                            new PreviewContext(mContext, mIdp), null /* iconCacheFileName */);
                            previewContext, null /* iconCacheFileName */);
                    fetcher = new WorkspaceItemsInfoFromPreviewFetcher(appForPreview);
                    fetcher = new WorkspaceItemsInfoFromPreviewFetcher(appForPreview);
                    MODEL_EXECUTOR.execute(fetcher);
                    MODEL_EXECUTOR.execute(fetcher);
                } else {
                } else {
@@ -396,6 +412,9 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {
                            (LauncherModel.ModelUpdateTask) fetcher);
                            (LauncherModel.ModelUpdateTask) fetcher);
                }
                }
                WorkspaceResult workspaceResult = fetcher.get();
                WorkspaceResult workspaceResult = fetcher.get();
                if (previewContext != null) {
                    previewContext.onDestroy();
                }


                if (workspaceResult == null) {
                if (workspaceResult == null) {
                    return;
                    return;
@@ -557,6 +576,7 @@ public class LauncherPreviewRenderer implements Callable<Bitmap> {
        public WorkspaceResult call() throws Exception {
        public WorkspaceResult call() throws Exception {
            List<ShortcutInfo> allShortcuts = new ArrayList<>();
            List<ShortcutInfo> allShortcuts = new ArrayList<>();
            loadWorkspace(allShortcuts, LauncherSettings.Favorites.PREVIEW_CONTENT_URI);
            loadWorkspace(allShortcuts, LauncherSettings.Favorites.PREVIEW_CONTENT_URI);
            mBgDataModel.widgetsModel.update(mApp, null);
            return new WorkspaceResult(mBgDataModel.workspaceItems, mBgDataModel.appWidgets,
            return new WorkspaceResult(mBgDataModel.workspaceItems, mBgDataModel.appWidgets,
                    mBgDataModel.widgetsModel);
                    mBgDataModel.widgetsModel);
        }
        }
+1 −1
Original line number Original line Diff line number Diff line
@@ -104,7 +104,7 @@ import java.util.concurrent.CancellationException;
public class LoaderTask implements Runnable {
public class LoaderTask implements Runnable {
    private static final String TAG = "LoaderTask";
    private static final String TAG = "LoaderTask";


    private final LauncherAppState mApp;
    protected final LauncherAppState mApp;
    private final AllAppsList mBgAllAppsList;
    private final AllAppsList mBgAllAppsList;
    protected final BgDataModel mBgDataModel;
    protected final BgDataModel mBgDataModel;


+6 −0
Original line number Original line Diff line number Diff line
@@ -51,6 +51,7 @@ public class CustomWidgetManager implements PluginListener<CustomWidgetPlugin> {
    public static final MainThreadInitializedObject<CustomWidgetManager> INSTANCE =
    public static final MainThreadInitializedObject<CustomWidgetManager> INSTANCE =
            new MainThreadInitializedObject<>(CustomWidgetManager::new);
            new MainThreadInitializedObject<>(CustomWidgetManager::new);


    private final Context mContext;
    /**
    /**
     * auto provider Id is an ever-increasing number that serves as the providerId whenever a new
     * auto provider Id is an ever-increasing number that serves as the providerId whenever a new
     * custom widget has been connected.
     * custom widget has been connected.
@@ -62,6 +63,7 @@ public class CustomWidgetManager implements PluginListener<CustomWidgetPlugin> {
    private Consumer<PackageUserKey> mWidgetRefreshCallback;
    private Consumer<PackageUserKey> mWidgetRefreshCallback;


    private CustomWidgetManager(Context context) {
    private CustomWidgetManager(Context context) {
        mContext = context;
        mPlugins = new SparseArray<>();
        mPlugins = new SparseArray<>();
        mCustomWidgets = new ArrayList<>();
        mCustomWidgets = new ArrayList<>();
        mWidgetsIdMap = new SparseArray<>();
        mWidgetsIdMap = new SparseArray<>();
@@ -69,6 +71,10 @@ public class CustomWidgetManager implements PluginListener<CustomWidgetPlugin> {
                .addPluginListener(this, CustomWidgetPlugin.class, true);
                .addPluginListener(this, CustomWidgetPlugin.class, true);
    }
    }


    public void onDestroy() {
        PluginManagerWrapper.INSTANCE.get(mContext).removePluginListener(this);
    }

    @Override
    @Override
    public void onPluginConnected(CustomWidgetPlugin plugin, Context context) {
    public void onPluginConnected(CustomWidgetPlugin plugin, Context context) {
        mPlugins.put(mAutoProviderId, plugin);
        mPlugins.put(mAutoProviderId, plugin);
+4 −0
Original line number Original line Diff line number Diff line
@@ -249,6 +249,10 @@ public class WidgetsModel {
            ComponentName providerName) {
            ComponentName providerName) {
        ArrayList<WidgetItem> widgetsList = mWidgetsList.get(
        ArrayList<WidgetItem> widgetsList = mWidgetsList.get(
                new PackageItemInfo(providerName.getPackageName()));
                new PackageItemInfo(providerName.getPackageName()));
        if (widgetsList == null) {
            return null;
        }

        for (WidgetItem item : widgetsList) {
        for (WidgetItem item : widgetsList) {
            if (item.componentName.equals(providerName)) {
            if (item.componentName.equals(providerName)) {
                return item;
                return item;