diff options
author | 2025-03-11 15:47:31 -0700 | |
---|---|---|
committer | 2025-03-13 11:23:23 -0700 | |
commit | 25f5c7e761e7243cb7cfc866075453d6dddd3bd5 (patch) | |
tree | 41ba8b2e584894ab444e2377fbc810c31273fe3a /src | |
parent | 1db86b7c1b29a93cfbd838871c73f23760329261 (diff) |
Making ModelDbController injectable
Bug: 361850561
Test: Updated tests
Flag: EXEMPT dagger
Change-Id: Ie600469476ce5eb60813a3c8b57b9445fcf82c24
Diffstat (limited to 'src')
9 files changed, 96 insertions, 114 deletions
diff --git a/src/com/android/launcher3/LauncherModel.kt b/src/com/android/launcher3/LauncherModel.kt index 02d70ae386..557ad67386 100644 --- a/src/com/android/launcher3/LauncherModel.kt +++ b/src/com/android/launcher3/LauncherModel.kt @@ -86,12 +86,11 @@ constructor( private val loaderFactory: LoaderTaskFactory, private val binderFactory: BaseLauncherBinderFactory, private val spaceFinderFactory: Provider<WorkspaceItemSpaceFinder>, + val modelDbController: ModelDbController, ) { private val mCallbacksList = ArrayList<BgDataModel.Callbacks>(1) - val modelDbController = ModelDbController(context) - private val mLock = Any() private var mLoaderTask: LoaderTask? = null diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index 03ecf14ef6..acb2b48aeb 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -26,13 +26,13 @@ import android.content.ContentUris; import android.content.ContentValues; import android.content.pm.PackageManager; import android.database.Cursor; -import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.Process; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.model.ModelDbController; @@ -74,24 +74,20 @@ public class LauncherProvider extends ContentProvider { @Override public String getType(Uri uri) { - SqlArguments args = new SqlArguments(uri, null, null); - if (TextUtils.isEmpty(args.where)) { - return "vnd.android.cursor.dir/" + args.table; + if (TextUtils.isEmpty(parseUri(uri, null, null).first)) { + return "vnd.android.cursor.dir/" + Favorites.TABLE_NAME; } else { - return "vnd.android.cursor.item/" + args.table; + return "vnd.android.cursor.item/" + Favorites.TABLE_NAME; } } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - SqlArguments args = new SqlArguments(uri, selection, selectionArgs); - SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); - qb.setTables(args.table); - + Pair<String, String[]> args = parseUri(uri, selection, selectionArgs); Cursor[] result = new Cursor[1]; executeControllerTask(controller -> { - result[0] = controller.query(args.table, projection, args.where, args.args, sortOrder); + result[0] = controller.query(projection, args.first, args.second, sortOrder); return 0; }); return result[0]; @@ -108,7 +104,7 @@ public class LauncherProvider extends ContentProvider { // attempt allocate and bind the widget. Integer itemType = values.getAsInteger(Favorites.ITEM_TYPE); if (itemType != null - && itemType.intValue() == Favorites.ITEM_TYPE_APPWIDGET + && itemType == Favorites.ITEM_TYPE_APPWIDGET && !values.containsKey(Favorites.APPWIDGET_ID)) { ComponentName cn = ComponentName.unflattenFromString( @@ -135,8 +131,7 @@ public class LauncherProvider extends ContentProvider { } } - SqlArguments args = new SqlArguments(uri); - return controller.insert(args.table, values); + return controller.insert(values); }); return rowId < 0 ? null : ContentUris.withAppendedId(uri, rowId); @@ -144,14 +139,14 @@ public class LauncherProvider extends ContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { - SqlArguments args = new SqlArguments(uri, selection, selectionArgs); - return executeControllerTask(c -> c.delete(args.table, args.where, args.args)); + Pair<String, String[]> args = parseUri(uri, selection, selectionArgs); + return executeControllerTask(c -> c.delete(args.first, args.second)); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - SqlArguments args = new SqlArguments(uri, selection, selectionArgs); - return executeControllerTask(c -> c.update(args.table, values, args.where, args.args)); + Pair<String, String[]> args = parseUri(uri, selection, selectionArgs); + return executeControllerTask(c -> c.update(values, args.first, args.second)); } @Override @@ -209,35 +204,24 @@ public class LauncherProvider extends ContentProvider { } } - static class SqlArguments { - public final String table; - public final String where; - public final String[] args; - - SqlArguments(Uri url, String where, String[] args) { - if (url.getPathSegments().size() == 1) { - this.table = url.getPathSegments().get(0); - this.where = where; - this.args = args; - } else if (url.getPathSegments().size() != 2) { - throw new IllegalArgumentException("Invalid URI: " + url); - } else if (!TextUtils.isEmpty(where)) { - throw new UnsupportedOperationException("WHERE clause not supported: " + url); - } else { - this.table = url.getPathSegments().get(0); - this.where = "_id=" + ContentUris.parseId(url); - this.args = null; + /** + * Parses the uri and returns the where and arg clause. + * + * Note: This should be called on the binder thread (before posting on any executor) so that + * any parsing error gets propagated to the caller. + */ + private static Pair<String, String[]> parseUri(Uri url, String where, String[] args) { + switch (url.getPathSegments().size()) { + case 1 -> { + return Pair.create(where, args); } - } - - SqlArguments(Uri url) { - if (url.getPathSegments().size() == 1) { - table = url.getPathSegments().get(0); - where = null; - args = null; - } else { - throw new IllegalArgumentException("Invalid URI: " + url); + case 2 -> { + if (!TextUtils.isEmpty(where)) { + throw new UnsupportedOperationException("WHERE clause not supported: " + url); + } + return Pair.create("_id=" + ContentUris.parseId(url), null); } + default -> throw new IllegalArgumentException("Invalid URI: " + url); } } } diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java index 5a9b9c20f9..457d12e8ca 100644 --- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java @@ -21,7 +21,6 @@ import static android.content.res.Configuration.UI_MODE_NIGHT_YES; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.launcher3.LauncherPrefs.GRID_NAME; -import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; import static com.android.launcher3.graphics.ThemeManager.PREF_ICON_SHAPE; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; @@ -179,7 +178,7 @@ public class PreviewSurfaceRenderer { ModelDbController mainController = LauncherAppState.getInstance(mContext).getModel().getModelDbController(); - try (Cursor c = mainController.query(TABLE_NAME, + try (Cursor c = mainController.query( new String[] { LauncherSettings.Favorites.APPWIDGET_ID, LauncherSettings.Favorites.SPANX, diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java index 77d0d7656b..efe61572fe 100644 --- a/src/com/android/launcher3/model/LoaderCursor.java +++ b/src/com/android/launcher3/model/LoaderCursor.java @@ -21,7 +21,6 @@ import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; -import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET; import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_ARCHIVED; @@ -466,7 +465,7 @@ public class LoaderCursor extends CursorWrapper { public boolean commitDeleted() { if (mItemsToRemove.size() > 0) { // Remove dead items - mModel.getModelDbController().delete(TABLE_NAME, + mModel.getModelDbController().delete( Utilities.createDbSelectionQuery(Favorites._ID, mItemsToRemove), null); return true; } @@ -492,7 +491,7 @@ public class LoaderCursor extends CursorWrapper { // Update restored items that no longer require special handling ContentValues values = new ContentValues(); values.put(Favorites.RESTORED, 0); - mModel.getModelDbController().update(TABLE_NAME, values, + mModel.getModelDbController().update(values, Utilities.createDbSelectionQuery(Favorites._ID, mRestoredRows), null); } if (mRestoreEventLogger != null) { diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 73af6a221a..78e5d898cd 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -23,7 +23,6 @@ import static com.android.launcher3.Flags.enableSmartspaceRemovalToggle; import static com.android.launcher3.LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE; import static com.android.launcher3.LauncherPrefs.SHOULD_SHOW_SMARTSPACE; import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; -import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; import static com.android.launcher3.icons.CacheableShortcutInfo.convertShortcutsToCacheableShortcuts; import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION; @@ -485,7 +484,7 @@ public class LoaderTask implements Runnable { mShortcutKeyToPinnedShortcuts = new HashMap<>(); final LoaderCursor c = mLoaderCursorFactory.createLoaderCursor( - dbController.query(TABLE_NAME, null, selection, null, null), + dbController.query(null, selection, null, null), mUserManagerState, mIsRestoreFromBackup ? restoreEventLogger : null); final Bundle extras = c.getExtras(); diff --git a/src/com/android/launcher3/model/ModelDbController.java b/src/com/android/launcher3/model/ModelDbController.java index feae632bc5..64b9c1c9cd 100644 --- a/src/com/android/launcher3/model/ModelDbController.java +++ b/src/com/android/launcher3/model/ModelDbController.java @@ -73,6 +73,8 @@ import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger; import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError; +import com.android.launcher3.dagger.ApplicationContext; +import com.android.launcher3.dagger.LauncherAppSingleton; import com.android.launcher3.logging.FileLog; import com.android.launcher3.pm.UserCache; import com.android.launcher3.provider.LauncherDbUtils; @@ -91,10 +93,13 @@ import java.io.StringReader; import java.util.List; import java.util.stream.Collectors; +import javax.inject.Inject; + /** * Utility class which maintains an instance of Launcher database and provides utility methods * around it. */ +@LauncherAppSingleton public class ModelDbController { private static final String TAG = "ModelDbController"; @@ -105,17 +110,25 @@ public class ModelDbController { protected DatabaseHelper mOpenHelper; private final Context mContext; - - public ModelDbController(Context context) { + private final InvariantDeviceProfile mIdp; + private final LauncherPrefs mPrefs; + private final UserCache mUserCache; + + @Inject + ModelDbController( + @ApplicationContext Context context, + InvariantDeviceProfile idp, + LauncherPrefs prefs, + UserCache userCache) { mContext = context; + mIdp = idp; + mPrefs = prefs; + mUserCache = userCache; } private void printDBs(String prefix) { try { - File directory = new File( - mContext.getDatabasePath(InvariantDeviceProfile.INSTANCE.get(mContext).dbFile) - .getParent() - ); + File directory = new File(mContext.getDatabasePath(mIdp.dbFile).getParent()); if (directory.exists()) { for (File file : directory.listFiles()) { Log.d("b/353505773", prefix + "Database file: " + file.getName()); @@ -130,9 +143,9 @@ public class ModelDbController { private synchronized void createDbIfNotExists() { if (mOpenHelper == null) { - String dbFile = LauncherPrefs.get(mContext).get(DB_FILE); + String dbFile = mPrefs.get(DB_FILE); if (dbFile.isEmpty()) { - dbFile = InvariantDeviceProfile.INSTANCE.get(mContext).dbFile; + dbFile = mIdp.dbFile; } mOpenHelper = createDatabaseHelper(false /* forMigration */, dbFile); printDBs("before: "); @@ -144,7 +157,7 @@ public class ModelDbController { protected DatabaseHelper createDatabaseHelper(boolean forMigration, String dbFile) { // Set the flag for empty DB Runnable onEmptyDbCreateCallback = forMigration ? () -> { } - : () -> LauncherPrefs.get(mContext).putSync(getEmptyDbCreatedKey(dbFile).to(true)); + : () -> mPrefs.putSync(getEmptyDbCreatedKey(dbFile).to(true)); DatabaseHelper databaseHelper = new DatabaseHelper(mContext, dbFile, this::getSerialNumberForUser, onEmptyDbCreateCallback); @@ -169,12 +182,12 @@ public class ModelDbController { * Refer {@link SQLiteDatabase#query} */ @WorkerThread - public Cursor query(String table, String[] projection, String selection, + public Cursor query(String[] projection, String selection, String[] selectionArgs, String sortOrder) { createDbIfNotExists(); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); Cursor result = db.query( - table, projection, selection, selectionArgs, null, null, sortOrder); + TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); final Bundle extra = new Bundle(); extra.putString(EXTRA_DB_NAME, mOpenHelper.getDatabaseName()); @@ -186,12 +199,12 @@ public class ModelDbController { * Refer {@link SQLiteDatabase#insert(String, String, ContentValues)} */ @WorkerThread - public int insert(String table, ContentValues initialValues) { + public int insert(ContentValues initialValues) { createDbIfNotExists(); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); addModifiedTime(initialValues); - int rowId = mOpenHelper.dbInsertAndCheck(db, table, initialValues); + int rowId = mOpenHelper.dbInsertAndCheck(db, TABLE_NAME, initialValues); if (rowId >= 0) { onAddOrDeleteOp(db); } @@ -202,11 +215,11 @@ public class ModelDbController { * Refer {@link SQLiteDatabase#delete(String, String, String[])} */ @WorkerThread - public int delete(String table, String selection, String[] selectionArgs) { + public int delete(String selection, String[] selectionArgs) { createDbIfNotExists(); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - int count = db.delete(table, selection, selectionArgs); + int count = db.delete(TABLE_NAME, selection, selectionArgs); if (count > 0) { onAddOrDeleteOp(db); } @@ -217,14 +230,12 @@ public class ModelDbController { * Refer {@link SQLiteDatabase#update(String, ContentValues, String, String[])} */ @WorkerThread - public int update(String table, ContentValues values, - String selection, String[] selectionArgs) { + public int update(ContentValues values, String selection, String[] selectionArgs) { createDbIfNotExists(); addModifiedTime(values); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - int count = db.update(table, values, selection, selectionArgs); - return count; + return db.update(TABLE_NAME, values, selection, selectionArgs); } /** @@ -261,7 +272,7 @@ public class ModelDbController { public void createEmptyDB() { createDbIfNotExists(); mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); - LauncherPrefs.get(mContext).putSync(getEmptyDbCreatedKey().to(true)); + mPrefs.putSync(getEmptyDbCreatedKey().to(true)); } /** @@ -292,7 +303,6 @@ public class ModelDbController { mOpenHelper.getReadableDatabase(), Favorites.HYBRID_HOTSEAT_BACKUP_TABLE); } - /** * Resets the launcher DB if we should reset it. */ @@ -302,11 +312,10 @@ public class ModelDbController { } FileLog.d(TAG, "resetLauncherDb: Migration failed: resetting launcher database"); createEmptyDB(); - LauncherPrefs.get(mContext).putSync( - getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true)); + mPrefs.putSync(getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true)); // Write the grid state to avoid another migration - new DeviceGridState(LauncherAppState.getIDP(mContext)).writeToPrefs(mContext); + new DeviceGridState(mIdp).writeToPrefs(mContext); } /** @@ -326,7 +335,7 @@ public class ModelDbController { } private boolean isThereExistingDb() { - if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) { + if (mPrefs.get(getEmptyDbCreatedKey())) { // If we already have a new DB, ignore migration FileLog.d(TAG, "isThereExistingDb: new DB already created, skipping migration"); return true; @@ -335,8 +344,7 @@ public class ModelDbController { } private boolean isGridMigrationNecessary() { - InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); - if (GridSizeMigrationDBController.needsToMigrate(mContext, idp)) { + if (GridSizeMigrationDBController.needsToMigrate(mContext, mIdp)) { return true; } FileLog.d(TAG, "isGridMigrationNecessary: no grid migration needed"); @@ -344,8 +352,7 @@ public class ModelDbController { } private boolean isCurrentDbSameAsTarget() { - InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); - String targetDbName = new DeviceGridState(idp).getDbFile(); + String targetDbName = new DeviceGridState(mIdp).getDbFile(); if (TextUtils.equals(targetDbName, mOpenHelper.getDatabaseName())) { FileLog.e(TAG, "isCurrentDbSameAsTarget: target db is same as current" + " current db: " + mOpenHelper.getDatabaseName() @@ -367,7 +374,6 @@ public class ModelDbController { return; } - InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); DatabaseHelper oldHelper = mOpenHelper; // We save the existing db's before creating the destination db helper so we know what logic @@ -376,12 +382,12 @@ public class ModelDbController { .filter(dbName -> mContext.getDatabasePath(dbName).exists()) .collect(Collectors.toList()); - mOpenHelper = createDatabaseHelper(true, new DeviceGridState(idp).getDbFile()); + mOpenHelper = createDatabaseHelper(true, new DeviceGridState(mIdp).getDbFile()); try { // This is the current grid we have, given by the mContext DeviceGridState srcDeviceState = new DeviceGridState(mContext); // This is the state we want to migrate to that is given by the idp - DeviceGridState destDeviceState = new DeviceGridState(idp); + DeviceGridState destDeviceState = new DeviceGridState(mIdp); boolean isDestNewDb = !existingDBs.contains(destDeviceState.getDbFile()); GridSizeMigrationLogic gridSizeMigrationLogic = new GridSizeMigrationLogic(); @@ -404,10 +410,10 @@ public class ModelDbController { ModelDelegate modelDelegate) { if (!migrateGridIfNeeded(modelDelegate)) { if (restoreEventLogger != null) { - if (LauncherPrefs.get(mContext).get(NO_DB_FILES_RESTORED)) { + if (mPrefs.get(NO_DB_FILES_RESTORED)) { restoreEventLogger.logLauncherItemsRestoreFailed(DATA_TYPE_DB_FILE, 1, RestoreError.DATABASE_FILE_NOT_RESTORED); - LauncherPrefs.get(mContext).put(NO_DB_FILES_RESTORED, false); + mPrefs.put(NO_DB_FILES_RESTORED, false); FileLog.d(TAG, "There is no data to migrate: resetting launcher database"); } else { restoreEventLogger.logLauncherItemsRestored(DATA_TYPE_DB_FILE, 1); @@ -416,11 +422,10 @@ public class ModelDbController { } FileLog.d(TAG, "tryMigrateDB: Migration failed: resetting launcher database"); createEmptyDB(); - LauncherPrefs.get(mContext).putSync( - getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true)); + mPrefs.putSync(getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true)); // Write the grid state to avoid another migration - new DeviceGridState(LauncherAppState.getIDP(mContext)).writeToPrefs(mContext); + new DeviceGridState(mIdp).writeToPrefs(mContext); } else if (restoreEventLogger != null) { restoreEventLogger.logLauncherItemsRestored(DATA_TYPE_DB_FILE, 1); } @@ -434,17 +439,16 @@ public class ModelDbController { */ private boolean migrateGridIfNeeded(ModelDelegate modelDelegate) { createDbIfNotExists(); - if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) { + if (mPrefs.get(getEmptyDbCreatedKey())) { // If we have already create a new DB, ignore migration FileLog.d(TAG, "migrateGridIfNeeded: new DB already created, skipping migration"); return false; } - InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); - if (!GridSizeMigrationDBController.needsToMigrate(mContext, idp)) { + if (!GridSizeMigrationDBController.needsToMigrate(mContext, mIdp)) { FileLog.d(TAG, "migrateGridIfNeeded: no grid migration needed"); return true; } - String targetDbName = new DeviceGridState(idp).getDbFile(); + String targetDbName = new DeviceGridState(mIdp).getDbFile(); if (TextUtils.equals(targetDbName, mOpenHelper.getDatabaseName())) { FileLog.e(TAG, "migrateGridIfNeeded: target db is same as current" + " current db: " + mOpenHelper.getDatabaseName() @@ -462,7 +466,7 @@ public class ModelDbController { // This is the current grid we have, given by the mContext DeviceGridState srcDeviceState = new DeviceGridState(mContext); // This is the state we want to migrate to that is given by the idp - DeviceGridState destDeviceState = new DeviceGridState(idp); + DeviceGridState destDeviceState = new DeviceGridState(mIdp); boolean isDestNewDb = !existingDBs.contains(destDeviceState.getDbFile()); return GridSizeMigrationDBController.migrateGridIfNeeded(mContext, srcDeviceState, destDeviceState, mOpenHelper, oldHelper.getWritableDatabase(), isDestNewDb, @@ -611,7 +615,7 @@ public class ModelDbController { } private void clearFlagEmptyDbCreated() { - LauncherPrefs.get(mContext).removeSync(getEmptyDbCreatedKey()); + mPrefs.removeSync(getEmptyDbCreatedKey()); } /** @@ -625,7 +629,7 @@ public class ModelDbController { public synchronized void loadDefaultFavoritesIfNecessary() { createDbIfNotExists(); - if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) { + if (mPrefs.get(getEmptyDbCreatedKey())) { Log.d(TAG, "loading default workspace"); LauncherWidgetHolder widgetHolder = mOpenHelper.newLauncherWidgetHolder(); @@ -737,10 +741,9 @@ public class ModelDbController { } private DefaultLayoutParser getDefaultLayoutParser(LauncherWidgetHolder widgetHolder) { - InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext); - int defaultLayout = idp.demoModeLayoutId != 0 + int defaultLayout = mIdp.demoModeLayoutId != 0 && mContext.getSystemService(UserManager.class).isDemoUser() - ? idp.demoModeLayoutId : idp.defaultLayoutId; + ? mIdp.demoModeLayoutId : mIdp.defaultLayoutId; return new DefaultLayoutParser(mContext, widgetHolder, mOpenHelper, mContext.getResources(), defaultLayout); @@ -766,6 +769,6 @@ public class ModelDbController { * Returns the serial number for the provided user */ public long getSerialNumberForUser(UserHandle user) { - return UserCache.INSTANCE.get(mContext).getSerialNumberForUser(user); + return mUserCache.getSerialNumberForUser(user); } } diff --git a/src/com/android/launcher3/model/ModelWriter.java b/src/com/android/launcher3/model/ModelWriter.java index 0332775224..659bacd784 100644 --- a/src/com/android/launcher3/model/ModelWriter.java +++ b/src/com/android/launcher3/model/ModelWriter.java @@ -16,7 +16,6 @@ package com.android.launcher3.model; -import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; import static com.android.launcher3.provider.LauncherDbUtils.itemIdMatch; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; @@ -253,7 +252,7 @@ public class ModelWriter { item.onAddToDatabase(writer); writer.put(Favorites._ID, item.id); - mModel.getModelDbController().insert(Favorites.TABLE_NAME, writer.getValues(mContext)); + mModel.getModelDbController().insert(writer.getValues(mContext)); synchronized (mBgDataModel) { checkItemInfoLocked(item.id, item, stackTrace); mBgDataModel.addItem(mContext, item, true); @@ -292,7 +291,7 @@ public class ModelWriter { notifyDelete(items); enqueueDeleteRunnable(newModelTask(() -> { for (ItemInfo item : items) { - mModel.getModelDbController().delete(TABLE_NAME, itemIdMatch(item.id), null); + mModel.getModelDbController().delete(itemIdMatch(item.id), null); mBgDataModel.removeItem(mContext, item); verifier.verifyModel(); } @@ -307,12 +306,12 @@ public class ModelWriter { notifyDelete(Collections.singleton(info)); enqueueDeleteRunnable(newModelTask(() -> { - mModel.getModelDbController().delete(Favorites.TABLE_NAME, + mModel.getModelDbController().delete( Favorites.CONTAINER + "=" + info.id, null); mBgDataModel.removeItem(mContext, info.getContents()); info.getContents().clear(); - mModel.getModelDbController().delete(Favorites.TABLE_NAME, + mModel.getModelDbController().delete( Favorites._ID + "=" + info.id, null); mBgDataModel.removeItem(mContext, info); verifier.verifyModel(); @@ -411,7 +410,7 @@ public class ModelWriter { @Override public void runImpl() { mModel.getModelDbController().update( - TABLE_NAME, mWriter.get().getValues(mContext), itemIdMatch(mItemId), null); + mWriter.get().getValues(mContext), itemIdMatch(mItemId), null); updateItemArrays(mItem, mItemId); } } @@ -433,7 +432,7 @@ public class ModelWriter { ItemInfo item = mItems.get(i); final int itemId = item.id; mModel.getModelDbController().update( - TABLE_NAME, mValues.get(i), itemIdMatch(itemId), null); + mValues.get(i), itemIdMatch(itemId), null); updateItemArrays(item, itemId); } t.commit(); diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 23941bb1e6..f6ee26baa6 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -80,6 +80,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -206,7 +207,8 @@ public class RestoreDbTask { LauncherRestoreEventLogger restoreEventLogger = LauncherRestoreEventLogger.Companion.newInstance(context); task.sanitizeDB(context, controller, db, backupManager, restoreEventLogger); - task.restoreAppWidgetIdsIfExists(context, controller, restoreEventLogger); + task.restoreAppWidgetIdsIfExists(context, controller, restoreEventLogger, + () -> new AppWidgetHost(context, APPWIDGET_HOST_ID)); t.commit(); return true; } catch (Exception e) { @@ -438,14 +440,13 @@ public class RestoreDbTask { @WorkerThread @VisibleForTesting void restoreAppWidgetIdsIfExists(Context context, ModelDbController controller, - LauncherRestoreEventLogger restoreEventLogger) { + LauncherRestoreEventLogger restoreEventLogger, Supplier<AppWidgetHost> hostSupplier) { LauncherPrefs lp = LauncherPrefs.get(context); if (lp.has(APP_WIDGET_IDS, OLD_APP_WIDGET_IDS)) { - AppWidgetHost host = new AppWidgetHost(context, APPWIDGET_HOST_ID); restoreAppWidgetIds(context, controller, restoreEventLogger, IntArray.fromConcatString(lp.get(OLD_APP_WIDGET_IDS)).toArray(), IntArray.fromConcatString(lp.get(APP_WIDGET_IDS)).toArray(), - host); + hostSupplier.get()); } else { FileLog.d(TAG, "Did not receive new app widget id map during Launcher restore"); } diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java index 9910dc2e70..c2c1fee561 100644 --- a/src/com/android/launcher3/util/ContentWriter.java +++ b/src/com/android/launcher3/util/ContentWriter.java @@ -23,7 +23,6 @@ import android.os.UserHandle; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.GraphicsUtils; import com.android.launcher3.model.ModelDbController; @@ -107,7 +106,7 @@ public class ContentWriter { public int commit() { if (mCommitParams != null) { return mCommitParams.mDbController.update( - Favorites.TABLE_NAME, getValues(mContext), + getValues(mContext), mCommitParams.mWhere, mCommitParams.mSelectionArgs); } return 0; |