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