EmailPreferenceActivity.java revision 72a24f12a2a0a48528cf0f826397e2348fe8ace2
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
1938089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onukiimport android.app.ActionBar;
202ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Activity;
211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.AlertDialog;
221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.Dialog;
231a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.DialogFragment;
242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.app.Fragment;
25464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadlerimport android.content.Context;
261a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.content.DialogInterface;
272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.content.Intent;
28f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadlerimport android.content.res.Resources;
292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.database.Cursor;
30308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onukiimport android.net.Uri;
312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.AsyncTask;
322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.os.Bundle;
332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.preference.PreferenceActivity;
342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport android.util.Log;
3557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadlerimport android.view.KeyEvent;
3697874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadlerimport android.view.Menu;
3797874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadlerimport android.view.MenuItem;
382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
3935b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.Controller;
4035b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.R;
4135b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.activity.ActivityHelper;
4235b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.activity.IntentUtilities;
4335b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.mail.Sender;
4435b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.email.mail.Store;
4535b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.emailcommon.Logging;
4635b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.emailcommon.provider.Account;
4735b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
4835b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blankimport com.android.emailcommon.utility.Utility;
4935b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blank
502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadlerimport java.util.List;
512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler/**
53fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Handles account preferences, using multi-pane arrangement when possible.
54fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
55fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This activity uses the following fragments:
56fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *   AccountSettingsFragment
57fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *   Account{Incoming/Outgoing/Exchange}Fragment
58fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *   AccountCheckSettingsFragment
59fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *   GeneralPreferences
60fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *   DebugFragment
612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler *
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 */
67bc42ab77068947ec5cf7caa9043ade70bc03dd34Jorge Lugopublic class AccountSettings extends PreferenceActivity {
68308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki    /*
69308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki     * Intent to open account settings for account=1
70308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        adb shell am start -a android.intent.action.EDIT \
71308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki            -d '"content://ui.email.android.com/settings?ACCOUNT_ID=1"'
72308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki     */
73308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki
749c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // Intent extras for our internal activity launch
753955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    private static final String EXTRA_ENABLE_DEBUG = "AccountSettings.enable_debug";
763955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    private static final String EXTRA_LOGIN_WARNING_FOR_ACCOUNT = "AccountSettings.for_account";
773955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    private static final String EXTRA_TITLE = "AccountSettings.title";
7857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler
799c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // Intent extras for launch directly from system account manager
809c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // NOTE: This string must match the one in res/xml/account_preferences.xml
819c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private static final String ACTION_ACCOUNT_MANAGER_ENTRY =
829c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        "com.android.email.activity.setup.ACCOUNT_MANAGER_ENTRY";
839c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // NOTE: This constant should eventually be defined in android.accounts.Constants
849c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private static final String EXTRA_ACCOUNT_MANAGER_ACCOUNT = "account";
859c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
865a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo    // Key for arguments bundle for QuickResponse editing
875a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo    private static final String QUICK_RESPONSE_ACCOUNT_KEY = "account";
885a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo
8957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    // Key codes used to open a debug settings fragment.
9057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    private static final int[] SECRET_KEY_CODES = {
9157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_B, KeyEvent.KEYCODE_U,
9257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            KeyEvent.KEYCODE_G
9357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            };
9457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    private int mSecretKeyCodeIndex = 0;
9557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler
969c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // Support for account-by-name lookup
979c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private static final String SELECTION_ACCOUNT_EMAIL_ADDRESS =
989c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        AccountColumns.EMAIL_ADDRESS + "=?";
999c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
1009c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    // When the user taps "Email Preferences" 10 times in a row, we'll enable the debug settings.
10157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    private int mNumGeneralHeaderClicked = 0;
1022ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
10351224176259b1b3126087c69814ccf652cb398b9Andrew Stadler    private long mRequestedAccountId;
1049c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private Header mRequestedAccountHeader;
105a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn    private Header[] mAccountListHeaders;
1062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    private Header mAppPreferencesHeader;
1079c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    /* package */ Fragment mCurrentFragment;
108a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    private long mDeletingAccountId = -1;
10957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    private boolean mShowDebugMenu;
1101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    private List<Header> mGeneratedHeaders;
1112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1122ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    // Async Tasks
1132ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    private LoadAccountListTask mLoadAccountListTask;
1149c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private GetAccountIdFromAccountTask mGetAccountIdFromAccountTask;
1152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    // Specific callbacks used by settings fragments
1171a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    private final AccountSettingsFragmentCallback mAccountSettingsFragmentCallback
1182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            = new AccountSettingsFragmentCallback();
1191a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    private final AccountServerSettingsFragmentCallback mAccountServerSettingsFragmentCallback
1201a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            = new AccountServerSettingsFragmentCallback();
1212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1222ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
1232ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * Display (and edit) settings for a specific account, or -1 for any/all accounts
1242ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
1252ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public static void actionSettings(Activity fromActivity, long accountId) {
126308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        fromActivity.startActivity(createAccountSettingsIntent(fromActivity, accountId, null));
1272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
1282ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1292ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
130d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank     * Create and return an intent to display (and edit) settings for a specific account, or -1
131f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     * for any/all accounts.  If an account name string is provided, a warning dialog will be
132f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     * displayed as well.
133d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank     */
134f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler    public static Intent createAccountSettingsIntent(Context context, long accountId,
135f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            String loginWarningAccountName) {
136308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder("settings");
137308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        IntentUtilities.setAccountId(b, accountId);
138308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        Intent i = new Intent(Intent.ACTION_EDIT, b.build());
139308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        if (loginWarningAccountName != null) {
140308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki            i.putExtra(EXTRA_LOGIN_WARNING_FOR_ACCOUNT, loginWarningAccountName);
141308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki        }
142d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank        return i;
143d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank    }
144d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank
145d3e4f3ca7e43fb7ebaa140f93a44a1fb96a0577eMarc Blank    /**
14657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler     * Launch generic settings and pre-enable the debug preferences
1472ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
14857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    public static void actionSettingsWithDebug(Context fromContext) {
1492866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        Intent i = new Intent(fromContext, AccountSettings.class);
15057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
15157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        i.putExtra(EXTRA_ENABLE_DEBUG, true);
15257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        fromContext.startActivity(i);
15357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    }
1542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    @Override
1562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
1572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        super.onCreate(savedInstanceState);
158cd09545b87979fa6b4337f17b5a001f0ef7b5269Andrew Stadler        ActivityHelper.debugSetWindowFlags(this);
1592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        Intent i = getIntent();
161a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn        if (savedInstanceState == null) {
162a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            // If we are not restarting from a previous instance, we need to
163a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            // figure out the initial prefs to show.  (Otherwise, we want to
164a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            // continue showing whatever the user last selected.)
165a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            if (ACTION_ACCOUNT_MANAGER_ENTRY.equals(i.getAction())) {
166a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                // This case occurs if we're changing account settings from Settings -> Accounts
167a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                mGetAccountIdFromAccountTask =
168bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki                        (GetAccountIdFromAccountTask) new GetAccountIdFromAccountTask()
169bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki                        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, i);
170a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            } else {
171f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                // Otherwise, we're called from within the Email app and look for our extras
172308ce9284793b597797994dfb1fb25155cbe0b20Makoto Onuki                mRequestedAccountId = IntentUtilities.getAccountIdFromIntent(i);
173f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                String loginWarningAccount = i.getStringExtra(EXTRA_LOGIN_WARNING_FOR_ACCOUNT);
174f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                if (loginWarningAccount != null) {
175f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                    // Show dialog (first time only - don't re-show on a rotation)
176f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                    LoginWarningDialog dialog = LoginWarningDialog.newInstance(loginWarningAccount);
177f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                    dialog.show(getFragmentManager(), "loginwarning");
178f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                }
179a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            }
1809c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        }
18157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false);
18238089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki
1833955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        String title = i.getStringExtra(EXTRA_TITLE);
1843955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        if (title != null) {
1853955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            setTitle(title);
1863955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        }
1873955f6794f23c1380749d4470b5f2264d2109adcBen Komalo
18838089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki        getActionBar().setDisplayOptions(
18938089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
1902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
1912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
1922ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    @Override
1932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onResume() {
1942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        super.onResume();
1952ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        updateAccounts();
1968ec0dcfe0d241cdac946a8c131472913c7349492Andy Stadler    }
1978ec0dcfe0d241cdac946a8c131472913c7349492Andy Stadler
1988ec0dcfe0d241cdac946a8c131472913c7349492Andy Stadler    @Override
1992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    protected void onDestroy() {
2002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        super.onDestroy();
2012ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        Utility.cancelTaskInterrupt(mLoadAccountListTask);
2022ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        mLoadAccountListTask = null;
2039c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        Utility.cancelTaskInterrupt(mGetAccountIdFromAccountTask);
2049c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        mGetAccountIdFromAccountTask = null;
2052ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
2062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
2072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
20857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler     * Listen for secret sequence and, if heard, enable debug menu
20957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler     */
21057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    @Override
21157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    public boolean onKeyDown(int keyCode, KeyEvent event) {
21257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) {
21357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            mSecretKeyCodeIndex++;
21457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) {
21557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler                mSecretKeyCodeIndex = 0;
21657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler                enableDebugMenu();
21757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            }
21857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        } else {
21957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            mSecretKeyCodeIndex = 0;
22057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        }
22157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        return super.onKeyDown(keyCode, event);
22257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    }
22357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler
224b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler    @Override
22597874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    public boolean onCreateOptionsMenu(Menu menu) {
22697874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        super.onCreateOptionsMenu(menu);
22797874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        getMenuInflater().inflate(R.menu.account_settings_add_account_option, menu);
22897874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        return true;
22997874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    }
23097874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler
23197874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    @Override
23297874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    public boolean onPrepareOptionsMenu(Menu menu) {
23397874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        return shouldShowNewAccount();
23497874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    }
23597874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler
23697874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    @Override
23797874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler    public boolean onOptionsItemSelected(MenuItem item) {
23897874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        switch (item.getItemId()) {
23938089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki            case android.R.id.home:
24038089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                // The app icon on the action bar is pressed.  Just emulate a back press.
24138089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                // TODO: this should navigate to the main screen, even if a sub-setting is open.
24238089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                // But we shouldn't just finish(), as we want to show "discard changes?" dialog
24338089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                // when necessary.
24438089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                onBackPressed();
24538089f6c4222ab56582899f1f228966c5ebf75e8Makoto Onuki                break;
24697874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler            case R.id.add_new_account:
24797874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler                onAddNewAccount();
24897874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler                break;
24997874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler            default:
25097874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler                return super.onOptionsItemSelected(item);
251b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler        }
25297874770fc7cbe6a89a6ea706658fb42dff77a95Andy Stadler        return true;
253b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler    }
254b387560384d38e3280090176a0f3b2cf8b1f9ab5Andrew Stadler
2553955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    @Override
2563955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,
2573955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            int titleRes, int shortTitleRes) {
2583955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        Intent result = super.onBuildStartFragmentIntent(
2593955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                fragmentName, args, titleRes, shortTitleRes);
2603955f6794f23c1380749d4470b5f2264d2109adcBen Komalo
2613955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        // When opening a sub-settings page (e.g. account specific page), see if we want to modify
2623955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        // the activity title.
2633955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        String title = AccountSettingsFragment.getTitleFromArgs(args);
2643955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        if ((titleRes == 0) && (title != null)) {
2653955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            result.putExtra(EXTRA_TITLE, title);
2663955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        }
2673955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        return result;
2683955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    }
2693955f6794f23c1380749d4470b5f2264d2109adcBen Komalo
2709c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    /**
271c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     * Any time we exit via this pathway, and we are showing a server settings fragment,
272c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     * we put up the exit-save-changes dialog.  This will work for the following cases:
273983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     *   Cancel button
274983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     *   Back button
275983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     *   Up arrow in application icon
276983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     * It will *not* apply in the following cases:
277983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     *   Click the parent breadcrumb - need to find a hook for this
278983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     *   Click in the header list (e.g. another account) - handled elsewhere
279983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     */
280983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler    @Override
281983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler    public void onBackPressed() {
282c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        if (mCurrentFragment instanceof AccountServerBaseFragment) {
2833955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            boolean changed = ((AccountServerBaseFragment) mCurrentFragment).haveSettingsChanged();
284c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            if (changed) {
285c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                UnsavedChangesDialogFragment dialogFragment =
2863955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                        UnsavedChangesDialogFragment.newInstanceForBack();
287c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
288c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                return; // Prevent "back" from being handled
289c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            }
290c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
291983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler        super.onBackPressed();
292983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler    }
293983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler
294983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler    /**
2959c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * If the caller requested a specific account to be edited, switch to it.  This is a one-shot,
2969c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * so the user is free to edit another account as well.
2979c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     */
2989c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    @Override
2999c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    public Header onGetNewHeader() {
3009c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        Header result = mRequestedAccountHeader;
3019c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        mRequestedAccountHeader = null;
3029c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        return result;
3039c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    }
3049c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
30557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    private void enableDebugMenu() {
30657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        mShowDebugMenu = true;
30757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        invalidateHeaders();
30857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    }
30957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler
31057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler    /**
311a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler     * Decide if "add account" should be shown
312a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler     */
313a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    private boolean shouldShowNewAccount() {
314a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        // If in single pane mode, only add accounts at top level
31572a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo        if (!onIsMultiPane()) {
31672a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo            return hasHeaders();
317a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        } else {
318a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            // If in multi pane mode, only add accounts when showing a top level fragment
319a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            // Note: null is OK; This is the case when we first launch the activity
320a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            if ((mCurrentFragment != null)
321464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler                && !(mCurrentFragment instanceof GeneralPreferences)
32257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler                && !(mCurrentFragment instanceof DebugFragment)
323a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler                && !(mCurrentFragment instanceof AccountSettingsFragment)) return false;
324a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        }
325a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        return true;
326a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    }
327a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler
328a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    private void onAddNewAccount() {
329a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        AccountSetupBasics.actionNewAccount(this);
330a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    }
331a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler
332a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    /**
3332ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * Start the async reload of the accounts list (if the headers are being displayed)
3342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
3352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    private void updateAccounts() {
3362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        if (hasHeaders()) {
3372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            Utility.cancelTaskInterrupt(mLoadAccountListTask);
338bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki            mLoadAccountListTask = (LoadAccountListTask)
339bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki                    new LoadAccountListTask().executeOnExecutor(
340bc2eaadde987044027b57d241e635de014bdb8baMakoto Onuki                            AsyncTask.THREAD_POOL_EXECUTOR, mDeletingAccountId);
3412ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
3422ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
3432ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
3442ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
3452ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * Write the current header (accounts) array into the one provided by the PreferenceActivity.
346464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler     * Skip any headers that match mDeletingAccountId (this is a quick-hide algorithm while a
3479c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * background thread works on deleting the account).  Also sets mRequestedAccountHeader if
3489c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * we find the requested account (by id).
3492ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
3502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    @Override
3512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onBuildHeaders(List<Header> target) {
3529c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        // Assume the account is unspecified
3539c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        mRequestedAccountHeader = null;
3549c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
355464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        // Always add app preferences as first header
356464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        target.clear();
357464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        target.add(getAppPreferencesHeader());
3589c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
359464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        // Then add zero or more account headers as necessary
360464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        if (mAccountListHeaders != null) {
361464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            int headerCount = mAccountListHeaders.length;
362464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            for (int index = 0; index < headerCount; index++) {
363a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                Header header = mAccountListHeaders[index];
36404c4ae864fb0df88b9bc41e85a72062c12540d81Andy Stadler                if (header != null && header.id != HEADER_ID_UNDEFINED) {
365a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                    if (header.id != mDeletingAccountId) {
366a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                        target.add(header);
367a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                        if (header.id == mRequestedAccountId) {
368a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                            mRequestedAccountHeader = header;
369a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                            mRequestedAccountId = -1;
370a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                        }
3719c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler                    }
372464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler                }
373464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            }
374464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        }
3759c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
37657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        // finally, if debug header is enabled, show it
37757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        if (mShowDebugMenu) {
37857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            // setup lightweight header for debugging
37957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            Header debugHeader = new Header();
38057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            debugHeader.title = getText(R.string.debug_title);
38157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            debugHeader.summary = null;
38257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            debugHeader.iconRes = 0;
38357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            debugHeader.fragment = DebugFragment.class.getCanonicalName();
38457f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            debugHeader.fragmentArguments = null;
38557f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            target.add(debugHeader);
38657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        }
3871a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
3881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // Save for later use (see forceSwitch)
3891a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        mGeneratedHeaders = target;
390464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    }
391464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler
392464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    /**
393464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler     * Generate and return the first header, for app preferences
394464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler     */
395464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    private Header getAppPreferencesHeader() {
3962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        // Set up fixed header for general settings
3972ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        if (mAppPreferencesHeader == null) {
3982ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAppPreferencesHeader = new Header();
3992ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAppPreferencesHeader.title = getText(R.string.header_label_general_preferences);
4002ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAppPreferencesHeader.summary = null;
4012ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAppPreferencesHeader.iconRes = 0;
4020f52e546ef662e126b7360ad69c8c8f838789ef3Makoto Onuki            mAppPreferencesHeader.fragment = GeneralPreferences.class.getCanonicalName();
4032ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAppPreferencesHeader.fragmentArguments = null;
4042ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
405464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        return mAppPreferencesHeader;
406464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    }
407464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler
408464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    /**
4092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * This AsyncTask reads the accounts list and generates the headers.  When the headers are
4102ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * ready, we'll trigger PreferenceActivity to refresh the account list with them.
4112ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     *
41204c4ae864fb0df88b9bc41e85a72062c12540d81Andy Stadler     * The array generated and stored in mAccountListHeaders may be sparse so any readers should
41304c4ae864fb0df88b9bc41e85a72062c12540d81Andy Stadler     * check for and skip over null entries, and should not assume array length is # of accounts.
41404c4ae864fb0df88b9bc41e85a72062c12540d81Andy Stadler     *
4152ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * TODO: Smaller projection
4162ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * TODO: Convert to Loader
417a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler     * TODO: Write a test, including operation of deletingAccountId param
4182ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
419464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler    private class LoadAccountListTask extends AsyncTask<Long, Void, Object[]> {
4202ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
4212ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        @Override
422464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        protected Object[] doInBackground(Long... params) {
423a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            Header[] result = null;
424464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            Boolean deletingAccountFound = false;
425a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            long deletingAccountId = params[0];
4262ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
4272ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            Cursor c = getContentResolver().query(
428f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank                    Account.CONTENT_URI,
429f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank                    Account.CONTENT_PROJECTION, null, null, null);
4302ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            try {
4312ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                int index = 0;
4322ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                int headerCount = c.getCount();
433a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                result = new Header[headerCount];
4342ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
4352ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                while (c.moveToNext()) {
436a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler                    long accountId = c.getLong(Account.CONTENT_ID_COLUMN);
437a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler                    if (accountId == deletingAccountId) {
438464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler                        deletingAccountFound = true;
439a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler                        continue;
440a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler                    }
4413955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                    String name = c.getString(Account.CONTENT_DISPLAY_NAME_COLUMN);
4423955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                    String email = c.getString(Account.CONTENT_EMAIL_ADDRESS_COLUMN);
443a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                    Header newHeader = new Header();
444a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                    newHeader.id = accountId;
4453955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                    newHeader.title = name;
4463955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                    newHeader.summary = email;
447a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn                    newHeader.fragment = AccountSettingsFragment.class.getCanonicalName();
4483955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                    newHeader.fragmentArguments =
4493955f6794f23c1380749d4470b5f2264d2109adcBen Komalo                            AccountSettingsFragment.buildArguments(accountId, email);
450a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn
4512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                    result[index++] = newHeader;
4522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                }
4532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            } finally {
4542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                if (c != null) {
4552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                    c.close();
4562ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                }
4572ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            }
458464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            return new Object[] { result, deletingAccountFound };
4592ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
4602ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
4612ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        @Override
462464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        protected void onPostExecute(Object[] result) {
4632866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            if (isCancelled() || result == null) return;
464464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            // Extract the results
465a2cc46c810eb802c172a4af8ecc67fca53dd584fDianne Hackborn            Header[] headers = (Header[]) result[0];
466464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            boolean deletingAccountFound = (Boolean) result[1];
467a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            // report the settings
4682ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            mAccountListHeaders = headers;
4692866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            invalidateHeaders();
470464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            if (!deletingAccountFound) {
471464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler                mDeletingAccountId = -1;
472464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            }
4732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
4742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
4752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
4762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
4772ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * Called when the user selects an item in the header list.  Handles save-data cases as needed
4782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     *
4792ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * @param header The header that was selected.
4802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * @param position The header's position in the list.
4812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
4822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    @Override
4832ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onHeaderClick(Header header, int position) {
4841a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // special case when exiting the server settings fragments
4851a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        if (mCurrentFragment instanceof AccountServerBaseFragment) {
486c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            boolean changed = ((AccountServerBaseFragment)mCurrentFragment).haveSettingsChanged();
487c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            if (changed) {
4881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                UnsavedChangesDialogFragment dialogFragment =
489c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                    UnsavedChangesDialogFragment.newInstanceForHeader(position);
4901a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG);
491c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                return;
4921a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            }
4931a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
4941a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
4951a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // Secret keys:  Click 10x to enable debug settings
49657f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        if (position == 0) {
49757f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            mNumGeneralHeaderClicked++;
49857f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            if (mNumGeneralHeaderClicked == 10) {
49957f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler                enableDebugMenu();
50057f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            }
50157f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        } else {
50257f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler            mNumGeneralHeaderClicked = 0;
50357f125a01b5fbb5860b144b3057153a50d07ddd1Andrew Stadler        }
5041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
5051a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // Process header click normally
5062ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        super.onHeaderClick(header, position);
5072ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
5082ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
5092ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
5101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Switch to a specific header without checking for server settings fragments as done
5111a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * in {@link #onHeaderClick(Header, int)}.  Called after we interrupted a header switch
5121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * with a dialog, and the user OK'd it.
5131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
514c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    private void forceSwitchHeader(int position) {
515c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Clear the current fragment; we're navigating away
516c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        mCurrentFragment = null;
517c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Ensure the UI visually shows the correct header selected
518c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        setSelection(position);
519c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        Header header = mGeneratedHeaders.get(position);
520c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        switchToHeader(header);
521c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
522c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
523c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    /**
524c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     * Forcefully go backward in the stack. This may potentially discard unsaved settings.
525c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     */
526c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    private void forceBack() {
527c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Clear the current fragment; we're navigating away
528c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        mCurrentFragment = null;
529c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        onBackPressed();
5301a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
5311a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
5323955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    @Override
5333955f6794f23c1380749d4470b5f2264d2109adcBen Komalo    public void onAttachFragment(Fragment f) {
5343955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        super.onAttachFragment(f);
5353955f6794f23c1380749d4470b5f2264d2109adcBen Komalo
5362ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        if (f instanceof AccountSettingsFragment) {
5372ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            AccountSettingsFragment asf = (AccountSettingsFragment) f;
5382ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            asf.setCallback(mAccountSettingsFragmentCallback);
5393955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        } else if (f instanceof AccountServerBaseFragment) {
540ee97468feb73f0ed040485292687b764027d7d31Ben Komalo            AccountServerBaseFragment asbf = (AccountServerBaseFragment) f;
5411a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            asbf.setCallback(mAccountServerSettingsFragmentCallback);
5423955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        } else {
5433955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            // Possibly uninteresting fragment, such as a dialog.
5443955f6794f23c1380749d4470b5f2264d2109adcBen Komalo            return;
5451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
5463955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        mCurrentFragment = f;
5471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
5481a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // When we're changing fragments, enable/disable the add account button
54972a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo        invalidateOptionsMenu();
5502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
5512ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
5522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
5532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     * Callbacks for AccountSettingsFragment
5542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
5552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    private class AccountSettingsFragmentCallback implements AccountSettingsFragment.Callback {
5562866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        @Override
55734704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy        public void onSettingsChanged(Account account, String preference, Object value) {
5582866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            AccountSettings.this.onSettingsChanged(account, preference, value);
55934704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy        }
5602866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        @Override
5615a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        public void onEditQuickResponses(Account account) {
5625a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo            AccountSettings.this.onEditQuickResponses(account);
5635a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        }
5645a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        @Override
5652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        public void onIncomingSettings(Account account) {
5662866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            AccountSettings.this.onIncomingSettings(account);
5672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
5682866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        @Override
5692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        public void onOutgoingSettings(Account account) {
5702866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            AccountSettings.this.onOutgoingSettings(account);
5712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
5722866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        @Override
5732ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        public void abandonEdit() {
5742ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            finish();
5752ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
5762866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo        @Override
577a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        public void deleteAccount(Account account) {
5782866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            AccountSettings.this.deleteAccount(account);
579a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        }
5802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
5812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
5822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
5831a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Callbacks for AccountServerSettingsFragmentCallback
5841a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
5851a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    private class AccountServerSettingsFragmentCallback
5861a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            implements AccountServerBaseFragment.Callback {
5871a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        @Override
5881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        public void onEnableProceedButtons(boolean enable) {
5891a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            // This is not used - it's a callback for the legacy activities
5901a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
591fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
5921a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        @Override
593fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        public void onProceedNext(int checkMode, AccountServerBaseFragment target) {
594fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler            AccountCheckSettingsFragment checkerFragment =
595fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler                AccountCheckSettingsFragment.newInstance(checkMode, target);
596fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler            startPreferenceFragment(checkerFragment, true);
597fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        }
598fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
599fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        /**
600fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * After verifying a new server configuration as OK, we return here and continue.  This
601fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * simply does a "back" to exit the settings screen.
602fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         */
6033955f6794f23c1380749d4470b5f2264d2109adcBen Komalo        @Override
6042731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        public void onCheckSettingsComplete(int result, int setupMode) {
6052731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler            if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
606c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                // Settings checked & saved; clear current fragment
607c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                mCurrentFragment = null;
6082731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler                onBackPressed();
6092731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler            }
6101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
6111a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
6121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
6131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
61434704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy     * Some of the settings have changed. Update internal state as necessary.
61534704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy     */
61634704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy    public void onSettingsChanged(Account account, String preference, Object value) {
61734704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy        if (AccountSettingsFragment.PREFERENCE_DESCRIPTION.equals(preference)) {
61834704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy            for (Header header : mAccountListHeaders) {
61934704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                if (header.id == account.mId) {
62034704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                    // Manually tweak the header title. We cannot rebuild the header list from
62134704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                    // an account cursor as the account database has not been saved yet.
62234704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                    header.title = value.toString();
62334704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                    invalidateHeaders();
62434704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                    break;
62534704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy                }
62634704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy            }
62734704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy        }
62834704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy    }
62934704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy
63034704851e96dcc139d6833adb3bd139f57fa497cTodd Kennedy    /**
6315a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo     * Dispatch to edit quick responses.
6325a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo     */
6335a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo    public void onEditQuickResponses(Account account) {
6345a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        try {
6355a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo            Bundle args = new Bundle();
6365a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo            args.putParcelable(QUICK_RESPONSE_ACCOUNT_KEY, account);
6375a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo            startPreferencePanel(AccountSettingsEditQuickResponsesFragment.class.getName(), args,
6385a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo                    R.string.account_settings_edit_quick_responses_label, null, null, 0);
6395a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        } catch (Exception e) {
6405a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo            Log.d(Logging.LOG_TAG, "Error while trying to invoke edit quick responses.", e);
6415a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo        }
6425a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo    }
6435a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo
6445a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo    /**
6451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Dispatch to edit incoming settings.
6461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     *
6471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * TODO: Make things less hardwired
6482ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
6492ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onIncomingSettings(Account account) {
6502ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        try {
65135b0e95ca795e17b6dc8dd98c7ab847d65d9aa0cMarc Blank            Store store = Store.getInstance(account, getApplication());
6522ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            if (store != null) {
6532ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                Class<? extends android.app.Activity> setting = store.getSettingActivityClass();
6542ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                if (setting != null) {
6551a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    SetupData.init(SetupData.FLOW_MODE_EDIT, account);
6561a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    if (setting.equals(AccountSetupIncoming.class)) {
657983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                        startPreferencePanel(AccountSetupIncomingFragment.class.getName(),
658983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                AccountSetupIncomingFragment.getSettingsModeArgs(),
659983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                R.string.account_settings_incoming_label, null, null, 0);
6601a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    } else if (setting.equals(AccountSetupExchange.class)) {
661983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                        startPreferencePanel(AccountSetupExchangeFragment.class.getName(),
662983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                AccountSetupExchangeFragment.getSettingsModeArgs(),
663983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                R.string.account_settings_incoming_label, null, null, 0);
6641a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    }
6652ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                }
6662ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            }
6672ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        } catch (Exception e) {
66831d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "Error while trying to invoke store settings.", e);
6692ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
6702ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
6712ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
6722ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
6731a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Dispatch to edit outgoing settings.
6741a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     *
6751a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * TODO: Make things less hardwired
6762ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler     */
6772ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    public void onOutgoingSettings(Account account) {
6782ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        try {
679daf869cf60de75bc91ed3aef6ac0bff1fe371733Todd Kennedy            Sender sender = Sender.getInstance(getApplication(), account);
6802ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            if (sender != null) {
6812ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                Class<? extends android.app.Activity> setting = sender.getSettingActivityClass();
6822ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                if (setting != null) {
6831a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    SetupData.init(SetupData.FLOW_MODE_EDIT, account);
6841a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    if (setting.equals(AccountSetupOutgoing.class)) {
685983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                        startPreferencePanel(AccountSetupOutgoingFragment.class.getName(),
686983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                AccountSetupOutgoingFragment.getSettingsModeArgs(),
687983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler                                R.string.account_settings_outgoing_label, null, null, 0);
6881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                    }
6892ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler                }
6902ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler            }
6912ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        } catch (Exception e) {
69231d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank            Log.d(Logging.LOG_TAG, "Error while trying to invoke sender settings.", e);
6932ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler        }
6942ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    }
6952ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler
6962ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler    /**
697a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler     * Delete the selected account
698a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler     */
699bd3e7777c58d4ffef41922b1e7e0d3ccbbb78ca3Makoto Onuki    public void deleteAccount(Account account) {
700464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        // Kick off the work to actually delete the account
701464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        // Delete the account (note, this is async.  Would be nice to get a callback.
702464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        Controller.getInstance(this).deleteAccount(account.mId);
703464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler
704464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler        // Then update the UI as appropriate:
705a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        // If single pane, return to the header list.  If multi, rebuild header list
70672a24f12a2a0a48528cf0f826397e2348fe8ace2Ben Komalo        if (onIsMultiPane()) {
707464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            Header prefsHeader = getAppPreferencesHeader();
708464d1f95b725fb22d701bd7b55d6d682ad4d3cbfAndrew Stadler            this.switchToHeader(prefsHeader.fragment, prefsHeader.fragmentArguments);
709a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            mDeletingAccountId = account.mId;
71009aae75f4e37c3197c6f8d3f046b15c71534d1f0Andy Stadler            updateAccounts();
711a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        } else {
712a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            // We should only be calling this while showing AccountSettingsFragment,
713a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            // so a finish() should bring us back to headers.  No point hiding the deleted account.
714a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler            finish();
715a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler        }
716a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    }
717a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler
718a14a24a5bc2ffa426f7ef8e5e6938cffe3f35829Andrew Stadler    /**
7199c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * This AsyncTask looks up an account based on its email address (which is what we get from
7209c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * the Account Manager).  When the account id is determined, we refresh the header list,
7219c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     * which will select the preferences for that account.
7229c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler     */
7239c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    private class GetAccountIdFromAccountTask extends AsyncTask<Intent, Void, Long> {
7249c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
7259c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        @Override
7269c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        protected Long doInBackground(Intent... params) {
7279c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler            Intent intent = params[0];
7289c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler            android.accounts.Account acct =
7299c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler                (android.accounts.Account) intent.getParcelableExtra(EXTRA_ACCOUNT_MANAGER_ACCOUNT);
7302866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            return Utility.getFirstRowLong(AccountSettings.this, Account.CONTENT_URI,
7312866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo                    Account.ID_PROJECTION, SELECTION_ACCOUNT_EMAIL_ADDRESS,
7322866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo                    new String[] {acct.name}, null, Account.ID_PROJECTION_COLUMN, -1L);
7339c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        }
7349c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
7359c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        @Override
7369c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        protected void onPostExecute(Long accountId) {
7379c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler            if (accountId != -1 && !isCancelled()) {
7389c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler                mRequestedAccountId = accountId;
7392866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo                invalidateHeaders();
7409c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler            }
7419c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler        }
7429c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    }
7439c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler
7449c65c146f3d8e60f35f46c815d4121749ad13abdAndrew Stadler    /**
7451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Dialog fragment to show "exit with unsaved changes?" dialog
7461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
747c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    /* package */ static class UnsavedChangesDialogFragment extends DialogFragment {
7481a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        private final static String TAG = "UnsavedChangesDialogFragment";
7491a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
7501a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        // Argument bundle keys
751c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        private final static String BUNDLE_KEY_HEADER = "UnsavedChangesDialogFragment.Header";
752c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        private final static String BUNDLE_KEY_BACK = "UnsavedChangesDialogFragment.Back";
7531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
7541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        /**
755c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy         * Creates a save changes dialog when the user selects a new header
756c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy         * @param position The new header index to make active if the user accepts the dialog. This
757c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy         * must be a valid header index although there is no error checking.
7581a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         */
759c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        public static UnsavedChangesDialogFragment newInstanceForHeader(int position) {
7601a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment();
7611a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            Bundle b = new Bundle();
762c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            b.putInt(BUNDLE_KEY_HEADER, position);
7631a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            f.setArguments(b);
7641a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            return f;
7651a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
7661a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
767c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        /**
768c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy         * Creates a save changes dialog when the user navigates "back".
7692866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo         * {@link #onBackPressed()} defines in which case this may be triggered.
770c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy         */
771c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        public static UnsavedChangesDialogFragment newInstanceForBack() {
772c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment();
773c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            Bundle b = new Bundle();
774c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            b.putBoolean(BUNDLE_KEY_BACK, true);
775c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            f.setArguments(b);
776c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            return f;
777c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
778c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
779c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        // Force usage of newInstance()
780c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        private UnsavedChangesDialogFragment() {
781c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
782c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
7831a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        @Override
7841a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        public Dialog onCreateDialog(Bundle savedInstanceState) {
7852866284a6d4ee4b368fcaf412c540b21d457e065Ben Komalo            final AccountSettings activity = (AccountSettings) getActivity();
786c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            final int position = getArguments().getInt(BUNDLE_KEY_HEADER);
787c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            final boolean isBack = getArguments().getBoolean(BUNDLE_KEY_BACK);
7881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
7891a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler            return new AlertDialog.Builder(activity)
79049518bb3605d6c8e3cc4801c452e4f8f63220f44Makoto Onuki                .setIconAttribute(android.R.attr.alertDialogIcon)
7911a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                .setTitle(android.R.string.dialog_alert_title)
7921a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                .setMessage(R.string.account_settings_exit_server_settings)
7931a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                .setPositiveButton(
7941a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                        R.string.okay_action,
7951a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                        new DialogInterface.OnClickListener() {
7961a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                            public void onClick(DialogInterface dialog, int which) {
797c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                                if (isBack) {
798c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                                    activity.forceBack();
799c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                                } else {
800c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                                    activity.forceSwitchHeader(position);
801c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                                }
8021a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                                dismiss();
8031a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                            }
8041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                        })
8051a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                .setNegativeButton(
806c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                        activity.getString(R.string.cancel_action), null)
8071a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                .create();
8081a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
8091a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
8101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
811f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler    /**
812f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     * Dialog briefly shown in some cases, to indicate the user that login failed.  If the user
813f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     * clicks OK, we simply dismiss the dialog, leaving the user in the account settings for
814f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     * that account;  If the user clicks "cancel", we exit account settings.
815f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler     */
816f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler    public static class LoginWarningDialog extends DialogFragment
817f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            implements DialogInterface.OnClickListener {
818f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        private static final String BUNDLE_KEY_ACCOUNT_NAME = "account_name";
819f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler
820f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        /**
821f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler         * Create a new dialog.
822f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler         */
823f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        public static LoginWarningDialog newInstance(String accountName) {
824f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            final LoginWarningDialog dialog = new LoginWarningDialog();
825f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            Bundle b = new Bundle();
826f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.putString(BUNDLE_KEY_ACCOUNT_NAME, accountName);
827f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            dialog.setArguments(b);
828f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            return dialog;
829f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        }
830f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler
831f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        @Override
832f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        public Dialog onCreateDialog(Bundle savedInstanceState) {
833f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            final String accountName = getArguments().getString(BUNDLE_KEY_ACCOUNT_NAME);
834f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler
835f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            final Context context = getActivity();
836f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            final Resources res = context.getResources();
837f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            final AlertDialog.Builder b = new AlertDialog.Builder(context);
838f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.setTitle(R.string.account_settings_login_dialog_title);
839f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.setIconAttribute(android.R.attr.alertDialogIcon);
840f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.setMessage(res.getString(R.string.account_settings_login_dialog_content_fmt,
841f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                    accountName));
842f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.setPositiveButton(R.string.okay_action, this);
843f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            b.setNegativeButton(R.string.cancel_action, this);
844f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            return b.create();
845f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        }
846f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler
847f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        @Override
848f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        public void onClick(DialogInterface dialog, int which) {
849f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            dismiss();
850f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            if (which == DialogInterface.BUTTON_NEGATIVE) {
851f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler                getActivity().finish();
852f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler            }
853f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler        }
854f4894131427ec7562fcb05388b9f3aa094e388bcAndy Stadler    }
8552ae2a12d6b049a4347c0781bd4daa17229bf1340Andrew Stadler}
856