From d70ef242332e766b2c23e3b8bb537dc2d584e9ec Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 24 Aug 2016 11:30:33 -0700 Subject: [PATCH] Fixing the hotseat import logic The import logic following the behavior: Improt everything and force run GridMigrationTask to automatically remove broken icons. This logic would fail for hotseat as the replacement happens before the GridMigrationTask, which will not replace the broken targets appropriately The cl changes some logic only for hotseat import > After import remove any broken icons/empty folders > When adding default icons, only add as much icons as required. Since GridMigrationTask uses weights, it sometimes removes imported icon, if the hotseat size becomes too large. Bug: 30909630 Change-Id: I6ca1f25dac81649794d81aaf82c3c38d1c918d91 --- .../model/GridSizeMigrationTask.java | 20 ++++++++++++ .../launcher3/provider/ImportDataTask.java | 31 +++++++++++++------ 2 files changed, 41 insertions(+), 10 deletions(-) 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);