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