EmailPreferenceActivity.java revision fd14496c494a0d38c35c3788c9cc55f1984592e4
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; 279c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadlerimport com.android.email.provider.EmailContent.AccountColumns; 28464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport com.android.email.service.MailService; 292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Activity; 311a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.AlertDialog; 321a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.Dialog; 331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.DialogFragment; 342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Fragment; 35464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport android.content.Context; 361a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.content.DialogInterface; 372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.content.Intent; 382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.database.Cursor; 392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.AsyncTask; 402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.Bundle; 412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.preference.PreferenceActivity; 422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.util.Log; 4357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadlerimport android.view.KeyEvent; 44b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.view.View; 45b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.view.View.OnClickListener; 46b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadlerimport android.widget.Button; 472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport java.util.List; 492ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler/** 51fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Handles account preferences, using multi-pane arrangement when possible. 52fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * 53fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This activity uses the following fragments: 54fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * AccountSettingsFragment 55fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Account{Incoming/Outgoing/Exchange}Fragment 56fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * AccountCheckSettingsFragment 57fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * GeneralPreferences 58fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * DebugFragment 592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: In Account settings in Phone UI, change title 6151224176259b1b3126087c69814ccf652cb398b9Andrew Stadler * TODO: Rework all remaining calls to DB from UI thread 62464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * TODO: Delete account - on single-pane view (phone UX) the account list doesn't update properly 63464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * TODO: Handle dynamic changes to the account list (exit if necessary). It probably makes 64464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * sense to use a loader for the accounts list, because it would provide better support for 65464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * dealing with accounts being added/deleted and triggering the header reload. 662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 671a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpublic class AccountSettingsXL extends PreferenceActivity implements OnClickListener { 682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 699c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // Intent extras for our internal activity launch 709c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler /* package */ static final String EXTRA_ACCOUNT_ID = "AccountSettingsXL.account_id"; 7157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private static final String EXTRA_ENABLE_DEBUG = "AccountSettingsXL.enable_debug"; 7257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 739c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // Intent extras for launch directly from system account manager 749c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // NOTE: This string must match the one in res/xml/account_preferences.xml 759c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private static final String ACTION_ACCOUNT_MANAGER_ENTRY = 769c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler "com.android.email.activity.setup.ACCOUNT_MANAGER_ENTRY"; 779c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // NOTE: This constant should eventually be defined in android.accounts.Constants 789c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private static final String EXTRA_ACCOUNT_MANAGER_ACCOUNT = "account"; 799c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 8057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // Key codes used to open a debug settings fragment. 8157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private static final int[] SECRET_KEY_CODES = { 8257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_B, KeyEvent.KEYCODE_U, 8357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler KeyEvent.KEYCODE_G 8457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler }; 8557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private int mSecretKeyCodeIndex = 0; 8657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 879c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // Support for account-by-name lookup 889c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private static final String SELECTION_ACCOUNT_EMAIL_ADDRESS = 899c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler AccountColumns.EMAIL_ADDRESS + "=?"; 909c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 919c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // When the user taps "Email Preferences" 10 times in a row, we'll enable the debug settings. 9257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private int mNumGeneralHeaderClicked = 0; 932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 9451224176259b1b3126087c69814ccf652cb398b9Andrew Stadler private long mRequestedAccountId; 959c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private Header mRequestedAccountHeader; 96464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private ExtendedHeader[] mAccountListHeaders; 972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private Header mAppPreferencesHeader; 982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private int mCurrentHeaderPosition; 999c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler /* package */ Fragment mCurrentFragment; 100a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private long mDeletingAccountId = -1; 10157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private boolean mShowDebugMenu; 102b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler private Button mAddAccountButton; 1031a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private List<Header> mGeneratedHeaders; 1042ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1052ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Async Tasks 1062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private LoadAccountListTask mLoadAccountListTask; 1079c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private GetAccountIdFromAccountTask mGetAccountIdFromAccountTask; 1082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Specific callbacks used by settings fragments 1101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private final AccountSettingsFragmentCallback mAccountSettingsFragmentCallback 1112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler = new AccountSettingsFragmentCallback(); 1121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private final AccountServerSettingsFragmentCallback mAccountServerSettingsFragmentCallback 1131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler = new AccountServerSettingsFragmentCallback(); 1142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 1162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Display (and edit) settings for a specific account, or -1 for any/all accounts 1172ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 1182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public static void actionSettings(Activity fromActivity, long accountId) { 1192ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Intent i = new Intent(fromActivity, AccountSettingsXL.class); 1202ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler i.putExtra(EXTRA_ACCOUNT_ID, accountId); 1212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler fromActivity.startActivity(i); 1222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 12557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler * Launch generic settings and pre-enable the debug preferences 1262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 12757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler public static void actionSettingsWithDebug(Context fromContext) { 12857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler Intent i = new Intent(fromContext, AccountSettingsXL.class); 12957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 13057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler i.putExtra(EXTRA_ENABLE_DEBUG, true); 13157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler fromContext.startActivity(i); 13257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 1332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onCreate(Bundle savedInstanceState) { 1362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onCreate(savedInstanceState); 1372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Intent i = getIntent(); 1399c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler if (ACTION_ACCOUNT_MANAGER_ENTRY.equals(i.getAction())) { 1409c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // This case occurs if we're changing account settings from Settings -> Accounts 1419c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mGetAccountIdFromAccountTask = 1429c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler (GetAccountIdFromAccountTask) new GetAccountIdFromAccountTask().execute(i); 1439c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } else { 1449c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // Otherwise, we're called from within the Email app and look for our extra 1459c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mRequestedAccountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1); 1469c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 14757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false); 148b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 149b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler // Add Account as header list footer 150b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler // TODO: This probably should be some sort of themed layout with a button in it 151b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler if (hasHeaders()) { 152b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton = new Button(this); 153b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setText(R.string.add_account_action); 154b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setOnClickListener(this); 155b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler mAddAccountButton.setEnabled(false); 156b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler setListFooter(mAddAccountButton); 157b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 158b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 1592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onResume() { 1632ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onResume(); 1642ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler updateAccounts(); 1651a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 1661a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // When we're resuming, enable/disable the add account button 1671a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (mAddAccountButton != null && hasHeaders()) { 1681a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mAddAccountButton.setEnabled(shouldShowNewAccount()); 1691a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 1702ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 1732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler protected void onDestroy() { 1742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onDestroy(); 1752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountListTask); 1762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mLoadAccountListTask = null; 1779c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler Utility.cancelTaskInterrupt(mGetAccountIdFromAccountTask); 1789c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mGetAccountIdFromAccountTask = null; 1792ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 1802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 1812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 18257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler * Listen for secret sequence and, if heard, enable debug menu 18357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler */ 18457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler @Override 18557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler public boolean onKeyDown(int keyCode, KeyEvent event) { 18657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) { 18757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex++; 18857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) { 18957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex = 0; 19057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler enableDebugMenu(); 19157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 19257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } else { 19357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mSecretKeyCodeIndex = 0; 19457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 19557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler return super.onKeyDown(keyCode, event); 19657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 19757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 198b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler @Override 199b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler public void onClick(View v) { 200b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler if (v == mAddAccountButton) { 201b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler onAddNewAccount(); 202b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 203b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler } 204b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler 2059c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler /** 2069c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * If the caller requested a specific account to be edited, switch to it. This is a one-shot, 2079c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * so the user is free to edit another account as well. 2089c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler */ 2099c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler @Override 2109c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler public Header onGetNewHeader() { 2119c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler Header result = mRequestedAccountHeader; 2129c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mRequestedAccountHeader = null; 2139c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler return result; 2149c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 2159c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 21657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler private void enableDebugMenu() { 21757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mShowDebugMenu = true; 21857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler invalidateHeaders(); 21957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 22057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler 22157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler /** 222a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * Decide if "add account" should be shown 223a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler */ 224a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private boolean shouldShowNewAccount() { 225a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If in single pane mode, only add accounts at top level 226a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (!isMultiPane()) { 227a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (!hasHeaders()) return false; 228a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } else { 229a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If in multi pane mode, only add accounts when showing a top level fragment 230a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // Note: null is OK; This is the case when we first launch the activity 231a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if ((mCurrentFragment != null) 232464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler && !(mCurrentFragment instanceof GeneralPreferences) 23357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler && !(mCurrentFragment instanceof DebugFragment) 234a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler && !(mCurrentFragment instanceof AccountSettingsFragment)) return false; 235a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 236a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler return true; 237a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 238a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 239a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler private void onAddNewAccount() { 240a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler AccountSetupBasics.actionNewAccount(this); 241a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 242a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 243a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler /** 2442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Start the async reload of the accounts list (if the headers are being displayed) 2452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 2462ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private void updateAccounts() { 2472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (hasHeaders()) { 2482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Utility.cancelTaskInterrupt(mLoadAccountListTask); 249bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki mLoadAccountListTask = (LoadAccountListTask) 250a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler new LoadAccountListTask().execute(mDeletingAccountId); 2512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 2532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 2542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 2552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Write the current header (accounts) array into the one provided by the PreferenceActivity. 256464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Skip any headers that match mDeletingAccountId (this is a quick-hide algorithm while a 2579c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * background thread works on deleting the account). Also sets mRequestedAccountHeader if 2589c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * we find the requested account (by id). 2592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 2602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 2612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onBuildHeaders(List<Header> target) { 2629c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler // Assume the account is unspecified 2639c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mRequestedAccountHeader = null; 2649c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 265464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Always add app preferences as first header 266464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler target.clear(); 267464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler target.add(getAppPreferencesHeader()); 2689c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 269464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Then add zero or more account headers as necessary 270464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (mAccountListHeaders != null) { 271464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler int headerCount = mAccountListHeaders.length; 272464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler for (int index = 0; index < headerCount; index++) { 2739c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler ExtendedHeader header = mAccountListHeaders[index]; 2749c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler if (header.accountId != mDeletingAccountId) { 2759c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler target.add(header); 2769c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler if (header.accountId == mRequestedAccountId) { 2779c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mRequestedAccountHeader = header; 2781a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mRequestedAccountId = -1; 2799c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 280464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 281464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 282464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 2839c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 28457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // finally, if debug header is enabled, show it 28557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mShowDebugMenu) { 28657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler // setup lightweight header for debugging 28757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler Header debugHeader = new Header(); 28857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.title = getText(R.string.debug_title); 28957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.summary = null; 29057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.iconRes = 0; 29157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.icon = null; 29257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.fragment = DebugFragment.class.getCanonicalName(); 29357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler debugHeader.fragmentArguments = null; 29457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler target.add(debugHeader); 29557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 2961a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 2971a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // Save for later use (see forceSwitch) 2981a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mGeneratedHeaders = target; 299464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 300464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 301464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler /** 302464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Generate and return the first header, for app preferences 303464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler */ 304464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private Header getAppPreferencesHeader() { 3052ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // Set up fixed header for general settings 3062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (mAppPreferencesHeader == null) { 3072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader = new Header(); 3082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.title = getText(R.string.header_label_general_preferences); 3092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.summary = null; 3102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.iconRes = 0; 3112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.icon = null; 3120f52e546ef662e126b7360ad69c8c8f838789ef3Makoto Onuki mAppPreferencesHeader.fragment = GeneralPreferences.class.getCanonicalName(); 3132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAppPreferencesHeader.fragmentArguments = null; 3142ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 315464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler return mAppPreferencesHeader; 316464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 317464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 318464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler /** 319464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Overloaded version of Header adds AccountId to make it easier to keep track 320464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * Note, this is also stored inside the argument bundle, but this is more efficient 321464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler * for quick scans, etc. 322464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler */ 323464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private class ExtendedHeader extends Header { 3249c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler public final long accountId; 325464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 326464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler public ExtendedHeader(long _accountId, String _title, String _summary) { 327464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler title = _title; 328464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler summary = _summary; 329464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler fragment = AccountSettingsFragment.class.getCanonicalName(); 330464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler fragmentArguments = AccountSettingsFragment.buildArguments(_accountId); 331464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler accountId = _accountId; 3322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * This AsyncTask reads the accounts list and generates the headers. When the headers are 3372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * ready, we'll trigger PreferenceActivity to refresh the account list with them. 3382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 3392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Smaller projection 3402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * TODO: Convert to Loader 341a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * TODO: Write a test, including operation of deletingAccountId param 3422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 343464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler private class LoadAccountListTask extends AsyncTask<Long, Void, Object[]> { 3442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 346464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler protected Object[] doInBackground(Long... params) { 347464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader[] result = null; 348464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Boolean deletingAccountFound = false; 349a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler long deletingAccountId = params[0]; 3502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Cursor c = getContentResolver().query( 3522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler EmailContent.Account.CONTENT_URI, 3532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler EmailContent.Account.CONTENT_PROJECTION, null, null, null); 3542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 3552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler int index = 0; 3562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler int headerCount = c.getCount(); 357464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler result = new ExtendedHeader[headerCount]; 3582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler while (c.moveToNext()) { 360a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler long accountId = c.getLong(Account.CONTENT_ID_COLUMN); 361a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (accountId == deletingAccountId) { 362464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler deletingAccountFound = true; 363a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler continue; 364a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 3652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler String title = c.getString(Account.CONTENT_DISPLAY_NAME_COLUMN); 3662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler String summary = c.getString(Account.CONTENT_EMAIL_ADDRESS_COLUMN); 367464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader newHeader = new ExtendedHeader(accountId, title, summary); 3682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler result[index++] = newHeader; 3692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3702ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } finally { 3712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (c != null) { 3722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler c.close(); 3732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 375464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler return new Object[] { result, deletingAccountFound }; 3762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3772ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 379464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler protected void onPostExecute(Object[] result) { 380464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (this.isCancelled() || result == null) return; 381464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Extract the results 382464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler ExtendedHeader[] headers = (ExtendedHeader[]) result[0]; 383464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler boolean deletingAccountFound = (Boolean) result[1]; 384a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // report the settings 3852ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mAccountListHeaders = headers; 3862ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.invalidateHeaders(); 387464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler if (!deletingAccountFound) { 388464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler mDeletingAccountId = -1; 389464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler } 3902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 3922ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 3932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 3942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Called when the user selects an item in the header list. Handles save-data cases as needed 3952ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * 3962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * @param header The header that was selected. 3972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * @param position The header's position in the list. 3982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 3992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler @Override 4002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onHeaderClick(Header header, int position) { 4011a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // special case when exiting the server settings fragments 4021a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (mCurrentFragment instanceof AccountServerBaseFragment) { 4031a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (position != mCurrentHeaderPosition) { 4041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler UnsavedChangesDialogFragment dialogFragment = 4051a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler UnsavedChangesDialogFragment.newInstance(position); 4061a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG); 4071a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4081a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler return; 4091a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 4111a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // Secret keys: Click 10x to enable debug settings 41257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (position == 0) { 41357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mNumGeneralHeaderClicked++; 41457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler if (mNumGeneralHeaderClicked == 10) { 41557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler enableDebugMenu(); 41657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 41757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } else { 41857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler mNumGeneralHeaderClicked = 0; 41957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler } 4201a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 4211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // Process header click normally 4221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mCurrentHeaderPosition = position; 4232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler super.onHeaderClick(header, position); 4242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 4271a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Switch to a specific header without checking for server settings fragments as done 4281a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * in {@link #onHeaderClick(Header, int)}. Called after we interrupted a header switch 4291a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * with a dialog, and the user OK'd it. 4301a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */ 4311a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private void forceSwitchHeader(int newPosition) { 4321a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mCurrentHeaderPosition = newPosition; 4331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler Header header = mGeneratedHeaders.get(newPosition); 4341a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler switchToHeader(header.fragment, header.fragmentArguments); 4351a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4361a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 4371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler /** 4381a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Called by fragments at onAttach time 4392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 4402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onAttach(Fragment f) { 4412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler mCurrentFragment = f; 4422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler // dispatch per-fragment setup 4432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (f instanceof AccountSettingsFragment) { 4442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsFragment asf = (AccountSettingsFragment) f; 4452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler asf.setCallback(mAccountSettingsFragmentCallback); 4461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } else if (mCurrentFragment instanceof AccountServerBaseFragment) { 4471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler AccountServerBaseFragment asbf = (AccountServerBaseFragment) mCurrentFragment; 4481a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler asbf.setCallback(mAccountServerSettingsFragmentCallback); 4491a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4501a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 4511a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // When we're changing fragments, enable/disable the add account button 4521a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (mAddAccountButton != null && hasHeaders()) { 4531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler mAddAccountButton.setEnabled(shouldShowNewAccount()); 4541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 4582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler * Callbacks for AccountSettingsFragment 4592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 4602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler private class AccountSettingsFragmentCallback implements AccountSettingsFragment.Callback { 4612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onIncomingSettings(Account account) { 4622ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.onIncomingSettings(account); 4632ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4642ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onOutgoingSettings(Account account) { 4652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler AccountSettingsXL.this.onOutgoingSettings(account); 4662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void abandonEdit() { 4682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler finish(); 4692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 470a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler public void deleteAccount(Account account) { 471a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler AccountSettingsXL.this.deleteAccount(account); 472a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 4732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 4742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 4752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 4761a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Callbacks for AccountServerSettingsFragmentCallback 4771a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */ 4781a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private class AccountServerSettingsFragmentCallback 4791a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler implements AccountServerBaseFragment.Callback { 4801a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 4811a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler public void onEnableProceedButtons(boolean enable) { 4821a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // This is not used - it's a callback for the legacy activities 4831a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 484fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler 4851a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 486fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler public void onProceedNext(int checkMode, AccountServerBaseFragment target) { 487fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler AccountCheckSettingsFragment checkerFragment = 488fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler AccountCheckSettingsFragment.newInstance(checkMode, target); 489fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler startPreferenceFragment(checkerFragment, true); 490fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler } 491fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler 492fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler /** 493fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * After verifying a new server configuration as OK, we return here and continue. This 494fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * simply does a "back" to exit the settings screen. 495fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */ 496fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler public void onCheckSettingsOk(int setupMode) { 497fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler onBackPressed(); 4981a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 4991a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 5001a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 5011a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler /** 5021a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Dispatch to edit incoming settings. 5031a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * 5041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * TODO: Cache the store lookup earlier, in an AsyncTask, to avoid this DB access 5051a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * TODO: Make things less hardwired 5062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 5072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onIncomingSettings(Account account) { 5082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 5092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Store store = Store.getInstance(account.getStoreUri(this), getApplication(), null); 5102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (store != null) { 5112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Class<? extends android.app.Activity> setting = store.getSettingActivityClass(); 5122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (setting != null) { 5131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// java.lang.reflect.Method m = setting.getMethod("actionEditIncomingSettings", 5141a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// Activity.class, int.class, Account.class); 5151a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); 5161a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler SetupData.init(SetupData.FLOW_MODE_EDIT, account); 5171a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler Fragment f = null; 5181a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (setting.equals(AccountSetupIncoming.class)) { 5191a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler f = new AccountSetupIncomingFragment(); 5201a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } else if (setting.equals(AccountSetupExchange.class)) { 5211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler f = new AccountSetupExchangeFragment(); 5221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 5231a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler startPreferenceFragment(f, true); 5242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } catch (Exception e) { 5272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Log.d(Email.LOG_TAG, "Error while trying to invoke store settings.", e); 5282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 5312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 5321a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Dispatch to edit outgoing settings. 5331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * 5341a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * TODO: Cache the store lookup earlier, in an AsyncTask, to avoid this DB access 5351a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * TODO: Make things less hardwired 5362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler */ 5372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler public void onOutgoingSettings(Account account) { 5382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler try { 5392ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Sender sender = Sender.getInstance(getApplication(), account.getSenderUri(this)); 5402ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (sender != null) { 5412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Class<? extends android.app.Activity> setting = sender.getSettingActivityClass(); 5422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler if (setting != null) { 5431a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// java.lang.reflect.Method m = setting.getMethod("actionEditOutgoingSettings", 5441a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// Activity.class, int.class, Account.class); 5451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler// m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); 5461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler SetupData.init(SetupData.FLOW_MODE_EDIT, account); 5471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler Fragment f = null; 5481a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler if (setting.equals(AccountSetupOutgoing.class)) { 5491a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler f = new AccountSetupOutgoingFragment(); 5501a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 5511a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler startPreferenceFragment(f, true); 5522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } catch (Exception e) { 5552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler Log.d(Email.LOG_TAG, "Error while trying to invoke sender settings.", e); 5562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler } 5582ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler 5592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler /** 560a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler * Delete the selected account 561a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler */ 562bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki public void deleteAccount(Account account) { 563464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Kick off the work to actually delete the account 564464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 565464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Clear notifications, which may become stale here 566bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki MailService.cancelNewMessageNotification(this); 567464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 568464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Delete the account (note, this is async. Would be nice to get a callback. 569464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Controller.getInstance(this).deleteAccount(account.mId); 570464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler 571464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler // Then update the UI as appropriate: 572a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // If single pane, return to the header list. If multi, rebuild header list 573a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler if (isMultiPane()) { 574464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler Header prefsHeader = getAppPreferencesHeader(); 575464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler this.switchToHeader(prefsHeader.fragment, prefsHeader.fragmentArguments); 576a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler mDeletingAccountId = account.mId; 577a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler invalidateHeaders(); 578a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } else { 579a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // We should only be calling this while showing AccountSettingsFragment, 580a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler // so a finish() should bring us back to headers. No point hiding the deleted account. 581a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler finish(); 582a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 583a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler } 584a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler 585a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler /** 5869c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * This AsyncTask looks up an account based on its email address (which is what we get from 5879c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * the Account Manager). When the account id is determined, we refresh the header list, 5889c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler * which will select the preferences for that account. 5899c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler */ 5909c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler private class GetAccountIdFromAccountTask extends AsyncTask<Intent, Void, Long> { 5919c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 5929c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler @Override 5939c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler protected Long doInBackground(Intent... params) { 5949c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler Intent intent = params[0]; 5959c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler android.accounts.Account acct = 5969c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler (android.accounts.Account) intent.getParcelableExtra(EXTRA_ACCOUNT_MANAGER_ACCOUNT); 5979c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler return Utility.getFirstRowLong(AccountSettingsXL.this, Account.CONTENT_URI, 5989c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler Account.ID_PROJECTION, SELECTION_ACCOUNT_EMAIL_ADDRESS, new String[] {acct.name}, 5999c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler null, Account.ID_PROJECTION_COLUMN, -1L); 6009c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 6019c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 6029c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler @Override 6039c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler protected void onPostExecute(Long accountId) { 6049c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler if (accountId != -1 && !isCancelled()) { 6059c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler mRequestedAccountId = accountId; 6069c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler AccountSettingsXL.this.invalidateHeaders(); 6079c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 6089c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 6099c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler } 6109c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler 6119c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler /** 6121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Dialog fragment to show "exit with unsaved changes?" dialog 6131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */ 6141a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler public static class UnsavedChangesDialogFragment extends DialogFragment { 6151a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private final static String TAG = "UnsavedChangesDialogFragment"; 6161a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 6171a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler // Argument bundle keys 6181a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler private final static String BUNDLE_KEY_NEW_HEADER = "UnsavedChangesDialogFragment.Header"; 6191a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 6201a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler /** 6211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Create the dialog with parameters 6221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */ 6231a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler public static UnsavedChangesDialogFragment newInstance(int newPosition) { 6241a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment(); 6251a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler Bundle b = new Bundle(); 6261a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler b.putInt(BUNDLE_KEY_NEW_HEADER, newPosition); 6271a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler f.setArguments(b); 6281a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler return f; 6291a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 6301a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 6311a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler @Override 6321a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler public Dialog onCreateDialog(Bundle savedInstanceState) { 6331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler final AccountSettingsXL activity = (AccountSettingsXL) getActivity(); 6341a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler final int newPosition = getArguments().getInt(BUNDLE_KEY_NEW_HEADER); 6351a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 6361a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler return new AlertDialog.Builder(activity) 6371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .setIcon(android.R.drawable.ic_dialog_alert) 6381a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .setTitle(android.R.string.dialog_alert_title) 6391a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .setMessage(R.string.account_settings_exit_server_settings) 6401a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .setPositiveButton( 6411a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler R.string.okay_action, 6421a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler new DialogInterface.OnClickListener() { 6431a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler public void onClick(DialogInterface dialog, int which) { 6441a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler activity.forceSwitchHeader(newPosition); 6451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler dismiss(); 6461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 6471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler }) 6481a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .setNegativeButton( 6491a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler activity.getString(R.string.cancel_action), 6501a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler null) 6511a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler .create(); 6521a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 6531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler } 6541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler 6552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler} 656