EmailPreferenceActivity.java revision b387560384d38e3280090176a0f3b2cf8b1f9ab5
12ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler/* 22ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Copyright (C) 2010 The Android Open Source Project 32ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 42ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 52ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * you may not use this file except in compliance with the License. 62ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * You may obtain a copy of the License at 72ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 82ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 92ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Unless required by applicable law or agreed to in writing, software 112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * See the License for the specific language governing permissions and 142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * limitations under the License. 152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 172ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerpackage com.android.email.activity.setup; 182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 19464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport com.android.email.Controller; 202ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.Email; 212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.R; 222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.Utility; 232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.mail.Sender; 242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.mail.Store; 252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.provider.EmailContent; 262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport com.android.email.provider.EmailContent.Account; 27464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport com.android.email.service.MailService; 282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Activity; 302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Fragment; 31464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport android.content.Context; 322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.content.Intent; 332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.database.Cursor; 342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.AsyncTask; 352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.Bundle; 362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.preference.PreferenceActivity; 372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.preference.PreferenceFragment; 382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.util.Log; 3957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadlerimport android.view.KeyEvent; 40b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.view.View; 41b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.view.View.OnClickListener; 42b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.widget.Button; 432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport java.util.List; 452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 462ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler/** 472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Handles account preferences using multi-pane arrangement when possible. 482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 4951224176259b1b3126087c69814ccf652cb398b9Andrew Stadler * TODO: Go directly to specific account when requested - post runnable after onBuildHeaders 502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Incorporate entry point & other stuff to support launch from AccountManager 512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: In Account settings in Phone UI, change title 5251224176259b1b3126087c69814ccf652cb398b9Andrew Stadler * TODO: Rework all remaining calls to DB from UI thread 53464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * TODO: Delete account - on single-pane view (phone UX) the account list doesn't update properly 54464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * TODO: Handle dynamic changes to the account list (exit if necessary). It probably makes 55464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * sense to use a loader for the accounts list, because it would provide better support for 56464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * dealing with accounts being added/deleted and triggering the header reload. 572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerpublic class AccountSettingsXL extends PreferenceActivity 59b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler implements AccountSettingsFragment.OnAttachListener, OnClickListener { 602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private static final String EXTRA_ACCOUNT_ID = "AccountSettingsXL.account_id"; 6257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private static final String EXTRA_ENABLE_DEBUG = "AccountSettingsXL.enable_debug"; 6357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 6457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // Key codes used to open a debug settings fragment. 6557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private static final int[] SECRET_KEY_CODES = { 6657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_B, KeyEvent.KEYCODE_U, 6757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler KeyEvent.KEYCODE_G 6857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler }; 6957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private int mSecretKeyCodeIndex = 0; 7057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 7157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler /** 7257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler * When the user taps "Email Preferences" 10 times in a row, we'll enable the debug settings. 7357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler */ 7457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private int mNumGeneralHeaderClicked = 0; 752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 7651224176259b1b3126087c69814ccf652cb398b9Andrew Stadler private long mRequestedAccountId; 77464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private ExtendedHeader[] mAccountListHeaders; 782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private Header mAppPreferencesHeader; 792ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private int mCurrentHeaderPosition; 802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private Fragment mCurrentFragment; 81a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private long mDeletingAccountId = -1; 8257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private boolean mShowDebugMenu; 83b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler private Button mAddAccountButton; 842ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 852ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Async Tasks 862ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private LoadAccountListTask mLoadAccountListTask; 872ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 882ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Specific callbacks used by settings fragments 892ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private AccountSettingsFragmentCallback mAccountSettingsFragmentCallback 902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler = new AccountSettingsFragmentCallback(); 912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 922ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Display (and edit) settings for a specific account, or -1 for any/all accounts 942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 952ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public static void actionSettings(Activity fromActivity, long accountId) { 962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Intent i = new Intent(fromActivity, AccountSettingsXL.class); 972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler i.putExtra(EXTRA_ACCOUNT_ID, accountId); 982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler fromActivity.startActivity(i); 992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1012ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 10257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler * Launch generic settings and pre-enable the debug preferences 1032ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 10457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler public static void actionSettingsWithDebug(Context fromContext) { 10557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler Intent i = new Intent(fromContext, AccountSettingsXL.class); 10657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 10757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler i.putExtra(EXTRA_ENABLE_DEBUG, true); 10857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler fromContext.startActivity(i); 10957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 1102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onCreate(Bundle savedInstanceState) { 1132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onCreate(savedInstanceState); 1142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Intent i = getIntent(); 11651224176259b1b3126087c69814ccf652cb398b9Andrew Stadler mRequestedAccountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1); 11757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false); 118b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 119b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler // Add Account as header list footer 120b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler // TODO: This probably should be some sort of themed layout with a button in it 121b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler if (hasHeaders()) { 122b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton = new Button(this); 123b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setText(R.string.add_account_action); 124b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setOnClickListener(this); 125b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setEnabled(false); 126b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler setListFooter(mAddAccountButton); 127b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 128b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 1292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onResume() { 1332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onResume(); 1342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler updateAccounts(); 1352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler protected void onDestroy() { 1392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onDestroy(); 1402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountListTask); 1412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mLoadAccountListTask = null; 1422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 14557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler * Listen for secret sequence and, if heard, enable debug menu 14657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler */ 14757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler @Override 14857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler public boolean onKeyDown(int keyCode, KeyEvent event) { 14957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) { 15057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex++; 15157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) { 15257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex = 0; 15357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler enableDebugMenu(); 15457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 15557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } else { 15657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex = 0; 15757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 15857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler return super.onKeyDown(keyCode, event); 15957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 16057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 161b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler @Override 162b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler public void onClick(View v) { 163b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler if (v == mAddAccountButton) { 164b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler onAddNewAccount(); 165b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 166b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 167b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 16857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private void enableDebugMenu() { 16957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mShowDebugMenu = true; 17057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler invalidateHeaders(); 17157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 17257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 17357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler /** 174a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * Decide if "add account" should be shown 175a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler */ 176a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private boolean shouldShowNewAccount() { 177a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If in single pane mode, only add accounts at top level 178a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (!isMultiPane()) { 179a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (!hasHeaders()) return false; 180a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } else { 181a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If in multi pane mode, only add accounts when showing a top level fragment 182a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // Note: null is OK; This is the case when we first launch the activity 183a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if ((mCurrentFragment != null) 184464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler && !(mCurrentFragment instanceof GeneralPreferences) 18557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler && !(mCurrentFragment instanceof DebugFragment) 186a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler && !(mCurrentFragment instanceof AccountSettingsFragment)) return false; 187a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 188a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler return true; 189a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 190a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 191a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private void onAddNewAccount() { 192a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler AccountSetupBasics.actionNewAccount(this); 193a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 194a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 195a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler /** 1962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Start the async reload of the accounts list (if the headers are being displayed) 1972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 1982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private void updateAccounts() { 1992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (hasHeaders()) { 2002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountListTask); 201bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki mLoadAccountListTask = (LoadAccountListTask) 202a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler new LoadAccountListTask().execute(mDeletingAccountId); 2032ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2042ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2052ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 2072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Write the current header (accounts) array into the one provided by the PreferenceActivity. 208464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Skip any headers that match mDeletingAccountId (this is a quick-hide algorithm while a 209464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * background thread works on deleting the account). 2102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 2112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 2122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onBuildHeaders(List<Header> target) { 213464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Always add app preferences as first header 214464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler target.clear(); 215464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler target.add(getAppPreferencesHeader()); 216464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Then add zero or more account headers as necessary 217464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (mAccountListHeaders != null) { 218464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler int headerCount = mAccountListHeaders.length; 219464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler for (int index = 0; index < headerCount; index++) { 220464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (mAccountListHeaders[index].accountId != mDeletingAccountId) { 221464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler target.add(mAccountListHeaders[index]); 222464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 223464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 224464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 22557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // finally, if debug header is enabled, show it 22657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mShowDebugMenu) { 22757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // setup lightweight header for debugging 22857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler Header debugHeader = new Header(); 22957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.title = getText(R.string.debug_title); 23057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.summary = null; 23157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.iconRes = 0; 23257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.icon = null; 23357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.fragment = DebugFragment.class.getCanonicalName(); 23457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.fragmentArguments = null; 23557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler target.add(debugHeader); 23657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 237464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 238464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 239464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler /** 240464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Generate and return the first header, for app preferences 241464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler */ 242464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private Header getAppPreferencesHeader() { 2432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Set up fixed header for general settings 2442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (mAppPreferencesHeader == null) { 2452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader = new Header(); 2462ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.title = getText(R.string.header_label_general_preferences); 2472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.summary = null; 2482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.iconRes = 0; 2492ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.icon = null; 2502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.fragment = GeneralPreferences.getCanonicalName(); 2512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.fragmentArguments = null; 2522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 253464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler return mAppPreferencesHeader; 254464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 255464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 256464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler /** 257464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Overloaded version of Header adds AccountId to make it easier to keep track 258464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Note, this is also stored inside the argument bundle, but this is more efficient 259464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * for quick scans, etc. 260464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler */ 261464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private class ExtendedHeader extends Header { 262464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler public long accountId; 263464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 264464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler public ExtendedHeader(long _accountId, String _title, String _summary) { 265464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler title = _title; 266464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler summary = _summary; 267464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler fragment = AccountSettingsFragment.class.getCanonicalName(); 268464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler fragmentArguments = AccountSettingsFragment.buildArguments(_accountId); 269464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler accountId = _accountId; 2702ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 2742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * This AsyncTask reads the accounts list and generates the headers. When the headers are 2752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * ready, we'll trigger PreferenceActivity to refresh the account list with them. 2762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 2772ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Smaller projection 2782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Convert to Loader 279a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * TODO: Write a test, including operation of deletingAccountId param 2802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 281464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private class LoadAccountListTask extends AsyncTask<Long, Void, Object[]> { 2822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2832ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 284464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler protected Object[] doInBackground(Long... params) { 285464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader[] result = null; 286464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Boolean deletingAccountFound = false; 287a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler long deletingAccountId = params[0]; 2882ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2892ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Cursor c = getContentResolver().query( 2902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler EmailContent.Account.CONTENT_URI, 2912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler EmailContent.Account.CONTENT_PROJECTION, null, null, null); 2922ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 2932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler int index = 0; 2942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler int headerCount = c.getCount(); 295464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler result = new ExtendedHeader[headerCount]; 2962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler while (c.moveToNext()) { 298a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler long accountId = c.getLong(Account.CONTENT_ID_COLUMN); 299a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (accountId == deletingAccountId) { 300464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler deletingAccountFound = true; 301a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler continue; 302a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 3032ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler String title = c.getString(Account.CONTENT_DISPLAY_NAME_COLUMN); 3042ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler String summary = c.getString(Account.CONTENT_EMAIL_ADDRESS_COLUMN); 305464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader newHeader = new ExtendedHeader(accountId, title, summary); 3062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler result[index++] = newHeader; 3072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } finally { 3092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (c != null) { 3102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler c.close(); 3112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 313464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler return new Object[] { result, deletingAccountFound }; 3142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 317464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler protected void onPostExecute(Object[] result) { 318464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (this.isCancelled() || result == null) return; 319464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Extract the results 320464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader[] headers = (ExtendedHeader[]) result[0]; 321464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler boolean deletingAccountFound = (Boolean) result[1]; 322a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // report the settings 3232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAccountListHeaders = headers; 3242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.invalidateHeaders(); 325464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (!deletingAccountFound) { 326464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler mDeletingAccountId = -1; 327464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 3282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Called when the user selects an item in the header list. Handles save-data cases as needed 3332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 3342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * @param header The header that was selected. 3352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * @param position The header's position in the list. 3362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 3382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onHeaderClick(Header header, int position) { 33957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (position == 0) { 34057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mNumGeneralHeaderClicked++; 34157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mNumGeneralHeaderClicked == 10) { 34257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler enableDebugMenu(); 34357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 34457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } else { 34557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mNumGeneralHeaderClicked = 0; 34657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 3472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (position != mCurrentHeaderPosition) { 3482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // if showing a sub-panel (e.g. server settings) we need to trap & post a dialog 3492ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onHeaderClick(header, position); 3512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Implements AccountSettingsFragment.OnAttachListener 3552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 3572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onAttach(Fragment f) { 3582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mCurrentFragment = f; 3592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // dispatch per-fragment setup 3602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (f instanceof AccountSettingsFragment) { 3612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsFragment asf = (AccountSettingsFragment) f; 3622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler asf.setCallback(mAccountSettingsFragmentCallback); 3632ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } else if (f instanceof AccountSetupIncomingFragment) { 3642ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // TODO 3652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } else if (f instanceof AccountSetupOutgoingFragment) { 3662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // TODO 3672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } else if (f instanceof AccountSetupExchangeFragment) { 3682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // TODO 3692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 370b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler // Since we're changing fragments, enable/disable the add account button 371b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setEnabled(shouldShowNewAccount()); 3722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Callbacks for AccountSettingsFragment 3762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3772ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private class AccountSettingsFragmentCallback implements AccountSettingsFragment.Callback { 3782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onIncomingSettings(Account account) { 3792ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.onIncomingSettings(account); 3802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onOutgoingSettings(Account account) { 3822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.onOutgoingSettings(account); 3832ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3842ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void abandonEdit() { 3852ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler finish(); 3862ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 387a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler public void deleteAccount(Account account) { 388a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler AccountSettingsXL.this.deleteAccount(account); 389a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 3902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3922ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * STOPSHIP: non-fragmented dispatch to edit incoming settings. Replace with fragment flip. 3942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3952ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onIncomingSettings(Account account) { 3962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 3972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Store store = Store.getInstance(account.getStoreUri(this), getApplication(), null); 3982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (store != null) { 3992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Class<? extends android.app.Activity> setting = store.getSettingActivityClass(); 4002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (setting != null) { 4012ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler java.lang.reflect.Method m = setting.getMethod("actionEditIncomingSettings", 4022ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Activity.class, int.class, Account.class); 4032ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); 4042ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4052ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } catch (Exception e) { 4072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Log.d(Email.LOG_TAG, "Error while trying to invoke store settings.", e); 4082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 4122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * STOPSHIP: non-fragmented dispatch to edit outgoing settings. Replace with fragment flip. 4132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 4142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onOutgoingSettings(Account account) { 4152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 4162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Sender sender = Sender.getInstance(getApplication(), account.getSenderUri(this)); 4172ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (sender != null) { 4182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Class<? extends android.app.Activity> setting = sender.getSettingActivityClass(); 4192ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (setting != null) { 4202ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler java.lang.reflect.Method m = setting.getMethod("actionEditOutgoingSettings", 4212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Activity.class, int.class, Account.class); 4222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); 4232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } catch (Exception e) { 4262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Log.d(Email.LOG_TAG, "Error while trying to invoke sender settings.", e); 4272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 431a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * Delete the selected account 432a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler */ 433bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki public void deleteAccount(Account account) { 434464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Kick off the work to actually delete the account 435464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 436464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Clear notifications, which may become stale here 437bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki MailService.cancelNewMessageNotification(this); 438464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 439464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Delete the account (note, this is async. Would be nice to get a callback. 440464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Controller.getInstance(this).deleteAccount(account.mId); 441464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 442464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Then update the UI as appropriate: 443a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If single pane, return to the header list. If multi, rebuild header list 444a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (isMultiPane()) { 445464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Header prefsHeader = getAppPreferencesHeader(); 446464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler this.switchToHeader(prefsHeader.fragment, prefsHeader.fragmentArguments); 447a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler mDeletingAccountId = account.mId; 448a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler invalidateHeaders(); 449a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } else { 450a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // We should only be calling this while showing AccountSettingsFragment, 451a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // so a finish() should bring us back to headers. No point hiding the deleted account. 452a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler finish(); 453a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 454a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 455a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 456a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler /** 4572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Placeholder for app-wide preferences 4582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * STOPSHIP - make this real 4592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 4602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public static class GeneralPreferences extends PreferenceFragment { 4612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** STOPSHIP - this is hardcoded for now because getCanonicalName() doesn't return $ */ 4632ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public static String getCanonicalName() { 4642ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler return "com.android.email.activity.setup.AccountSettingsXL$GeneralPreferences"; 4652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 4682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onCreate(Bundle savedInstanceState) { 4692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onCreate(savedInstanceState); 4702ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Load the preferences from an XML resource 4722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler addPreferencesFromResource(R.xml.general_preferences); 4732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler} 476