From b023873bc3f68c53e93512895c597ed1339bee64 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 13 Jul 2020 23:13:00 -0700 Subject: [PATCH] Improve grid preview performance After breaking down the time we spend in rendering preview under a different grid setting, I found out that we spend a huge amount of time loading the workspace. It takes a long time in non preview case (launcher workspace init), so to optimize we should try to cut down things that are not necessary for preview. Widget model loading (widget and shortcut updates) takes half of the time, and can be optimized with minimal risks / code changes. Bug: 160662425 Test: Manual Change-Id: I89029d0ddf6e2517077a0ba3fbbcfdcd60b268d9 --- .../graphics/LauncherPreviewRenderer.java | 43 ++++++++++++++++--- .../android/launcher3/model/LoaderTask.java | 11 ++--- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index 885fb6698b..458ffa368d 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -28,6 +28,7 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.annotation.TargetApi; import android.app.Fragment; import android.appwidget.AppWidgetHostView; +import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; @@ -56,6 +57,7 @@ import com.android.launcher3.Hotseat; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; @@ -83,6 +85,7 @@ import com.android.launcher3.pm.InstallSessionHelper; import com.android.launcher3.pm.UserCache; import com.android.launcher3.uioverrides.PredictedAppIconInflater; import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; +import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.views.ActivityContext; @@ -339,14 +342,33 @@ public class LauncherPreviewRenderer { addInScreenFromBind(folderIcon, info); } + private void inflateAndAddWidgets(LauncherAppWidgetInfo info, + Map widgetProviderInfoMap) { + if (widgetProviderInfoMap == null) { + return; + } + AppWidgetProviderInfo providerInfo = widgetProviderInfoMap.get( + new ComponentKey(info.providerName, info.user)); + if (providerInfo == null) { + return; + } + inflateAndAddWidgets(info, LauncherAppWidgetProviderInfo.fromProviderInfo( + getApplicationContext(), providerInfo)); + } + private void inflateAndAddWidgets(LauncherAppWidgetInfo info, WidgetsModel widgetsModel) { WidgetItem widgetItem = widgetsModel.getWidgetProviderInfoByProviderName( info.providerName); if (widgetItem == null) { return; } + inflateAndAddWidgets(info, widgetItem.widgetInfo); + } + + private void inflateAndAddWidgets(LauncherAppWidgetInfo info, + LauncherAppWidgetProviderInfo providerInfo) { AppWidgetHostView view = new AppWidgetHostView(mContext); - view.setAppWidget(-1, widgetItem.widgetInfo); + view.setAppWidget(-1, providerInfo); view.updateAppWidget(null); view.setTag(info); addInScreenFromBind(view, info); @@ -433,8 +455,13 @@ public class LauncherPreviewRenderer { switch (itemInfo.itemType) { case Favorites.ITEM_TYPE_APPWIDGET: case Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: - inflateAndAddWidgets((LauncherAppWidgetInfo) itemInfo, - workspaceResult.mWidgetsModel); + if (mMigrated) { + inflateAndAddWidgets((LauncherAppWidgetInfo) itemInfo, + workspaceResult.mWidgetProvidersMap); + } else { + inflateAndAddWidgets((LauncherAppWidgetInfo) itemInfo, + workspaceResult.mWidgetsModel); + } break; default: break; @@ -542,7 +569,7 @@ public class LauncherPreviewRenderer { } return new WorkspaceResult(mBgDataModel.workspaceItems, mBgDataModel.appWidgets, - mBgDataModel.cachedPredictedItems, mBgDataModel.widgetsModel); + mBgDataModel.cachedPredictedItems, mBgDataModel.widgetsModel, null); } } @@ -569,9 +596,8 @@ public class LauncherPreviewRenderer { 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.cachedPredictedItems, mBgDataModel.widgetsModel); + mBgDataModel.cachedPredictedItems, null, mWidgetProvidersMap); } } @@ -593,14 +619,17 @@ public class LauncherPreviewRenderer { private final ArrayList mAppWidgets; private final ArrayList mCachedPredictedItems; private final WidgetsModel mWidgetsModel; + private final Map mWidgetProvidersMap; private WorkspaceResult(ArrayList workspaceItems, ArrayList appWidgets, - ArrayList cachedPredictedItems, WidgetsModel widgetsModel) { + ArrayList cachedPredictedItems, WidgetsModel widgetsModel, + Map widgetProviderInfoMap) { mWorkspaceItems = workspaceItems; mAppWidgets = appWidgets; mCachedPredictedItems = cachedPredictedItems; mWidgetsModel = widgetsModel; + mWidgetProvidersMap = widgetProviderInfoMap; } } } diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 102ec31e1c..4a64522c65 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -126,6 +126,8 @@ public class LoaderTask implements Runnable { private final UserManagerState mUserManagerState = new UserManagerState(); + protected Map mWidgetProvidersMap; + private boolean mStopped; public LoaderTask(LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel dataModel, @@ -342,8 +344,6 @@ public class LoaderTask implements Runnable { contentResolver.query(contentUri, null, null, null, null), contentUri, mApp, mUserManagerState); - Map widgetProvidersMap = null; - try { final int appWidgetIdIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.APPWIDGET_ID); @@ -650,10 +650,11 @@ public class LoaderTask implements Runnable { final boolean wasProviderReady = !c.hasRestoreFlag( LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY); - if (widgetProvidersMap == null) { - widgetProvidersMap = WidgetManagerHelper.getAllProvidersMap(context); + if (mWidgetProvidersMap == null) { + mWidgetProvidersMap = WidgetManagerHelper.getAllProvidersMap( + context); } - final AppWidgetProviderInfo provider = widgetProvidersMap.get( + final AppWidgetProviderInfo provider = mWidgetProvidersMap.get( new ComponentKey(component, c.user)); final boolean isProviderReady = isValidProvider(provider); -- GitLab