196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.android.email.activity.setup;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19f020910461908681978a9e0f8f98b748853b0e39Andy Stadlerimport android.accounts.AccountAuthenticatorResponse;
20f020910461908681978a9e0f8f98b748853b0e39Andy Stadlerimport android.accounts.AccountManager;
21a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.accounts.AccountManagerCallback;
22a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.accounts.AccountManagerFuture;
23a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.accounts.AuthenticatorException;
24a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.accounts.OperationCanceledException;
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.app.Activity;
26a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.app.AlertDialog;
276eac1c9f1c15c8a9440fbf4c1854958c054b912bMarc Blankimport android.app.ProgressDialog;
28ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadlerimport android.content.Context;
29a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport android.content.DialogInterface;
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.Intent;
3126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantlerimport android.os.AsyncTask;
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.os.Bundle;
33f6db592c313c77190727c7cd72d3edda9d23a099Marc Blankimport android.os.RemoteException;
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.view.View;
357fd78d8d6184384cd2393849a554cce58e71180aAndy Stadlerimport android.view.View.OnClickListener;
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.ArrayAdapter;
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.CheckBox;
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.Spinner;
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4085e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.R;
4185e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.activity.ActivityHelper;
4285e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.email.activity.UiUtilities;
4366a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankimport com.android.email.service.EmailServiceUtils;
44f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email.service.EmailServiceUtils.EmailServiceInfo;
45f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.email2.ui.MailActivityEmail;
4685e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.Logging;
47f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
48919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blankimport com.android.emailcommon.provider.Policy;
49f6db592c313c77190727c7cd72d3edda9d23a099Marc Blankimport com.android.emailcommon.service.EmailServiceProxy;
5085e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.service.SyncWindow;
5185e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blankimport com.android.emailcommon.utility.Utility;
52b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedyimport com.android.mail.preferences.AccountPreferences;
53b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedyimport com.android.mail.utils.LogUtils;
5485e4c101b014857fe40f87c3837b82564cfc5b6cMarc Blank
55a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blankimport java.io.IOException;
56a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
577fd78d8d6184384cd2393849a554cce58e71180aAndy Stadlerpublic class AccountSetupOptions extends AccountSetupActivity implements OnClickListener {
58d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    private static final String EXTRA_IS_PROCESSING_KEY = "com.android.email.is_processing";
59d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private Spinner mCheckFrequencyView;
619197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler    private Spinner mSyncWindowView;
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private CheckBox mNotifyView;
63bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler    private CheckBox mSyncContactsView;
64f3fcb8929e3690bc092aec0d4d643b346f079acdMarc Blank    private CheckBox mSyncCalendarView;
65e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank    private CheckBox mSyncEmailView;
66946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler    private CheckBox mBackgroundAttachmentsView;
672fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki    private View mAccountSyncWindowRow;
68b7fe21676ec46ce98e88bc181fc82a18e882236aMarc Blank    private boolean mDonePressed = false;
69f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private EmailServiceInfo mServiceInfo;
70d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    private boolean mIsProcessing = false;
71d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank
726eac1c9f1c15c8a9440fbf4c1854958c054b912bMarc Blank    private ProgressDialog mCreateAccountDialog;
736eac1c9f1c15c8a9440fbf4c1854958c054b912bMarc Blank
74d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank    public static final int REQUEST_CODE_ACCEPT_POLICIES = 1;
759019315b2642d58691cf09d32c07c0cf902f0a41Andrew Stadler
766854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki    /** Default sync window for new EAS accounts */
7721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu    private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_1_WEEK;
786854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki
7926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler    public static void actionOptions(Activity fromActivity, SetupData setupData) {
8026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Intent intent = new ForwardingIntent(fromActivity, AccountSetupOptions.class);
8126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
8226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        fromActivity.startActivity(intent);
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void onCreate(Bundle savedInstanceState) {
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.onCreate(savedInstanceState);
88cd09545b87979fa6b4337f17b5a001f0ef7b5269Andrew Stadler        ActivityHelper.debugSetWindowFlags(this);
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setContentView(R.layout.account_setup_options);
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mCheckFrequencyView = UiUtilities.getView(this, R.id.account_check_frequency);
9226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSyncWindowView = UiUtilities.getView(this, R.id.account_sync_window);
9326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mNotifyView = UiUtilities.getView(this, R.id.account_notify);
9426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSyncContactsView = UiUtilities.getView(this, R.id.account_sync_contacts);
9526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSyncCalendarView = UiUtilities.getView(this, R.id.account_sync_calendar);
9626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mSyncEmailView = UiUtilities.getView(this, R.id.account_sync_email);
97e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        mSyncEmailView.setChecked(true);
9826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        mBackgroundAttachmentsView = UiUtilities.getView(this, R.id.account_background_attachments);
99946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler        mBackgroundAttachmentsView.setChecked(true);
1002fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        UiUtilities.getView(this, R.id.previous).setOnClickListener(this);
1012fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        UiUtilities.getView(this, R.id.next).setOnClickListener(this);
1022fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mAccountSyncWindowRow = UiUtilities.getView(this, R.id.account_sync_window_row);
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
105f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        mServiceInfo = EmailServiceUtils.getServiceInfo(getApplicationContext(),
106f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                account.mHostAuthRecv.mProtocol);
10726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final CharSequence[] frequencyValues = mServiceInfo.syncIntervals;
10826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final CharSequence[] frequencyEntries = mServiceInfo.syncIntervalStrings;
109a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
110f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        // Now create the array used by the sync interval Spinner
11126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final SpinnerOption[] checkFrequencies = new SpinnerOption[frequencyEntries.length];
112ea6fea9bb22368c10083d5dce52adae86e51a243Andy Stadler        for (int i = 0; i < frequencyEntries.length; i++) {
113ea6fea9bb22368c10083d5dce52adae86e51a243Andy Stadler            checkFrequencies[i] = new SpinnerOption(
114ea6fea9bb22368c10083d5dce52adae86e51a243Andy Stadler                    Integer.valueOf(frequencyValues[i].toString()), frequencyEntries[i].toString());
115ea6fea9bb22368c10083d5dce52adae86e51a243Andy Stadler        }
11626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final ArrayAdapter<SpinnerOption> checkFrequenciesAdapter =
11726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new ArrayAdapter<SpinnerOption>(this, android.R.layout.simple_spinner_item,
11826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        checkFrequencies);
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        checkFrequenciesAdapter
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mCheckFrequencyView.setAdapter(checkFrequenciesAdapter);
122a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
123f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.offerLookback) {
124f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            enableLookbackSpinner();
1259197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        }
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
127b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy        mNotifyView.setChecked(true); // By default, we want notifications on
128e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval());
129bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler
130f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.syncContacts) {
131bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler            mSyncContactsView.setVisibility(View.VISIBLE);
132bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler            mSyncContactsView.setChecked(true);
133f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            UiUtilities.setVisibilitySafe(this, R.id.account_sync_contacts_divider, View.VISIBLE);
134f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
135f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (mServiceInfo.syncCalendar) {
136f3fcb8929e3690bc092aec0d4d643b346f079acdMarc Blank            mSyncCalendarView.setVisibility(View.VISIBLE);
137f3fcb8929e3690bc092aec0d4d643b346f079acdMarc Blank            mSyncCalendarView.setChecked(true);
1382fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki            UiUtilities.setVisibilitySafe(this, R.id.account_sync_calendar_divider, View.VISIBLE);
139bcff14acf25d3a999b7448e317604e694c204f47Andrew Stadler        }
140e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank
141f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        if (!mServiceInfo.offerAttachmentPreload) {
142946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler            mBackgroundAttachmentsView.setVisibility(View.GONE);
1432fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki            UiUtilities.setVisibilitySafe(this, R.id.account_background_attachments_divider,
1442fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki                    View.GONE);
145946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler        }
146946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler
147d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mIsProcessing = savedInstanceState != null &&
148d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski                savedInstanceState.getBoolean(EXTRA_IS_PROCESSING_KEY, false);
149d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        if (mIsProcessing) {
150d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski            // We are already processing, so just show the dialog until we finish
151d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski            showCreateAccountDialog();
152d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        } else if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
153d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski            // If we are just visiting here to fill in details, exit immediately
154e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank            onDone();
155e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        }
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
158f020910461908681978a9e0f8f98b748853b0e39Andy Stadler    @Override
159d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    public void onSaveInstanceState(Bundle outState) {
160d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        super.onSaveInstanceState(outState);
161d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        outState.putBoolean(EXTRA_IS_PROCESSING_KEY, mIsProcessing);
162d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    }
1636eac1c9f1c15c8a9440fbf4c1854958c054b912bMarc Blank
164d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    @Override
165d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    public void finish() {
166f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        // If the account manager initiated the creation, and success was not reported,
167f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        // then we assume that we're giving up (for any reason) - report failure.
16826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final AccountAuthenticatorResponse authenticatorResponse =
16926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                mSetupData.getAccountAuthenticatorResponse();
170f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        if (authenticatorResponse != null) {
171f020910461908681978a9e0f8f98b748853b0e39Andy Stadler            authenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
17226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            mSetupData.setAccountAuthenticatorResponse(null);
173f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        }
174f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        super.finish();
175f020910461908681978a9e0f8f98b748853b0e39Andy Stadler    }
176f020910461908681978a9e0f8f98b748853b0e39Andy Stadler
1778bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler    /**
1787fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler     * Respond to clicks in the "Next" or "Previous" buttons
1798bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler     */
1808bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler    @Override
1817fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler    public void onClick(View view) {
1827fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler        switch (view.getId()) {
1838bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler            case R.id.next:
1848bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                // Don't allow this more than once (Exchange accounts call an async method
1858bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                // before finish()'ing the Activity, which allows this code to potentially be
1868bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                // executed multiple times
1878bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                if (!mDonePressed) {
1888bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                    onDone();
1898bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                    mDonePressed = true;
1908bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler                }
1917fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler                break;
1927fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler            case R.id.previous:
1937fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler                onBackPressed();
1947fd78d8d6184384cd2393849a554cce58e71180aAndy Stadler                break;
1958bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler        }
1968bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler    }
1978bcb572ccfdac6974c111fe6dfc753a5e0d4e7caAndrew Stadler
198ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    /**
199ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * Ths is called when the user clicks the "done" button.
200ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * It collects the data from the UI, updates the setup account record, and commits
201ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * the account to the database (making it real for the first time.)
202ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * Finally, we call setupAccountManagerAccount(), which will eventually complete via callback.
203ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     */
204f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    @SuppressWarnings("deprecation")
205ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    private void onDone() {
20626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
2078df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        if (account.isSaved()) {
2088df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank            // Disrupting the normal flow could get us here, but if the account is already
2098df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank            // saved, we've done this work
2108df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank            return;
211d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        } else if (account.mHostAuthRecv == null) {
212d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski            throw new IllegalStateException("in AccountSetupOptions with null mHostAuthRecv");
2138df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        }
214d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski
215d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mIsProcessing = true;
216ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        account.setDisplayName(account.getEmailAddress());
217b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy        int newFlags = account.getFlags() & ~(Account.FLAGS_BACKGROUND_ATTACHMENTS);
218f6db592c313c77190727c7cd72d3edda9d23a099Marc Blank        if (mServiceInfo.offerAttachmentPreload && mBackgroundAttachmentsView.isChecked()) {
219946239e8a0e01c628fae61894d3d48248b74cefcAndy Stadler            newFlags |= Account.FLAGS_BACKGROUND_ATTACHMENTS;
220ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        }
221ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        account.setFlags(newFlags);
222ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        account.setSyncInterval((Integer)((SpinnerOption)mCheckFrequencyView
223ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                .getSelectedItem()).value);
2242fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        if (mAccountSyncWindowRow.getVisibility() == View.VISIBLE) {
22526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            account.setSyncLookback(
22626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    (Integer)((SpinnerOption)mSyncWindowView.getSelectedItem()).value);
227ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        }
228ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler
229ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // Finish setting up the account, and commit it to the database
230ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // Set the incomplete flag here to avoid reconciliation issues in ExchangeService
231ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        account.mFlags |= Account.FLAGS_INCOMPLETE;
23226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        if (mSetupData.getPolicy() != null) {
233f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            account.mFlags |= Account.FLAGS_SECURITY_HOLD;
23426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            account.mPolicy = mSetupData.getPolicy();
235f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
236ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler
237ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // Finally, write the completed account (for the first time) and then
238ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // install it into the Account manager as well.  These are done off-thread.
239ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // The account manager will report back via the callback, which will take us to
240ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        // the next operations.
24126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean email = mSyncEmailView.isChecked();
24226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean calendar = mServiceInfo.syncCalendar && mSyncCalendarView.isChecked();
24326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final boolean contacts = mServiceInfo.syncContacts && mSyncContactsView.isChecked();
244c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank
245d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        showCreateAccountDialog();
246ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        Utility.runAsync(new Runnable() {
247ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler            @Override
248ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler            public void run() {
24926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                final Context context = AccountSetupOptions.this;
250ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                AccountSettingsUtils.commitSettings(context, account);
25102f0b1eee8f5de651ad5f0289146f88fea99bce0Yu Ping Hu                EmailServiceUtils.setupAccountManagerAccount(context, account,
25226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        email, calendar, contacts, mAccountManagerCallback);
253b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy
254b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy                // We can move the notification setting to the inbox FolderPreferences later, once
255b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy                // we know what the inbox is
256b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy                final AccountPreferences accountPreferences =
25732614f3746f0fa8a09370672abaca68fa795fc33Tony Mantler                        new AccountPreferences(context, account.getEmailAddress());
258b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy                accountPreferences.setDefaultInboxNotificationsEnabled(mNotifyView.isChecked());
259ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler            }
260ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        });
261ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    }
262ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler
263d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    private void showCreateAccountDialog() {
264d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        /// Show "Creating account..." dialog
265d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mCreateAccountDialog = new ProgressDialog(this);
266d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mCreateAccountDialog.setIndeterminate(true);
267d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mCreateAccountDialog.setMessage(getString(R.string.account_setup_creating_account_msg));
268d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski        mCreateAccountDialog.show();
269d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski    }
270d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski
271ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    /**
272ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * This is called at the completion of MailService.setupAccountManagerAccount()
273ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     */
274a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank    AccountManagerCallback<Bundle> mAccountManagerCallback = new AccountManagerCallback<Bundle>() {
275f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        @Override
276a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank        public void run(AccountManagerFuture<Bundle> future) {
277a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            try {
27826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                // Block until the operation completes
27926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                future.getResult();
280ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                AccountSetupOptions.this.runOnUiThread(new Runnable() {
281f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                    @Override
282a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                    public void run() {
283d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank                        optionsComplete();
284a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                    }
285a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                });
286a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                return;
287a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            } catch (OperationCanceledException e) {
288560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                LogUtils.d(Logging.LOG_TAG, "addAccount was canceled");
289a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            } catch (IOException e) {
290560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                LogUtils.d(Logging.LOG_TAG, "addAccount failed: " + e);
291a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            } catch (AuthenticatorException e) {
292560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                LogUtils.d(Logging.LOG_TAG, "addAccount failed: " + e);
293a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            }
294a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            showErrorDialog(R.string.account_setup_failed_dlg_auth_message,
295a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                    R.string.system_account_create_failed);
296a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank        }
297a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank    };
298a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
299ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    /**
300ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * This is called if MailService.setupAccountManagerAccount() fails for some reason
301ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     */
302a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank    private void showErrorDialog(final int msgResId, final Object... args) {
303ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        runOnUiThread(new Runnable() {
304f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            @Override
305a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            public void run() {
306a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                new AlertDialog.Builder(AccountSetupOptions.this)
30749518bb3605d6c8e3cc4801c452e4f8f63220f44Makoto Onuki                        .setIconAttribute(android.R.attr.alertDialogIcon)
308a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                        .setTitle(getString(R.string.account_setup_failed_dlg_title))
309a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                        .setMessage(getString(msgResId, args))
310a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                        .setCancelable(true)
311a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                        .setPositiveButton(
312a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                                getString(R.string.account_setup_failed_dlg_edit_details_action),
313a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                                new DialogInterface.OnClickListener() {
314f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                                    @Override
315a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                                    public void onClick(DialogInterface dialog, int which) {
316d7ed294dd13f789543265abc3674b794df212e45Paul Sliwowski                                        finish();
317a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                                    }
318a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                                })
319a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank                        .show();
320a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank            }
321a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank        });
322a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank    }
3230b8b68cbebdba372c7302a207e2321cd80b384aeMarc Blank
324ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    /**
325ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * This is called after the account manager creates the new account.
326ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     */
327d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank    private void optionsComplete() {
328f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        // If the account manager initiated the creation, report success at this point
32926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final AccountAuthenticatorResponse authenticatorResponse =
33026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            mSetupData.getAccountAuthenticatorResponse();
331f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        if (authenticatorResponse != null) {
332f020910461908681978a9e0f8f98b748853b0e39Andy Stadler            authenticatorResponse.onResult(null);
33326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            mSetupData.setAccountAuthenticatorResponse(null);
334f020910461908681978a9e0f8f98b748853b0e39Andy Stadler        }
335f020910461908681978a9e0f8f98b748853b0e39Andy Stadler
3368df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        // Now that AccountManager account creation is complete, clear the INCOMPLETE flag
33726cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Account account = mSetupData.getAccount();
3388df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        account.mFlags &= ~Account.FLAGS_INCOMPLETE;
3398df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        AccountSettingsUtils.commitSettings(AccountSetupOptions.this, account);
3408df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank
3418df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank        // If we've got policies for this account, ask the user to accept.
342e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        if ((account.mFlags & Account.FLAGS_SECURITY_HOLD) != 0) {
34326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final Intent intent =
34426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                    AccountSecurity.actionUpdateSecurityIntent(this, account.mId, false);
345d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank            startActivityForResult(intent, AccountSetupOptions.REQUEST_CODE_ACCEPT_POLICIES);
346d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank            return;
347d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank        }
348d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank        saveAccountAndFinish();
349f6db592c313c77190727c7cd72d3edda9d23a099Marc Blank
350eb232290309aa3247d6c9b566e8490065a28f763Yu Ping Hu        // Update the folder list (to get our starting folders, e.g. Inbox)
35126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final EmailServiceProxy proxy = EmailServiceUtils.getServiceForAccount(this, account.mId);
352eb232290309aa3247d6c9b566e8490065a28f763Yu Ping Hu        try {
353eb232290309aa3247d6c9b566e8490065a28f763Yu Ping Hu            proxy.updateFolderList(account.mId);
354eb232290309aa3247d6c9b566e8490065a28f763Yu Ping Hu        } catch (RemoteException e) {
355eb232290309aa3247d6c9b566e8490065a28f763Yu Ping Hu            // It's all good
356f6db592c313c77190727c7cd72d3edda9d23a099Marc Blank        }
357d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank    }
358d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank
3592959a7e073c87e2fa5fab42ec543b352a91cf187Andy Stadler    /**
360ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * This is called after the AccountSecurity activity completes.
3612959a7e073c87e2fa5fab42ec543b352a91cf187Andy Stadler     */
362ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    @Override
363ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    public void onActivityResult(int requestCode, int resultCode, Intent data) {
364ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler        saveAccountAndFinish();
365a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank    }
366a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
367ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    /**
368ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     * These are the final cleanup steps when creating an account:
369ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     *  Clear incomplete & security hold flags
370ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     *  Update account in DB
371ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     *  Enable email services
372ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     *  Enable exchange services
373ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     *  Move to final setup screen
374ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler     */
375ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler    private void saveAccountAndFinish() {
37626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
377ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler            @Override
37826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            protected Void doInBackground(Void... params) {
37926cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                final AccountSetupOptions context = AccountSetupOptions.this;
3808df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank                // Clear the security hold flag now
38126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                final Account account = mSetupData.getAccount();
3828df9af0df3ea8d987b06364f388cd5de57c7bea9Marc Blank                account.mFlags &= ~Account.FLAGS_SECURITY_HOLD;
383ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                AccountSettingsUtils.commitSettings(context, account);
384ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                // Start up services based on new account(s)
385f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                MailActivityEmail.setServicesEnabledSync(context);
386f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank                EmailServiceUtils.startService(context, account.mHostAuthRecv.mProtocol);
387ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                // Move to final setup screen
38826cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                AccountSetupNames.actionSetNames(context, mSetupData);
389ec9398e7c6dc7a016b68ea3009fd950f898763a0Andy Stadler                finish();
39026cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                return null;
391d6d874f8c6ce2580ef9ec2406fe411af45b2d92dMarc Blank            }
39226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        };
39326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        asyncTask.execute();
39496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
39596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3969197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler    /**
3979197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler     * Enable an additional spinner using the arrays normally handled by preferences
3989197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler     */
399f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    private void enableLookbackSpinner() {
4009197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        // Show everything
4012fbb3db5d86210d03175ce77ff08c989a96c5864Makoto Onuki        mAccountSyncWindowRow.setVisibility(View.VISIBLE);
4029197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler
4039197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        // Generate spinner entries using XML arrays used by the preferences
40426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final CharSequence[] windowValues = getResources().getTextArray(
4059197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler                R.array.account_settings_mail_window_values);
40626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final CharSequence[] windowEntries = getResources().getTextArray(
4079197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler                R.array.account_settings_mail_window_entries);
408a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
409919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank        // Find a proper maximum for email lookback, based on policy (if we have one)
410919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank        int maxEntry = windowEntries.length;
41126cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final Policy policy = mSetupData.getAccount().mPolicy;
412919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank        if (policy != null) {
41326cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler            final int maxLookback = policy.mMaxEmailLookback;
414919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank            if (maxLookback != 0) {
415919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank                // Offset/Code   0      1      2      3      4        5
416919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank                // Entries      auto, 1 day, 3 day, 1 week, 2 week, 1 month
417919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank                // Lookback     N/A   1 day, 3 day, 1 week, 2 week, 1 month
418919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank                // Since our test below is i < maxEntry, we must set maxEntry to maxLookback + 1
419919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank                maxEntry = maxLookback + 1;
420919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank            }
421919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank        }
422919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank
4239197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        // Now create the array used by the Spinner
42426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final SpinnerOption[] windowOptions = new SpinnerOption[maxEntry];
4256854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki        int defaultIndex = -1;
426919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank        for (int i = 0; i < maxEntry; i++) {
4276854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki            final int value = Integer.valueOf(windowValues[i].toString());
4286854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki            windowOptions[i] = new SpinnerOption(value, windowEntries[i].toString());
4296854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki            if (value == SYNC_WINDOW_EAS_DEFAULT) {
4306854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki                defaultIndex = i;
4316854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki            }
4329197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        }
4339197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler
43426cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler        final ArrayAdapter<SpinnerOption> windowOptionsAdapter =
43526cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                new ArrayAdapter<SpinnerOption>(this, android.R.layout.simple_spinner_item,
43626cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                        windowOptions);
4379197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        windowOptionsAdapter
4389197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
4399197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler        mSyncWindowView.setAdapter(windowOptionsAdapter);
440a3c6c6ed294d5a1fb0662fdacc1388944487fdf2Marc Blank
441e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        SpinnerOption.setSpinnerOptionValue(mSyncWindowView,
44226cd5e024c6af8ff9c8558325dd0930c9aacb370Tony Mantler                mSetupData.getAccount().getSyncLookback());
4436854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki        if (defaultIndex >= 0) {
4446854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki            mSyncWindowView.setSelection(defaultIndex);
4456854a4f24a0e93547fc7785553b7f53878a76e08Makoto Onuki        }
4469197f428946d5c77613b64a50c93a46e2acf62dcAndy Stadler    }
44796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
448