AccountSetupOutgoingFragment.java revision 6e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6
1faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler/*
2faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Copyright (C) 2010 The Android Open Source Project
3faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
4faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
5faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * you may not use this file except in compliance with the License.
6faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * You may obtain a copy of the License at
7faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
8faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
9faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler *
10faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * Unless required by applicable law or agreed to in writing, software
11faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
12faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * See the License for the specific language governing permissions and
14faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler * limitations under the License.
15faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler */
16faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
17faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerpackage com.android.email.activity.setup;
18faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
19faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.AccountBackupRestore;
20faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.Email;
21faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.R;
22faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.Utility;
23faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport com.android.email.provider.EmailContent;
246e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadlerimport com.android.email.provider.EmailContent.Account;
25faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
26faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.app.Activity;
27faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.content.Context;
28faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.os.Bundle;
29faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.Editable;
30faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.TextWatcher;
31faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.text.method.DigitsKeyListener;
32faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.util.Log;
33faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.LayoutInflater;
34faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.View;
35faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.view.ViewGroup;
36faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.AdapterView;
37faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.ArrayAdapter;
38faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CheckBox;
39faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton;
40faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.CompoundButton.OnCheckedChangeListener;
41faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.EditText;
42faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport android.widget.Spinner;
43faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
44faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport java.net.URI;
45faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadlerimport java.net.URISyntaxException;
46faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
47fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler/**
48fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * Provides UI for SMTP account settings (for IMAP/POP accounts).
49fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler *
50fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * This fragment is used by AccountSetupOutgoing (for creating accounts) and by AccountSettingsXL
51fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler * (for editing existing accounts).
52fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler */
531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpublic class AccountSetupOutgoingFragment extends AccountServerBaseFragment
541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        implements OnCheckedChangeListener {
551f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
561f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler    private final static String STATE_KEY_LOADED = "AccountSetupOutgoingFragment.loaded";
571f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
58faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private static final int SMTP_PORTS[] = {
59faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            587, 465, 465, 587, 587
60faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    };
61faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
62faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private static final String SMTP_SCHEMES[] = {
63faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            "smtp", "smtp+ssl+", "smtp+ssl+trustallcerts", "smtp+tls+", "smtp+tls+trustallcerts"
64faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    };
65faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
66faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mUsernameView;
67faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mPasswordView;
68faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mServerView;
69faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private EditText mPortView;
70faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private CheckBox mRequireLoginView;
71e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler    private View mRequireLoginSettingsView;
72e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler    private View mRequireLoginSettingsView2;
73faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private Spinner mSecurityTypeView;
74faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
75faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    // Support for lifecycle
76faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private boolean mStarted;
77faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private boolean mLoaded;
78faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
79faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
80112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * Create the fragment with parameters - used mainly to force into settings mode (with buttons)
81112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * @param settingsMode if true, alters appearance for use in settings (default is "setup")
82112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     */
83112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    public static AccountSetupOutgoingFragment newInstance(boolean settingsMode) {
84112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        AccountSetupOutgoingFragment f = new AccountSetupOutgoingFragment();
85112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        f.setSetupArguments(settingsMode);
86112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        return f;
87112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    }
88112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
89112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    /**
90faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called to do initial creation of a fragment.  This is called after
91faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
92faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
93faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
94faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onCreate(Bundle savedInstanceState) {
95faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
96faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onCreate");
97faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
98faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onCreate(savedInstanceState);
991f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
1001f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (savedInstanceState != null) {
1011f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler            mLoaded = savedInstanceState.getBoolean(STATE_KEY_LOADED, false);
1021f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        }
103faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
104faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
105faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
106faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public View onCreateView(LayoutInflater inflater, ViewGroup container,
107faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Bundle savedInstanceState) {
108faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
109faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onCreateView");
110faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
111112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        int layoutId = mSettingsMode
112112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                ? R.layout.account_settings_outgoing_fragment
113112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                : R.layout.account_setup_outgoing_fragment;
114112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
115112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        View view = inflater.inflate(layoutId, container, false);
116faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        Context context = getActivity();
117faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
118faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mUsernameView = (EditText) view.findViewById(R.id.account_username);
119faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPasswordView = (EditText) view.findViewById(R.id.account_password);
120faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mServerView = (EditText) view.findViewById(R.id.account_server);
121faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView = (EditText) view.findViewById(R.id.account_port);
122faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mRequireLoginView = (CheckBox) view.findViewById(R.id.account_require_login);
123e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        mRequireLoginSettingsView = view.findViewById(R.id.account_require_login_settings);
124e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        mRequireLoginSettingsView2 = view.findViewById(R.id.account_require_login_settings_2);
125faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mSecurityTypeView = (Spinner) view.findViewById(R.id.account_security_type);
126faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mRequireLoginView.setOnCheckedChangeListener(this);
127faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
128faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Note:  Strings are shared with AccountSetupIncomingFragment
129faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        SpinnerOption securityTypes[] = {
130faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            new SpinnerOption(0, context.getString(
131faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_none_label)),
132faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            new SpinnerOption(1, context.getString(
133faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_ssl_label)),
134faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            new SpinnerOption(2, context.getString(
135faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_ssl_trust_certificates_label)),
136faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            new SpinnerOption(3, context.getString(
137faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_tls_label)),
138faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            new SpinnerOption(4, context.getString(
139faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    R.string.account_setup_incoming_security_tls_trust_certificates_label)),
140faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        };
141faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
142faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        ArrayAdapter<SpinnerOption> securityTypesAdapter = new ArrayAdapter<SpinnerOption>(context,
143faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                android.R.layout.simple_spinner_item, securityTypes);
144faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
145faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mSecurityTypeView.setAdapter(securityTypesAdapter);
146faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
147faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Updates the port when the user changes the security type. This allows
148faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // us to show a reasonable default which the user can change.
149faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
150faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
151faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                updatePortFromSecurityType();
152faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
153faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
154faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void onNothingSelected(AdapterView<?> arg0) { }
155faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        });
156faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
157faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Calls validateFields() which enables or disables the Next button
158faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        TextWatcher validationTextWatcher = new TextWatcher() {
159faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void afterTextChanged(Editable s) {
160faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                validateFields();
161faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
162faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
163faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
164faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            public void onTextChanged(CharSequence s, int start, int before, int count) { }
165faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        };
166faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mUsernameView.addTextChangedListener(validationTextWatcher);
167faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPasswordView.addTextChangedListener(validationTextWatcher);
168faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mServerView.addTextChangedListener(validationTextWatcher);
169faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView.addTextChangedListener(validationTextWatcher);
170faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
171112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Only allow digits in the port field.
172faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
173112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
174112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Additional setup only used while in "settings" mode
175112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        onCreateViewSettingsMode(view);
176112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
177faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        return view;
178faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
179faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
180faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
181faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onActivityCreated(Bundle savedInstanceState) {
182faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
183faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onActivityCreated");
184faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
185faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onActivityCreated(savedInstanceState);
186faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
187faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
188faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
189faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the Fragment is visible to the user.
190faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
191faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
192faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onStart() {
193faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
194faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onStart");
195faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
196faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onStart();
197faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mStarted = true;
1981f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        loadSettings();
199faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
200faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
201faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
202faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the fragment is visible to the user and actively running.
203faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
204faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
205faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onResume() {
206faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
207faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onResume");
208faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
209faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onResume();
210faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
211faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
212faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
213faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
214faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onPause() {
215faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
216faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onPause");
217faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
218faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onPause();
219faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
220faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
221faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
222faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the Fragment is no longer started.
223faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
224faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
225faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onStop() {
226faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
227faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onStop");
228faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
229faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onStop();
230faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mStarted = false;
231faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
232faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
233faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
234faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Called when the fragment is no longer in use.
235faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
236faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
237faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onDestroy() {
238faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
239faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onDestroy");
240faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
241faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onDestroy();
242faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
243faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
244faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
245faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onSaveInstanceState(Bundle outState) {
246faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
247faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Log.d(Email.LOG_TAG, "AccountSetupOutgoingFragment onSaveInstanceState");
248faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
249faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        super.onSaveInstanceState(outState);
2501f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler
2511f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        outState.putBoolean(STATE_KEY_LOADED, mLoaded);
252faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
253faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
254faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
255faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Activity provides callbacks here.  This also triggers loading and setting up the UX
256faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
2571a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
258faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void setCallback(Callback callback) {
2591a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.setCallback(callback);
2601f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mStarted) {
261faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            loadSettings();
262faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
263faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
264faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
265faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
266faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Load the current settings into the UI
267faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
268faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private void loadSettings() {
2691f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (mLoaded) return;
270faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        try {
271faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            // TODO this should be accessed directly via the HostAuth structure
272faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            URI uri = new URI(SetupData.getAccount().getSenderUri(mContext));
273faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            String username = null;
274faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            String password = null;
275faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (uri.getUserInfo() != null) {
276faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                String[] userInfoParts = uri.getUserInfo().split(":", 2);
277faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                username = userInfoParts[0];
278faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                if (userInfoParts.length > 1) {
279faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    password = userInfoParts[1];
280faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                }
281faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
282faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
283faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (username != null) {
284faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mUsernameView.setText(username);
285faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mRequireLoginView.setChecked(true);
286faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
287faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
288faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (password != null) {
289faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mPasswordView.setText(password);
290faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
291faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
292faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            for (int i = 0; i < SMTP_SCHEMES.length; i++) {
293faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                if (SMTP_SCHEMES[i].equals(uri.getScheme())) {
294faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    SpinnerOption.setSpinnerOptionValue(mSecurityTypeView, i);
295faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                }
296faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
297faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
298faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (uri.getHost() != null) {
299faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mServerView.setText(uri.getHost());
300faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
301faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
302faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            if (uri.getPort() != -1) {
303faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mPortView.setText(Integer.toString(uri.getPort()));
304faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            } else {
305faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                updatePortFromSecurityType();
306faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
307faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        } catch (URISyntaxException use) {
308faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            /*
309faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler             * We should always be able to parse our own settings.
310faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler             */
311faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            throw new Error(use);
312faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
3131f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        mLoaded = true;
314faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
315faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
316faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
317faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
318faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Preflight the values in the fields and decide if it makes sense to enable the "next" button
319faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
320faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private void validateFields() {
3211f3e117951e5ffe97a30bdd61c1cf99759f15406Andy Stadler        if (!mLoaded) return;
322faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        boolean enabled =
323faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            Utility.isTextViewNotEmpty(mServerView) && Utility.isPortFieldValid(mPortView);
324faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
325faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (enabled && mRequireLoginView.isChecked()) {
326faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            enabled = (Utility.isTextViewNotEmpty(mUsernameView)
327faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                    && Utility.isTextViewNotEmpty(mPasswordView));
328faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
329faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
330faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (enabled) {
331faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            try {
332faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                URI uri = getUri();
333faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            } catch (URISyntaxException use) {
334faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                enabled = false;
335faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            }
336faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
3371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        enableNextButton(enabled);
338faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler   }
339faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
340faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
341faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * implements OnCheckedChangeListener
342faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
343faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    @Override
344faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
345faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mRequireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
346e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        if (mRequireLoginSettingsView2 != null) {
347e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler            mRequireLoginSettingsView2.setVisibility(isChecked ? View.VISIBLE : View.GONE);
348e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        }
349faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        validateFields();
350faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
351faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
352faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    private void updatePortFromSecurityType() {
353faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
354faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        mPortView.setText(Integer.toString(SMTP_PORTS[securityType]));
355faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
356faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
357faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
358faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Entry point from Activity after editing settings and verifying them.  Must be FLOW_MODE_EDIT.
3596e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Blocking - do not call from UI Thread.
360faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
3611a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
362faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void saveSettingsAfterEdit() {
3636e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        Account account = SetupData.getAccount();
3646e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        account.mHostAuthSend.update(mContext, account.mHostAuthSend.toContentValues());
365faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        // Update the backup (side copy) of the accounts
366faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        AccountBackupRestore.backupAccounts(mContext);
367faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
368faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
369faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
370fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     * Entry point from Activity after entering new settings and verifying them.  For setup mode.
371fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     */
372fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
373fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    public void saveSettingsAfterSetup() {
374fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    }
375fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
376fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    /**
377faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Attempt to create a URI from the fields provided.  Throws URISyntaxException if there's
378faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * a problem with the user input.
379faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * @return a URI built from the account setup fields
380faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
381fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /* package */ URI getUri() throws URISyntaxException {
382faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        int securityType = (Integer)((SpinnerOption)mSecurityTypeView.getSelectedItem()).value;
383faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        String userInfo = null;
384faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        if (mRequireLoginView.isChecked()) {
385fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler            userInfo = mUsernameView.getText().toString().trim() + ":" + mPasswordView.getText();
386faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
387faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        URI uri = new URI(
388faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                SMTP_SCHEMES[securityType],
389faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                userInfo,
390faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                mServerView.getText().toString().trim(),
391faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                Integer.parseInt(mPortView.getText().toString().trim()),
392faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler                null, null, null);
393faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        return uri;
394faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
395faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler
396faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    /**
397faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     * Entry point from Activity, when "next" button is clicked
398faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler     */
3991a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
400faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    public void onNext() {
401faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        EmailContent.Account account = SetupData.getAccount();
402faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        try {
403faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            // TODO this should be accessed directly via the HostAuth structure
404faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            URI uri = getUri();
405faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            account.setSenderUri(mContext, uri.toString());
406faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        } catch (URISyntaxException use) {
407faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            /*
408faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler             * It's unrecoverable if we cannot create a URI from components that
409faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler             * we validated to be safe.
410faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler             */
411faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler            throw new Error(use);
412faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler        }
41355110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler
4148d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this);
415faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler    }
416faaa115e1a52eda9e675f9da5982c7a52b382336Andrew Stadler}
417