From cfcefb0c47552c149d4c614d04ea3a560c5f7d23 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 10 Dec 2020 16:22:41 -0800 Subject: [PATCH] Synchronizing model data access Test: Presubmit Bug: 173328873 Change-Id: Ifc1724e17ebfa2ee5f21bb3f272986b8a14fdbc1 --- .../hybridhotseat/HotseatPredictionModel.java | 3 +-- .../graphics/LauncherPreviewRenderer.java | 12 +++++++----- .../android/launcher3/model/BgDataModel.java | 10 ++++++++++ src/com/android/launcher3/model/LoaderTask.java | 17 +++++++---------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionModel.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionModel.java index 8f31c22d15..080633a653 100644 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionModel.java +++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatPredictionModel.java @@ -52,8 +52,7 @@ public class HotseatPredictionModel { public static Bundle convertDataModelToAppTargetBundle(Context context, BgDataModel dataModel) { Bundle bundle = new Bundle(); ArrayList events = new ArrayList<>(); - ArrayList workspaceItems = new ArrayList<>(dataModel.workspaceItems); - workspaceItems.addAll(dataModel.appWidgets); + ArrayList workspaceItems = dataModel.getAllWorkspaceItems(); for (ItemInfo item : workspaceItems) { AppTarget target = getAppTargetFromInfo(context, item); if (target != null && !isTrackedForPrediction(item)) continue; diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index effb3a4a0c..efc1201bba 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -629,11 +629,13 @@ public class LauncherPreviewRenderer extends ContextThemeWrapper private WorkspaceResult(BgDataModel dataModel, WidgetsModel widgetsModel, Map widgetProviderInfoMap) { - mWorkspaceItems = dataModel.workspaceItems; - mAppWidgets = dataModel.appWidgets; - mHotseatPredictions = dataModel.extraItems.get(CONTAINER_HOTSEAT_PREDICTION); - mWidgetsModel = widgetsModel; - mWidgetProvidersMap = widgetProviderInfoMap; + synchronized (dataModel) { + mWorkspaceItems = dataModel.workspaceItems; + mAppWidgets = dataModel.appWidgets; + mHotseatPredictions = dataModel.extraItems.get(CONTAINER_HOTSEAT_PREDICTION); + mWidgetsModel = widgetsModel; + mWidgetProvidersMap = widgetProviderInfoMap; + } } } } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 49b40edb76..c217a475a1 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -375,6 +375,16 @@ public class BgDataModel { } } + /** + * Returns a list containing all workspace items including widgets. + */ + public synchronized ArrayList getAllWorkspaceItems() { + ArrayList items = new ArrayList<>(workspaceItems.size() + appWidgets.size()); + items.addAll(workspaceItems); + items.addAll(appWidgets); + return items; + } + /** * Calls the provided {@code op} for all workspaceItems in the in-memory model (both persisted * items and dynamic/predicted items for the provided {@code userHandle}. diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index b108788061..8e085ce52d 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -166,12 +166,7 @@ public class LoaderTask implements Runnable { private void sendFirstScreenActiveInstallsBroadcast() { ArrayList firstScreenItems = new ArrayList<>(); - - ArrayList allItems = new ArrayList<>(); - synchronized (mBgDataModel) { - allItems.addAll(mBgDataModel.workspaceItems); - allItems.addAll(mBgDataModel.appWidgets); - } + ArrayList allItems = mBgDataModel.getAllWorkspaceItems(); // Screen set is never empty final int firstScreen = mBgDataModel.collectWorkspaceScreens().get(0); @@ -858,10 +853,12 @@ public class LoaderTask implements Runnable { .call(contentResolver, LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS) .getIntArray(LauncherSettings.Settings.EXTRA_VALUE); - for (int folderId : deletedFolderIds) { - mBgDataModel.workspaceItems.remove(mBgDataModel.folders.get(folderId)); - mBgDataModel.folders.remove(folderId); - mBgDataModel.itemsIdMap.remove(folderId); + synchronized (mBgDataModel) { + for (int folderId : deletedFolderIds) { + mBgDataModel.workspaceItems.remove(mBgDataModel.folders.get(folderId)); + mBgDataModel.folders.remove(folderId); + mBgDataModel.itemsIdMap.remove(folderId); + } } // Remove any ghost widgets