151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook/* 251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Copyright (C) 2012 The Android Open Source Project 351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License"); 551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * you may not use this file except in compliance with the License. 651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * You may obtain a copy of the License at 751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * http://www.apache.org/licenses/LICENSE-2.0 951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 1051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Unless required by applicable law or agreed to in writing, software 1151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS, 1251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * See the License for the specific language governing permissions and 1451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * limitations under the License. 1551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 1651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 1751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookpackage com.android.email.provider; 1851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 1951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.content.ContentResolver; 2051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.content.Context; 2151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.content.SharedPreferences; 2251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.database.Cursor; 2351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.net.Uri; 2451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 2551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.emailcommon.provider.Account; 2651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.emailcommon.provider.Mailbox; 2751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.providers.Folder; 2851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.providers.UIProvider; 2951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.utils.LogTag; 3051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.utils.LogUtils; 3151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.widget.BaseWidgetProvider; 3251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport com.android.mail.widget.WidgetService; 3351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 3451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookpublic class WidgetProvider extends BaseWidgetProvider { 3551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook private static final String LEGACY_PREFS_NAME = "com.android.email.widget.WidgetManager"; 3651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook private static final String LEGACY_ACCOUNT_ID_PREFIX = "accountId_"; 3751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook private static final String LEGACY_MAILBOX_ID_PREFIX = "mailboxId_"; 3851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 3951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook private static final String LOG_TAG = LogTag.getLogTag(); 4051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 4151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook /** 4251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Remove preferences when deleting widget 4351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 4451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 4551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook public void onDeleted(Context context, int[] appWidgetIds) { 4651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook super.onDeleted(context, appWidgetIds); 4751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 4851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook // Remove any legacy Email widget information 4951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0); 5051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences.Editor editor = prefs.edit(); 5151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook for (int widgetId : appWidgetIds) { 5251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook // Remove the account in the preference 5351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId); 5451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId); 5551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 5651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook editor.apply(); 5751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 5851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 5951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 6051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook protected com.android.mail.providers.Account getAccountObject( 6151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook Context context, String accountUri) { 6251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final ContentResolver resolver = context.getContentResolver(); 63b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy final Cursor accountCursor = resolver.query(Uri.parse(accountUri), 64b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null); 6551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 66b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy return getPopulatedAccountObject(accountCursor); 6751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 6851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 6951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 7051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 7151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook protected boolean isAccountValid(Context context, com.android.mail.providers.Account account) { 7251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook if (account != null) { 7351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final ContentResolver resolver = context.getContentResolver(); 74b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy final Cursor accountCursor = resolver.query(account.uri, 75b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null); 76b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy if (accountCursor != null) { 7751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook try { 78b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy return accountCursor.getCount() > 0; 7951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } finally { 80b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy accountCursor.close(); 8151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 8251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 8351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 8451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return false; 8551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 8651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 8721959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook @Override 8821959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook protected void migrateLegacyWidgetInformation(Context context, int widgetId) { 8951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0); 9051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences.Editor editor = prefs.edit(); 9151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 9221959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook long accountId = loadAccountIdPref(context, widgetId); 9321959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook long mailboxId = loadMailboxIdPref(context, widgetId); 9421959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook // Legacy support; if preferences haven't been saved for this widget, load something 9521959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook if (accountId == Account.NO_ACCOUNT || mailboxId == Mailbox.NO_MAILBOX) { 9621959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook LogUtils.d(LOG_TAG, "Couldn't load account or mailbox. accountId: %d" + 976580e500318a3ee421516364b4a9314403174734Yu Ping Hu " mailboxId: %d widgetId %d", accountId, mailboxId, widgetId); 9821959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook return; 9921959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook } 10051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 1013a82ad59928864931b826c46413831d7431057f9Mark Wei accountId = migrateLegacyWidgetAccountId(accountId); 1023a82ad59928864931b826c46413831d7431057f9Mark Wei mailboxId = migrateLegacyWidgetMailboxId(mailboxId, accountId); 1033a82ad59928864931b826c46413831d7431057f9Mark Wei 10421959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook // Get Account and folder objects for the account id and mailbox id 10521959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook final com.android.mail.providers.Account uiAccount = getAccount(context, accountId); 106f3618c23208c7db065847aa3d529b5aad87062c0Andrew Sapperstein final Folder uiFolder = EmailProvider.getFolder(context, mailboxId); 10751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 10821959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook if (uiAccount != null && uiFolder != null) { 109dfd2c87740cb3f4fe3d3b882116a6fe00cdcb2bdScott Kennedy WidgetService.saveWidgetInformation(context, widgetId, uiAccount, 110281c6365fb95037ca284dd8c910538639e8b3dcbScott Kennedy uiFolder.folderUri.fullUri.toString()); 11151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 112469c4263760373c1bc330251910ec28005051aa8James Lemieux updateWidgetInternal(context, widgetId, uiAccount, uiFolder.type, uiFolder.capabilities, 113281c6365fb95037ca284dd8c910538639e8b3dcbScott Kennedy uiFolder.folderUri.fullUri, uiFolder.conversationListUri, uiFolder.name); 11451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 11521959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook // Now remove the old legacy preference value 11621959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId); 11721959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId); 11851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 11951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook editor.apply(); 12051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 12151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 1221b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy private static long migrateLegacyWidgetAccountId(long accountId) { 1233a82ad59928864931b826c46413831d7431057f9Mark Wei if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) { 1243a82ad59928864931b826c46413831d7431057f9Mark Wei return EmailProvider.COMBINED_ACCOUNT_ID; 1253a82ad59928864931b826c46413831d7431057f9Mark Wei } 1263a82ad59928864931b826c46413831d7431057f9Mark Wei return accountId; 1273a82ad59928864931b826c46413831d7431057f9Mark Wei } 1283a82ad59928864931b826c46413831d7431057f9Mark Wei 1293a82ad59928864931b826c46413831d7431057f9Mark Wei /** 1303a82ad59928864931b826c46413831d7431057f9Mark Wei * @param accountId The migrated accountId 1313a82ad59928864931b826c46413831d7431057f9Mark Wei * @return 1323a82ad59928864931b826c46413831d7431057f9Mark Wei */ 1331b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy private static long migrateLegacyWidgetMailboxId(long mailboxId, long accountId) { 1343a82ad59928864931b826c46413831d7431057f9Mark Wei if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { 1353a82ad59928864931b826c46413831d7431057f9Mark Wei return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_INBOX); 1363a82ad59928864931b826c46413831d7431057f9Mark Wei } else if (mailboxId == Mailbox.QUERY_ALL_UNREAD) { 137cdee4b0c11400d766ae826e6c01d234c2769554fAndrew Sapperstein return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_UNREAD); 1383a82ad59928864931b826c46413831d7431057f9Mark Wei } 1393a82ad59928864931b826c46413831d7431057f9Mark Wei return mailboxId; 1403a82ad59928864931b826c46413831d7431057f9Mark Wei } 1413a82ad59928864931b826c46413831d7431057f9Mark Wei 142b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy private static com.android.mail.providers.Account getAccount(Context context, long accountId) { 14351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final ContentResolver resolver = context.getContentResolver(); 14451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final Cursor ac = resolver.query(EmailProvider.uiUri("uiaccount", accountId), 145b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null); 14651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 14751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook com.android.mail.providers.Account uiAccount = getPopulatedAccountObject(ac); 14851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 14951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return uiAccount; 15051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 15151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 152b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy private static com.android.mail.providers.Account getPopulatedAccountObject( 153b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy final Cursor accountCursor) { 154b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy if (accountCursor == null) { 15551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook LogUtils.e(LOG_TAG, "Null account cursor"); 15651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return null; 15751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 15851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 15951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook com.android.mail.providers.Account uiAccount = null; 16051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook try { 16151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook if (accountCursor.moveToFirst()) { 1627e75afadb152659e3a237c62e4d95cefb60e228dRay Chen uiAccount = com.android.mail.providers.Account.builder().buildFrom(accountCursor); 16351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 16451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } finally { 16551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook accountCursor.close(); 16651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 16751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return uiAccount; 16851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 16951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 17051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook /** 17151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Returns the saved account ID for the given widget. Otherwise, 17251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * {@link com.android.emailcommon.provider.Account#NO_ACCOUNT} if 17351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * the account ID was not previously saved. 17451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 17551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook static long loadAccountIdPref(Context context, int appWidgetId) { 17651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0); 17751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook long accountId = prefs.getLong(LEGACY_ACCOUNT_ID_PREFIX + appWidgetId, Account.NO_ACCOUNT); 17851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return accountId; 17951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 18051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 18151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook /** 18251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Returns the saved mailbox ID for the given widget. Otherwise, 18351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * {@link com.android.emailcommon.provider.Mailbox#NO_MAILBOX} if 18451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * the mailbox ID was not previously saved. 18551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 18651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook static long loadMailboxIdPref(Context context, int appWidgetId) { 18751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0); 18851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook long mailboxId = prefs.getLong(LEGACY_MAILBOX_ID_PREFIX + appWidgetId, Mailbox.NO_MAILBOX); 18951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook return mailboxId; 19051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 19151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook} 192