Merge "Improve V2 grid migration algorithm" into ub-launcher3-rvc-dev
This commit is contained in:
+57
-22
@@ -59,6 +59,17 @@ public class GridSizeMigrationTaskV2Test {
|
||||
private HashSet<String> mValidPackages;
|
||||
private InvariantDeviceProfile mIdp;
|
||||
|
||||
private final String testPackage1 = "com.android.launcher3.validpackage1";
|
||||
private final String testPackage2 = "com.android.launcher3.validpackage2";
|
||||
private final String testPackage3 = "com.android.launcher3.validpackage3";
|
||||
private final String testPackage4 = "com.android.launcher3.validpackage4";
|
||||
private final String testPackage5 = "com.android.launcher3.validpackage5";
|
||||
private final String testPackage6 = "com.android.launcher3.validpackage6";
|
||||
private final String testPackage7 = "com.android.launcher3.validpackage7";
|
||||
private final String testPackage8 = "com.android.launcher3.validpackage8";
|
||||
private final String testPackage9 = "com.android.launcher3.validpackage9";
|
||||
private final String testPackage10 = "com.android.launcher3.validpackage10";
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mModelHelper = new LauncherModelHelper();
|
||||
@@ -67,6 +78,17 @@ public class GridSizeMigrationTaskV2Test {
|
||||
|
||||
mValidPackages = new HashSet<>();
|
||||
mValidPackages.add(TEST_PACKAGE);
|
||||
mValidPackages.add(testPackage1);
|
||||
mValidPackages.add(testPackage2);
|
||||
mValidPackages.add(testPackage3);
|
||||
mValidPackages.add(testPackage4);
|
||||
mValidPackages.add(testPackage5);
|
||||
mValidPackages.add(testPackage6);
|
||||
mValidPackages.add(testPackage7);
|
||||
mValidPackages.add(testPackage8);
|
||||
mValidPackages.add(testPackage9);
|
||||
mValidPackages.add(testPackage10);
|
||||
|
||||
mIdp = InvariantDeviceProfile.INSTANCE.get(mContext);
|
||||
|
||||
long userSerial = UserCache.INSTANCE.get(mContext).getSerialNumberForUser(
|
||||
@@ -78,20 +100,6 @@ public class GridSizeMigrationTaskV2Test {
|
||||
|
||||
@Test
|
||||
public void testMigration() {
|
||||
final String testPackage1 = "com.android.launcher3.validpackage1";
|
||||
final String testPackage2 = "com.android.launcher3.validpackage2";
|
||||
final String testPackage3 = "com.android.launcher3.validpackage3";
|
||||
final String testPackage4 = "com.android.launcher3.validpackage4";
|
||||
final String testPackage5 = "com.android.launcher3.validpackage5";
|
||||
final String testPackage7 = "com.android.launcher3.validpackage7";
|
||||
|
||||
mValidPackages.add(testPackage1);
|
||||
mValidPackages.add(testPackage2);
|
||||
mValidPackages.add(testPackage3);
|
||||
mValidPackages.add(testPackage4);
|
||||
mValidPackages.add(testPackage5);
|
||||
mValidPackages.add(testPackage7);
|
||||
|
||||
int[] srcHotseatItems = {
|
||||
mModelHelper.addItem(APP_ICON, 0, HOTSEAT, 0, 0, testPackage1, 1, TMP_CONTENT_URI),
|
||||
mModelHelper.addItem(SHORTCUT, 1, HOTSEAT, 0, 0, testPackage2, 2, TMP_CONTENT_URI),
|
||||
@@ -100,6 +108,10 @@ public class GridSizeMigrationTaskV2Test {
|
||||
mModelHelper.addItem(APP_ICON, 4, HOTSEAT, 0, 0, testPackage4, 4, TMP_CONTENT_URI),
|
||||
};
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 2, testPackage5, 5, TMP_CONTENT_URI);
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 3, testPackage6, 6, TMP_CONTENT_URI);
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 4, 1, testPackage8, 8, TMP_CONTENT_URI);
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 4, 2, testPackage9, 9, TMP_CONTENT_URI);
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 4, 3, testPackage10, 10, TMP_CONTENT_URI);
|
||||
|
||||
int[] destHotseatItems = {
|
||||
-1,
|
||||
@@ -108,21 +120,24 @@ public class GridSizeMigrationTaskV2Test {
|
||||
};
|
||||
mModelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 2, testPackage7);
|
||||
|
||||
mIdp.numHotseatIcons = 3;
|
||||
mIdp.numColumns = 3;
|
||||
mIdp.numRows = 3;
|
||||
mIdp.numHotseatIcons = 4;
|
||||
mIdp.numColumns = 4;
|
||||
mIdp.numRows = 4;
|
||||
GridSizeMigrationTaskV2.DbReader srcReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||
LauncherSettings.Favorites.TMP_TABLE, mContext, mValidPackages, 5);
|
||||
LauncherSettings.Favorites.TMP_TABLE, mContext, mValidPackages,
|
||||
srcHotseatItems.length);
|
||||
GridSizeMigrationTaskV2.DbReader destReader = new GridSizeMigrationTaskV2.DbReader(mDb,
|
||||
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages, 3);
|
||||
LauncherSettings.Favorites.TABLE_NAME, mContext, mValidPackages,
|
||||
mIdp.numHotseatIcons);
|
||||
GridSizeMigrationTaskV2 task = new GridSizeMigrationTaskV2(mContext, mDb, srcReader,
|
||||
destReader, 3, new Point(mIdp.numColumns, mIdp.numRows));
|
||||
destReader, mIdp.numHotseatIcons, new Point(mIdp.numColumns, mIdp.numRows));
|
||||
task.migrate();
|
||||
|
||||
// Check hotseat items
|
||||
Cursor c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
||||
new String[]{LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.INTENT},
|
||||
"container=" + CONTAINER_HOTSEAT, null, null, null);
|
||||
assertEquals(c.getCount(), 3);
|
||||
assertEquals(c.getCount(), mIdp.numHotseatIcons);
|
||||
int screenIndex = c.getColumnIndex(LauncherSettings.Favorites.SCREEN);
|
||||
int intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
||||
c.moveToNext();
|
||||
@@ -134,13 +149,17 @@ public class GridSizeMigrationTaskV2Test {
|
||||
c.moveToNext();
|
||||
assertEquals(c.getInt(screenIndex), 2);
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage3));
|
||||
c.moveToNext();
|
||||
assertEquals(c.getInt(screenIndex), 3);
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage4));
|
||||
c.close();
|
||||
|
||||
// Check workspace items
|
||||
c = mContext.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI,
|
||||
new String[]{LauncherSettings.Favorites.CELLX, LauncherSettings.Favorites.CELLY,
|
||||
LauncherSettings.Favorites.INTENT},
|
||||
"container=" + CONTAINER_DESKTOP, null, null, null);
|
||||
assertEquals(c.getCount(), 2);
|
||||
assertEquals(c.getCount(), 6);
|
||||
intentIndex = c.getColumnIndex(LauncherSettings.Favorites.INTENT);
|
||||
int cellXIndex = c.getColumnIndex(LauncherSettings.Favorites.CELLX);
|
||||
int cellYIndex = c.getColumnIndex(LauncherSettings.Favorites.CELLY);
|
||||
@@ -148,7 +167,23 @@ public class GridSizeMigrationTaskV2Test {
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage7));
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage6));
|
||||
assertEquals(c.getInt(cellXIndex), 0);
|
||||
assertEquals(c.getInt(cellYIndex), 3);
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage10));
|
||||
assertEquals(c.getInt(cellXIndex), 1);
|
||||
assertEquals(c.getInt(cellYIndex), 3);
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage5));
|
||||
assertEquals(c.getInt(cellXIndex), 2);
|
||||
assertEquals(c.getInt(cellYIndex), 3);
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage9));
|
||||
assertEquals(c.getInt(cellXIndex), 3);
|
||||
assertEquals(c.getInt(cellYIndex), 3);
|
||||
c.moveToNext();
|
||||
assertTrue(c.getString(intentIndex).contains(testPackage8));
|
||||
assertEquals(c.getInt(cellXIndex), 0);
|
||||
assertEquals(c.getInt(cellYIndex), 2);
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import android.database.DatabaseUtils;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.graphics.Point;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -55,6 +56,7 @@ import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -226,9 +228,8 @@ public class GridSizeMigrationTaskV2 {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Migrating " + screenId);
|
||||
}
|
||||
List<DbEntry> entries = mDestReader.loadWorkspaceEntries(screenId);
|
||||
GridPlacementSolution workspaceSolution = new GridPlacementSolution(mDb, mSrcReader,
|
||||
mDestReader, mContext, entries, screenId, mTrgX, mTrgY, mWorkspaceDiff);
|
||||
mDestReader, mContext, screenId, mTrgX, mTrgY, mWorkspaceDiff);
|
||||
workspaceSolution.find();
|
||||
if (mWorkspaceDiff.isEmpty()) {
|
||||
break;
|
||||
@@ -238,8 +239,7 @@ public class GridSizeMigrationTaskV2 {
|
||||
int screenId = mDestReader.mLastScreenId + 1;
|
||||
while (!mWorkspaceDiff.isEmpty()) {
|
||||
GridPlacementSolution workspaceSolution = new GridPlacementSolution(mDb, mSrcReader,
|
||||
mDestReader, mContext, new ArrayList<>(), screenId, mTrgX, mTrgY,
|
||||
mWorkspaceDiff);
|
||||
mDestReader, mContext, screenId, mTrgX, mTrgY, mWorkspaceDiff);
|
||||
workspaceSolution.find();
|
||||
screenId++;
|
||||
}
|
||||
@@ -352,8 +352,7 @@ public class GridSizeMigrationTaskV2 {
|
||||
private int mNextStartY;
|
||||
|
||||
GridPlacementSolution(SQLiteDatabase db, DbReader srcReader, DbReader destReader,
|
||||
Context context, List<DbEntry> placedWorkspaceItems, int screenId, int trgX,
|
||||
int trgY, List<DbEntry> itemsToPlace) {
|
||||
Context context, int screenId, int trgX, int trgY, List<DbEntry> itemsToPlace) {
|
||||
mDb = db;
|
||||
mSrcReader = srcReader;
|
||||
mDestReader = destReader;
|
||||
@@ -364,8 +363,11 @@ public class GridSizeMigrationTaskV2 {
|
||||
mTrgY = trgY;
|
||||
mNextStartX = 0;
|
||||
mNextStartY = mTrgY - 1;
|
||||
for (DbEntry entry : placedWorkspaceItems) {
|
||||
mOccupied.markCells(entry, true);
|
||||
List<DbEntry> existedEntries = mDestReader.mWorkspaceEntriesByScreenId.get(screenId);
|
||||
if (existedEntries != null) {
|
||||
for (DbEntry entry : existedEntries) {
|
||||
mOccupied.markCells(entry, true);
|
||||
}
|
||||
}
|
||||
mItemsToPlace = itemsToPlace;
|
||||
}
|
||||
@@ -386,6 +388,11 @@ public class GridSizeMigrationTaskV2 {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for the next possible placement of an icon. (mNextStartX, mNextStartY) serves as
|
||||
* a memoization of last placement, we can start our search for next placement from there
|
||||
* to speed up the search.
|
||||
*/
|
||||
private boolean findPlacement(DbEntry entry) {
|
||||
for (int y = mNextStartY; y >= 0; y--) {
|
||||
for (int x = mNextStartX; x < mTrgX; x++) {
|
||||
@@ -406,6 +413,7 @@ public class GridSizeMigrationTaskV2 {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
mNextStartX = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -475,6 +483,8 @@ public class GridSizeMigrationTaskV2 {
|
||||
|
||||
private final ArrayList<DbEntry> mHotseatEntries = new ArrayList<>();
|
||||
private final ArrayList<DbEntry> mWorkspaceEntries = new ArrayList<>();
|
||||
private final Map<Integer, ArrayList<DbEntry>> mWorkspaceEntriesByScreenId =
|
||||
new ArrayMap<>();
|
||||
|
||||
DbReader(SQLiteDatabase db, String tableName, Context context,
|
||||
HashSet<String> validPackages, int hotseatSize) {
|
||||
@@ -564,25 +574,6 @@ public class GridSizeMigrationTaskV2 {
|
||||
return loadWorkspaceEntries(c);
|
||||
}
|
||||
|
||||
protected ArrayList<DbEntry> loadWorkspaceEntries(int screen) {
|
||||
Cursor c = queryWorkspace(
|
||||
new String[]{
|
||||
LauncherSettings.Favorites._ID, // 0
|
||||
LauncherSettings.Favorites.ITEM_TYPE, // 1
|
||||
LauncherSettings.Favorites.SCREEN, // 2
|
||||
LauncherSettings.Favorites.CELLX, // 3
|
||||
LauncherSettings.Favorites.CELLY, // 4
|
||||
LauncherSettings.Favorites.SPANX, // 5
|
||||
LauncherSettings.Favorites.SPANY, // 6
|
||||
LauncherSettings.Favorites.INTENT, // 7
|
||||
LauncherSettings.Favorites.APPWIDGET_PROVIDER, // 8
|
||||
LauncherSettings.Favorites.APPWIDGET_ID}, // 9
|
||||
LauncherSettings.Favorites.CONTAINER + " = "
|
||||
+ LauncherSettings.Favorites.CONTAINER_DESKTOP
|
||||
+ " AND " + LauncherSettings.Favorites.SCREEN + " = " + screen);
|
||||
return loadWorkspaceEntries(c);
|
||||
}
|
||||
|
||||
private ArrayList<DbEntry> loadWorkspaceEntries(Cursor c) {
|
||||
final int indexId = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID);
|
||||
final int indexItemType = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE);
|
||||
@@ -660,6 +651,10 @@ public class GridSizeMigrationTaskV2 {
|
||||
continue;
|
||||
}
|
||||
mWorkspaceEntries.add(entry);
|
||||
if (!mWorkspaceEntriesByScreenId.containsKey(entry.screenId)) {
|
||||
mWorkspaceEntriesByScreenId.put(entry.screenId, new ArrayList<>());
|
||||
}
|
||||
mWorkspaceEntriesByScreenId.get(entry.screenId).add(entry);
|
||||
}
|
||||
removeEntryFromDb(mDb, mTableName, entriesToRemove);
|
||||
c.close();
|
||||
|
||||
Reference in New Issue
Block a user