Fix LauncherProvider newScreenId issue
Remove maxScreenId from LauncherProvider and whenever we need
a new screenId, query the database to calculate a new screenId.
Also converted and refactored AddWorkspaceItemsTaskTest
and added some extra test cases.
Test: manual & AddWorkspaceItemsTaskTest.kt
Bug: 199160559
Change-Id: I185f6823fed171d778af0130497f5ffaf89c0a70
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 9f3d445..68e19cb 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -383,7 +383,7 @@
case LauncherSettings.Settings.METHOD_NEW_SCREEN_ID: {
Bundle result = new Bundle();
result.putInt(LauncherSettings.Settings.EXTRA_VALUE,
- mOpenHelper.generateNewScreenId());
+ mOpenHelper.getNewScreenId());
return result;
}
case LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB: {
@@ -628,7 +628,6 @@
private final Context mContext;
private final boolean mForMigration;
private int mMaxItemId = -1;
- private int mMaxScreenId = -1;
private boolean mBackupTableExists;
private boolean mHotseatRestoreTableExists;
@@ -672,9 +671,6 @@
if (mMaxItemId == -1) {
mMaxItemId = initializeMaxItemId(getWritableDatabase());
}
- if (mMaxScreenId == -1) {
- mMaxScreenId = initializeMaxScreenId(getWritableDatabase());
- }
}
@Override
@@ -682,7 +678,6 @@
if (LOGD) Log.d(TAG, "creating new launcher database");
mMaxItemId = 1;
- mMaxScreenId = 0;
addFavoritesTable(db, false);
@@ -1043,36 +1038,19 @@
public void checkId(ContentValues values) {
int id = values.getAsInteger(Favorites._ID);
mMaxItemId = Math.max(id, mMaxItemId);
-
- Integer screen = values.getAsInteger(Favorites.SCREEN);
- Integer container = values.getAsInteger(Favorites.CONTAINER);
- if (screen != null && container != null
- && container.intValue() == Favorites.CONTAINER_DESKTOP) {
- mMaxScreenId = Math.max(screen, mMaxScreenId);
- }
}
private int initializeMaxItemId(SQLiteDatabase db) {
return getMaxId(db, "SELECT MAX(%1$s) FROM %2$s", Favorites._ID, Favorites.TABLE_NAME);
}
- // Generates a new ID to use for an workspace screen in your database. This method
- // should be only called from the main UI thread. As an exception, we do call it when we
- // call the constructor from the worker thread; however, this doesn't extend until after the
- // constructor is called, and we only pass a reference to LauncherProvider to LauncherApp
- // after that point
- public int generateNewScreenId() {
- if (mMaxScreenId < 0) {
- throw new RuntimeException("Error: max screen id was not initialized");
- }
- mMaxScreenId += 1;
- return mMaxScreenId;
- }
-
- private int initializeMaxScreenId(SQLiteDatabase db) {
- return getMaxId(db, "SELECT MAX(%1$s) FROM %2$s WHERE %3$s = %4$d AND %1$s >= 0",
+ // Returns a new ID to use for an workspace screen in your database that is greater than all
+ // existing screen IDs.
+ private int getNewScreenId() {
+ return getMaxId(getWritableDatabase(),
+ "SELECT MAX(%1$s) FROM %2$s WHERE %3$s = %4$d AND %1$s >= 0",
Favorites.SCREEN, Favorites.TABLE_NAME, Favorites.CONTAINER,
- Favorites.CONTAINER_DESKTOP);
+ Favorites.CONTAINER_DESKTOP) + 1;
}
@Thunk int loadFavorites(SQLiteDatabase db, AutoInstallsLayout loader) {
@@ -1081,7 +1059,6 @@
// Ensure that the max ids are initialized
mMaxItemId = initializeMaxItemId(db);
- mMaxScreenId = initializeMaxScreenId(db);
return count;
}
}