Merge "Mitigate 10 minutes delay in launcher restore for work apps." into ub-launcher3-rvc-dev

This commit is contained in:
TreeHugger Robot
2020-05-08 21:02:02 +00:00
committed by Android (Google) Code Review
3 changed files with 22 additions and 29 deletions
@@ -20,7 +20,6 @@ import static com.android.launcher3.config.FeatureFlags.MULTI_DB_GRID_MIRATION_A
import static com.android.launcher3.provider.LauncherDbUtils.copyTable;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
import static com.android.launcher3.provider.LauncherDbUtils.tableExists;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import android.annotation.TargetApi;
import android.app.backup.BackupManager;
@@ -48,7 +47,6 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
@@ -85,6 +83,7 @@ import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
public class LauncherProvider extends ContentProvider {
@@ -92,8 +91,7 @@ public class LauncherProvider extends ContentProvider {
private static final boolean LOGD = false;
private static final String DOWNGRADE_SCHEMA_FILE = "downgrade_schema.json";
private static final String TOKEN_RESTORE_BACKUP_TABLE = "restore_backup_table";
private static final long RESTORE_BACKUP_TABLE_DELAY = 60000;
private static final long RESTORE_BACKUP_TABLE_DELAY = TimeUnit.SECONDS.toMillis(30);
/**
* Represents the schema of the database. Changes in scheme need not be backwards compatible.
@@ -107,6 +105,8 @@ public class LauncherProvider extends ContentProvider {
protected DatabaseHelper mOpenHelper;
private long mLastRestoreTimestamp = 0L;
/**
* $ adb shell dumpsys activity provider com.android.launcher3
*/
@@ -412,11 +412,12 @@ public class LauncherProvider extends ContentProvider {
return null;
}
case LauncherSettings.Settings.METHOD_RESTORE_BACKUP_TABLE: {
final Handler handler = MODEL_EXECUTOR.getHandler();
handler.removeCallbacksAndMessages(TOKEN_RESTORE_BACKUP_TABLE);
handler.postDelayed(() -> RestoreDbTask.restoreIfPossible(
getContext(), mOpenHelper, new BackupManager(getContext())),
TOKEN_RESTORE_BACKUP_TABLE, RESTORE_BACKUP_TABLE_DELAY);
final long ts = System.currentTimeMillis();
if (ts - mLastRestoreTimestamp > RESTORE_BACKUP_TABLE_DELAY) {
mLastRestoreTimestamp = ts;
RestoreDbTask.restoreIfPossible(
getContext(), mOpenHelper, new BackupManager(getContext()));
}
return null;
}
case LauncherSettings.Settings.METHOD_UPDATE_CURRENT_OPEN_HELPER: {
@@ -56,8 +56,6 @@ public class InstallSessionHelper {
// Set<String> of session ids of promise icons that have been added to the home screen
// as FLAG_PROMISE_NEW_INSTALLS.
protected static final String PROMISE_ICON_IDS = "promise_icon_ids";
public static final String KEY_INSTALL_SESSION_CREATED_TIMESTAMP =
"key_install_session_created_timestamp";
private static final boolean DEBUG = false;
@@ -166,14 +164,13 @@ public class InstallSessionHelper {
}
/**
* Attempt to restore workspace layout if the session is triggered due to device restore and it
* has a newer timestamp.
* Attempt to restore workspace layout if the session is triggered due to device restore.
*/
public boolean restoreDbIfApplicable(@NonNull final SessionInfo info) {
if (!Utilities.ATLEAST_OREO || !FeatureFlags.ENABLE_DATABASE_RESTORE.get()) {
return false;
}
if (isRestore(info) && hasNewerTimestamp(mAppContext, info)) {
if (isRestore(info)) {
LauncherSettings.Settings.call(mAppContext.getContentResolver(),
LauncherSettings.Settings.METHOD_RESTORE_BACKUP_TABLE);
return true;
@@ -186,13 +183,6 @@ public class InstallSessionHelper {
return info.getInstallReason() == PackageManager.INSTALL_REASON_DEVICE_RESTORE;
}
private static boolean hasNewerTimestamp(
@NonNull final Context context, @NonNull final SessionInfo info) {
return PackageManagerHelper.getSessionCreatedTimeInMillis(info)
> Utilities.getDevicePrefs(context).getLong(
KEY_INSTALL_SESSION_CREATED_TIMESTAMP, 0);
}
public boolean promiseIconAddedForId(int sessionId) {
return mPromiseIconIds.contains(sessionId);
}
@@ -16,7 +16,6 @@
package com.android.launcher3.provider;
import static com.android.launcher3.pm.InstallSessionHelper.KEY_INSTALL_SESSION_CREATED_TIMESTAMP;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
import android.app.backup.BackupManager;
@@ -87,13 +86,10 @@ public class RestoreDbTask {
*/
public static boolean restoreIfPossible(@NonNull Context context,
@NonNull DatabaseHelper helper, @NonNull BackupManager backupManager) {
Utilities.getDevicePrefs(context).edit().putLong(
KEY_INSTALL_SESSION_CREATED_TIMESTAMP, System.currentTimeMillis()).apply();
final SQLiteDatabase db = helper.getWritableDatabase();
try (SQLiteTransaction t = new SQLiteTransaction(db)) {
RestoreDbTask task = new RestoreDbTask();
task.restoreWorkspace(context, db, helper, backupManager);
task.restoreAppWidgetIdsIfExists(context);
t.commit();
return true;
} catch (Exception e) {
@@ -107,7 +103,6 @@ public class RestoreDbTask {
*/
private void backupWorkspace(Context context, SQLiteDatabase db) throws Exception {
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
// TODO(pinyaoting): Support backing up workspace with multiple grid options.
new GridBackupTable(context, db, idp.numHotseatIcons, idp.numColumns, idp.numRows)
.doBackup(getDefaultProfileId(db), GridBackupTable.OPTION_REQUIRES_SANITIZATION);
}
@@ -115,13 +110,17 @@ public class RestoreDbTask {
private void restoreWorkspace(@NonNull Context context, @NonNull SQLiteDatabase db,
@NonNull DatabaseHelper helper, @NonNull BackupManager backupManager)
throws Exception {
// TODO(pinyaoting): Support restoring workspace with multiple grid options.
final InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
GridBackupTable backupTable = new GridBackupTable(context, db, idp.numHotseatIcons,
idp.numColumns, idp.numRows);
if (backupTable.restoreFromRawBackupIfAvailable(getDefaultProfileId(db))) {
sanitizeDB(helper, db, backupManager);
int itemsDeleted = sanitizeDB(helper, db, backupManager);
LauncherAppState.getInstance(context).getModel().forceReload();
restoreAppWidgetIdsIfExists(context);
if (itemsDeleted == 0) {
// all the items are restored, we no longer need the backup table
dropTable(db, Favorites.BACKUP_TABLE_NAME);
}
}
}
@@ -132,8 +131,10 @@ public class RestoreDbTask {
* the restored apps get installed.
* 3. If the user serial for any restored profile is different than that of the previous
* device, update the entries to the new profile id.
*
* @return number of items deleted.
*/
private void sanitizeDB(DatabaseHelper helper, SQLiteDatabase db, BackupManager backupManager)
private int sanitizeDB(DatabaseHelper helper, SQLiteDatabase db, BackupManager backupManager)
throws Exception {
// Primary user ids
long myProfileId = helper.getDefaultUserSerial();
@@ -210,6 +211,7 @@ public class RestoreDbTask {
if (myProfileId != oldProfileId) {
changeDefaultColumn(db, myProfileId);
}
return itemsDeleted;
}
/**