WidgetProvider.java revision 1b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98ea
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.email.provider;
18
19import android.content.ContentResolver;
20import android.content.Context;
21import android.content.SharedPreferences;
22import android.database.Cursor;
23import android.net.Uri;
24
25import com.android.emailcommon.provider.Account;
26import com.android.emailcommon.provider.Mailbox;
27import com.android.mail.providers.Folder;
28import com.android.mail.providers.UIProvider;
29import com.android.mail.utils.LogTag;
30import com.android.mail.utils.LogUtils;
31import com.android.mail.widget.BaseWidgetProvider;
32import com.android.mail.widget.WidgetService;
33
34public class WidgetProvider extends BaseWidgetProvider {
35    private static final String LEGACY_PREFS_NAME = "com.android.email.widget.WidgetManager";
36    private static final String LEGACY_ACCOUNT_ID_PREFIX = "accountId_";
37    private static final String LEGACY_MAILBOX_ID_PREFIX = "mailboxId_";
38
39    private static final String LOG_TAG = LogTag.getLogTag();
40
41    /**
42     * Remove preferences when deleting widget
43     */
44    @Override
45    public void onDeleted(Context context, int[] appWidgetIds) {
46        super.onDeleted(context, appWidgetIds);
47
48        // Remove any legacy Email widget information
49        final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
50        final SharedPreferences.Editor editor = prefs.edit();
51        for (int widgetId : appWidgetIds) {
52            // Remove the account in the preference
53            editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId);
54            editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId);
55        }
56        editor.apply();
57    }
58
59    @Override
60    protected com.android.mail.providers.Account getAccountObject(
61            Context context, String accountUri) {
62        final ContentResolver resolver = context.getContentResolver();
63        final Cursor accountCursor = resolver.query(Uri.parse(accountUri),
64                UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
65
66        return getPopulatedAccountObject(accountCursor);
67    }
68
69
70    @Override
71    protected boolean isAccountValid(Context context, com.android.mail.providers.Account account) {
72        if (account != null) {
73            final ContentResolver resolver = context.getContentResolver();
74            final Cursor accountCursor = resolver.query(account.uri,
75                    UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
76            if (accountCursor != null) {
77                try {
78                    return accountCursor.getCount() > 0;
79                } finally {
80                    accountCursor.close();
81                }
82            }
83        }
84        return false;
85    }
86
87    @Override
88    protected void migrateLegacyWidgetInformation(Context context, int widgetId) {
89        final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
90        final SharedPreferences.Editor editor = prefs.edit();
91
92        long accountId = loadAccountIdPref(context, widgetId);
93        long mailboxId = loadMailboxIdPref(context, widgetId);
94        // Legacy support; if preferences haven't been saved for this widget, load something
95        if (accountId == Account.NO_ACCOUNT || mailboxId == Mailbox.NO_MAILBOX) {
96            LogUtils.d(LOG_TAG, "Couldn't load account or mailbox.  accountId: %d" +
97                    " mailboxId: %d widgetId %d", accountId, mailboxId);
98            return;
99        }
100
101        accountId = migrateLegacyWidgetAccountId(accountId);
102        mailboxId = migrateLegacyWidgetMailboxId(mailboxId, accountId);
103
104        // Get Account and folder objects for the account id and mailbox id
105        final com.android.mail.providers.Account uiAccount = getAccount(context, accountId);
106        final Folder uiFolder = EmailProvider.getFolder(context, mailboxId);
107
108        if (uiAccount != null && uiFolder != null) {
109            WidgetService.saveWidgetInformation(context, widgetId, uiAccount,
110                    uiFolder.uri.toString());
111
112            updateWidgetInternal(context, widgetId, uiAccount, uiFolder.type, uiFolder.uri,
113                    uiFolder.conversationListUri, uiFolder.name);
114
115            // Now remove the old legacy preference value
116            editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId);
117            editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId);
118        }
119        editor.apply();
120    }
121
122    private static long migrateLegacyWidgetAccountId(long accountId) {
123        if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
124            return EmailProvider.COMBINED_ACCOUNT_ID;
125        }
126        return accountId;
127    }
128
129    /**
130     * @param accountId The migrated accountId
131     * @return
132     */
133    private static long migrateLegacyWidgetMailboxId(long mailboxId, long accountId) {
134        if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
135            return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_INBOX);
136        } else if (mailboxId == Mailbox.QUERY_ALL_UNREAD) {
137            return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_ALL_UNREAD);
138        }
139        return mailboxId;
140    }
141
142    private static com.android.mail.providers.Account getAccount(Context context, long accountId) {
143        final ContentResolver resolver = context.getContentResolver();
144        final Cursor ac = resolver.query(EmailProvider.uiUri("uiaccount", accountId),
145                UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
146
147        com.android.mail.providers.Account uiAccount = getPopulatedAccountObject(ac);
148
149        return uiAccount;
150    }
151
152    private static com.android.mail.providers.Account getPopulatedAccountObject(
153            final Cursor accountCursor) {
154        if (accountCursor == null) {
155            LogUtils.e(LOG_TAG, "Null account cursor");
156            return null;
157        }
158
159        com.android.mail.providers.Account uiAccount = null;
160        try {
161            if (accountCursor.moveToFirst()) {
162                 uiAccount = new com.android.mail.providers.Account(accountCursor);
163            }
164        } finally {
165            accountCursor.close();
166        }
167        return uiAccount;
168    }
169
170    /**
171     * Returns the saved account ID for the given widget. Otherwise,
172     * {@link com.android.emailcommon.provider.Account#NO_ACCOUNT} if
173     * the account ID was not previously saved.
174     */
175    static long loadAccountIdPref(Context context, int appWidgetId) {
176        final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
177        long accountId = prefs.getLong(LEGACY_ACCOUNT_ID_PREFIX + appWidgetId, Account.NO_ACCOUNT);
178        return accountId;
179    }
180
181    /**
182     * Returns the saved mailbox ID for the given widget. Otherwise,
183     * {@link com.android.emailcommon.provider.Mailbox#NO_MAILBOX} if
184     * the mailbox ID was not previously saved.
185     */
186    static long loadMailboxIdPref(Context context, int appWidgetId) {
187        final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
188        long mailboxId = prefs.getLong(LEGACY_MAILBOX_ID_PREFIX + appWidgetId, Mailbox.NO_MAILBOX);
189        return mailboxId;
190    }
191}
192