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