diff options
-rw-r--r-- | src/com/android/launcher3/AppWidgetsRestoredReceiver.java | 15 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherProvider.java | 3 | ||||
-rw-r--r-- | src/com/android/launcher3/Utilities.java | 20 | ||||
-rw-r--r-- | src/com/android/launcher3/provider/RestoreDbTask.java | 40 |
4 files changed, 62 insertions, 16 deletions
diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index 0250c363d..d9491419f 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -8,7 +8,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; -import android.os.Handler; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; @@ -34,16 +33,8 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { final int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS); final int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); - if (oldIds.length == newIds.length) { - final PendingResult asyncResult = goAsync(); - new Handler(LauncherModel.getWorkerLooper()) - .postAtFrontOfQueue(new Runnable() { - @Override - public void run() { - restoreAppWidgetIds(context, oldIds, newIds); - asyncResult.finish(); - } - }); + if (oldIds != null && newIds != null && oldIds.length == newIds.length) { + RestoreDbTask.setRestoredAppWidgetIds(context, oldIds, newIds); } else { Log.e(TAG, "Invalid host restored received"); } @@ -54,7 +45,7 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { * Updates the app widgets whose id has changed during the restore process. */ @WorkerThread - static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) { + public static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) { AppWidgetHost appWidgetHost = new LauncherAppWidgetHost(context); if (FeatureFlags.GO_DISABLE_WIDGETS) { Log.e(TAG, "Skipping widget ID remap as widgets not supported"); diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index f830301a3..6ad5c3684 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -158,7 +158,8 @@ public class LauncherProvider extends ContentProvider { mOpenHelper = new DatabaseHelper(getContext(), mListenerHandler); if (RestoreDbTask.isPending(getContext())) { - if (!RestoreDbTask.performRestore(mOpenHelper, new BackupManager(getContext()))) { + if (!RestoreDbTask.performRestore(getContext(), mOpenHelper, + new BackupManager(getContext()))) { mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); } // Set is pending to false irrespective of the result, so that it doesn't get diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 5cfd95cd0..02fc84b9a 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -74,6 +74,7 @@ import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.StringTokenizer; import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -652,4 +653,23 @@ public final class Utilities { return null; } } + + public static int[] getIntArrayFromString(String tokenized) { + StringTokenizer tokenizer = new StringTokenizer(tokenized, ","); + int[] array = new int[tokenizer.countTokens()]; + int count = 0; + while (tokenizer.hasMoreTokens()) { + array[count] = Integer.parseInt(tokenizer.nextToken()); + count++; + } + return array; + } + + public static String getStringFromIntArray(int[] array) { + StringBuilder str = new StringBuilder(); + for (int value : array) { + str.append(value).append(","); + } + return str.toString(); + } } diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 053c493d7..3c0c5fdde 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -16,18 +16,23 @@ package com.android.launcher3.provider; +import static com.android.launcher3.Utilities.getIntArrayFromString; +import static com.android.launcher3.Utilities.getStringFromIntArray; import static com.android.launcher3.provider.LauncherDbUtils.dropTable; import android.app.backup.BackupManager; import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.os.Build; import android.os.UserHandle; import android.util.LongSparseArray; import android.util.SparseLongArray; +import androidx.annotation.NonNull; + +import com.android.launcher3.AppWidgetsRestoredReceiver; import com.android.launcher3.LauncherAppWidgetInfo; import com.android.launcher3.LauncherProvider.DatabaseHelper; import com.android.launcher3.LauncherSettings.Favorites; @@ -53,10 +58,16 @@ public class RestoreDbTask { private static final String INFO_COLUMN_NAME = "name"; private static final String INFO_COLUMN_DEFAULT_VALUE = "dflt_value"; - public static boolean performRestore(DatabaseHelper helper, BackupManager backupManager) { + private static final String APPWIDGET_OLD_IDS = "appwidget_old_ids"; + private static final String APPWIDGET_IDS = "appwidget_ids"; + + public static boolean performRestore(Context context, DatabaseHelper helper, + BackupManager backupManager) { SQLiteDatabase db = helper.getWritableDatabase(); try (SQLiteTransaction t = new SQLiteTransaction(db)) { - new RestoreDbTask().sanitizeDB(helper, db, backupManager); + RestoreDbTask task = new RestoreDbTask(); + task.sanitizeDB(helper, db, backupManager); + task.restoreAppWidgetIdsIfExists(context); t.commit(); return true; } catch (Exception e) { @@ -230,4 +241,27 @@ public class RestoreDbTask { FileLog.d(TAG, "Restore data received through full backup " + isPending); Utilities.getPrefs(context).edit().putBoolean(RESTORE_TASK_PENDING, isPending).commit(); } + + private void restoreAppWidgetIdsIfExists(Context context) { + SharedPreferences prefs = Utilities.getPrefs(context); + if (prefs.contains(APPWIDGET_OLD_IDS) && prefs.contains(APPWIDGET_IDS)) { + AppWidgetsRestoredReceiver.restoreAppWidgetIds(context, + getIntArrayFromString(prefs.getString(APPWIDGET_OLD_IDS, "")), + getIntArrayFromString(prefs.getString(APPWIDGET_IDS, ""))); + } else { + FileLog.d(TAG, "No app widget ids to restore."); + } + + prefs.edit().remove(APPWIDGET_OLD_IDS) + .remove(APPWIDGET_IDS).apply(); + } + + public static void setRestoredAppWidgetIds(Context context, @NonNull int[] oldIds, + @NonNull int[] newIds) { + Utilities.getPrefs(context).edit() + .putString(APPWIDGET_OLD_IDS, getStringFromIntArray(oldIds)) + .putString(APPWIDGET_IDS, getStringFromIntArray(newIds)) + .commit(); + } + } |