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