17e4daecc9af8d35a7118de4edb711f084110814eTony Mantler/* 27e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * Copyright (C) 2014 The Android Open Source Project 37e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * 47e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 57e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * you may not use this file except in compliance with the License. 67e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * You may obtain a copy of the License at 77e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * 87e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 97e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * 107e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * Unless required by applicable law or agreed to in writing, software 117e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 127e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * See the License for the specific language governing permissions and 147e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * limitations under the License. 157e4daecc9af8d35a7118de4edb711f084110814eTony Mantler */ 167e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 177e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerpackage com.android.email.activity.setup; 187e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 197e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.accounts.AccountManagerFuture; 207e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.accounts.AuthenticatorException; 217e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.accounts.OperationCanceledException; 227e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.app.Fragment; 237e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.app.LoaderManager; 247e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.content.Context; 257e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.content.Intent; 267e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.content.Loader; 277e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.os.Bundle; 287e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.os.Handler; 297e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport android.os.RemoteException; 307e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 31bb68c13afa630cae058eb40d3ce68644f3f3c8b9Paul Westbrookimport com.android.email.provider.EmailProvider; 327e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.email.service.EmailServiceUtils; 337e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.email2.ui.MailActivityEmail; 347e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.emailcommon.provider.Account; 357e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.emailcommon.service.EmailServiceProxy; 367e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.mail.preferences.AccountPreferences; 377e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.mail.ui.MailAsyncTaskLoader; 387e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport com.android.mail.utils.LogUtils; 397e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 407e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerimport java.io.IOException; 417e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 427e4daecc9af8d35a7118de4edb711f084110814eTony Mantler/** 437e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * This retained headless fragment acts as a container for the multi-step task of creating the 447e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * AccountManager account and saving our account object to the database, as well as some misc 457e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * related background tasks. 467e4daecc9af8d35a7118de4edb711f084110814eTony Mantler */ 477e4daecc9af8d35a7118de4edb711f084110814eTony Mantlerpublic class AccountCreationFragment extends Fragment { 4876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler public static final String TAG = "AccountCreationFragment"; 4976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 507e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public static final int REQUEST_CODE_ACCEPT_POLICIES = 1; 517e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 527e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String ACCOUNT_TAG = "account"; 537e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String SYNC_EMAIL_TAG = "email"; 547e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String SYNC_CALENDAR_TAG = "calendar"; 557e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String SYNC_CONTACTS_TAG = "contacts"; 567e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String NOTIFICATIONS_TAG = "notifications"; 577e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 587e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final String SAVESTATE_STAGE = "AccountCreationFragment.stage"; 597e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final int STAGE_BEFORE_ACCOUNT_SECURITY = 0; 607e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final int STAGE_REFRESHING_ACCOUNT = 1; 617e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final int STAGE_WAITING_FOR_ACCOUNT_SECURITY = 2; 627e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private static final int STAGE_AFTER_ACCOUNT_SECURITY = 3; 637e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private int mStage = 0; 647e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 657e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private Context mAppContext; 667e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private final Handler mHandler; 677e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 6876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler public interface Callback { 6976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler void onAccountCreationFragmentComplete(); 7076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler void destroyAccountCreationFragment(); 7176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler void showCreateAccountErrorDialog(); 7276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler void setAccount(Account account); 7376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler } 7476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 75ff8d375376157753015fd51837b7ce15b9a26144Tony Mantler public AccountCreationFragment() { 767e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mHandler = new Handler(); 777e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 787e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 797e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public static AccountCreationFragment newInstance(Account account, boolean syncEmail, 807e4daecc9af8d35a7118de4edb711f084110814eTony Mantler boolean syncCalendar, boolean syncContacts, boolean enableNotifications) { 817e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final Bundle args = new Bundle(5); 827e4daecc9af8d35a7118de4edb711f084110814eTony Mantler args.putParcelable(AccountCreationFragment.ACCOUNT_TAG, account); 837e4daecc9af8d35a7118de4edb711f084110814eTony Mantler args.putBoolean(AccountCreationFragment.SYNC_EMAIL_TAG, syncEmail); 847e4daecc9af8d35a7118de4edb711f084110814eTony Mantler args.putBoolean(AccountCreationFragment.SYNC_CALENDAR_TAG, syncCalendar); 857e4daecc9af8d35a7118de4edb711f084110814eTony Mantler args.putBoolean(AccountCreationFragment.SYNC_CONTACTS_TAG, syncContacts); 867e4daecc9af8d35a7118de4edb711f084110814eTony Mantler args.putBoolean(AccountCreationFragment.NOTIFICATIONS_TAG, enableNotifications); 877e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 887e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final AccountCreationFragment f = new AccountCreationFragment(); 897e4daecc9af8d35a7118de4edb711f084110814eTony Mantler f.setArguments(args); 907e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return f; 917e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 927e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 937e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 947e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onCreate(Bundle savedInstanceState) { 957e4daecc9af8d35a7118de4edb711f084110814eTony Mantler super.onCreate(savedInstanceState); 967e4daecc9af8d35a7118de4edb711f084110814eTony Mantler setRetainInstance(true); 977e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (savedInstanceState != null) { 987e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mStage = savedInstanceState.getInt(SAVESTATE_STAGE); 997e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1007e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1017e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1027e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 10376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler public void onActivityCreated(Bundle savedInstanceState) { 10476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler super.onActivityCreated(savedInstanceState); 10576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler mAppContext = getActivity().getApplicationContext(); 10676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler } 10776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 10876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler @Override 1097e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onSaveInstanceState(Bundle outState) { 1107e4daecc9af8d35a7118de4edb711f084110814eTony Mantler super.onSaveInstanceState(outState); 1117e4daecc9af8d35a7118de4edb711f084110814eTony Mantler outState.putInt(SAVESTATE_STAGE, mStage); 1127e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1137e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1147e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 1157e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onResume() { 1167e4daecc9af8d35a7118de4edb711f084110814eTony Mantler super.onResume(); 1177e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1187e4daecc9af8d35a7118de4edb711f084110814eTony Mantler switch (mStage) { 1197e4daecc9af8d35a7118de4edb711f084110814eTony Mantler case STAGE_BEFORE_ACCOUNT_SECURITY: 1207e4daecc9af8d35a7118de4edb711f084110814eTony Mantler kickBeforeAccountSecurityLoader(); 1217e4daecc9af8d35a7118de4edb711f084110814eTony Mantler break; 1227e4daecc9af8d35a7118de4edb711f084110814eTony Mantler case STAGE_REFRESHING_ACCOUNT: 1237e4daecc9af8d35a7118de4edb711f084110814eTony Mantler kickRefreshingAccountLoader(); 1247e4daecc9af8d35a7118de4edb711f084110814eTony Mantler break; 1257e4daecc9af8d35a7118de4edb711f084110814eTony Mantler case STAGE_WAITING_FOR_ACCOUNT_SECURITY: 1267e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // TODO: figure out when we might get here and what to do if we do 1277e4daecc9af8d35a7118de4edb711f084110814eTony Mantler break; 1287e4daecc9af8d35a7118de4edb711f084110814eTony Mantler case STAGE_AFTER_ACCOUNT_SECURITY: 1297e4daecc9af8d35a7118de4edb711f084110814eTony Mantler kickAfterAccountSecurityLoader(); 1307e4daecc9af8d35a7118de4edb711f084110814eTony Mantler break; 1317e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1327e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1337e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1347e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private void kickBeforeAccountSecurityLoader() { 1357e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final LoaderManager loaderManager = getLoaderManager(); 1367e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1377e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_REFRESHING_ACCOUNT); 1387e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_AFTER_ACCOUNT_SECURITY); 1397e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.initLoader(STAGE_BEFORE_ACCOUNT_SECURITY, getArguments(), 1407e4daecc9af8d35a7118de4edb711f084110814eTony Mantler new BeforeAccountSecurityCallbacks()); 1417e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1427e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1437e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private void kickRefreshingAccountLoader() { 1447e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final LoaderManager loaderManager = getLoaderManager(); 1457e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1467e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_BEFORE_ACCOUNT_SECURITY); 1477e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_AFTER_ACCOUNT_SECURITY); 1487e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.initLoader(STAGE_REFRESHING_ACCOUNT, getArguments(), 1497e4daecc9af8d35a7118de4edb711f084110814eTony Mantler new RefreshAccountCallbacks()); 1507e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1517e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1527e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private void kickAfterAccountSecurityLoader() { 1537e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final LoaderManager loaderManager = getLoaderManager(); 1547e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1557e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_BEFORE_ACCOUNT_SECURITY); 1567e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.destroyLoader(STAGE_REFRESHING_ACCOUNT); 1577e4daecc9af8d35a7118de4edb711f084110814eTony Mantler loaderManager.initLoader(STAGE_AFTER_ACCOUNT_SECURITY, getArguments(), 1587e4daecc9af8d35a7118de4edb711f084110814eTony Mantler new AfterAccountSecurityCallbacks()); 1597e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 1607e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1617e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private class BeforeAccountSecurityCallbacks 1627e4daecc9af8d35a7118de4edb711f084110814eTony Mantler implements LoaderManager.LoaderCallbacks<Boolean> { 1637e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public BeforeAccountSecurityCallbacks() {} 1647e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1657e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 1667e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Loader<Boolean> onCreateLoader(int id, Bundle args) { 1677e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final Account account = args.getParcelable(ACCOUNT_TAG); 1687e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final boolean email = args.getBoolean(SYNC_EMAIL_TAG); 1697e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final boolean calendar = args.getBoolean(SYNC_CALENDAR_TAG); 1707e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final boolean contacts = args.getBoolean(SYNC_CONTACTS_TAG); 1717e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final boolean notificationsEnabled = args.getBoolean(NOTIFICATIONS_TAG); 1727e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1737e4daecc9af8d35a7118de4edb711f084110814eTony Mantler /** 1747e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * Task loader returns true if we created the account, false if we bailed out. 1757e4daecc9af8d35a7118de4edb711f084110814eTony Mantler */ 1767e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return new MailAsyncTaskLoader<Boolean>(mAppContext) { 1777e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 1787e4daecc9af8d35a7118de4edb711f084110814eTony Mantler protected void onDiscardResult(Boolean result) {} 1797e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1807e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 1817e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Boolean loadInBackground() { 1827e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Set the incomplete flag here to avoid reconciliation issues 1837e4daecc9af8d35a7118de4edb711f084110814eTony Mantler account.mFlags |= Account.FLAGS_INCOMPLETE; 1847e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1857e4daecc9af8d35a7118de4edb711f084110814eTony Mantler AccountSettingsUtils.commitSettings(mAppContext, account); 1867e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final AccountManagerFuture<Bundle> future = 1877e4daecc9af8d35a7118de4edb711f084110814eTony Mantler EmailServiceUtils.setupAccountManagerAccount(mAppContext, account, 1887e4daecc9af8d35a7118de4edb711f084110814eTony Mantler email, calendar, contacts, null); 1897e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 1907e4daecc9af8d35a7118de4edb711f084110814eTony Mantler boolean createSuccess = false; 1917e4daecc9af8d35a7118de4edb711f084110814eTony Mantler try { 1927e4daecc9af8d35a7118de4edb711f084110814eTony Mantler future.getResult(); 1937e4daecc9af8d35a7118de4edb711f084110814eTony Mantler createSuccess = true; 1947e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } catch (OperationCanceledException e) { 1957e4daecc9af8d35a7118de4edb711f084110814eTony Mantler LogUtils.d(LogUtils.TAG, "addAccount was canceled"); 1967e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } catch (IOException e) { 1977e4daecc9af8d35a7118de4edb711f084110814eTony Mantler LogUtils.d(LogUtils.TAG, "addAccount failed: " + e); 1987e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } catch (AuthenticatorException e) { 1997e4daecc9af8d35a7118de4edb711f084110814eTony Mantler LogUtils.d(LogUtils.TAG, "addAccount failed: " + e); 2007e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2017e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (!createSuccess) { 2027e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return false; 2037e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2047e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // We can move the notification setting to the inbox FolderPreferences 2057e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // later, once we know what the inbox is 2067e4daecc9af8d35a7118de4edb711f084110814eTony Mantler new AccountPreferences(mAppContext, account.getEmailAddress()) 2077e4daecc9af8d35a7118de4edb711f084110814eTony Mantler .setDefaultInboxNotificationsEnabled(notificationsEnabled); 2087e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2097e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Now that AccountManager account creation is complete, clear the 2107e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // INCOMPLETE flag 2117e4daecc9af8d35a7118de4edb711f084110814eTony Mantler account.mFlags &= ~Account.FLAGS_INCOMPLETE; 2127e4daecc9af8d35a7118de4edb711f084110814eTony Mantler AccountSettingsUtils.commitSettings(mAppContext, account); 2137e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2147e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return true; 2157e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2167e4daecc9af8d35a7118de4edb711f084110814eTony Mantler }; 2177e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2187e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2197e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2207e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoadFinished(Loader<Boolean> loader, Boolean success) { 2217e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (success == null || !isResumed()) { 2227e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return; 2237e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2247e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (success) { 2257e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mStage = STAGE_REFRESHING_ACCOUNT; 2267e4daecc9af8d35a7118de4edb711f084110814eTony Mantler kickRefreshingAccountLoader(); 2277e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } else { 22876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler final Callback callback = (Callback) getActivity(); 2297e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mHandler.post(new Runnable() { 2307e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2317e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void run() { 2327e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (!isResumed()) { 2337e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return; 2347e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2357e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Can't do this from within onLoadFinished 23676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler callback.destroyAccountCreationFragment(); 23776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler callback.showCreateAccountErrorDialog(); 2387e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2397e4daecc9af8d35a7118de4edb711f084110814eTony Mantler }); 2407e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2417e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2427e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2437e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2447e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoaderReset(Loader<Boolean> loader) {} 2457e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2467e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2477e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private class RefreshAccountCallbacks implements LoaderManager.LoaderCallbacks<Account> { 2487e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2497e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2507e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Loader<Account> onCreateLoader(int id, Bundle args) { 2517e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final Account account = args.getParcelable(ACCOUNT_TAG); 2527e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return new MailAsyncTaskLoader<Account>(mAppContext) { 2537e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2547e4daecc9af8d35a7118de4edb711f084110814eTony Mantler protected void onDiscardResult(Account result) {} 2557e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2567e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2577e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Account loadInBackground() { 2587e4daecc9af8d35a7118de4edb711f084110814eTony Mantler account.refresh(mAppContext); 2597e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return account; 2607e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2617e4daecc9af8d35a7118de4edb711f084110814eTony Mantler }; 2627e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2637e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2647e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2657e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoadFinished(Loader<Account> loader, Account account) { 2667e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (account == null || !isResumed()) { 2677e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return; 2687e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2697e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2707e4daecc9af8d35a7118de4edb711f084110814eTony Mantler getArguments().putParcelable(ACCOUNT_TAG, account); 2717e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2727e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if ((account.mFlags & Account.FLAGS_SECURITY_HOLD) != 0) { 2737e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final Intent intent = AccountSecurity 2747e4daecc9af8d35a7118de4edb711f084110814eTony Mantler .actionUpdateSecurityIntent(getActivity(), account.mId, false); 2757e4daecc9af8d35a7118de4edb711f084110814eTony Mantler startActivityForResult(intent, REQUEST_CODE_ACCEPT_POLICIES); 2767e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mStage = STAGE_WAITING_FOR_ACCOUNT_SECURITY; 2777e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } else { 2787e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mStage = STAGE_AFTER_ACCOUNT_SECURITY; 2797e4daecc9af8d35a7118de4edb711f084110814eTony Mantler kickAfterAccountSecurityLoader(); 2807e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2817e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2827e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2837e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2847e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoaderReset(Loader<Account> loader) {} 2857e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 2867e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2877e4daecc9af8d35a7118de4edb711f084110814eTony Mantler private class AfterAccountSecurityCallbacks 2887e4daecc9af8d35a7118de4edb711f084110814eTony Mantler implements LoaderManager.LoaderCallbacks<Account> { 2897e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2907e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Loader<Account> onCreateLoader(int id, Bundle args) { 2917e4daecc9af8d35a7118de4edb711f084110814eTony Mantler final Account account = args.getParcelable(ACCOUNT_TAG); 2927e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return new MailAsyncTaskLoader<Account>(mAppContext) { 2937e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2947e4daecc9af8d35a7118de4edb711f084110814eTony Mantler protected void onDiscardResult(Account result) {} 2957e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 2967e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 2977e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public Account loadInBackground() { 2987e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Clear the security hold flag now 2997e4daecc9af8d35a7118de4edb711f084110814eTony Mantler account.mFlags &= ~Account.FLAGS_SECURITY_HOLD; 3007e4daecc9af8d35a7118de4edb711f084110814eTony Mantler AccountSettingsUtils.commitSettings(mAppContext, account); 3017e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Start up services based on new account(s) 302bb68c13afa630cae058eb40d3ce68644f3f3c8b9Paul Westbrook EmailProvider.setServicesEnabledSync(mAppContext); 3037e4daecc9af8d35a7118de4edb711f084110814eTony Mantler EmailServiceUtils 3047e4daecc9af8d35a7118de4edb711f084110814eTony Mantler .startService(mAppContext, account.mHostAuthRecv.mProtocol); 3057e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return account; 3067e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3077e4daecc9af8d35a7118de4edb711f084110814eTony Mantler }; 3087e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3097e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3107e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 3117e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoadFinished(final Loader<Account> loader, final Account account) { 3127e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Need to do this from a runnable because this triggers fragment transactions 3137e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mHandler.post(new Runnable() { 3147e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 3157e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void run() { 3167e4daecc9af8d35a7118de4edb711f084110814eTony Mantler if (account == null || !isResumed()) { 3177e4daecc9af8d35a7118de4edb711f084110814eTony Mantler return; 3187e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3197e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3207e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Move to final setup screen 32176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler Callback callback = (Callback) getActivity(); 32276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler callback.setAccount(account); 32376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler callback.onAccountCreationFragmentComplete(); 3247e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3257e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // Update the folder list (to get our starting folders, e.g. Inbox) 32676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler final EmailServiceProxy proxy = EmailServiceUtils 32776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler .getServiceForAccount(mAppContext, account.mId); 3287e4daecc9af8d35a7118de4edb711f084110814eTony Mantler try { 3297e4daecc9af8d35a7118de4edb711f084110814eTony Mantler proxy.updateFolderList(account.mId); 3307e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } catch (RemoteException e) { 3317e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // It's all good 3327e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3337e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3347e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3357e4daecc9af8d35a7118de4edb711f084110814eTony Mantler }); 3367e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3377e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3387e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 3397e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onLoaderReset(Loader<Account> loader) {} 3407e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3417e4daecc9af8d35a7118de4edb711f084110814eTony Mantler 3427e4daecc9af8d35a7118de4edb711f084110814eTony Mantler /** 3437e4daecc9af8d35a7118de4edb711f084110814eTony Mantler * This is called after the AccountSecurity activity completes. 3447e4daecc9af8d35a7118de4edb711f084110814eTony Mantler */ 3457e4daecc9af8d35a7118de4edb711f084110814eTony Mantler @Override 3467e4daecc9af8d35a7118de4edb711f084110814eTony Mantler public void onActivityResult(int requestCode, int resultCode, Intent data) { 3477e4daecc9af8d35a7118de4edb711f084110814eTony Mantler mStage = STAGE_AFTER_ACCOUNT_SECURITY; 3487e4daecc9af8d35a7118de4edb711f084110814eTony Mantler // onResume() will be called immediately after this to kick the next loader 3497e4daecc9af8d35a7118de4edb711f084110814eTony Mantler } 3507e4daecc9af8d35a7118de4edb711f084110814eTony Mantler} 351