1310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh/*
2310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Copyright (C) 2011 The Android Open Source Project
3310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
4310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
5310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * you may not use this file except in compliance with the License.
6310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * You may obtain a copy of the License at
7310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
8310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
9310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
10310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
11310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
12310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * See the License for the specific language governing permissions and
14310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * limitations under the License.
15310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh */
16310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
17310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehpackage com.android.settings.vpn2;
18310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
19310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.app.AlertDialog;
20310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.content.Context;
21310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.content.DialogInterface;
22310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.os.Bundle;
23310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.security.Credentials;
24310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.security.KeyStore;
25310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.text.Editable;
26310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.text.TextWatcher;
27310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.view.View;
28d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yehimport android.view.WindowManager;
29310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.widget.AdapterView;
30310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.widget.ArrayAdapter;
31310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.widget.CheckBox;
32310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.widget.Spinner;
33310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport android.widget.TextView;
34310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
352bd92d5d0685144aad566b9d29454fb519ff0371Robin Leeimport com.android.internal.net.VpnProfile;
362bd92d5d0685144aad566b9d29454fb519ff0371Robin Leeimport com.android.settings.R;
372bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee
38d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yehimport java.net.InetAddress;
39d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh
402bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee/**
412bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee * Dialog showing information about a VPN configuration. The dialog
422bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee * can be launched to either edit or prompt for credentials to connect
432bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee * to a user-added VPN.
442bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee *
452bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee * {@see AppDialog}
462bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee */
472bd92d5d0685144aad566b9d29454fb519ff0371Robin Leeclass ConfigDialog extends AlertDialog implements TextWatcher,
48d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        View.OnClickListener, AdapterView.OnItemSelectedListener {
49310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private final KeyStore mKeyStore = KeyStore.getInstance();
50310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private final DialogInterface.OnClickListener mListener;
51310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private final VpnProfile mProfile;
52310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
53310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private boolean mEditing;
542bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee    private boolean mExists;
55310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
56310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private View mView;
57310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
58310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mName;
59310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private Spinner mType;
60310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mServer;
61310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mUsername;
62310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mPassword;
632fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    private TextView mSearchDomains;
64d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh    private TextView mDnsServers;
65310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mRoutes;
66310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private CheckBox mMppe;
67310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mL2tpSecret;
68310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mIpsecIdentifier;
69310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private TextView mIpsecSecret;
70310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private Spinner mIpsecUserCert;
71310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private Spinner mIpsecCaCert;
72f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh    private Spinner mIpsecServerCert;
73310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private CheckBox mSaveLogin;
746f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    private CheckBox mShowOptions;
75310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
762bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee    ConfigDialog(Context context, DialogInterface.OnClickListener listener,
772bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee            VpnProfile profile, boolean editing, boolean exists) {
78310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        super(context);
792bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee
80310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mListener = listener;
81310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mProfile = profile;
82310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mEditing = editing;
832bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee        mExists = exists;
84310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
85310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
86310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
87310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    protected void onCreate(Bundle savedState) {
88310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mView = getLayoutInflater().inflate(R.layout.vpn_dialog, null);
89310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        setView(mView);
90310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
91310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        Context context = getContext();
92310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
93310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // First, find out all the fields.
94310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mName = (TextView) mView.findViewById(R.id.name);
95310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mType = (Spinner) mView.findViewById(R.id.type);
96310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mServer = (TextView) mView.findViewById(R.id.server);
97310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mUsername = (TextView) mView.findViewById(R.id.username);
98310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mPassword = (TextView) mView.findViewById(R.id.password);
992fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh        mSearchDomains = (TextView) mView.findViewById(R.id.search_domains);
100d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        mDnsServers = (TextView) mView.findViewById(R.id.dns_servers);
101310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mRoutes = (TextView) mView.findViewById(R.id.routes);
102310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mMppe = (CheckBox) mView.findViewById(R.id.mppe);
103310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mL2tpSecret = (TextView) mView.findViewById(R.id.l2tp_secret);
104310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecIdentifier = (TextView) mView.findViewById(R.id.ipsec_identifier);
105310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecSecret = (TextView) mView.findViewById(R.id.ipsec_secret);
106310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecUserCert = (Spinner) mView.findViewById(R.id.ipsec_user_cert);
107310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecCaCert = (Spinner) mView.findViewById(R.id.ipsec_ca_cert);
108f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh        mIpsecServerCert = (Spinner) mView.findViewById(R.id.ipsec_server_cert);
109310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mSaveLogin = (CheckBox) mView.findViewById(R.id.save_login);
1106f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        mShowOptions = (CheckBox) mView.findViewById(R.id.show_options);
111310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
112310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Second, copy values from the profile.
113310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mName.setText(mProfile.name);
114310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mType.setSelection(mProfile.type);
115310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mServer.setText(mProfile.server);
11694c6cd6c29cb7cc92b4f5377db78df02c769f7c1Chia-chi Yeh        if (mProfile.saveLogin) {
11794c6cd6c29cb7cc92b4f5377db78df02c769f7c1Chia-chi Yeh            mUsername.setText(mProfile.username);
11894c6cd6c29cb7cc92b4f5377db78df02c769f7c1Chia-chi Yeh            mPassword.setText(mProfile.password);
11994c6cd6c29cb7cc92b4f5377db78df02c769f7c1Chia-chi Yeh        }
1202fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh        mSearchDomains.setText(mProfile.searchDomains);
121d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        mDnsServers.setText(mProfile.dnsServers);
122310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mRoutes.setText(mProfile.routes);
123310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mMppe.setChecked(mProfile.mppe);
124aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh        mL2tpSecret.setText(mProfile.l2tpSecret);
125310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecIdentifier.setText(mProfile.ipsecIdentifier);
126aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh        mIpsecSecret.setText(mProfile.ipsecSecret);
1272340efc9a3fb4ae7b90cf9e7b3eab8c9ff7aeec8Chia-chi Yeh        loadCertificates(mIpsecUserCert, Credentials.USER_PRIVATE_KEY,
128310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                0, mProfile.ipsecUserCert);
129bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh        loadCertificates(mIpsecCaCert, Credentials.CA_CERTIFICATE,
130310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                R.string.vpn_no_ca_cert, mProfile.ipsecCaCert);
131f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh        loadCertificates(mIpsecServerCert, Credentials.USER_CERTIFICATE,
132f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh                R.string.vpn_no_server_cert, mProfile.ipsecServerCert);
133310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mSaveLogin.setChecked(mProfile.saveLogin);
134310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
135310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Third, add listeners to required fields.
136310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mName.addTextChangedListener(this);
137310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mType.setOnItemSelectedListener(this);
138310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mServer.addTextChangedListener(this);
139310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mUsername.addTextChangedListener(this);
140310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mPassword.addTextChangedListener(this);
141d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        mDnsServers.addTextChangedListener(this);
142d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        mRoutes.addTextChangedListener(this);
143310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecSecret.addTextChangedListener(this);
144310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mIpsecUserCert.setOnItemSelectedListener(this);
1456f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        mShowOptions.setOnClickListener(this);
146310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
1476f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        // Fourth, determine whether to do editing or connecting.
148310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        boolean valid = validate(true);
149310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mEditing = mEditing || !valid;
150310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
151310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        if (mEditing) {
152310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            setTitle(R.string.vpn_edit);
153310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
154310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // Show common fields.
155310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            mView.findViewById(R.id.editor).setVisibility(View.VISIBLE);
156310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
157310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // Show type-specific fields.
158310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            changeType(mProfile.type);
159310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
1606f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee            // Switch to advanced view immediately if any advanced options are on
1616f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee            if (!mProfile.searchDomains.isEmpty() || !mProfile.dnsServers.isEmpty() ||
1626f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee                    !mProfile.routes.isEmpty()) {
1636f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee                showAdvancedOptions();
164d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh            }
165d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh
1662bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee            // Create a button to forget the profile if it has already been saved..
1672bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee            if (mExists) {
1682bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee                setButton(DialogInterface.BUTTON_NEUTRAL,
1692bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee                        context.getString(R.string.vpn_forget), mListener);
1702bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee            }
1712bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee
172310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // Create a button to save the profile.
173310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            setButton(DialogInterface.BUTTON_POSITIVE,
174310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                    context.getString(R.string.vpn_save), mListener);
175310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        } else {
176310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            setTitle(context.getString(R.string.vpn_connect_to, mProfile.name));
177310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
178310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // Not editing, just show username and password.
179310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            mView.findViewById(R.id.login).setVisibility(View.VISIBLE);
180310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
181310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // Create a button to connect the network.
182310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            setButton(DialogInterface.BUTTON_POSITIVE,
183310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                    context.getString(R.string.vpn_connect), mListener);
184310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
185310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
186310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Always provide a cancel button.
187310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        setButton(DialogInterface.BUTTON_NEGATIVE,
188310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                context.getString(R.string.vpn_cancel), mListener);
189310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
190310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Let AlertDialog create everything.
1912bd92d5d0685144aad566b9d29454fb519ff0371Robin Lee        super.onCreate(savedState);
192310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
193310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Disable the action button if necessary.
194310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        getButton(DialogInterface.BUTTON_POSITIVE)
195310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                .setEnabled(mEditing ? valid : validate(false));
196d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh
197d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        // Workaround to resize the dialog for the input method.
198d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
199d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
200310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
201310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
202310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
2036f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    public void onRestoreInstanceState(Bundle savedState) {
2046f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        super.onRestoreInstanceState(savedState);
2056f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee
2066f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        // Visibility isn't restored by super.onRestoreInstanceState, so re-show the advanced
2076f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        // options here if they were already revealed or set.
2086f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        if (mShowOptions.isChecked()) {
2096f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee            showAdvancedOptions();
2106f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        }
2116f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    }
2126f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee
2136f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    @Override
214310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    public void afterTextChanged(Editable field) {
215310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(mEditing));
216310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
217310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
218310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
219310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
220310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
221310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
222310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
223310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    public void onTextChanged(CharSequence s, int start, int before, int count) {
224310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
225310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
226310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
2276f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    public void onClick(View view) {
2286f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        if (view == mShowOptions) {
2296f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee            showAdvancedOptions();
2306f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        }
231d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh    }
232d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh
233d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh    @Override
234310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
235310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        if (parent == mType) {
236310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            changeType(position);
237310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
238bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh        getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(mEditing));
239310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
240310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
241310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    @Override
242310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    public void onNothingSelected(AdapterView<?> parent) {
243310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
244310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
2456f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    private void showAdvancedOptions() {
2466f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        mView.findViewById(R.id.options).setVisibility(View.VISIBLE);
2476f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee        mShowOptions.setVisibility(View.GONE);
2486f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee    }
2496f4951a1fac50ff2284187ac8f4ddc815856a25bRobin Lee
250310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private void changeType(int type) {
251310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // First, hide everything.
252310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mMppe.setVisibility(View.GONE);
253310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mView.findViewById(R.id.l2tp).setVisibility(View.GONE);
254310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mView.findViewById(R.id.ipsec_psk).setVisibility(View.GONE);
255310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        mView.findViewById(R.id.ipsec_user).setVisibility(View.GONE);
256f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh        mView.findViewById(R.id.ipsec_peer).setVisibility(View.GONE);
257310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
258310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Then, unhide type-specific fields.
259310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        switch (type) {
260310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_PPTP:
261310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                mMppe.setVisibility(View.VISIBLE);
262310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
2636d4334be691815cd9615b0fdebb756999a9c06a3Chia-chi Yeh
264310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_PSK:
265310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                mView.findViewById(R.id.l2tp).setVisibility(View.VISIBLE);
2666d4334be691815cd9615b0fdebb756999a9c06a3Chia-chi Yeh                // fall through
267310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
268310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                mView.findViewById(R.id.ipsec_psk).setVisibility(View.VISIBLE);
269310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
270310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
271310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_RSA:
272310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                mView.findViewById(R.id.l2tp).setVisibility(View.VISIBLE);
273310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                // fall through
274310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
2750082d17ce7ad2f8b3601068e62eda92aa8670a0fChia-chi Yeh                mView.findViewById(R.id.ipsec_user).setVisibility(View.VISIBLE);
276310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                // fall through
277310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_HYBRID_RSA:
278f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh                mView.findViewById(R.id.ipsec_peer).setVisibility(View.VISIBLE);
279310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
280310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
281310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
282310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
283310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private boolean validate(boolean editing) {
284310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        if (!editing) {
285310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            return mUsername.getText().length() != 0 && mPassword.getText().length() != 0;
286310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
287d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        if (mName.getText().length() == 0 || mServer.getText().length() == 0 ||
288d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                !validateAddresses(mDnsServers.getText().toString(), false) ||
289d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                !validateAddresses(mRoutes.getText().toString(), true)) {
290310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            return false;
291310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
292310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        switch (mType.getSelectedItemPosition()) {
293310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_PPTP:
2946d4334be691815cd9615b0fdebb756999a9c06a3Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_HYBRID_RSA:
295310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return true;
296310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
297310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_PSK:
298310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
299310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return mIpsecSecret.getText().length() != 0;
300310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
301310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_RSA:
302310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
303310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return mIpsecUserCert.getSelectedItemPosition() != 0;
304310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
305310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        return false;
306310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
307310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
308d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh    private boolean validateAddresses(String addresses, boolean cidr) {
309d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        try {
310d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh            for (String address : addresses.split(" ")) {
311d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                if (address.isEmpty()) {
312d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                    continue;
313d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                }
314d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                // Legacy VPN currently only supports IPv4.
315d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                int prefixLength = 32;
316d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                if (cidr) {
317d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                    String[] parts = address.split("/", 2);
318d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                    address = parts[0];
319d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                    prefixLength = Integer.parseInt(parts[1]);
320d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                }
321d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                byte[] bytes = InetAddress.parseNumericAddress(address).getAddress();
322d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                int integer = (bytes[3] & 0xFF) | (bytes[2] & 0xFF) << 8 |
323d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                        (bytes[1] & 0xFF) << 16 | (bytes[0] & 0xFF) << 24;
324d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                if (bytes.length != 4 || prefixLength < 0 || prefixLength > 32 ||
325d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                        (prefixLength < 32 && (integer << prefixLength) != 0)) {
326d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                    return false;
327d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh                }
328d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh            }
329d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        } catch (Exception e) {
330d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh            return false;
331d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        }
332d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        return true;
333d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh    }
334d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh
335310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    private void loadCertificates(Spinner spinner, String prefix, int firstId, String selected) {
336310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        Context context = getContext();
337310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        String first = (firstId == 0) ? "" : context.getString(firstId);
3383848407d0c2fad920419d6b925e0c8e374502680Alex Klyubin        String[] certificates = mKeyStore.list(prefix);
339310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
340bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh        if (certificates == null || certificates.length == 0) {
341bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh            certificates = new String[] {first};
342310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        } else {
343bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh            String[] array = new String[certificates.length + 1];
344310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            array[0] = first;
345bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh            System.arraycopy(certificates, 0, array, 1, certificates.length);
346bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh            certificates = array;
347310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
348310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
349310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
350bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh                context, android.R.layout.simple_spinner_item, certificates);
351310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
352310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        spinner.setAdapter(adapter);
353310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
354bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh        for (int i = 1; i < certificates.length; ++i) {
355bbb5094be6673929bcb808cdeaf748a73be4dbf0Chia-chi Yeh            if (certificates[i].equals(selected)) {
356310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                spinner.setSelection(i);
357310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
358310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            }
359310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
360310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
361310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
362310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    boolean isEditing() {
363310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        return mEditing;
364310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
365310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
366310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    VpnProfile getProfile() {
367310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // First, save common fields.
368310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        VpnProfile profile = new VpnProfile(mProfile.key);
369310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.name = mName.getText().toString();
370310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.type = mType.getSelectedItemPosition();
371310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.server = mServer.getText().toString().trim();
372310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.username = mUsername.getText().toString();
373aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh        profile.password = mPassword.getText().toString();
3742fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh        profile.searchDomains = mSearchDomains.getText().toString().trim();
375d68dbe29bb0a6639bfd95449eb28e7d4b174a3feChia-chi Yeh        profile.dnsServers = mDnsServers.getText().toString().trim();
376310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.routes = mRoutes.getText().toString().trim();
377310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
378310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        // Then, save type-specific fields.
379310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        switch (profile.type) {
380310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_PPTP:
381310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                profile.mppe = mMppe.isChecked();
382310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
3836d4334be691815cd9615b0fdebb756999a9c06a3Chia-chi Yeh
384310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_PSK:
385aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh                profile.l2tpSecret = mL2tpSecret.getText().toString();
3866d4334be691815cd9615b0fdebb756999a9c06a3Chia-chi Yeh                // fall through
387310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
388413b171159cec5ad1e7b3cf4f1f842b5f2debc05Chia-chi Yeh                profile.ipsecIdentifier = mIpsecIdentifier.getText().toString();
389aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh                profile.ipsecSecret = mIpsecSecret.getText().toString();
390310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
391310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
392310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_L2TP_IPSEC_RSA:
393aa5b531b0b540488f47ad0414dc77eecbb47cd3aChia-chi Yeh                profile.l2tpSecret = mL2tpSecret.getText().toString();
394310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                // fall through
395310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
3960082d17ce7ad2f8b3601068e62eda92aa8670a0fChia-chi Yeh                if (mIpsecUserCert.getSelectedItemPosition() != 0) {
3970082d17ce7ad2f8b3601068e62eda92aa8670a0fChia-chi Yeh                    profile.ipsecUserCert = (String) mIpsecUserCert.getSelectedItem();
398310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                }
399310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                // fall through
400310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            case VpnProfile.TYPE_IPSEC_HYBRID_RSA:
4010082d17ce7ad2f8b3601068e62eda92aa8670a0fChia-chi Yeh                if (mIpsecCaCert.getSelectedItemPosition() != 0) {
4020082d17ce7ad2f8b3601068e62eda92aa8670a0fChia-chi Yeh                    profile.ipsecCaCert = (String) mIpsecCaCert.getSelectedItem();
403310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                }
404f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh                if (mIpsecServerCert.getSelectedItemPosition() != 0) {
405f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh                    profile.ipsecServerCert = (String) mIpsecServerCert.getSelectedItem();
406f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh                }
407310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                break;
408310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
409310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
410310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        profile.saveLogin = mSaveLogin.isChecked();
411310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        return profile;
412310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
413310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh}
414