Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef474d29 authored by Tracy Zhou's avatar Tracy Zhou Committed by Android (Google) Code Review
Browse files

Merge "Improve V2 grid migration algorithm" into ub-launcher3-rvc-dev

parents 2191b49f b48e289e
Loading
Loading
Loading
Loading
+57 −22
Original line number Diff line number Diff line
@@ -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);
    }
+22 −27
Original line number Diff line number Diff line
@@ -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,9 +363,12 @@ public class GridSizeMigrationTaskV2 {
            mTrgY = trgY;
            mNextStartX = 0;
            mNextStartY = mTrgY - 1;
            for (DbEntry entry : placedWorkspaceItems) {
            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();