From f5a2e75100584dfd7e90dfd958717b15ae32439a Mon Sep 17 00:00:00 2001 From: Sebastian Franco Date: Mon, 4 Mar 2024 12:28:21 -0600 Subject: [PATCH] In the case the gird migration goes to a taller grid keep the grid configuration For example going from 4x5 to 4x6 it will keep the 4x5 configuration which fits in the 4x6 grid. Also, it fixes GridMigrationTest which was flaky because of how it sorted arrays. Bug: 325286145 Flag: ACONFIG grid_migration_fix disabled Test: NA (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2eaf15c37a051fd17c18c4443a8bd19d39057bf0) Merged-In: I6063e3c303320096f7429a3b1d909e107d2ef2a0 Change-Id: I6063e3c303320096f7429a3b1d909e107d2ef2a0 --- .../model/GridSizeMigrationUtil.java | 11 +++ .../flagged_result5x5to5x8.db | Bin 0 -> 77824 bytes .../launcher3/model/GridMigrationTest.kt | 77 ++++++++++++++---- .../util/rule/TestToPhoneFileCopier.kt | 6 +- 4 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db diff --git a/src/com/android/launcher3/model/GridSizeMigrationUtil.java b/src/com/android/launcher3/model/GridSizeMigrationUtil.java index 30d2cfbf86..c40484dcea 100644 --- a/src/com/android/launcher3/model/GridSizeMigrationUtil.java +++ b/src/com/android/launcher3/model/GridSizeMigrationUtil.java @@ -40,6 +40,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import com.android.launcher3.Flags; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings; @@ -122,6 +123,16 @@ public class GridSizeMigrationUtil { if (!needsToMigrate(srcDeviceState, destDeviceState)) { return true; } + + if (Flags.gridMigrationFix() + && srcDeviceState.getColumns().equals(destDeviceState.getColumns()) + && srcDeviceState.getRows() < destDeviceState.getRows()) { + // Only use this strategy when comparing the previous grid to the new grid and the + // columns are the same and the destination has more rows + copyTable(source, TABLE_NAME, target.getWritableDatabase(), TABLE_NAME, context); + destDeviceState.writeToPrefs(context); + return true; + } copyTable(source, TABLE_NAME, target.getWritableDatabase(), TMP_TABLE, context); HashSet validPackages = getValidPackages(context); diff --git a/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db new file mode 100644 index 0000000000000000000000000000000000000000..8bea3ce70857de284cccf8b56073c0d31d09f49b GIT binary patch literal 77824 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 it.cellX } - val sortY = { it: GridSizeMigrationUtil.DbEntry -> it.cellX } + val sort = compareBy({ it.cellX }, { it.cellY }) val mapF = { it: GridSizeMigrationUtil.DbEntry -> EntryData(it.cellX, it.cellY, it.spanX, it.spanY, it.rank) } - val entriesDst = dst.readEntries().sortedBy(sortX).sortedBy(sortY).map(mapF) - val entriesTarget = target.readEntries().sortedBy(sortX).sortedBy(sortY).map(mapF) + val entriesDst = dst.readEntries().sortedWith(sort).map(mapF) + val entriesTarget = target.readEntries().sortedWith(sort).map(mapF) + assert(entriesDst == entriesTarget) { "The elements on the dst database is not the same as in the target" } @@ -128,9 +147,9 @@ class GridMigrationTest { @Rule val result5x5to3x3 = TestToPhoneFileCopier( - "databases/GridMigrationTest/result5x5to3x3.db", - "databases/result5x5to3x3.db", - true + src = "databases/GridMigrationTest/result5x5to3x3.db", + dest = "databases/result5x5to3x3.db", + removeOnFinish = true ) @Test @@ -151,9 +170,9 @@ class GridMigrationTest { @Rule val result5x5to4x7 = TestToPhoneFileCopier( - "databases/GridMigrationTest/result5x5to4x7.db", - "databases/result5x5to4x7.db", - true + src = "databases/GridMigrationTest/result5x5to4x7.db", + dest = "databases/result5x5to4x7.db", + removeOnFinish = true ) @Test @@ -174,9 +193,9 @@ class GridMigrationTest { @Rule val result5x5to5x8 = TestToPhoneFileCopier( - "databases/GridMigrationTest/result5x5to5x8.db", - "databases/result5x5to5x8.db", - true + src = "databases/GridMigrationTest/result5x5to5x8.db", + dest = "databases/result5x5to5x8.db", + removeOnFinish = true ) @Test @@ -192,4 +211,32 @@ class GridMigrationTest { target = GridMigrationData("result5x5to5x8.db", DeviceGridState(5, 8, 5, TYPE_PHONE, "")) ) + + @JvmField + @Rule + val flaggedResult5x5to5x8 = + TestToPhoneFileCopier( + src = "databases/GridMigrationTest/flagged_result5x5to5x8.db", + dest = "databases/flagged_result5x5to5x8.db", + removeOnFinish = true + ) + + @Test + fun `flagged 5x5 to 5x8`() { + setFlagsRule.setFlags(true, Flags.FLAG_GRID_MIGRATION_FIX) + runTest( + src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)), + dst = + GridMigrationData( + null, // in memory db, to download a new db change null for the filename of the + // db name to store it. Do not use existing names. + DeviceGridState(5, 8, 5, TYPE_PHONE, "") + ), + target = + GridMigrationData( + "flagged_result5x5to5x8.db", + DeviceGridState(5, 8, 5, TYPE_PHONE, "") + ) + ) + } } diff --git a/tests/src/com/android/launcher3/util/rule/TestToPhoneFileCopier.kt b/tests/src/com/android/launcher3/util/rule/TestToPhoneFileCopier.kt index 72c4f16f90..d3516d1d2d 100644 --- a/tests/src/com/android/launcher3/util/rule/TestToPhoneFileCopier.kt +++ b/tests/src/com/android/launcher3/util/rule/TestToPhoneFileCopier.kt @@ -49,7 +49,11 @@ class TestToPhoneFileCopier( object : Statement() { override fun evaluate() { before() - base.evaluate() + try { + base.evaluate() + } finally { + after() + } } } }