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