171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler/* 271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Copyright (C) 2010 The Android Open Source Project 371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * 471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * you may not use this file except in compliance with the License. 671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * You may obtain a copy of the License at 771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * 871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * 1071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Unless required by applicable law or agreed to in writing, software 1171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 1271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * See the License for the specific language governing permissions and 1471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * limitations under the License. 1571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 1671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 1771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerpackage com.android.email.activity.setup; 1871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 1971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.app.Activity; 20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.AlertDialog; 21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.Dialog; 22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.DialogFragment; 23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.Fragment; 24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.FragmentTransaction; 2571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.content.ContentResolver; 269f7e3982ada78ab64e82a797186633684d02dec5Andy Stadlerimport android.content.ContentValues; 2771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.content.Context; 28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.DialogInterface; 2971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.content.SharedPreferences; 302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.AsyncTask; 3171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.os.Bundle; 329ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadlerimport android.os.Vibrator; 3371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.CheckBoxPreference; 3471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.EditTextPreference; 3571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.ListPreference; 3671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.Preference; 3771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.PreferenceCategory; 38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.preference.PreferenceFragment; 3971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.preference.RingtonePreference; 4071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.provider.ContactsContract; 41373ccb10377fdebdac7c3fbc96c6e592a1c1d8fbAndy Stadlerimport android.text.TextUtils; 4271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadlerimport android.util.Log; 4371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.Email; 4585e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.R; 46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.mail.Sender; 47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.AccountManagerTypes; 48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.CalendarProviderStub; 4985e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.Logging; 50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.mail.MessagingException; 51f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account; 5285e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.provider.EmailContent; 5385e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.provider.HostAuth; 5485e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.utility.Utility; 55f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 5671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler/** 5771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Fragment containing the main logic for account settings. This also calls out to other 5871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * fragments for server settings. 5971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * 609f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * TODO: Remove or make async the mAccountDirty reload logic. Probably no longer needed. 612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Can we defer calling addPreferencesFromResource() until after we load the account? This 622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * could reduce flicker. 6371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class AccountSettingsFragment extends PreferenceFragment { 652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Keys used for arguments bundle 672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private static final String BUNDLE_KEY_ACCOUNT_ID = "AccountSettingsFragment.AccountId"; 683955f6794f23c1380749d4470b5f2264d2109adcBen Komalo private static final String BUNDLE_KEY_ACCOUNT_EMAIL = "AccountSettingsFragment.Email"; 692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 7034704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy public static final String PREFERENCE_DESCRIPTION = "account_description"; 7171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_NAME = "account_name"; 7271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_SIGNATURE = "account_signature"; 735a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo private static final String PREFERENCE_QUICK_RESPONSES = "account_quick_responses"; 7471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_FREQUENCY = "account_check_frequency"; 75946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler private static final String PREFERENCE_BACKGROUND_ATTACHMENTS = 76946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler "account_background_attachments"; 7771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_DEFAULT = "account_default"; 7872a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo private static final String PREFERENCE_CATEGORY_DATA_USAGE = "data_usage"; 799ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler private static final String PREFERENCE_CATEGORY_NOTIFICATIONS = "account_notifications"; 8071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_NOTIFY = "account_notify"; 813c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy private static final String PREFERENCE_VIBRATE = "account_settings_vibrate"; 823c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy private static final String PREFERENCE_VIBRATE_OLD = "account_settings_vibrate_when"; 8371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_RINGTONE = "account_ringtone"; 849ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler private static final String PREFERENCE_CATEGORY_SERVER = "account_servers"; 8571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_INCOMING = "incoming"; 8671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_OUTGOING = "outgoing"; 8771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_SYNC_CONTACTS = "account_sync_contacts"; 8871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static final String PREFERENCE_SYNC_CALENDAR = "account_sync_calendar"; 89cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank private static final String PREFERENCE_SYNC_EMAIL = "account_sync_email"; 90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private static final String PREFERENCE_DELETE_ACCOUNT = "delete_account"; 91266064bcc7c6ed7318a284d59bb83d53edbf1921Marc Blank 9271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private EditTextPreference mAccountDescription; 9371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private EditTextPreference mAccountName; 9471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private EditTextPreference mAccountSignature; 9571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private ListPreference mCheckFrequency; 9671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private ListPreference mSyncWindow; 97946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler private CheckBoxPreference mAccountBackgroundAttachments; 9871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private CheckBoxPreference mAccountDefault; 9971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private CheckBoxPreference mAccountNotify; 1003c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy private CheckBoxPreference mAccountVibrate; 10171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private RingtonePreference mAccountRingtone; 10271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private CheckBoxPreference mSyncContacts; 10371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private CheckBoxPreference mSyncCalendar; 104cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank private CheckBoxPreference mSyncEmail; 10571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 10671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private Context mContext; 10771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private Account mAccount; 10871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private boolean mAccountDirty; 1099f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler private long mDefaultAccountId; 11071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private Callback mCallback = EmptyCallback.INSTANCE; 11171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private boolean mStarted; 11271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private boolean mLoaded; 1132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private boolean mSaveOnExit; 1142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1153955f6794f23c1380749d4470b5f2264d2109adcBen Komalo /** The e-mail of the account being edited. */ 1163955f6794f23c1380749d4470b5f2264d2109adcBen Komalo private String mAccountEmail; 1173955f6794f23c1380749d4470b5f2264d2109adcBen Komalo 1182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Async Tasks 1192ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private AsyncTask<?,?,?> mLoadAccountTask; 12071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 12171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 1222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Callback interface that owning activities must provide 12371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 12471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public interface Callback { 12534704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy public void onSettingsChanged(Account account, String preference, Object value); 1265a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public void onEditQuickResponses(Account account); 1272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onIncomingSettings(Account account); 1282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onOutgoingSettings(Account account); 12971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void abandonEdit(); 130bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void deleteAccount(Account account); 13171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 13271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 13371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private static class EmptyCallback implements Callback { 13471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public static final Callback INSTANCE = new EmptyCallback(); 13534704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy @Override public void onSettingsChanged(Account account, String preference, Object value) {} 1365a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo @Override public void onEditQuickResponses(Account account) {} 13734704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy @Override public void onIncomingSettings(Account account) {} 13834704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy @Override public void onOutgoingSettings(Account account) {} 13934704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy @Override public void abandonEdit() {} 140bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override public void deleteAccount(Account account) {} 14171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 14271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 14371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 1442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * If launching with an arguments bundle, use this method to build the arguments. 1452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 1463955f6794f23c1380749d4470b5f2264d2109adcBen Komalo public static Bundle buildArguments(long accountId, String email) { 1472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Bundle b = new Bundle(); 1482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler b.putLong(BUNDLE_KEY_ACCOUNT_ID, accountId); 1493955f6794f23c1380749d4470b5f2264d2109adcBen Komalo b.putString(BUNDLE_KEY_ACCOUNT_EMAIL, email); 1502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler return b; 1512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1533955f6794f23c1380749d4470b5f2264d2109adcBen Komalo public static String getTitleFromArgs(Bundle args) { 1543955f6794f23c1380749d4470b5f2264d2109adcBen Komalo return (args == null) ? null : args.getString(BUNDLE_KEY_ACCOUNT_EMAIL); 1553955f6794f23c1380749d4470b5f2264d2109adcBen Komalo } 1563955f6794f23c1380749d4470b5f2264d2109adcBen Komalo 157cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank @Override 1582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onAttach(Activity activity) { 1592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onAttach(activity); 1602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mContext = activity; 1612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1632ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 16471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Called to do initial creation of a fragment. This is called after 16571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. 16671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 16771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 16871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onCreate(Bundle savedInstanceState) { 169bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 17031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onCreate"); 17171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 17271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onCreate(savedInstanceState); 17371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 1743c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy upgradeVibrateSetting(); 1753c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy 17671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // Load the preferences from an XML resource 17771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler addPreferencesFromResource(R.xml.account_settings_preferences); 1782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1792ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Start loading the account data, if provided in the arguments 1802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // If not, activity must call startLoadingAccount() directly 1812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Bundle b = getArguments(); 1822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (b != null) { 1832ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler long accountId = b.getLong(BUNDLE_KEY_ACCOUNT_ID, -1); 1843955f6794f23c1380749d4470b5f2264d2109adcBen Komalo mAccountEmail = b.getString(BUNDLE_KEY_ACCOUNT_EMAIL); 1852ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (accountId >= 0 && !mLoaded) { 1862ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler startLoadingAccount(accountId); 1872ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1882ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 18955110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler 19055110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler mAccountDirty = false; 19171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 19271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 1933c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy /** 1943c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy * Upgrades the old tri-state vibrate setting to the new boolean value. 1953c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy */ 1963c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy private void upgradeVibrateSetting() { 1973c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy final SharedPreferences sharedPreferences = getPreferenceManager().getSharedPreferences(); 1983c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy 1993c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy if (!sharedPreferences.contains(PREFERENCE_VIBRATE)) { 2003c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy // Try to migrate the old one 2013c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy final boolean vibrate = 2023c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy "always".equals(sharedPreferences.getString(PREFERENCE_VIBRATE_OLD, "")); 2033c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy sharedPreferences.edit().putBoolean(PREFERENCE_VIBRATE, vibrate); 2043c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy } 2053c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy } 2063c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy 20771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 20871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onActivityCreated(Bundle savedInstanceState) { 209bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 21031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onActivityCreated"); 21171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 21271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onActivityCreated(savedInstanceState); 21371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 21471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 21571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 21671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Called when the Fragment is visible to the user. 21771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 21871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 21971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onStart() { 220bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 22131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStart"); 22271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 22371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onStart(); 22471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mStarted = true; 2252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // If the loaded account is ready now, load the UI 22771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler if (mAccount != null && !mLoaded) { 22871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler loadSettings(); 22971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 23071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 23171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 23271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 23371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Called when the fragment is visible to the user and actively running. 2349f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * TODO: Don't read account data on UI thread. This should be fixed by removing the need 2359f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * to do this, not by spinning up yet another thread. 23671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 23771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 23871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onResume() { 239bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 24031d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onResume"); 24171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 24271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onResume(); 24371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 24471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler if (mAccountDirty) { 24571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // if we are coming back from editing incoming or outgoing settings, 24671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // we need to refresh them here so we don't accidentally overwrite the 24771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // old values we're still holding here 24871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.mHostAuthRecv = 24971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv); 25071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.mHostAuthSend = 25171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeySend); 25271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // Because "delete policy" UI is on edit incoming settings, we have 25371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // to refresh that as well. 25471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler Account refreshedAccount = Account.restoreAccountWithId(mContext, mAccount.mId); 25571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler if (refreshedAccount == null || mAccount.mHostAuthRecv == null 25671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler || mAccount.mHostAuthSend == null) { 2572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mSaveOnExit = false; 25871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mCallback.abandonEdit(); 25971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler return; 26071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 26171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setDeletePolicy(refreshedAccount.getDeletePolicy()); 26271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDirty = false; 26371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 26471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 26571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 26671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 26771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onPause() { 268bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 26931d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onPause"); 27071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 27171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onPause(); 2729f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler if (mSaveOnExit) { 2739f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler saveSettings(); 2749f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler } 27571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 27671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 27771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 27871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Called when the Fragment is no longer started. 27971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 28071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 28171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onStop() { 282bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 28331d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onStop"); 28471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 28571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onStop(); 28671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mStarted = false; 28771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 28871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 28971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 29071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Called when the fragment is no longer in use. 29171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 29271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 29371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onDestroy() { 294bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 29531d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onDestroy"); 29671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 29771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onDestroy(); 2982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountTask); 3002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mLoadAccountTask = null; 30171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 30271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 30371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler @Override 30471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void onSaveInstanceState(Bundle outState) { 305bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 30631d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank Log.d(Logging.LOG_TAG, "AccountSettingsFragment onSaveInstanceState"); 30771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 30871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler super.onSaveInstanceState(outState); 30971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 31071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 31171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 31271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Activity provides callbacks here 31371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 31471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public void setCallback(Callback callback) { 31571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback; 31671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 31771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 31871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 3192ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Start loading a single account in preparation for editing it 32071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 3212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void startLoadingAccount(long accountId) { 3222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountTask); 323bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki mLoadAccountTask = new LoadAccountTask().executeOnExecutor( 324bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki AsyncTask.THREAD_POOL_EXECUTOR, accountId); 3252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Async task to load account in order to view/edit it 3292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3309f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler private class LoadAccountTask extends AsyncTask<Long, Void, Object[]> { 3312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 3329f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler protected Object[] doInBackground(Long... params) { 3332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler long accountId = params[0]; 3342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Account account = Account.restoreAccountWithId(mContext, accountId); 3352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (account != null) { 3362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler account.mHostAuthRecv = 3372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler HostAuth.restoreHostAuthWithId(mContext, account.mHostAuthKeyRecv); 3382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler account.mHostAuthSend = 3392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler HostAuth.restoreHostAuthWithId(mContext, account.mHostAuthKeySend); 3402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (account.mHostAuthRecv == null || account.mHostAuthSend == null) { 3412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler account = null; 3422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3449f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler long defaultAccountId = Account.getDefaultAccountId(mContext); 3459f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler return new Object[] { account, Long.valueOf(defaultAccountId) }; 34671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 3472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 3499f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler protected void onPostExecute(Object[] results) { 3509f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler if (results != null && !isCancelled()) { 3519f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler Account account = (Account) results[0]; 3522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (account == null) { 3532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mSaveOnExit = false; 3542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mCallback.abandonEdit(); 3552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } else { 3562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAccount = account; 3579f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler mDefaultAccountId = (Long) results[1]; 3582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (mStarted && !mLoaded) { 3592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler loadSettings(); 3602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 36371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 36471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 36571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 36671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler /** 36771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler * Load account data into preference UI 36871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler */ 36971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler private void loadSettings() { 37071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // We can only do this once, so prevent repeat 37171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mLoaded = true; 3722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Once loaded the data is ready to be saved, as well 3739f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler mSaveOnExit = false; 37471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 37571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDescription = (EditTextPreference) findPreference(PREFERENCE_DESCRIPTION); 37671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDescription.setSummary(mAccount.getDisplayName()); 37771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDescription.setText(mAccount.getDisplayName()); 378bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountDescription.setOnPreferenceChangeListener( 379bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Preference.OnPreferenceChangeListener() { 380bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 381bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String summary = newValue.toString().trim(); 382bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (TextUtils.isEmpty(summary)) { 383bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook summary = mAccount.mEmailAddress; 384bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 385bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountDescription.setSummary(summary); 386bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountDescription.setText(summary); 387bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(PREFERENCE_DESCRIPTION, summary); 388bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return false; 389bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 390bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 391bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ); 39271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 39371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountName = (EditTextPreference) findPreference(PREFERENCE_NAME); 3942d6a98aedf10a8f836ae2e02ddbdec597cf53899Andy Stadler String senderName = mAccount.getSenderName(); 3952d6a98aedf10a8f836ae2e02ddbdec597cf53899Andy Stadler // In rare cases, sendername will be null; Change this to empty string to avoid NPE's 3962d6a98aedf10a8f836ae2e02ddbdec597cf53899Andy Stadler if (senderName == null) senderName = ""; 3972d6a98aedf10a8f836ae2e02ddbdec597cf53899Andy Stadler mAccountName.setSummary(senderName); 3982d6a98aedf10a8f836ae2e02ddbdec597cf53899Andy Stadler mAccountName.setText(senderName); 399bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 400bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 401bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String summary = newValue.toString().trim(); 402bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (!TextUtils.isEmpty(summary)) { 403bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountName.setSummary(summary); 404bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountName.setText(summary); 405bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(PREFERENCE_NAME, summary); 406bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 407bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return false; 408bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 409bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 41071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 41171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountSignature = (EditTextPreference) findPreference(PREFERENCE_SIGNATURE); 412bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String signature = mAccount.getSignature(); 41371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountSignature.setText(mAccount.getSignature()); 414bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountSignature.setOnPreferenceChangeListener( 415bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Preference.OnPreferenceChangeListener() { 416bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 417bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Clean up signature if it's only whitespace (which is easy to do on a 418bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // soft keyboard) but leave whitespace in place otherwise, to give the user 419bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // maximum flexibility, e.g. the ability to indent 420bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String signature = newValue.toString(); 421bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (signature.trim().isEmpty()) { 422bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook signature = ""; 423bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 424bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountSignature.setText(signature); 425bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(PREFERENCE_SIGNATURE, signature); 426bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return false; 427bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 428bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 42971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 43071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mCheckFrequency = (ListPreference) findPreference(PREFERENCE_FREQUENCY); 431bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 432bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // TODO Move protocol into Account to avoid retrieving the HostAuth (implicitly) 43385e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blank String protocol = Account.getProtocol(mContext, mAccount.mId); 434bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (HostAuth.SCHEME_EAS.equals(protocol)) { 435bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCheckFrequency.setEntries(R.array.account_settings_check_frequency_entries_push); 436bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCheckFrequency.setEntryValues(R.array.account_settings_check_frequency_values_push); 437bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 438bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 43971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mCheckFrequency.setValue(String.valueOf(mAccount.getSyncInterval())); 44071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mCheckFrequency.setSummary(mCheckFrequency.getEntry()); 441bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCheckFrequency.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 442bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 443bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String summary = newValue.toString(); 444bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook int index = mCheckFrequency.findIndexOfValue(summary); 445bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCheckFrequency.setSummary(mCheckFrequency.getEntries()[index]); 446bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCheckFrequency.setValue(summary); 447bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(PREFERENCE_FREQUENCY, newValue); 448bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return false; 449bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 450bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 45171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 4525a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo findPreference(PREFERENCE_QUICK_RESPONSES).setOnPreferenceClickListener( 4535a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo new Preference.OnPreferenceClickListener() { 4545a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo @Override 4555a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public boolean onPreferenceClick(Preference preference) { 4565a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo mAccountDirty = true; 4575a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo mCallback.onEditQuickResponses(mAccount); 4585a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo return true; 4595a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 4605a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo }); 4615a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 46271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // Add check window preference 46372a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo PreferenceCategory dataUsageCategory = 46472a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo (PreferenceCategory) findPreference(PREFERENCE_CATEGORY_DATA_USAGE); 46572a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo 46671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow = null; 467bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (HostAuth.SCHEME_EAS.equals(protocol)) { 46871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow = new ListPreference(mContext); 46971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setTitle(R.string.account_setup_options_mail_window_label); 47071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setValue(String.valueOf(mAccount.getSyncLookback())); 47171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setSummary(mSyncWindow.getEntry()); 472919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank MailboxSettings.setupLookbackPreferenceOptions(mContext, mSyncWindow, mAccount); 47372a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo 47472a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo // Must correspond to the hole in the XML file that's reserved. 47572a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo mSyncWindow.setOrder(2); 47671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 47771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public boolean onPreferenceChange(Preference preference, Object newValue) { 47871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler final String summary = newValue.toString(); 47971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler int index = mSyncWindow.findIndexOfValue(summary); 48071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setSummary(mSyncWindow.getEntries()[index]); 48171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncWindow.setValue(summary); 482bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(preference.getKey(), newValue); 48371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler return false; 48471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 48571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler }); 48672a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo dataUsageCategory.addPreference(mSyncWindow); 48771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 48871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 489bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Show "background attachments" for IMAP & EAS - hide it for POP3. 490946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler mAccountBackgroundAttachments = (CheckBoxPreference) 491946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler findPreference(PREFERENCE_BACKGROUND_ATTACHMENTS); 492bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (HostAuth.SCHEME_POP3.equals(mAccount.mHostAuthRecv.mProtocol)) { 49372a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo dataUsageCategory.removePreference(mAccountBackgroundAttachments); 494946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler } else { 495946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler mAccountBackgroundAttachments.setChecked( 496946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler 0 != (mAccount.getFlags() & Account.FLAGS_BACKGROUND_ATTACHMENTS)); 497bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountBackgroundAttachments.setOnPreferenceChangeListener(mPreferenceChangeListener); 498946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler } 499946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler 50071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT); 5019f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler mAccountDefault.setChecked(mAccount.mId == mDefaultAccountId); 502bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountDefault.setOnPreferenceChangeListener(mPreferenceChangeListener); 50371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 50471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountNotify = (CheckBoxPreference) findPreference(PREFERENCE_NOTIFY); 50571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountNotify.setChecked(0 != (mAccount.getFlags() & Account.FLAGS_NOTIFY_NEW_MAIL)); 506bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountNotify.setOnPreferenceChangeListener(mPreferenceChangeListener); 50771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 50871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountRingtone = (RingtonePreference) findPreference(PREFERENCE_RINGTONE); 509bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountRingtone.setOnPreferenceChangeListener(mPreferenceChangeListener); 51071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 51171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // The following two lines act as a workaround for the RingtonePreference 51271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // which does not let us set/get the value programmatically 51371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); 514bd29c3090305ce415fb29ba7af339a1359c746d3Brad Fitzpatrick prefs.edit().putString(PREFERENCE_RINGTONE, mAccount.getRingtone()).apply(); 51571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 5169ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler // Set the vibrator value, or hide it on devices w/o a vibrator 5173c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy mAccountVibrate = (CheckBoxPreference) findPreference(PREFERENCE_VIBRATE); 5189ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); 5199ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler if (vibrator.hasVibrator()) { 5207d28a1c27936fce22af99d0ae5ec63e609eeac3eVikram Aggarwal // Calculate the value to set based on the choices, and set the value. 5213c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy final boolean vibrate = 0 != (mAccount.getFlags() & Account.FLAGS_VIBRATE); 5223c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy mAccountVibrate.setChecked(vibrate); 5233c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy 5243c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy // When the value is changed, update the setting. 5253c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy mAccountVibrate.setOnPreferenceChangeListener( 526bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Preference.OnPreferenceChangeListener() { 527bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 528bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 5293c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy final boolean vibrateSetting = (Boolean) newValue; 5303c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy mAccountVibrate.setChecked(vibrateSetting); 5313c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy onPreferenceChanged(PREFERENCE_VIBRATE, newValue); 532bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return false; 533bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 534bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 5359ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler } else { 5367d28a1c27936fce22af99d0ae5ec63e609eeac3eVikram Aggarwal // No vibrator present. Remove the preference altogether. 5379ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler PreferenceCategory notificationsCategory = (PreferenceCategory) 5389ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS); 5393c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy notificationsCategory.removePreference(mAccountVibrate); 5409ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler } 54171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 54271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler findPreference(PREFERENCE_INCOMING).setOnPreferenceClickListener( 54371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler new Preference.OnPreferenceClickListener() { 54471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public boolean onPreferenceClick(Preference preference) { 54571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDirty = true; 5462ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mCallback.onIncomingSettings(mAccount); 54771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler return true; 54871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 54971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler }); 55071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 55171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler // Hide the outgoing account setup link if it's not activated 55271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler Preference prefOutgoing = findPreference(PREFERENCE_OUTGOING); 553bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook boolean showOutgoing = true; 554bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook try { 555bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Sender sender = Sender.getInstance(mContext, mAccount); 556bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (sender != null) { 557bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Class<? extends android.app.Activity> setting = sender.getSettingActivityClass(); 558bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook showOutgoing = (setting != null); 559bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 560bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } catch (MessagingException me) { 561bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // just leave showOutgoing as true - bias towards showing it, so user can fix it 562bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 563bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (showOutgoing) { 56471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler prefOutgoing.setOnPreferenceClickListener( 56571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler new Preference.OnPreferenceClickListener() { 56671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler public boolean onPreferenceClick(Preference preference) { 56771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccountDirty = true; 5682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mCallback.onOutgoingSettings(mAccount); 56971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler return true; 57071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 57171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler }); 57271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } else { 57371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler PreferenceCategory serverCategory = (PreferenceCategory) findPreference( 5749ce244b2e3382f20e762154e23cb623bc0151fc9Andy Stadler PREFERENCE_CATEGORY_SERVER); 57571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler serverCategory.removePreference(prefOutgoing); 57671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 57771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 57871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncContacts = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CONTACTS); 57971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncCalendar = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_CALENDAR); 580cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank mSyncEmail = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_EMAIL); 581bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (mAccount.mHostAuthRecv.mProtocol.equals(HostAuth.SCHEME_EAS)) { 58271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress, 583bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook AccountManagerTypes.TYPE_EXCHANGE); 584bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSyncContacts.setChecked(ContentResolver 585bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .getSyncAutomatically(acct, ContactsContract.AUTHORITY)); 586bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSyncContacts.setOnPreferenceChangeListener(mPreferenceChangeListener); 587bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSyncCalendar.setChecked(ContentResolver 588bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .getSyncAutomatically(acct, CalendarProviderStub.AUTHORITY)); 589bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSyncCalendar.setOnPreferenceChangeListener(mPreferenceChangeListener); 590cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank mSyncEmail.setChecked(ContentResolver 591cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank .getSyncAutomatically(acct, EmailContent.AUTHORITY)); 592bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSyncEmail.setOnPreferenceChangeListener(mPreferenceChangeListener); 59371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } else { 59472a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo dataUsageCategory.removePreference(mSyncContacts); 59572a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo dataUsageCategory.removePreference(mSyncCalendar); 59672a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo dataUsageCategory.removePreference(mSyncEmail); 59771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 598bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 599bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Temporary home for delete account 600bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Preference prefDeleteAccount = findPreference(PREFERENCE_DELETE_ACCOUNT); 601bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook prefDeleteAccount.setOnPreferenceClickListener( 602bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Preference.OnPreferenceClickListener() { 603bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceClick(Preference preference) { 604bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook DeleteAccountFragment dialogFragment = DeleteAccountFragment.newInstance( 605bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccount, AccountSettingsFragment.this); 606bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook FragmentTransaction ft = getFragmentManager().beginTransaction(); 607bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ft.addToBackStack(null); 608bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook dialogFragment.show(ft, DeleteAccountFragment.TAG); 609bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return true; 610bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 611bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 61271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 61371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 6149f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler /** 615bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Generic onPreferenceChanged listener for the preferences (above) that just need 616bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * to be written, without extra tweaks 617bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 618bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final Preference.OnPreferenceChangeListener mPreferenceChangeListener = 619bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Preference.OnPreferenceChangeListener() { 620bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public boolean onPreferenceChange(Preference preference, Object newValue) { 621bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook onPreferenceChanged(preference.getKey(), newValue); 622bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return true; 623bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 624bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 625bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 626bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** 6279f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * Called any time a preference is changed. 6289f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler */ 629bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private void onPreferenceChanged(String preference, Object value) { 63034704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy mCallback.onSettingsChanged(mAccount, preference, value); 6319f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler mSaveOnExit = true; 6329f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler } 6339f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler 6342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /* 6359f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * Note: This writes the settings on the UI thread. This has to be done so the settings are 6369f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler * committed before we might be killed. 6372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 6389f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler private void saveSettings() { 639946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler // Turn off all controlled flags - will turn them back on while checking UI elements 64071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler int newFlags = mAccount.getFlags() & 64171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler ~(Account.FLAGS_NOTIFY_NEW_MAIL | 6423c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy Account.FLAGS_VIBRATE | 643946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler Account.FLAGS_BACKGROUND_ATTACHMENTS); 64471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 6452866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo newFlags |= mAccountBackgroundAttachments.isChecked() ? 646946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler Account.FLAGS_BACKGROUND_ATTACHMENTS : 0; 64771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setDefaultAccount(mAccountDefault.isChecked()); 648373ccb10377fdebdac7c3fbc96c6e592a1c1d8fbAndy Stadler // If the display name has been cleared, we'll reset it to the default value (email addr) 649373ccb10377fdebdac7c3fbc96c6e592a1c1d8fbAndy Stadler mAccount.setDisplayName(mAccountDescription.getText().trim()); 650373ccb10377fdebdac7c3fbc96c6e592a1c1d8fbAndy Stadler // The sender name must never be empty (this is enforced by the preference editor) 651373ccb10377fdebdac7c3fbc96c6e592a1c1d8fbAndy Stadler mAccount.setSenderName(mAccountName.getText().trim()); 65271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setSignature(mAccountSignature.getText()); 65371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler newFlags |= mAccountNotify.isChecked() ? Account.FLAGS_NOTIFY_NEW_MAIL : 0; 65471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setSyncInterval(Integer.parseInt(mCheckFrequency.getValue())); 65571cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler if (mSyncWindow != null) { 65671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setSyncLookback(Integer.parseInt(mSyncWindow.getValue())); 65771cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 6583c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy if (mAccountVibrate.isChecked()) { 6593c0b8eeaeb194de986f8adf2fd882080938afd37Scott Kennedy newFlags |= Account.FLAGS_VIBRATE; 66071cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 66171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); 66271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setRingtone(prefs.getString(PREFERENCE_RINGTONE, null)); 66371cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mAccount.setFlags(newFlags); 66471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler 665bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (mAccount.mHostAuthRecv.mProtocol.equals("eas")) { 66671cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler android.accounts.Account acct = new android.accounts.Account(mAccount.mEmailAddress, 667bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook AccountManagerTypes.TYPE_EXCHANGE); 66871cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler ContentResolver.setSyncAutomatically(acct, ContactsContract.AUTHORITY, 66971cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncContacts.isChecked()); 670bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ContentResolver.setSyncAutomatically(acct, CalendarProviderStub.AUTHORITY, 67171cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler mSyncCalendar.isChecked()); 672cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank ContentResolver.setSyncAutomatically(acct, EmailContent.AUTHORITY, 673cae8626fb93f4ac3ada998a7f8de22ecc3d9a052Marc Blank mSyncEmail.isChecked()); 67471cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler } 6759f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler 6769f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // Commit the changes 6779f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // Note, this is done in the UI thread because at this point, we must commit 6789f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // all changes - any time after onPause completes, we could be killed. This is analogous 6799f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // to the way that SharedPreferences tries to work off-thread in apply(), but will pause 6809f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // until completion in onPause(). 6819f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler ContentValues cv = AccountSettingsUtils.getAccountContentValues(mAccount); 6829f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler mAccount.update(mContext, cv); 6839f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler 6849f7e3982ada78ab64e82a797186633684d02dec5Andy Stadler // Run the remaining changes off-thread 685bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Email.setServicesEnabledAsync(mContext); 686bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 687bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 688bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** 689bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Dialog fragment to show "remove account?" dialog 690bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 691bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static class DeleteAccountFragment extends DialogFragment { 692bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String TAG = "DeleteAccountFragment"; 693bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 694bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Argument bundle keys 695bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String BUNDLE_KEY_ACCOUNT_NAME = "DeleteAccountFragment.Name"; 696bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 697bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** 698bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Create the dialog with parameters 699bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 700bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static DeleteAccountFragment newInstance(Account account, Fragment parentFragment) { 701bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook DeleteAccountFragment f = new DeleteAccountFragment(); 702bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Bundle b = new Bundle(); 703bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook b.putString(BUNDLE_KEY_ACCOUNT_NAME, account.getDisplayName()); 704bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook f.setArguments(b); 705bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook f.setTargetFragment(parentFragment, 0); 706bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return f; 707bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 708bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 709bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 710bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Dialog onCreateDialog(Bundle savedInstanceState) { 711bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context = getActivity(); 712bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String name = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME); 713bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 714bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return new AlertDialog.Builder(context) 715bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .setIconAttribute(android.R.attr.alertDialogIcon) 716bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .setTitle(R.string.account_delete_dlg_title) 717bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .setMessage(context.getString(R.string.account_delete_dlg_instructions_fmt, name)) 718bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .setPositiveButton( 719bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook R.string.okay_action, 720bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new DialogInterface.OnClickListener() { 721bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onClick(DialogInterface dialog, int whichButton) { 722bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Fragment f = getTargetFragment(); 723bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (f instanceof AccountSettingsFragment) { 724bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ((AccountSettingsFragment)f).finishDeleteAccount(); 725bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 726bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook dismiss(); 727bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 728bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }) 729bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .setNegativeButton( 730bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook R.string.cancel_action, 731bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new DialogInterface.OnClickListener() { 732bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onClick(DialogInterface dialog, int whichButton) { 733bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook dismiss(); 734bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 735bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }) 736bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook .create(); 737bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 738bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 739bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 740bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** 741bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Callback from delete account dialog - passes the delete command up to the activity 742bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 743bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private void finishDeleteAccount() { 744bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mSaveOnExit = false; 745bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback.deleteAccount(mAccount); 746a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 7473955f6794f23c1380749d4470b5f2264d2109adcBen Komalo 7483955f6794f23c1380749d4470b5f2264d2109adcBen Komalo public String getAccountEmail() { 7493955f6794f23c1380749d4470b5f2264d2109adcBen Komalo // Get the e-mail address of the account being editted, if this is for an existing account. 7503955f6794f23c1380749d4470b5f2264d2109adcBen Komalo return mAccountEmail; 7513955f6794f23c1380749d4470b5f2264d2109adcBen Komalo } 75271cc035c55079bf89283d0acd4ff2712f75a82e1Andrew Stadler} 753