diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java index 600768e5d6..fd647c79ab 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationTask.java +++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java @@ -973,6 +973,26 @@ public class GridSizeMigrationTask { return validPackages; } + /** + * Removes any broken item from the hotseat. + * @return a map with occupied hotseat position set to non-null value. + */ + public static LongArrayMap removeBrokenHotseatItems(Context context) throws Exception { + GridSizeMigrationTask task = new GridSizeMigrationTask(context, + LauncherAppState.getInstance().getInvariantDeviceProfile(), + getValidPackages(context), Integer.MAX_VALUE, Integer.MAX_VALUE); + + // Load all the valid entries + ArrayList items = task.loadHotseatEntries(); + // Delete any entry marked for deletion by above load. + task.applyOperations(); + LongArrayMap positions = new LongArrayMap<>(); + for (DbEntry item : items) { + positions.put(item.screenId, item); + } + return positions; + } + /** * Task to run grid migration in multiple steps when the size difference is more than 1. */ diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java index 233c3edf12..5cb34e856e 100644 --- a/src/com/android/launcher3/provider/ImportDataTask.java +++ b/src/com/android/launcher3/provider/ImportDataTask.java @@ -148,7 +148,6 @@ public class ImportDataTask { // Set of package names present in hotseat final HashSet hotseatTargetApps = new HashSet<>(); - final LongArrayMap hotseatItems = new LongArrayMap<>(); int maxId = 0; // Number of imported items on workspace and hotseat @@ -270,7 +269,6 @@ public class ImportDataTask { if (intent.getComponent() != null) { intent.setPackage(intent.getComponent().getPackageName()); } - hotseatItems.put(screen, intent); hotseatTargetApps.add(getPackage(intent)); } @@ -299,7 +297,13 @@ public class ImportDataTask { if (totalItemsOnWorkspace < MIN_ITEM_COUNT_FOR_SUCCESSFUL_MIGRATION) { throw new Exception("Insufficient data"); } + if (!insertOperations.isEmpty()) { + mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, + insertOperations); + insertOperations.clear(); + } + LongArrayMap hotseatItems = GridSizeMigrationTask.removeBrokenHotseatItems(mContext); int myHotseatCount = LauncherAppState.getInstance().getInvariantDeviceProfile().numHotseatIcons; if (!FeatureFlags.NO_ALL_APPS_ICON) { myHotseatCount--; @@ -307,14 +311,15 @@ public class ImportDataTask { if (hotseatItems.size() < myHotseatCount) { // Insufficient hotseat items. Add a few more. HotseatParserCallback parserCallback = new HotseatParserCallback( - hotseatTargetApps, hotseatItems, insertOperations, maxId + 1); + hotseatTargetApps, hotseatItems, insertOperations, maxId + 1, myHotseatCount); new HotseatLayoutParser(mContext, parserCallback).loadLayout(null, new ArrayList()); mHotseatSize = (int) hotseatItems.keyAt(hotseatItems.size() - 1) + 1; - } - if (!insertOperations.isEmpty()) { - mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, - insertOperations); + + if (!insertOperations.isEmpty()) { + mContext.getContentResolver().applyBatch(ProviderConfig.AUTHORITY, + insertOperations); + } } } @@ -404,16 +409,18 @@ public class ImportDataTask { */ private static class HotseatParserCallback implements LayoutParserCallback { private final HashSet mExisitingApps; - private final LongArrayMap mExistingItems; + private final LongArrayMap mExistingItems; private final ArrayList mOutOps; + private final int mRequiredSize; private int mStartItemId; HotseatParserCallback( - HashSet existingApps, LongArrayMap existingItems, - ArrayList outOps, int startItemId) { + HashSet existingApps, LongArrayMap existingItems, + ArrayList outOps, int startItemId, int requiredSize) { mExisitingApps = existingApps; mExistingItems = existingItems; mOutOps = outOps; + mRequiredSize = requiredSize; mStartItemId = startItemId; } @@ -424,6 +431,10 @@ public class ImportDataTask { @Override public long insertAndCheck(SQLiteDatabase db, ContentValues values) { + if (mExistingItems.size() >= mRequiredSize) { + // No need to add more items. + return 0; + } Intent intent; try { intent = Intent.parseUri(values.getAsString(Favorites.INTENT), 0);