From b0ac461e0610e5101ffbe61a8d2331ac032155a3 Mon Sep 17 00:00:00 2001 From: Sebastian Franco Date: Mon, 29 Aug 2022 16:40:47 -0700 Subject: [PATCH] Adding specific case for applications in getEntryMigrationId A string like this are sued as id when migrating the grid: The problem is that sourceBounds can chagne for the same app and then return the same app as different. To fix it I added a new case for Aplications and remove the variable sourceBounds for the default case if there is anotherr Favorites item that has the same problem but we don't know. Test: Manually migrated between different grids. Fix: 232004084 Change-Id: Ida015c971c70c8de2915fca1ebc38f446c21a310 --- .../model/GridSizeMigrationTaskV2.java | 53 ++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java b/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java index c25929ac86..341372ef31 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java +++ b/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java @@ -31,6 +31,7 @@ import android.graphics.Point; import android.util.ArrayMap; import android.util.Log; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.android.launcher3.InvariantDeviceProfile; @@ -47,6 +48,7 @@ import com.android.launcher3.util.IntArray; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.WidgetManagerHelper; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -776,17 +778,6 @@ public class GridSizeMigrationTaskV2 { values.put(LauncherSettings.Favorites.SPANY, spanY); } - /** - * This method should return an id that should be the same for two folders containing the - * same elements. - */ - private String getFolderMigrationId() { - return mFolderItems.keySet().stream() - .map(intentString -> mFolderItems.get(intentString).size() + intentString) - .sorted() - .collect(Collectors.joining(",")); - } - /** This id is not used in the DB is only used while doing the migration and it identifies * an entry on each workspace. For example two calculator icons would have the same * migration id even thought they have different database ids. @@ -797,9 +788,47 @@ public class GridSizeMigrationTaskV2 { return getFolderMigrationId(); case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: return mProvider; + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + final String intentStr = cleanIntentString(mIntent); + try { + Intent i = Intent.parseUri(intentStr, 0); + return Objects.requireNonNull(i.getComponent()).toString(); + } catch (Exception e) { + return intentStr; + } default: - return mIntent; + return cleanIntentString(mIntent); } } + + /** + * This method should return an id that should be the same for two folders containing the + * same elements. + */ + @NonNull + private String getFolderMigrationId() { + return mFolderItems.keySet().stream() + .map(intentString -> mFolderItems.get(intentString).size() + + cleanIntentString(intentString)) + .sorted() + .collect(Collectors.joining(",")); + } + + /** + * This is needed because sourceBounds can change and make the id of two equal items + * different. + */ + @NonNull + private String cleanIntentString(@NonNull String intentStr) { + try { + Intent i = Intent.parseUri(intentStr, 0); + i.setSourceBounds(null); + return i.toURI(); + } catch (URISyntaxException e) { + Log.e(TAG, "Unable to parse Intent string", e); + return intentStr; + } + + } } }