ProxySelector.java revision 8a963babe2e36b7a41f77b8d2598c97658196e58
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
198a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
2021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
2121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Daiimport android.app.Dialog;
2521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport android.app.Fragment;
2621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport android.app.admin.DevicePolicyManager;
2705411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayorimport android.content.Context;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
2952322a9173fc167d3011017b396d1c7419fc280bRobert Greenwaltimport android.net.ConnectivityManager;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Proxy;
31e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monkimport android.net.ProxyInfo;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.Selection;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.Spannable;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
3705411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayorimport android.view.LayoutInflater;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View.OnClickListener;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View.OnFocusChangeListener;
4121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport android.view.ViewGroup;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
468a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class ProxySelector extends InstrumentedFragment implements DialogCreatable {
4721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private static final String TAG = "ProxySelector";
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    EditText    mHostnameField;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    EditText    mPortField;
5105411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor    EditText    mExclusionListField;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    Button      mOKButton;
5321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    Button      mClearButton;
5421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    Button      mDefaultButton;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
5620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    private static final int ERROR_DIALOG_ID = 0;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
5821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private SettingsDialogFragment mDialogFragment;
5921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private View mView;
6021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa
6121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    @Override
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onCreate(Bundle icicle) {
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
6421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    }
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
6621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    @Override
6721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    public View onCreateView(LayoutInflater inflater, ViewGroup container,
6821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            Bundle savedInstanceState) {
6921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mView = inflater.inflate(R.layout.proxy, container, false);
7021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        initView(mView);
7105411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        // TODO: Populate based on connection status
7252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        populateFields();
7321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        return mView;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
7620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    @Override
7721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
7821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        super.onActivityCreated(savedInstanceState);
7921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final DevicePolicyManager dpm =
8021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa                (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
8121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa
8221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final boolean userSetGlobalProxy = (dpm.getGlobalProxyAdmin() == null);
8321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        // Disable UI if the Global Proxy is being controlled by a Device Admin
8421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mHostnameField.setEnabled(userSetGlobalProxy);
8521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mPortField.setEnabled(userSetGlobalProxy);
8621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mExclusionListField.setEnabled(userSetGlobalProxy);
8721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mOKButton.setEnabled(userSetGlobalProxy);
8821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mClearButton.setEnabled(userSetGlobalProxy);
8921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDefaultButton.setEnabled(userSetGlobalProxy);
9021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    }
9121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa
9221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    // Dialog management
9321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa
9421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    @Override
9521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    public Dialog onCreateDialog(int id) {
9620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        if (id == ERROR_DIALOG_ID) {
9720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            String hostname = mHostnameField.getText().toString().trim();
9820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            String portStr = mPortField.getText().toString().trim();
9905411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor            String exclList = mExclusionListField.getText().toString().trim();
10021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            String msg = getActivity().getString(validate(hostname, portStr, exclList));
10120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
10221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            return new AlertDialog.Builder(getActivity())
10320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    .setTitle(R.string.proxy_error)
10420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    .setPositiveButton(R.string.proxy_error_dismiss, null)
10520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    .setMessage(msg)
10620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    .create();
10720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
10821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        return null;
10920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    }
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
11121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private void showDialog(int dialogId) {
11221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        if (mDialogFragment != null) {
11321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            Log.e(TAG, "Old dialog fragment not null!");
11420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
11521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDialogFragment = new SettingsDialogFragment(this, dialogId);
11621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
11921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private void initView(View view) {
12021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mHostnameField = (EditText)view.findViewById(R.id.hostname);
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mHostnameField.setOnFocusChangeListener(mOnFocusChangeHandler);
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mPortField = (EditText)view.findViewById(R.id.port);
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setOnClickListener(mOKHandler);
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setOnFocusChangeListener(mOnFocusChangeHandler);
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mExclusionListField = (EditText)view.findViewById(R.id.exclusionlist);
12805411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        mExclusionListField.setOnFocusChangeListener(mOnFocusChangeHandler);
12905411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor
13021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mOKButton = (Button)view.findViewById(R.id.action);
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mOKButton.setOnClickListener(mOKHandler);
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mClearButton = (Button)view.findViewById(R.id.clear);
13421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mClearButton.setOnClickListener(mClearHandler);
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDefaultButton = (Button)view.findViewById(R.id.defaultView);
13721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDefaultButton.setOnClickListener(mDefaultHandler);
13821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    }
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
14052322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt    void populateFields() {
14121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final Activity activity = getActivity();
14252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        String hostname = "";
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int port = -1;
14452322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        String exclList = "";
14552322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        // Use the last setting given by the user
14652322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        ConnectivityManager cm =
14752322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
14852322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt
149e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monk        ProxyInfo proxy = cm.getGlobalProxy();
15052322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        if (proxy != null) {
15152322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt            hostname = proxy.getHost();
15252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt            port = proxy.getPort();
153d65928c558e79d3e7e0682b3d99610204fb4479fJason Monk            exclList = proxy.getExclusionListAsString();
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (hostname == null) {
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            hostname = "";
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mHostnameField.setText(hostname);
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String portStr = port == -1 ? "" : Integer.toString(port);
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setText(portStr);
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
16505411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        mExclusionListField.setText(exclList);
16605411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor
16721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final Intent intent = activity.getIntent();
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String buttonLabel = intent.getStringExtra("button-label");
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!TextUtils.isEmpty(buttonLabel)) {
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mOKButton.setText(buttonLabel);
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String title = intent.getStringExtra("title");
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!TextUtils.isEmpty(title)) {
17621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            activity.setTitle(title);
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * validate syntax of hostname and port entries
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @return 0 on success, string resource ID on failure
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
184c5361927f42572c8e10867ec6f8ffaa2cacff733Irfan Sheriff    public static int validate(String hostname, String port, String exclList) {
1851f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng        switch (Proxy.validate(hostname, port, exclList)) {
1861f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_VALID:
1871f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return 0;
1881f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_HOSTNAME_EMPTY:
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return R.string.proxy_error_empty_host_set_port;
1901f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_HOSTNAME_INVALID:
1911f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_invalid_host;
1921f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_PORT_EMPTY:
1931f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_empty_port;
1941f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_PORT_INVALID:
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return R.string.proxy_error_invalid_port;
1961f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_EXCLLIST_INVALID:
1971f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_invalid_exclusion_list;
1981f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            default:
1991f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                // should neven happen
2001f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                Log.e(TAG, "Unknown proxy settings error");
2011f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return -1;
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * returns true on success, false if the user must correct something
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    boolean saveToDb() {
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String hostname = mHostnameField.getText().toString().trim();
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String portStr = mPortField.getText().toString().trim();
21205411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        String exclList = mExclusionListField.getText().toString().trim();
21352322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        int port = 0;
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21505411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        int result = validate(hostname, portStr, exclList);
2161f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng        if (result != 0) {
21720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            showDialog(ERROR_DIALOG_ID);
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (portStr.length() > 0) {
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            try {
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                port = Integer.parseInt(portStr);
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } catch (NumberFormatException ex) {
22552322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                // should never happen - caught by validate above
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return false;
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
229e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monk        ProxyInfo p = new ProxyInfo(hostname, port, exclList);
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // FIXME: The best solution would be to make a better UI that would
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // disable editing of the text boxes if the user chooses to use the
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // default settings. i.e. checking a box to always use the default
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // carrier. http:/b/issue?id=756480
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // FIXME: If the user types in a proxy that matches the default, should
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // we keep that setting? Can be fixed with a new UI.
23652322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        ConnectivityManager cm =
23752322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23952322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        cm.setGlobalProxy(p);
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mOKHandler = new OnClickListener() {
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (saveToDb()) {
24621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa                    getActivity().onBackPressed();
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mClearHandler = new OnClickListener() {
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mHostnameField.setText("");
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mPortField.setText("");
25505411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor                mExclusionListField.setText("");
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mDefaultHandler = new OnClickListener() {
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
26105411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor                // TODO: populate based on connection status
26252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                populateFields();
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnFocusChangeListener mOnFocusChangeHandler = new OnFocusChangeListener() {
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onFocusChange(View v, boolean hasFocus) {
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (hasFocus) {
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    TextView textView = (TextView) v;
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Selection.selectAll((Spannable) textView.getText());
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
2748a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
2758a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
2768a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
2778a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.PROXY_SELECTOR;
2788a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
280