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
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Daiimport android.app.Dialog;
2221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport android.app.admin.DevicePolicyManager;
2305411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayorimport android.content.Context;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
2552322a9173fc167d3011017b396d1c7419fc280bRobert Greenwaltimport android.net.ConnectivityManager;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Proxy;
27e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monkimport android.net.ProxyInfo;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.Selection;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.Spannable;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
3305411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayorimport android.view.LayoutInflater;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View.OnClickListener;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View.OnFocusChangeListener;
3721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawaimport android.view.ViewGroup;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
42265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
4339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
442d0b3447360666847c483e6ce2521846c66c25c1Fan Zhangimport com.android.settings.core.InstrumentedPreferenceFragment;
4539b467482d1bf256a111c757e9b7621c6f523271Jason Monk
462d0b3447360666847c483e6ce2521846c66c25c1Fan Zhangpublic class ProxySelector extends InstrumentedPreferenceFragment 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
111d65184faef1076280e121c5cbc1db863f3f37924Fan Zhang    @Override
112d65184faef1076280e121c5cbc1db863f3f37924Fan Zhang    public int getDialogMetricsCategory(int dialogId) {
113d65184faef1076280e121c5cbc1db863f3f37924Fan Zhang        return MetricsEvent.DIALOG_PROXY_SELECTOR_ERROR;
114d65184faef1076280e121c5cbc1db863f3f37924Fan Zhang    }
115d65184faef1076280e121c5cbc1db863f3f37924Fan Zhang
11621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private void showDialog(int dialogId) {
11721c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        if (mDialogFragment != null) {
11821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            Log.e(TAG, "Old dialog fragment not null!");
11920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
12021c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDialogFragment = new SettingsDialogFragment(this, dialogId);
12121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12421c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    private void initView(View view) {
12521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mHostnameField = (EditText)view.findViewById(R.id.hostname);
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mHostnameField.setOnFocusChangeListener(mOnFocusChangeHandler);
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mPortField = (EditText)view.findViewById(R.id.port);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setOnClickListener(mOKHandler);
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setOnFocusChangeListener(mOnFocusChangeHandler);
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mExclusionListField = (EditText)view.findViewById(R.id.exclusionlist);
13305411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        mExclusionListField.setOnFocusChangeListener(mOnFocusChangeHandler);
13405411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor
13521c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mOKButton = (Button)view.findViewById(R.id.action);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mOKButton.setOnClickListener(mOKHandler);
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13821c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mClearButton = (Button)view.findViewById(R.id.clear);
13921c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mClearButton.setOnClickListener(mClearHandler);
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
14121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDefaultButton = (Button)view.findViewById(R.id.defaultView);
14221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        mDefaultButton.setOnClickListener(mDefaultHandler);
14321c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa    }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
14552322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt    void populateFields() {
14621c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final Activity activity = getActivity();
14752322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        String hostname = "";
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int port = -1;
14952322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        String exclList = "";
15052322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        // Use the last setting given by the user
15152322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        ConnectivityManager cm =
15252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
15352322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt
154e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monk        ProxyInfo proxy = cm.getGlobalProxy();
15552322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        if (proxy != null) {
15652322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt            hostname = proxy.getHost();
15752322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt            port = proxy.getPort();
158d65928c558e79d3e7e0682b3d99610204fb4479fJason Monk            exclList = proxy.getExclusionListAsString();
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (hostname == null) {
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            hostname = "";
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mHostnameField.setText(hostname);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String portStr = port == -1 ? "" : Integer.toString(port);
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPortField.setText(portStr);
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17005411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        mExclusionListField.setText(exclList);
17105411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor
17221c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa        final Intent intent = activity.getIntent();
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String buttonLabel = intent.getStringExtra("button-label");
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!TextUtils.isEmpty(buttonLabel)) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mOKButton.setText(buttonLabel);
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String title = intent.getStringExtra("title");
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!TextUtils.isEmpty(title)) {
18121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa            activity.setTitle(title);
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * validate syntax of hostname and port entries
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @return 0 on success, string resource ID on failure
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
189c5361927f42572c8e10867ec6f8ffaa2cacff733Irfan Sheriff    public static int validate(String hostname, String port, String exclList) {
1901f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng        switch (Proxy.validate(hostname, port, exclList)) {
1911f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_VALID:
1921f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return 0;
1931f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_HOSTNAME_EMPTY:
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return R.string.proxy_error_empty_host_set_port;
1951f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_HOSTNAME_INVALID:
1961f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_invalid_host;
1971f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_PORT_EMPTY:
1981f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_empty_port;
1991f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_PORT_INVALID:
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return R.string.proxy_error_invalid_port;
2011f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            case Proxy.PROXY_EXCLLIST_INVALID:
2021f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return R.string.proxy_error_invalid_exclusion_list;
2031f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng            default:
2041f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                // should neven happen
2051f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                Log.e(TAG, "Unknown proxy settings error");
2061f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng                return -1;
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * returns true on success, false if the user must correct something
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    boolean saveToDb() {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String hostname = mHostnameField.getText().toString().trim();
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String portStr = mPortField.getText().toString().trim();
21705411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        String exclList = mExclusionListField.getText().toString().trim();
21852322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        int port = 0;
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
22005411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor        int result = validate(hostname, portStr, exclList);
2211f7a190fd70c73a6c119b1c30dc4e4c034d8f343Yuhao Zheng        if (result != 0) {
22220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            showDialog(ERROR_DIALOG_ID);
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (portStr.length() > 0) {
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            try {
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                port = Integer.parseInt(portStr);
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } catch (NumberFormatException ex) {
23052322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                // should never happen - caught by validate above
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return false;
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
234e86790c8381aceb1d627c878fc41ab765c4d6874Jason Monk        ProxyInfo p = new ProxyInfo(hostname, port, exclList);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // FIXME: The best solution would be to make a better UI that would
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // disable editing of the text boxes if the user chooses to use the
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // default settings. i.e. checking a box to always use the default
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // carrier. http:/b/issue?id=756480
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // FIXME: If the user types in a proxy that matches the default, should
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // we keep that setting? Can be fixed with a new UI.
24152322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        ConnectivityManager cm =
24252322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
24452322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt        cm.setGlobalProxy(p);
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mOKHandler = new OnClickListener() {
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (saveToDb()) {
25121c1abcef77b6db18590215b6f7bc8e6dfda28bfDaisuke Miyakawa                    getActivity().onBackPressed();
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mClearHandler = new OnClickListener() {
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mHostnameField.setText("");
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mPortField.setText("");
26005411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor                mExclusionListField.setText("");
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnClickListener mDefaultHandler = new OnClickListener() {
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onClick(View v) {
26605411893af4afc4bf7b8530d787c5b9e0bbeed39Oscar Montemayor                // TODO: populate based on connection status
26752322a9173fc167d3011017b396d1c7419fc280bRobert Greenwalt                populateFields();
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    OnFocusChangeListener mOnFocusChangeHandler = new OnFocusChangeListener() {
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            public void onFocusChange(View v, boolean hasFocus) {
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (hasFocus) {
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    TextView textView = (TextView) v;
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Selection.selectAll((Spannable) textView.getText());
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        };
2798a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
2808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
2816507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
2829d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.PROXY_SELECTOR;
2838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
285