18a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira/*
28a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * Copyright (C) 2012 The Android Open Source Project
38a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira *
48a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
58a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * you may not use this file except in compliance with the License.
68a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * You may obtain a copy of the License at
78a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira *
88a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
98a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira *
108a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * Unless required by applicable law or agreed to in writing, software
118a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
128a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * See the License for the specific language governing permissions and
148a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira * limitations under the License.
158a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira */
168a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
178a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereirapackage com.android.mail.widget;
188a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
198a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.app.PendingIntent;
208a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.appwidget.AppWidgetManager;
218a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.appwidget.AppWidgetProvider;
228a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.content.ComponentName;
238a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.content.ContentResolver;
248a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.content.Context;
258a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.content.Intent;
268a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.database.Cursor;
278a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.net.Uri;
28b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedyimport android.os.AsyncTask;
29e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrookimport android.os.Bundle;
308a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.text.TextUtils;
318a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.view.View;
328a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport android.widget.RemoteViews;
338a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3465a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.R;
358c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huangimport com.android.mail.preferences.MailPrefs;
3665a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.providers.Account;
3765a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.providers.Folder;
3865a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.providers.UIProvider;
3967aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedyimport com.android.mail.providers.UIProvider.FolderType;
4065a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.ui.MailboxSelectionActivity;
4165a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.utils.AccountUtils;
42b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrookimport com.android.mail.utils.LogTag;
4365a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.utils.LogUtils;
4465a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.android.mail.utils.Utils;
4565a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.google.common.collect.Sets;
4665a2356da766d6de28be1593c558524f48d96e14Marc Blankimport com.google.common.primitives.Ints;
4765a2356da766d6de28be1593c558524f48d96e14Marc Blank
488a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereiraimport java.util.Set;
498a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
50127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrookpublic abstract class BaseWidgetProvider extends AppWidgetProvider {
5167aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy    public static final String EXTRA_FOLDER_TYPE = "folder-type";
5210ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux    public static final String EXTRA_FOLDER_CAPABILITIES = "folder-capabilities";
53b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    public static final String EXTRA_FOLDER_URI = "folder-uri";
54b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    public static final String EXTRA_FOLDER_CONVERSATION_LIST_URI = "folder-conversation-list-uri";
55b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    public static final String EXTRA_FOLDER_DISPLAY_NAME = "folder-display-name";
56e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook    public static final String EXTRA_UPDATE_ALL_WIDGETS = "update-all-widgets";
578a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    public static final String WIDGET_ACCOUNT_PREFIX = "widget-account-";
588a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
59b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    public static final String ACCOUNT_FOLDER_PREFERENCE_SEPARATOR = " ";
608a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
618a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
62a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    protected static final String ACTION_UPDATE_WIDGET = "com.android.mail.ACTION_UPDATE_WIDGET";
635383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    protected static final String
645383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            ACTION_VALIDATE_ALL_WIDGETS = "com.android.mail.ACTION_VALIDATE_ALL_WIDGETS";
65a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    protected static final String EXTRA_WIDGET_ID = "widgetId";
668a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
67a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    private static final String LOG_TAG = LogTag.getLogTag();
688a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
698a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    /**
708a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     * Remove preferences when deleting widget
718a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     */
728a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    @Override
738a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    public void onDeleted(Context context, int[] appWidgetIds) {
748a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        super.onDeleted(context, appWidgetIds);
75a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook
768a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        // TODO: (mindyp) save widget information.
778c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huang        MailPrefs.get(context).clearWidgets(appWidgetIds);
788a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
798a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
800183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler    public static String getProviderName(Context context) {
810183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler        return context.getString(R.string.widget_provider);
820183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler    }
830183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler
848a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    /**
850183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler     * Note: this method calls {@link BaseWidgetProvider#getProviderName} and thus returns widget
860183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler     * IDs based on the widget_provider string resource. When subclassing, be sure to either
870183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler     * override this method or provide the correct provider name in the string resource.
880183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler     *
898a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     * @return the list ids for the currently configured widgets.
908a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     */
91e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook    protected int[] getCurrentWidgetIds(Context context) {
928a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
930183066312b9468da81b0fe01357f56c0325fdc3Tony Mantler        final ComponentName mailComponent = new ComponentName(context, getProviderName(context));
948a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        return appWidgetManager.getAppWidgetIds(mailComponent);
958a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
968a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
978a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    /**
9891d0b86db3287f1702913177d347dd42b7d13764Marc Blank     * Get an array of account/mailbox string pairs for currently configured widgets
9991d0b86db3287f1702913177d347dd42b7d13764Marc Blank     * @return the account/mailbox string pairs
10091d0b86db3287f1702913177d347dd42b7d13764Marc Blank     */
10191d0b86db3287f1702913177d347dd42b7d13764Marc Blank    static public String[][] getWidgetInfo(Context context, int[] widgetIds) {
102a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        final String[][] widgetInfo = new String[widgetIds.length][2];
10391d0b86db3287f1702913177d347dd42b7d13764Marc Blank        for (int i = 0; i < widgetIds.length; i++) {
10491d0b86db3287f1702913177d347dd42b7d13764Marc Blank            // Retrieve the persisted information for this widget from
10591d0b86db3287f1702913177d347dd42b7d13764Marc Blank            // preferences.
1068c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huang            final String accountFolder = MailPrefs.get(context).getWidgetConfiguration(
1078c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huang                    widgetIds[i]);
10891d0b86db3287f1702913177d347dd42b7d13764Marc Blank            // If the account matched, update the widget.
10991d0b86db3287f1702913177d347dd42b7d13764Marc Blank            if (accountFolder != null) {
11091d0b86db3287f1702913177d347dd42b7d13764Marc Blank                widgetInfo[i] = TextUtils.split(accountFolder, ACCOUNT_FOLDER_PREFERENCE_SEPARATOR);
11191d0b86db3287f1702913177d347dd42b7d13764Marc Blank            }
11291d0b86db3287f1702913177d347dd42b7d13764Marc Blank        }
11391d0b86db3287f1702913177d347dd42b7d13764Marc Blank        return widgetInfo;
11491d0b86db3287f1702913177d347dd42b7d13764Marc Blank    }
11591d0b86db3287f1702913177d347dd42b7d13764Marc Blank
11691d0b86db3287f1702913177d347dd42b7d13764Marc Blank    /**
1178a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     * Catches ACTION_NOTIFY_DATASET_CHANGED intent and update the corresponding
1188a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     * widgets.
1198a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     */
1208a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    @Override
1218a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    public void onReceive(Context context, Intent intent) {
122127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        // We want to migrate any legacy Email widget information to the new format
123127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        migrateAllLegacyWidgetInformation(context);
124127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook
1258a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        super.onReceive(context, intent);
126e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook        LogUtils.d(LOG_TAG, "BaseWidgetProvider.onReceive: %s", intent);
127e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook
128a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        final String action = intent.getAction();
129a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        if (ACTION_UPDATE_WIDGET.equals(action)) {
130a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            final int widgetId = intent.getIntExtra(EXTRA_WIDGET_ID, -1);
13126a20758413f0f8629ea71a0943304e3ae740165Tony Mantler            final Account account = Account.newInstance(intent.getStringExtra(Utils.EXTRA_ACCOUNT));
13267aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy            final int folderType = intent.getIntExtra(EXTRA_FOLDER_TYPE, FolderType.DEFAULT);
13310ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final int folderCapabilities = intent.getIntExtra(EXTRA_FOLDER_CAPABILITIES, 0);
134b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            final Uri folderUri = intent.getParcelableExtra(EXTRA_FOLDER_URI);
135b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            final Uri folderConversationListUri =
136b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    intent.getParcelableExtra(EXTRA_FOLDER_CONVERSATION_LIST_URI);
137b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            final String folderDisplayName = intent.getStringExtra(EXTRA_FOLDER_DISPLAY_NAME);
138b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
139b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            if (widgetId != -1 && account != null && folderUri != null) {
14010ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                updateWidgetInternal(context, widgetId, account, folderType, folderCapabilities,
14110ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folderUri, folderConversationListUri, folderDisplayName);
142a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            }
1435383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        } else if (ACTION_VALIDATE_ALL_WIDGETS.equals(action)) {
1445383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            validateAllWidgetInformation(context);
145a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        } else if (Utils.ACTION_NOTIFY_DATASET_CHANGED.equals(action)) {
146a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            // Receive notification for a certain account.
147e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook            final Bundle extras = intent.getExtras();
148c197d4c5bfe62255ca664d7029367ef45f946219Tony Mantler            final Uri accountUri = extras.getParcelable(Utils.EXTRA_ACCOUNT_URI);
149c197d4c5bfe62255ca664d7029367ef45f946219Tony Mantler            final Uri folderUri = extras.getParcelable(Utils.EXTRA_FOLDER_URI);
150e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook            final boolean updateAllWidgets = extras.getBoolean(EXTRA_UPDATE_ALL_WIDGETS, false);
151e144980ef9c8828401922373ef0dc203281bff6ePaul Westbrook
152f8b76a68e46d834c46d14b42b3488293e57e26b1Mark Wei            if (accountUri == null && Utils.isEmpty(folderUri) && !updateAllWidgets) {
1538a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                return;
1548a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            }
1558a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            final Set<Integer> widgetsToUpdate = Sets.newHashSet();
1568a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            for (int id : getCurrentWidgetIds(context)) {
1578a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                // Retrieve the persisted information for this widget from
1588a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                // preferences.
1598c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huang                final String accountFolder = MailPrefs.get(context).getWidgetConfiguration(id);
1604fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                // If the account matched, update the widget.
1614fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                if (accountFolder != null) {
1624fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                    final String[] parsedInfo = TextUtils.split(accountFolder,
1634fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                            ACCOUNT_FOLDER_PREFERENCE_SEPARATOR);
16491d0b86db3287f1702913177d347dd42b7d13764Marc Blank                    boolean updateThis = updateAllWidgets;
16591d0b86db3287f1702913177d347dd42b7d13764Marc Blank                    if (!updateThis) {
16691d0b86db3287f1702913177d347dd42b7d13764Marc Blank                        if (accountUri != null &&
16791d0b86db3287f1702913177d347dd42b7d13764Marc Blank                                TextUtils.equals(accountUri.toString(), parsedInfo[0])) {
16891d0b86db3287f1702913177d347dd42b7d13764Marc Blank                            updateThis = true;
16991d0b86db3287f1702913177d347dd42b7d13764Marc Blank                        } else if (folderUri != null &&
17091d0b86db3287f1702913177d347dd42b7d13764Marc Blank                                TextUtils.equals(folderUri.toString(), parsedInfo[1])) {
17191d0b86db3287f1702913177d347dd42b7d13764Marc Blank                            updateThis = true;
17291d0b86db3287f1702913177d347dd42b7d13764Marc Blank                        }
17391d0b86db3287f1702913177d347dd42b7d13764Marc Blank                    }
17491d0b86db3287f1702913177d347dd42b7d13764Marc Blank                    if (updateThis) {
1754fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                        widgetsToUpdate.add(id);
1764fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                    }
1774fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                }
1788a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            }
1798a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            if (widgetsToUpdate.size() > 0) {
1808a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                final int[] widgets = Ints.toArray(widgetsToUpdate);
1818a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgets,
1828a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                        R.id.conversation_list);
1838a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            }
1848a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        }
1858a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
1868a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
1878a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    /**
1888a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     * Update all widgets in the list
1898a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     */
1908a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    @Override
1918a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
192127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        migrateLegacyWidgets(context, appWidgetIds);
193127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook
1948a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        super.onUpdate(context, appWidgetManager, appWidgetIds);
1958a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        // Update each of the widgets with a remote adapter
196b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
197b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        new BulkUpdateAsyncTask(context, appWidgetIds).execute((Void[]) null);
198b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    }
199b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
200b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy    private class BulkUpdateAsyncTask extends AsyncTask<Void, Void, Void> {
201b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        private final Context mContext;
202b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        private final int[] mAppWidgetIds;
203b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
204b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        public BulkUpdateAsyncTask(final Context context, final int[] appWidgetIds) {
205b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            mContext = context;
206b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            mAppWidgetIds = appWidgetIds;
207b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        }
208b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
209b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        @Override
210b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        protected Void doInBackground(final Void... params) {
211b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            for (int i = 0; i < mAppWidgetIds.length; ++i) {
212b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                // Get the account for this widget from preference
213b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                final String accountFolder = MailPrefs.get(mContext).getWidgetConfiguration(
214b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                        mAppWidgetIds[i]);
215b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                String accountUri = null;
216b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                Uri folderUri = null;
217b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                if (!TextUtils.isEmpty(accountFolder)) {
218b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    final String[] parsedInfo = TextUtils.split(accountFolder,
219b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                            ACCOUNT_FOLDER_PREFERENCE_SEPARATOR);
220b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    if (parsedInfo.length == 2) {
221b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                        accountUri = parsedInfo[0];
222b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                        folderUri = Uri.parse(parsedInfo[1]);
223b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    } else {
224b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                        accountUri = accountFolder;
225b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                        folderUri =  Uri.EMPTY;
226b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    }
2278a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                }
228b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                // account will be null the first time a widget is created. This is
229b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                // OK, as isAccountValid will return false, allowing the widget to
230b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                // be configured.
231b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
232b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                // Lookup the account by URI.
233b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                Account account = null;
234b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                if (!TextUtils.isEmpty(accountUri)) {
235b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    account = getAccountObject(mContext, accountUri);
236b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                }
237b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                if (Utils.isEmpty(folderUri) && account != null) {
238b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    folderUri = account.settings.defaultInbox;
239b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                }
240b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
241b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                Folder folder = null;
242b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
243b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                if (folderUri != null) {
244b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    final Cursor folderCursor =
245b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                            mContext.getContentResolver().query(folderUri,
246b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                                    UIProvider.FOLDERS_PROJECTION, null, null, null);
247b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
2489047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                    if (folderCursor != null) {
2499047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                        try {
2509047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                            if (folderCursor.moveToFirst()) {
2519047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                                folder = new Folder(folderCursor);
2529047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                            }
2539047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                        } finally {
2549047de4a1ad49813357227e81e8923b6742493e2Jay Shrauner                            folderCursor.close();
25565a2356da766d6de28be1593c558524f48d96e14Marc Blank                        }
2569ae8ce0578b5b097e59fbd1b09fbfb8f824500fbMindy Pereira                    }
2574fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira                }
258b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
25967aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy                updateWidgetInternal(mContext, mAppWidgetIds[i], account,
26010ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folder == null ? FolderType.DEFAULT : folder.type,
26110ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folder == null ? 0 : folder.capabilities,
26210ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folderUri,
26310ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folder == null ? null : folder.conversationListUri,
26410ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        folder == null ? null : folder.name);
2654fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira            }
266b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
267b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy            return null;
2688a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        }
269b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy
2708a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
2718a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
272e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook    protected Account getAccountObject(Context context, String accountUri) {
273e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        final ContentResolver resolver = context.getContentResolver();
274e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        Account account = null;
275e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        Cursor accountCursor = null;
276e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        try {
277e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook            accountCursor = resolver.query(Uri.parse(accountUri),
278e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook                    UIProvider.ACCOUNTS_PROJECTION, null, null, null);
279e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook            if (accountCursor != null) {
280e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook                if (accountCursor.moveToFirst()) {
2814b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen                    account = Account.builder().buildFrom(accountCursor);
282e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook                }
283e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook            }
284e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        } finally {
285e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook            if (accountCursor != null) {
286e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook                accountCursor.close();
287e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook            }
288e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        }
289e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook        return account;
290e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook    }
291e4ea25480e9e45d59013f6733352372592f0752dPaul Westbrook
2928a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    /**
293a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook     * Update the widget appWidgetId with the given account and folder
2948a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira     */
295a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    public static void updateWidget(Context context, int appWidgetId, Account account,
29610ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final int folderType, final int folderCapabilities, final Uri folderUri,
29710ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final Uri folderConversationListUri, final String folderDisplayName) {
298b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        if (account == null || folderUri == null) {
299b0892ccb967d61fb4f389b332ed21c8b37ce6579Paul Westbrook            LogUtils.e(LOG_TAG,
300b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy                    "Missing account or folder.  account: %s folder %s", account, folderUri);
301b0892ccb967d61fb4f389b332ed21c8b37ce6579Paul Westbrook            return;
302b0892ccb967d61fb4f389b332ed21c8b37ce6579Paul Westbrook        }
303a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        final Intent updateWidgetIntent = new Intent(ACTION_UPDATE_WIDGET);
304a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook
305a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        updateWidgetIntent.setType(account.mimeType);
306a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        updateWidgetIntent.putExtra(EXTRA_WIDGET_ID, appWidgetId);
30748cfe4613549cafdf36e2a524afba730522bf291Scott Kennedy        updateWidgetIntent.putExtra(Utils.EXTRA_ACCOUNT, account.serialize());
30867aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy        updateWidgetIntent.putExtra(EXTRA_FOLDER_TYPE, folderType);
30910ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux        updateWidgetIntent.putExtra(EXTRA_FOLDER_CAPABILITIES, folderCapabilities);
31067aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy        updateWidgetIntent.putExtra(EXTRA_FOLDER_URI, folderUri);
311b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        updateWidgetIntent.putExtra(EXTRA_FOLDER_CONVERSATION_LIST_URI, folderConversationListUri);
312b39aaf53a555c1046ef31b3fecf15d086acca013Scott Kennedy        updateWidgetIntent.putExtra(EXTRA_FOLDER_DISPLAY_NAME, folderDisplayName);
313a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook
314a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        context.sendBroadcast(updateWidgetIntent);
3158a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
3168a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3175383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    public static void validateAllWidgets(Context context, String accountMimeType) {
3185383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        final Intent migrateAllWidgetsIntent = new Intent(ACTION_VALIDATE_ALL_WIDGETS);
3195383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        migrateAllWidgetsIntent.setType(accountMimeType);
3205383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        context.sendBroadcast(migrateAllWidgetsIntent);
3215383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    }
3225383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
323a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    protected void updateWidgetInternal(Context context, int appWidgetId, Account account,
32410ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final int folderType, final int folderCapabilities, final Uri folderUri,
32510ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final Uri folderConversationListUri, final String folderDisplayName) {
326747e678d20e99ddd17953ff4530d2ee3f1c6cfc7Mark Wei        final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
3278a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3282c4eacfcad644111fa409d9c8645cd866818269cTony Mantler        if (!isAccountValid(context, account) || !isFolderValid(context, folderUri)) {
3298a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            // Widget has not been configured yet
3308a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setViewVisibility(R.id.widget_folder, View.GONE);
3318a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setViewVisibility(R.id.widget_compose, View.GONE);
3328a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setViewVisibility(R.id.conversation_list, View.GONE);
333f8b76a68e46d834c46d14b42b3488293e57e26b1Mark Wei            remoteViews.setViewVisibility(R.id.empty_conversation_list, View.GONE);
3348a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setViewVisibility(R.id.widget_folder_not_synced, View.GONE);
3358a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setViewVisibility(R.id.widget_configuration, View.VISIBLE);
3368a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3375707f53aecf206a92ff7e90cb48e483f54b0845aMark Wei            remoteViews.setTextViewText(R.id.empty_conversation_list,
3385707f53aecf206a92ff7e90cb48e483f54b0845aMark Wei                    context.getString(R.string.loading_conversations));
3395707f53aecf206a92ff7e90cb48e483f54b0845aMark Wei
3408a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            final Intent configureIntent = new Intent(context, MailboxSelectionActivity.class);
3418a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            configureIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
3428a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            configureIntent.setData(Uri.parse(configureIntent.toUri(Intent.URI_INTENT_SCHEME)));
3438a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            configureIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
3444fa30618ad6683915858c0da1a9e08d53810d851Mindy Pereira            PendingIntent clickIntent = PendingIntent.getActivity(context, 0, configureIntent,
3458a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira                    PendingIntent.FLAG_UPDATE_CURRENT);
3468a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            remoteViews.setOnClickPendingIntent(R.id.widget_configuration, clickIntent);
3478a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        } else {
3488a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira            // Set folder to a space here to avoid flicker.
34967aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy            configureValidAccountWidget(context, remoteViews, appWidgetId, account, folderType,
35010ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                    folderCapabilities, folderUri, folderConversationListUri,
35167aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy                    folderDisplayName == null ? " " : folderDisplayName);
3528a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3538a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        }
3548a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira        AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews);
3558a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
3568a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
357a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    protected boolean isAccountValid(Context context, Account account) {
358a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        if (account != null) {
359a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            Account[] accounts = AccountUtils.getSyncingAccounts(context);
360a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            for (Account existing : accounts) {
3613b965d78774a42358ce6bbdcc43b4c8df130a60eScott Kennedy                if (existing != null && account.uri.equals(existing.uri)) {
362a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook                    return true;
363a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook                }
364a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook            }
365a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        }
366a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        return false;
367e25998f8c3d20b37682cfe00aadb4a70c81eb8e4Mindy Pereira    }
3688a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
3695383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    protected boolean isFolderValid(Context context, Uri folderUri) {
3702c4eacfcad644111fa409d9c8645cd866818269cTony Mantler        if (!Utils.isEmpty(folderUri)) {
3715383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            final Cursor folderCursor =
3725383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    context.getContentResolver().query(folderUri,
3735383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                            UIProvider.FOLDERS_PROJECTION, null, null, null);
3745383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
3755383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            try {
3765383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                if (folderCursor.moveToFirst()) {
3775383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    return true;
3785383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                }
3795383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            } finally {
3805383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                folderCursor.close();
3815383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            }
3825383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        }
3835383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        return false;
3845383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    }
3855383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
386a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook    protected void configureValidAccountWidget(Context context, RemoteViews remoteViews,
38710ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            int appWidgetId, Account account, final int folderType, final int folderCapabilities,
38810ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux            final Uri folderUri, final Uri folderConversationListUri, String folderDisplayName) {
389a39f728390ba2cc849b27260be76753c8a58a085Paul Westbrook        WidgetService.configureValidAccountWidget(context, remoteViews, appWidgetId, account,
39010ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                folderType, folderCapabilities, folderUri, folderConversationListUri, folderDisplayName,
39167aa9e5162a15fb8b46b4113ac627cd20668f095Scott Kennedy                WidgetService.class);
392e25998f8c3d20b37682cfe00aadb4a70c81eb8e4Mindy Pereira    }
393e25998f8c3d20b37682cfe00aadb4a70c81eb8e4Mindy Pereira
394c197d4c5bfe62255ca664d7029367ef45f946219Tony Mantler    private void migrateAllLegacyWidgetInformation(Context context) {
395127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        final int[] currentWidgetIds = getCurrentWidgetIds(context);
396127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        migrateLegacyWidgets(context, currentWidgetIds);
397127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook    }
398127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook
399c197d4c5bfe62255ca664d7029367ef45f946219Tony Mantler    private void migrateLegacyWidgets(Context context, int[] widgetIds) {
400127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        for (int widgetId : widgetIds) {
401127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook            // We only want to bother to attempt to upgrade a widget if we don't already
402127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook            // have information about.
4038c8c9927c5b1ec2cb26ee20c3e755121723b979bAndy Huang            if (!MailPrefs.get(context).isWidgetConfigured(widgetId)) {
404127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook                migrateLegacyWidgetInformation(context, widgetId);
405127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook            }
406127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook        }
407127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook    }
408127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook
409c197d4c5bfe62255ca664d7029367ef45f946219Tony Mantler    private void validateAllWidgetInformation(Context context) {
4105383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        final int[] widgetIds = getCurrentWidgetIds(context);
4115383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        for (int widgetId : widgetIds) {
4125383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            final String accountFolder = MailPrefs.get(context).getWidgetConfiguration(widgetId);
4135383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            String accountUri = null;
4145383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            Uri folderUri = null;
4155383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            if (!TextUtils.isEmpty(accountFolder)) {
4165383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                final String[] parsedInfo = TextUtils.split(accountFolder,
4175383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                        ACCOUNT_FOLDER_PREFERENCE_SEPARATOR);
4185383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                if (parsedInfo.length == 2) {
4195383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    accountUri = parsedInfo[0];
4205383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    folderUri = Uri.parse(parsedInfo[1]);
4215383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                } else {
4225383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    accountUri = accountFolder;
4235383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                    folderUri =  Uri.EMPTY;
4245383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                }
4255383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            }
4265383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
4275383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            Account account = null;
4285383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            if (!TextUtils.isEmpty(accountUri)) {
4295383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei                account = getAccountObject(context, accountUri);
4305383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            }
4315383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
4325383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            // unconfigure the widget if it is not valid
4335383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            if (!isAccountValid(context, account) || !isFolderValid(context, folderUri)) {
43410ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                updateWidgetInternal(context, widgetId, null, FolderType.DEFAULT, 0, null, null,
43510ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux                        null);
4365383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei            }
4375383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei        }
4385383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei    }
4395383fdd924ef794a2d73bbaf679873a66e823c4fMark Wei
440127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook    /**
441127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook     * Abstract method allowing extending classes to perform widget migration
442127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook     */
443127d1fc15dc6a40e8dc9c4d4b003f4bfa915548fPaul Westbrook    protected abstract void migrateLegacyWidgetInformation(Context context, int widgetId);
4448a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira}
445