1 /* 2 * Copyright (C) 2013 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 package com.android.email.preferences; 17 18 import android.content.Context; 19 import android.database.Cursor; 20 import android.net.Uri; 21 import android.text.TextUtils; 22 23 import com.android.email.Preferences; 24 import com.android.emailcommon.provider.EmailContent; 25 import com.android.emailcommon.provider.EmailContent.AccountColumns; 26 import com.android.mail.preferences.BasePreferenceMigrator; 27 import com.android.mail.preferences.FolderPreferences; 28 import com.android.mail.preferences.MailPrefs; 29 import com.android.mail.providers.Account; 30 import com.android.mail.providers.Folder; 31 import com.android.mail.providers.UIProvider; 32 import com.android.mail.utils.LogUtils; 33 34 import java.util.ArrayList; 35 import java.util.List; 36 import java.util.Set; 37 38 /** 39 * Migrates Email settings to UnifiedEmail 40 */ 41 public class EmailPreferenceMigrator extends BasePreferenceMigrator { 42 private static final String LOG_TAG = "EmailPrefMigrator"; 43 44 @Override migrate(final Context context, final int oldVersion, final int newVersion)45 protected void migrate(final Context context, final int oldVersion, final int newVersion) { 46 final List<Account> accounts = new ArrayList<Account>(); 47 48 final Cursor accountCursor = context.getContentResolver().query(Uri.parse( 49 EmailContent.CONTENT_URI + "/uiaccts"), 50 UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null); 51 52 if (accountCursor == null) { 53 LogUtils.wtf(LOG_TAG, 54 "Null cursor returned from query to %s when migrating accounts from %d to %d", 55 EmailContent.CONTENT_URI + "/uiaccts", 56 oldVersion, newVersion); 57 } else { 58 try { 59 while (accountCursor.moveToNext()) { 60 accounts.add(Account.builder().buildFrom(accountCursor)); 61 } 62 } finally { 63 accountCursor.close(); 64 } 65 } 66 67 migrate(context, oldVersion, newVersion, accounts); 68 } 69 70 @SuppressWarnings("deprecation") migrate(final Context context, final int oldVersion, final int newVersion, final List<Account> accounts)71 protected static void migrate(final Context context, final int oldVersion, final int newVersion, 72 final List<Account> accounts) { 73 final Preferences preferences = Preferences.getPreferences(context); 74 final MailPrefs mailPrefs = MailPrefs.get(context); 75 if (oldVersion < 1) { 76 // Move global settings 77 78 final boolean hasSwipeDelete = preferences.hasSwipeDelete(); 79 if (hasSwipeDelete) { 80 final boolean swipeDelete = preferences.getSwipeDelete(); 81 mailPrefs.setConversationListSwipeEnabled(swipeDelete); 82 } 83 84 // Move reply-all setting 85 final boolean isReplyAllSet = preferences.hasReplyAll(); 86 if (isReplyAllSet) { 87 final boolean replyAll = preferences.getReplyAll(); 88 mailPrefs.setDefaultReplyAll(replyAll); 89 } 90 91 // Move folder notification settings 92 for (final Account account : accounts) { 93 // Get the emailcommon account 94 final Cursor ecAccountCursor = context.getContentResolver().query( 95 com.android.emailcommon.provider.Account.CONTENT_URI, 96 com.android.emailcommon.provider.Account.CONTENT_PROJECTION, 97 AccountColumns.EMAIL_ADDRESS + " = ?", 98 new String[] { account.getEmailAddress() }, 99 null); 100 final com.android.emailcommon.provider.Account ecAccount = 101 new com.android.emailcommon.provider.Account(); 102 103 104 if (ecAccountCursor == null) { 105 LogUtils.e(LOG_TAG, "Null old account cursor for mailbox %s", 106 LogUtils.sanitizeName(LOG_TAG, account.getEmailAddress())); 107 continue; 108 } 109 110 try { 111 if (ecAccountCursor.moveToFirst()) { 112 ecAccount.restore(ecAccountCursor); 113 } else { 114 LogUtils.e(LOG_TAG, "Couldn't load old account for mailbox %s", 115 LogUtils.sanitizeName(LOG_TAG, account.getEmailAddress())); 116 continue; 117 } 118 } finally { 119 ecAccountCursor.close(); 120 } 121 122 // The only setting in AccountPreferences so far is a global notification toggle, 123 // but we only allow Inbox notifications, so it will remain unused 124 final Cursor folderCursor = 125 context.getContentResolver().query(account.settings.defaultInbox, 126 UIProvider.FOLDERS_PROJECTION, null, null, null); 127 128 if (folderCursor == null) { 129 LogUtils.e(LOG_TAG, "Null folder cursor for mailbox %s", 130 LogUtils.sanitizeName(LOG_TAG, 131 account.settings.defaultInbox.toString())); 132 continue; 133 } 134 135 Folder folder = null; 136 try { 137 if (folderCursor.moveToFirst()) { 138 folder = new Folder(folderCursor); 139 } else { 140 LogUtils.e(LOG_TAG, "Empty folder cursor for mailbox %s", 141 LogUtils.sanitizeName(LOG_TAG, 142 account.settings.defaultInbox.toString())); 143 continue; 144 } 145 } finally { 146 folderCursor.close(); 147 } 148 149 final FolderPreferences folderPreferences = 150 new FolderPreferences(context, account.getEmailAddress(), folder, 151 true /* inbox */); 152 153 final boolean notify = (ecAccount.getFlags() 154 & com.android.emailcommon.provider.Account.FLAGS_NOTIFY_NEW_MAIL) != 0; 155 folderPreferences.setNotificationsEnabled(notify); 156 157 final String ringtoneUri = ecAccount.getRingtone(); 158 folderPreferences.setNotificationRingtoneUri(ringtoneUri); 159 160 final boolean vibrate = (ecAccount.getFlags() 161 & com.android.emailcommon.provider.Account.FLAGS_VIBRATE) != 0; 162 folderPreferences.setNotificationVibrateEnabled(vibrate); 163 164 folderPreferences.commit(); 165 } 166 } 167 168 if (oldVersion < 2) { 169 final Set<String> whitelistedAddresses = preferences.getWhitelistedSenderAddresses(); 170 mailPrefs.setSenderWhitelist(whitelistedAddresses); 171 } 172 173 if (oldVersion < 3) { 174 // The default for the conversation list icon is the sender image. 175 final boolean showSenderImages = !TextUtils.equals( 176 Preferences.CONV_LIST_ICON_NONE, preferences.getConversationListIcon()); 177 mailPrefs.setShowSenderImages(showSenderImages); 178 } 179 180 if (oldVersion < 4) { 181 final boolean confirmDelete = preferences.getConfirmDelete(); 182 mailPrefs.setConfirmDelete(confirmDelete); 183 184 final boolean confirmSend = preferences.getConfirmSend(); 185 mailPrefs.setConfirmSend(confirmSend); 186 187 final int autoAdvance = preferences.getAutoAdvanceDirection(); 188 switch(autoAdvance) { 189 case Preferences.AUTO_ADVANCE_OLDER: 190 mailPrefs.setAutoAdvanceMode(UIProvider.AutoAdvance.OLDER); 191 case Preferences.AUTO_ADVANCE_NEWER: 192 mailPrefs.setAutoAdvanceMode(UIProvider.AutoAdvance.NEWER); 193 case Preferences.AUTO_ADVANCE_MESSAGE_LIST: 194 default: 195 mailPrefs.setAutoAdvanceMode(UIProvider.AutoAdvance.LIST); 196 } 197 } 198 } 199 } 200