Home | History | Annotate | Download | only in provider
      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 
     17 package com.android.email.provider;
     18 
     19 import android.content.ContentResolver;
     20 import android.content.Context;
     21 import android.content.SharedPreferences;
     22 import android.database.Cursor;
     23 import android.net.Uri;
     24 
     25 import com.android.emailcommon.provider.Account;
     26 import com.android.emailcommon.provider.Mailbox;
     27 import com.android.mail.providers.Folder;
     28 import com.android.mail.providers.UIProvider;
     29 import com.android.mail.utils.LogTag;
     30 import com.android.mail.utils.LogUtils;
     31 import com.android.mail.widget.BaseWidgetProvider;
     32 import com.android.mail.widget.WidgetService;
     33 
     34 public 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, widgetId);
     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.folderUri.fullUri.toString());
    111 
    112             updateWidgetInternal(context, widgetId, uiAccount, uiFolder.type, uiFolder.capabilities,
    113                     uiFolder.folderUri.fullUri, 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_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 = com.android.mail.providers.Account.builder().buildFrom(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