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