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