1package com.android.launcher3; 2 3import android.appwidget.AppWidgetHost; 4import android.appwidget.AppWidgetManager; 5import android.appwidget.AppWidgetProviderInfo; 6import android.content.BroadcastReceiver; 7import android.content.ContentResolver; 8import android.content.ContentValues; 9import android.content.Context; 10import android.content.Intent; 11import android.database.Cursor; 12import android.util.Log; 13 14import com.android.launcher3.LauncherSettings.Favorites; 15 16public class AppWidgetsRestoredReceiver extends BroadcastReceiver { 17 18 private static final String TAG = "AWRestoredReceiver"; 19 20 @Override 21 public void onReceive(Context context, Intent intent) { 22 if (AppWidgetManager.ACTION_APPWIDGET_HOST_RESTORED.equals(intent.getAction())) { 23 int[] oldIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS); 24 int[] newIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 25 if (oldIds.length == newIds.length) { 26 restoreAppWidgetIds(context, oldIds, newIds); 27 } else { 28 Log.e(TAG, "Invalid host restored received"); 29 } 30 } 31 } 32 33 /** 34 * Updates the app widgets whose id has changed during the restore process. 35 */ 36 static void restoreAppWidgetIds(Context context, int[] oldWidgetIds, int[] newWidgetIds) { 37 final ContentResolver cr = context.getContentResolver(); 38 final AppWidgetManager widgets = AppWidgetManager.getInstance(context); 39 AppWidgetHost appWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID); 40 41 for (int i = 0; i < oldWidgetIds.length; i++) { 42 Log.i(TAG, "Widget state restore id " + oldWidgetIds[i] + " => " + newWidgetIds[i]); 43 44 final AppWidgetProviderInfo provider = widgets.getAppWidgetInfo(newWidgetIds[i]); 45 final int state; 46 if (LauncherModel.isValidProvider(provider)) { 47 // This will ensure that we show 'Click to setup' UI if required. 48 state = LauncherAppWidgetInfo.FLAG_UI_NOT_READY; 49 } else { 50 state = LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY; 51 } 52 53 ContentValues values = new ContentValues(); 54 values.put(LauncherSettings.Favorites.APPWIDGET_ID, newWidgetIds[i]); 55 values.put(LauncherSettings.Favorites.RESTORED, state); 56 57 String[] widgetIdParams = new String[] { Integer.toString(oldWidgetIds[i]) }; 58 59 int result = cr.update(Favorites.CONTENT_URI, values, 60 "appWidgetId=? and (restored & 1) = 1", widgetIdParams); 61 if (result == 0) { 62 Cursor cursor = cr.query(Favorites.CONTENT_URI, 63 new String[] {Favorites.APPWIDGET_ID}, 64 "appWidgetId=?", widgetIdParams, null); 65 try { 66 if (!cursor.moveToFirst()) { 67 // The widget no long exists. 68 appWidgetHost.deleteAppWidgetId(newWidgetIds[i]); 69 } 70 } finally { 71 cursor.close(); 72 } 73 } 74 } 75 76 LauncherAppState app = LauncherAppState.getInstanceNoCreate(); 77 if (app != null) { 78 app.reloadWorkspace(); 79 } 80 } 81} 82