diff --git a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java index 70be7dae45..6e33d2a556 100644 --- a/src/com/android/launcher3/AppWidgetsRestoredReceiver.java +++ b/src/com/android/launcher3/AppWidgetsRestoredReceiver.java @@ -9,10 +9,12 @@ import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Handler; +import android.support.annotation.WorkerThread; import android.util.Log; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.model.LoaderTask; +import com.android.launcher3.provider.RestoreDbTask; import com.android.launcher3.util.ContentWriter; public class AppWidgetsRestoredReceiver extends BroadcastReceiver { @@ -22,6 +24,12 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { if (AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED.equals(intent.getAction())) { + int hostId = intent.getIntExtra(AppWidgetManager.EXTRA_HOST_ID, 0); + Log.d(TAG, "Widget ID map received for host:" + hostId); + if (hostId != Launcher.APPWIDGET_HOST_ID) { + return; + } + final int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS); final int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); if (oldIds.length == newIds.length) { @@ -42,11 +50,23 @@ public class AppWidgetsRestoredReceiver extends BroadcastReceiver { /** * Updates the app widgets whose id has changed during the restore process. */ + @WorkerThread static void restoreAppWidgetIds(Context context, PendingResult asyncResult, int[] oldWidgetIds, int[] newWidgetIds) { + AppWidgetHost appWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID); + if (!RestoreDbTask.isPending(context)) { + // Someone has already gone through our DB once, probably LoaderTask. Skip any further + // modifications of the DB. + Log.e(TAG, "Skipping widget ID remap as DB already in use"); + for (int widgetId : newWidgetIds) { + Log.d(TAG, "Deleting widgetId: " + widgetId); + appWidgetHost.deleteAppWidgetId(widgetId); + } + asyncResult.finish(); + return; + } final ContentResolver cr = context.getContentResolver(); final AppWidgetManager widgets = AppWidgetManager.getInstance(context); - AppWidgetHost appWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID); for (int i = 0; i < oldWidgetIds.length; i++) { Log.i(TAG, "Widget state restore id " + oldWidgetIds[i] + " => " + newWidgetIds[i]); diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 00e2644a5b..5230160085 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -134,7 +134,7 @@ public class RestoreDbTask { } public static void setPending(Context context, boolean isPending) { - FileLog.d(TAG, "Restore data received through full backup"); + FileLog.d(TAG, "Restore data received through full backup " + isPending); Utilities.getPrefs(context).edit().putBoolean(RESTORE_TASK_PENDING, isPending).commit(); } }