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