13901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt/* 23901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * Copyright (C) 2008 The Android Open Source Project 33901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * 43901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License"); 53901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * you may not use this file except in compliance with the License. 63901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * You may obtain a copy of the License at 73901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * 83901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * http://www.apache.org/licenses/LICENSE-2.0 93901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * 103901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * Unless required by applicable law or agreed to in writing, software 113901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS, 123901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * See the License for the specific language governing permissions and 143901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * limitations under the License. 153901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt */ 163901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 173901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltpackage com.android.settings; 183901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 1965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport com.android.settings.wifi.WifiApEnabler; 2084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasaniimport com.android.settings.wifi.WifiApDialog; 2165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 229c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawaimport android.app.Activity; 23c3c93e5c6226863d09748160a0bfab00aebf0b9dRobert Greenwaltimport android.app.AlertDialog; 240b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriffimport android.app.Dialog; 2532711b6752eb73324e1b10db975ac956888eda96Danica Changimport android.bluetooth.BluetoothAdapter; 2632711b6752eb73324e1b10db975ac956888eda96Danica Changimport android.bluetooth.BluetoothPan; 279ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganeshimport android.bluetooth.BluetoothProfile; 283901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.content.BroadcastReceiver; 293901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.content.Context; 3084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasaniimport android.content.DialogInterface; 313901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.content.Intent; 323901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.content.IntentFilter; 334c3b2f0cf062b38a6e380cc15ff8dc9abdca518bRobert Greenwaltimport android.content.res.AssetManager; 3469a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwoodimport android.hardware.usb.UsbManager; 353901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.net.ConnectivityManager; 3684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasaniimport android.net.wifi.WifiConfiguration; 3784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasaniimport android.net.wifi.WifiManager; 389c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawaimport android.os.Bundle; 3926dad3ecef45ffb75178fc2fe184307089815510Mike Lockwoodimport android.os.Environment; 40505766cd60ea2ecd88769b08697d564529a27f5bRobert Greenwaltimport android.os.SystemProperties; 41209177aac6761db097c53152f6e9543f60748f15Robert Greenwaltimport android.preference.CheckBoxPreference; 423901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.preference.Preference; 433901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwaltimport android.preference.PreferenceScreen; 44aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriffimport android.text.TextUtils; 45476d79566752bfc128a7b3ae200c735d683370f7Amith Yamasaniimport android.view.ViewGroup; 46476d79566752bfc128a7b3ae200c735d683370f7Amith Yamasaniimport android.view.ViewParent; 47c3c93e5c6226863d09748160a0bfab00aebf0b9dRobert Greenwaltimport android.webkit.WebView; 483901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 494c3b2f0cf062b38a6e380cc15ff8dc9abdca518bRobert Greenwaltimport java.io.InputStream; 50c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwaltimport java.util.ArrayList; 51f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwaltimport java.util.concurrent.atomic.AtomicReference; 52c3c93e5c6226863d09748160a0bfab00aebf0b9dRobert Greenwaltimport java.util.Locale; 53b5f144af8ecc1c2f2e45f8a7d936f4ab368fdd97Matthew Xie 543901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt/* 553901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt * Displays preferences for Tethering. 563901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt */ 5784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasanipublic class TetherSettings extends SettingsPreferenceFragment 58aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener { 597f38f47ed2cc2479e1c9f362b471aac73caa0543zzy private static final String TAG = "TetherSettings"; 6032711b6752eb73324e1b10db975ac956888eda96Danica Chang 613901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt private static final String USB_TETHER_SETTINGS = "usb_tether_settings"; 6265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private static final String ENABLE_WIFI_AP = "enable_wifi_ap"; 6332711b6752eb73324e1b10db975ac956888eda96Danica Chang private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering"; 643901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 65d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani private static final int DIALOG_AP_SETTINGS = 1; 660b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff 670b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff private WebView mView; 68209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt private CheckBoxPreference mUsbTether; 693901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 7065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private WifiApEnabler mWifiApEnabler; 71aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff private CheckBoxPreference mEnableWifiAp; 7232711b6752eb73324e1b10db975ac956888eda96Danica Chang 7332711b6752eb73324e1b10db975ac956888eda96Danica Chang private CheckBoxPreference mBluetoothTether; 7432711b6752eb73324e1b10db975ac956888eda96Danica Chang 753901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt private BroadcastReceiver mTetherChangeReceiver; 763901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 77c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt private String[] mUsbRegexs; 78c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt 79c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt private String[] mWifiRegexs; 80c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt 8132711b6752eb73324e1b10db975ac956888eda96Danica Chang private String[] mBluetoothRegexs; 824f1970fe3ea188015053c05e2e871150b7a611a4Robert Greenwalt private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<BluetoothPan>(); 8332711b6752eb73324e1b10db975ac956888eda96Danica Chang 8484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private static final String WIFI_AP_SSID_AND_SECURITY = "wifi_ap_ssid_and_security"; 8584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private static final int CONFIG_SUBTEXT = R.string.wifi_tether_configure_subtext; 8684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 8784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private String[] mSecurityType; 8884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private Preference mCreateNetwork; 8984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 9084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private WifiApDialog mDialog; 9184a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private WifiManager mWifiManager; 9284a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private WifiConfiguration mWifiConfig = null; 9384a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 9469a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood private boolean mUsbConnected; 9569a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood private boolean mMassStorageActive; 9669a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood 97c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby private boolean mBluetoothEnableForTether; 98c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 9901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private static final int INVALID = -1; 10001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private static final int WIFI_TETHERING = 0; 10101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private static final int USB_TETHERING = 1; 10201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private static final int BLUETOOTH_TETHERING = 2; 10301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 10401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff /* One of INVALID, WIFI_TETHERING, USB_TETHERING or BLUETOOTH_TETHERING */ 10501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private int mTetherChoice = INVALID; 10601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 10701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff /* Stores the package name and the class name of the provisioning app */ 10801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private String[] mProvisionApp; 10901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private static final int PROVISION_REQUEST = 0; 11001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 1113901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt @Override 1129c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa public void onCreate(Bundle icicle) { 1133901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt super.onCreate(icicle); 1143901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt addPreferencesFromResource(R.xml.tether_prefs); 115476d79566752bfc128a7b3ae200c735d683370f7Amith Yamasani 1169c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa final Activity activity = getActivity(); 1179ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 1189ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh if (adapter != null) { 1199ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh adapter.getProfileProxy(activity.getApplicationContext(), mProfileServiceListener, 1209ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh BluetoothProfile.PAN); 1219ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh } 1229ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh 123aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff mEnableWifiAp = 124436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby (CheckBoxPreference) findPreference(ENABLE_WIFI_AP); 1250f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani Preference wifiApSettings = findPreference(WIFI_AP_SSID_AND_SECURITY); 126209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt mUsbTether = (CheckBoxPreference) findPreference(USB_TETHER_SETTINGS); 12732711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether = (CheckBoxPreference) findPreference(ENABLE_BLUETOOTH_TETHERING); 128c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt 129c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt ConnectivityManager cm = 130c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 13147ebb7895457160c88592248a2e9049c14e2b625Irfan Sheriff 132c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt mUsbRegexs = cm.getTetherableUsbRegexs(); 13332711b6752eb73324e1b10db975ac956888eda96Danica Chang mWifiRegexs = cm.getTetherableWifiRegexs(); 13432711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothRegexs = cm.getTetherableBluetoothRegexs(); 135e434bfb216682a6ca331fa54ce58a2bff7adf8d7Robert Greenwalt 136e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani final boolean usbAvailable = mUsbRegexs.length != 0; 137e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani final boolean wifiAvailable = mWifiRegexs.length != 0; 138e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani final boolean bluetoothAvailable = mBluetoothRegexs.length != 0; 13965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 14032711b6752eb73324e1b10db975ac956888eda96Danica Chang if (!usbAvailable || Utils.isMonkeyRunning()) { 14132711b6752eb73324e1b10db975ac956888eda96Danica Chang getPreferenceScreen().removePreference(mUsbTether); 14232711b6752eb73324e1b10db975ac956888eda96Danica Chang } 143e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani 144aaff44c84f4e88184276064dff9e36eefde3ffcbAmith Yamasani if (wifiAvailable && !Utils.isMonkeyRunning()) { 145aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp); 1460f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani initWifiTethering(); 1470f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani } else { 148aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff getPreferenceScreen().removePreference(mEnableWifiAp); 149436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby getPreferenceScreen().removePreference(wifiApSettings); 15032711b6752eb73324e1b10db975ac956888eda96Danica Chang } 151e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani 15232711b6752eb73324e1b10db975ac956888eda96Danica Chang if (!bluetoothAvailable) { 15332711b6752eb73324e1b10db975ac956888eda96Danica Chang getPreferenceScreen().removePreference(mBluetoothTether); 15432711b6752eb73324e1b10db975ac956888eda96Danica Chang } else { 155f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt BluetoothPan pan = mBluetoothPan.get(); 156f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (pan != null && pan.isTetheringOn()) { 15732711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setChecked(true); 15832711b6752eb73324e1b10db975ac956888eda96Danica Chang } else { 15932711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setChecked(false); 16032711b6752eb73324e1b10db975ac956888eda96Danica Chang } 16132711b6752eb73324e1b10db975ac956888eda96Danica Chang } 162e419bc1bed37d0584b32f0c0d54ecd9b9e1ea212Amith Yamasani 16301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mProvisionApp = getResources().getStringArray( 16401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff com.android.internal.R.array.config_mobile_hotspot_provision_app); 16501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 1669c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa mView = new WebView(activity); 16784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 16884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 16984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani private void initWifiTethering() { 17084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani final Activity activity = getActivity(); 17184a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 17284a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiConfig = mWifiManager.getWifiApConfiguration(); 17384a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mSecurityType = getResources().getStringArray(R.array.wifi_ap_security); 17484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 17584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mCreateNetwork = findPreference(WIFI_AP_SSID_AND_SECURITY); 17684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 17784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani if (mWifiConfig == null) { 17884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani final String s = activity.getString( 17984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani com.android.internal.R.string.wifi_tether_configure_ssid_default); 18084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT), 18184a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani s, mSecurityType[WifiApDialog.OPEN_INDEX])); 18284a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } else { 18384a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani int index = WifiApDialog.getSecurityTypeIndex(mWifiConfig); 18484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT), 18584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiConfig.SSID, 18684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mSecurityType[index])); 18784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 1883901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 1893901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 1909ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh private BluetoothProfile.ServiceListener mProfileServiceListener = 1919ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh new BluetoothProfile.ServiceListener() { 1929ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh public void onServiceConnected(int profile, BluetoothProfile proxy) { 193f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothPan.set((BluetoothPan) proxy); 1949ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh } 1959ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh public void onServiceDisconnected(int profile) { 196f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothPan.set(null); 1979ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh } 1989ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh }; 1999ad703cdb9a8d0972c123b041d18aa7bbeb391a4Jaikumar Ganesh 2000b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff @Override 2019c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa public Dialog onCreateDialog(int id) { 202d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani if (id == DIALOG_AP_SETTINGS) { 20384a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani final Activity activity = getActivity(); 20484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mDialog = new WifiApDialog(activity, this, mWifiConfig); 20584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani return mDialog; 2060b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff } 20784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 2080b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff return null; 2090b2669647f1328d2df79fd2d259bc9d15433ba0aIrfan Sheriff } 210c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt 2113901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt private class TetherChangeReceiver extends BroadcastReceiver { 21232711b6752eb73324e1b10db975ac956888eda96Danica Chang @Override 2133901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt public void onReceive(Context content, Intent intent) { 214c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby String action = intent.getAction(); 215c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) { 216a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt // TODO - this should understand the interface types 217a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ArrayList<String> available = intent.getStringArrayListExtra( 218a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ConnectivityManager.EXTRA_AVAILABLE_TETHER); 219a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ArrayList<String> active = intent.getStringArrayListExtra( 220a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ConnectivityManager.EXTRA_ACTIVE_TETHER); 221a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ArrayList<String> errored = intent.getStringArrayListExtra( 222a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt ConnectivityManager.EXTRA_ERRORED_TETHER); 22332711b6752eb73324e1b10db975ac956888eda96Danica Chang updateState(available.toArray(new String[available.size()]), 22432711b6752eb73324e1b10db975ac956888eda96Danica Chang active.toArray(new String[active.size()]), 22532711b6752eb73324e1b10db975ac956888eda96Danica Chang errored.toArray(new String[errored.size()])); 22669a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) { 22769a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood mMassStorageActive = true; 22869a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood updateState(); 22969a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood } else if (action.equals(Intent.ACTION_MEDIA_UNSHARED)) { 23069a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood mMassStorageActive = false; 23169a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood updateState(); 23269a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood } else if (action.equals(UsbManager.ACTION_USB_STATE)) { 23369a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood mUsbConnected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false); 234a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt updateState(); 235c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 236c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby if (mBluetoothEnableForTether) { 237c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby switch (intent 238c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby .getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) { 239c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby case BluetoothAdapter.STATE_ON: 240f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt BluetoothPan bluetoothPan = mBluetoothPan.get(); 241f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (bluetoothPan != null) { 242f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt bluetoothPan.setBluetoothTethering(true); 2437f38f47ed2cc2479e1c9f362b471aac73caa0543zzy mBluetoothEnableForTether = false; 2447f38f47ed2cc2479e1c9f362b471aac73caa0543zzy } 245c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby break; 246c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 247c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby case BluetoothAdapter.STATE_OFF: 248c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby case BluetoothAdapter.ERROR: 249c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby mBluetoothEnableForTether = false; 250c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby break; 251c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 252c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby default: 253c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby // ignore transition states 254c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 255c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } 25632711b6752eb73324e1b10db975ac956888eda96Danica Chang updateState(); 257a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt } 2583901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 2593901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 2603901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 2613901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt @Override 26202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani public void onStart() { 26302cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani super.onStart(); 2643901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 2659c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa final Activity activity = getActivity(); 2669c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa 26769a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState()); 2683901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mTetherChangeReceiver = new TetherChangeReceiver(); 26932711b6752eb73324e1b10db975ac956888eda96Danica Chang IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED); 2709c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa Intent intent = activity.registerReceiver(mTetherChangeReceiver, filter); 2713901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 272f0ed2f3f3175457825a0b49cab72f9cb78c3b997Robert Greenwalt filter = new IntentFilter(); 27369a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood filter.addAction(UsbManager.ACTION_USB_STATE); 27469a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood activity.registerReceiver(mTetherChangeReceiver, filter); 27569a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood 27669a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood filter = new IntentFilter(); 277f0ed2f3f3175457825a0b49cab72f9cb78c3b997Robert Greenwalt filter.addAction(Intent.ACTION_MEDIA_SHARED); 278f0ed2f3f3175457825a0b49cab72f9cb78c3b997Robert Greenwalt filter.addAction(Intent.ACTION_MEDIA_UNSHARED); 279f0ed2f3f3175457825a0b49cab72f9cb78c3b997Robert Greenwalt filter.addDataScheme("file"); 2809c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa activity.registerReceiver(mTetherChangeReceiver, filter); 281f0ed2f3f3175457825a0b49cab72f9cb78c3b997Robert Greenwalt 28232711b6752eb73324e1b10db975ac956888eda96Danica Chang filter = new IntentFilter(); 28332711b6752eb73324e1b10db975ac956888eda96Danica Chang filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); 2849c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa activity.registerReceiver(mTetherChangeReceiver, filter); 28532711b6752eb73324e1b10db975ac956888eda96Danica Chang 2869c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa if (intent != null) mTetherChangeReceiver.onReceive(activity, intent); 2870f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani if (mWifiApEnabler != null) { 288aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff mEnableWifiAp.setOnPreferenceChangeListener(this); 2890f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani mWifiApEnabler.resume(); 2900f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani } 291c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby 292c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby updateState(); 2933901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 2943901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 2953901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt @Override 29602cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani public void onStop() { 29702cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani super.onStop(); 2989c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa getActivity().unregisterReceiver(mTetherChangeReceiver); 2993901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mTetherChangeReceiver = null; 3000f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani if (mWifiApEnabler != null) { 301aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff mEnableWifiAp.setOnPreferenceChangeListener(null); 3020f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani mWifiApEnabler.pause(); 3030f47465a3f73a4f013ec7958efec95ecbb848ba8Amith Yamasani } 3043901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 3053901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt 306209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt private void updateState() { 307209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt ConnectivityManager cm = 308209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 309209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt 310209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt String[] available = cm.getTetherableIfaces(); 311209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt String[] tethered = cm.getTetheredIfaces(); 312209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt String[] errored = cm.getTetheringErroredIfaces(); 313209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt updateState(available, tethered, errored); 314209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 315209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt 3160008d219a2964218477d5bd5f28a848844063c44Ben Clark private void updateState(String[] available, String[] tethered, 3170008d219a2964218477d5bd5f28a848844063c44Ben Clark String[] errored) { 31832711b6752eb73324e1b10db975ac956888eda96Danica Chang updateUsbState(available, tethered, errored); 31932711b6752eb73324e1b10db975ac956888eda96Danica Chang updateBluetoothState(available, tethered, errored); 32032711b6752eb73324e1b10db975ac956888eda96Danica Chang } 32132711b6752eb73324e1b10db975ac956888eda96Danica Chang 32232711b6752eb73324e1b10db975ac956888eda96Danica Chang 32332711b6752eb73324e1b10db975ac956888eda96Danica Chang private void updateUsbState(String[] available, String[] tethered, 32432711b6752eb73324e1b10db975ac956888eda96Danica Chang String[] errored) { 325209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt ConnectivityManager cm = 326209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 32769a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood boolean usbAvailable = mUsbConnected && !mMassStorageActive; 328209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt int usbError = ConnectivityManager.TETHER_ERROR_NO_ERROR; 3290008d219a2964218477d5bd5f28a848844063c44Ben Clark for (String s : available) { 330c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt for (String regex : mUsbRegexs) { 331209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt if (s.matches(regex)) { 332209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) { 333209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt usbError = cm.getLastTetherError(s); 334209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 335209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 336c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt } 337c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt } 338436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby boolean usbTethered = false; 3390008d219a2964218477d5bd5f28a848844063c44Ben Clark for (String s : tethered) { 340c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt for (String regex : mUsbRegexs) { 341c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt if (s.matches(regex)) usbTethered = true; 342c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt } 343c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt } 344436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby boolean usbErrored = false; 3450008d219a2964218477d5bd5f28a848844063c44Ben Clark for (String s: errored) { 346d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt for (String regex : mUsbRegexs) { 347d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt if (s.matches(regex)) usbErrored = true; 348d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt } 349d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt } 350c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt 351c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt if (usbTethered) { 3523901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_active_subtext); 3533901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mUsbTether.setEnabled(true); 354204e7c1a6ed3ad9c89e6e10fc59fc8551817c2beRobert Greenwalt mUsbTether.setChecked(true); 355c4764d24837cf297440f0ee97fe8adb943c56fe0Robert Greenwalt } else if (usbAvailable) { 356209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) { 357209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_available_subtext); 358209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } else { 359209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_errored_subtext); 360209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 3613901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mUsbTether.setEnabled(true); 362204e7c1a6ed3ad9c89e6e10fc59fc8551817c2beRobert Greenwalt mUsbTether.setChecked(false); 363d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt } else if (usbErrored) { 364d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_errored_subtext); 365d5f121c66ab83f5304fca37c14ac519fcd530fb8Robert Greenwalt mUsbTether.setEnabled(false); 366204e7c1a6ed3ad9c89e6e10fc59fc8551817c2beRobert Greenwalt mUsbTether.setChecked(false); 36769a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood } else if (mMassStorageActive) { 368a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext); 369a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt mUsbTether.setEnabled(false); 370a2488762a7c80eb4a22a4dd018c916784526bba4Robert Greenwalt mUsbTether.setChecked(false); 3713901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } else { 3723901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext); 3733901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt mUsbTether.setEnabled(false); 374204e7c1a6ed3ad9c89e6e10fc59fc8551817c2beRobert Greenwalt mUsbTether.setChecked(false); 3753901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 3763901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt } 377209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt 37832711b6752eb73324e1b10db975ac956888eda96Danica Chang private void updateBluetoothState(String[] available, String[] tethered, 37932711b6752eb73324e1b10db975ac956888eda96Danica Chang String[] errored) { 380436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby boolean bluetoothErrored = false; 38132711b6752eb73324e1b10db975ac956888eda96Danica Chang for (String s: errored) { 38232711b6752eb73324e1b10db975ac956888eda96Danica Chang for (String regex : mBluetoothRegexs) { 38332711b6752eb73324e1b10db975ac956888eda96Danica Chang if (s.matches(regex)) bluetoothErrored = true; 38432711b6752eb73324e1b10db975ac956888eda96Danica Chang } 38532711b6752eb73324e1b10db975ac956888eda96Danica Chang } 38632711b6752eb73324e1b10db975ac956888eda96Danica Chang 38732711b6752eb73324e1b10db975ac956888eda96Danica Chang BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 38832711b6752eb73324e1b10db975ac956888eda96Danica Chang int btState = adapter.getState(); 38932711b6752eb73324e1b10db975ac956888eda96Danica Chang if (btState == BluetoothAdapter.STATE_TURNING_OFF) { 39032711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setEnabled(false); 391232e6fb3823bb6a26eae238b81ef969950c1d818Ryan Baxter mBluetoothTether.setSummary(R.string.bluetooth_turning_off); 39232711b6752eb73324e1b10db975ac956888eda96Danica Chang } else if (btState == BluetoothAdapter.STATE_TURNING_ON) { 39332711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setEnabled(false); 39432711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setSummary(R.string.bluetooth_turning_on); 395f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt } else { 396f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt BluetoothPan bluetoothPan = mBluetoothPan.get(); 397f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (btState == BluetoothAdapter.STATE_ON && bluetoothPan != null && 398f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt bluetoothPan.isTetheringOn()) { 399f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setChecked(true); 400f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setEnabled(true); 401f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt int bluetoothTethered = bluetoothPan.getConnectedDevices().size(); 402f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (bluetoothTethered > 1) { 403f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt String summary = getString( 404f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt R.string.bluetooth_tethering_devices_connected_subtext, 405f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt bluetoothTethered); 406f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setSummary(summary); 407f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt } else if (bluetoothTethered == 1) { 408f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setSummary( 409f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt R.string.bluetooth_tethering_device_connected_subtext); 410f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt } else if (bluetoothErrored) { 411f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext); 412f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt } else { 413f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext); 414f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt } 415c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else { 416f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setEnabled(true); 417f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setChecked(false); 418f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext); 41932711b6752eb73324e1b10db975ac956888eda96Danica Chang } 42032711b6752eb73324e1b10db975ac956888eda96Danica Chang } 42132711b6752eb73324e1b10db975ac956888eda96Danica Chang } 42232711b6752eb73324e1b10db975ac956888eda96Danica Chang 423aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff public boolean onPreferenceChange(Preference preference, Object value) { 424aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff boolean enable = (Boolean) value; 425aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff 426aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff if (enable) { 42701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startProvisioningIfNecessary(WIFI_TETHERING); 428aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } else { 429aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff mWifiApEnabler.setSoftapEnabled(false); 430aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } 431aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff return false; 432aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } 433aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff 43401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff boolean isProvisioningNeeded() { 435505766cd60ea2ecd88769b08697d564529a27f5bRobert Greenwalt if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) { 436505766cd60ea2ecd88769b08697d564529a27f5bRobert Greenwalt return false; 437505766cd60ea2ecd88769b08697d564529a27f5bRobert Greenwalt } 43801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff return mProvisionApp.length == 2; 43901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 44001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 44101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private void startProvisioningIfNecessary(int choice) { 44201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mTetherChoice = choice; 44301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff if (isProvisioningNeeded()) { 44401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff Intent intent = new Intent(Intent.ACTION_MAIN); 44501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff intent.setClassName(mProvisionApp[0], mProvisionApp[1]); 44601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startActivityForResult(intent, PROVISION_REQUEST); 44701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } else { 44801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startTethering(); 44901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 45001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 45101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 452aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff public void onActivityResult(int requestCode, int resultCode, Intent intent) { 453aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff super.onActivityResult(requestCode, resultCode, intent); 45401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff if (requestCode == PROVISION_REQUEST) { 455aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff if (resultCode == Activity.RESULT_OK) { 45601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startTethering(); 45701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } else { 45801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff //BT and USB need checkbox turned off on failure 45901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff //Wifi tethering is never turned on until afterwards 46001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff switch (mTetherChoice) { 46101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff case BLUETOOTH_TETHERING: 46201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mBluetoothTether.setChecked(false); 46301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 46401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff case USB_TETHERING: 46501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mUsbTether.setChecked(false); 46601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 46701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 46801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mTetherChoice = INVALID; 469aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } 470aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } 471aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff } 472aa3d2c406ed0af9bf6890e9984e6b2c1be8cbd99Irfan Sheriff 47301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private void startTethering() { 47401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff switch (mTetherChoice) { 47501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff case WIFI_TETHERING: 47601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mWifiApEnabler.setSoftapEnabled(true); 47701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 47801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff case BLUETOOTH_TETHERING: 47901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff // turn on Bluetooth first 48001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 48101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff if (adapter.getState() == BluetoothAdapter.STATE_OFF) { 48201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mBluetoothEnableForTether = true; 48301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff adapter.enable(); 48401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mBluetoothTether.setSummary(R.string.bluetooth_turning_on); 48501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mBluetoothTether.setEnabled(false); 48601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } else { 487f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt BluetoothPan bluetoothPan = mBluetoothPan.get(); 488f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (bluetoothPan != null) bluetoothPan.setBluetoothTethering(true); 48901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext); 49001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 49101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 49201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff case USB_TETHERING: 49301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff setUsbTethering(true); 49401b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 49501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff default: 49601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff //should not happen 49701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff break; 49801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 49901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 50001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 50101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff private void setUsbTethering(boolean enabled) { 50201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff ConnectivityManager cm = 50301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 50483397eab96d95fbf6443e17c556e30d54cfa88daLi Wenji mUsbTether.setChecked(false); 50501b32368fffd944a0265f22db764b689179be94cIrfan Sheriff if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { 50601b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mUsbTether.setSummary(R.string.usb_tethering_errored_subtext); 50701b32368fffd944a0265f22db764b689179be94cIrfan Sheriff return; 50801b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 50901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff mUsbTether.setSummary(""); 51001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } 51101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff 512209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt @Override 5136ebf8619d7f09e9642aed84310b56d9847eead94Daisuke Miyakawa public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 51469a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood ConnectivityManager cm = 51569a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 51669a09577179cc96cd90f724ad330ddde13f9eed6Mike Lockwood 517209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt if (preference == mUsbTether) { 518209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt boolean newState = mUsbTether.isChecked(); 519209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt 52001b32368fffd944a0265f22db764b689179be94cIrfan Sheriff if (newState) { 52101b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startProvisioningIfNecessary(USB_TETHERING); 52201b32368fffd944a0265f22db764b689179be94cIrfan Sheriff } else { 52301b32368fffd944a0265f22db764b689179be94cIrfan Sheriff setUsbTethering(newState); 524209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 525c777ee29c856e1d1a2a61ccd799b6e18b50febdcJake Hamby } else if (preference == mBluetoothTether) { 52632711b6752eb73324e1b10db975ac956888eda96Danica Chang boolean bluetoothTetherState = mBluetoothTether.isChecked(); 52732711b6752eb73324e1b10db975ac956888eda96Danica Chang 52832711b6752eb73324e1b10db975ac956888eda96Danica Chang if (bluetoothTetherState) { 52901b32368fffd944a0265f22db764b689179be94cIrfan Sheriff startProvisioningIfNecessary(BLUETOOTH_TETHERING); 53032711b6752eb73324e1b10db975ac956888eda96Danica Chang } else { 53132711b6752eb73324e1b10db975ac956888eda96Danica Chang boolean errored = false; 53238925c0b964b7aef23c8a03af4d1a9499474f1b2Robert Greenwalt 53332711b6752eb73324e1b10db975ac956888eda96Danica Chang String [] tethered = cm.getTetheredIfaces(); 53432711b6752eb73324e1b10db975ac956888eda96Danica Chang String bluetoothIface = findIface(tethered, mBluetoothRegexs); 53532711b6752eb73324e1b10db975ac956888eda96Danica Chang if (bluetoothIface != null && 53632711b6752eb73324e1b10db975ac956888eda96Danica Chang cm.untether(bluetoothIface) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { 53732711b6752eb73324e1b10db975ac956888eda96Danica Chang errored = true; 53832711b6752eb73324e1b10db975ac956888eda96Danica Chang } 53932711b6752eb73324e1b10db975ac956888eda96Danica Chang 540f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt BluetoothPan bluetoothPan = mBluetoothPan.get(); 541f60b92bb414aefb9793e8e98fb594298ac541430Robert Greenwalt if (bluetoothPan != null) bluetoothPan.setBluetoothTethering(false); 54232711b6752eb73324e1b10db975ac956888eda96Danica Chang if (errored) { 54332711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext); 54432711b6752eb73324e1b10db975ac956888eda96Danica Chang } else { 54532711b6752eb73324e1b10db975ac956888eda96Danica Chang mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext); 54632711b6752eb73324e1b10db975ac956888eda96Danica Chang } 54732711b6752eb73324e1b10db975ac956888eda96Danica Chang } 54884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } else if (preference == mCreateNetwork) { 54984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani showDialog(DIALOG_AP_SETTINGS); 550209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 5519c602c47892e7fbe322a449162badeb9def2c4faDaisuke Miyakawa 5526ebf8619d7f09e9642aed84310b56d9847eead94Daisuke Miyakawa return super.onPreferenceTreeClick(screen, preference); 553209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 554209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt 555436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private static String findIface(String[] ifaces, String[] regexes) { 556209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt for (String iface : ifaces) { 557209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt for (String regex : regexes) { 558209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt if (iface.matches(regex)) { 559209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt return iface; 560209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 561209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 562209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 563209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt return null; 564209177aac6761db097c53152f6e9543f60748f15Robert Greenwalt } 56584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani 56684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani public void onClick(DialogInterface dialogInterface, int button) { 56784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani if (button == DialogInterface.BUTTON_POSITIVE) { 56884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiConfig = mDialog.getConfig(); 56984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani if (mWifiConfig != null) { 57084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani /** 571233577cc255561443114d6726792b9df06c2a2a1Irfan Sheriff * if soft AP is stopped, bring up 572233577cc255561443114d6726792b9df06c2a2a1Irfan Sheriff * else restart with new config 573233577cc255561443114d6726792b9df06c2a2a1Irfan Sheriff * TODO: update config on a running access point when framework support is added 57484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani */ 57584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) { 576233577cc255561443114d6726792b9df06c2a2a1Irfan Sheriff mWifiManager.setWifiApEnabled(null, false); 57784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiManager.setWifiApEnabled(mWifiConfig, true); 57884a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } else { 57984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiManager.setWifiApConfiguration(mWifiConfig); 58084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 58184a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani int index = WifiApDialog.getSecurityTypeIndex(mWifiConfig); 58284a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mCreateNetwork.setSummary(String.format(getActivity().getString(CONFIG_SUBTEXT), 58384a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mWifiConfig.SSID, 58484a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani mSecurityType[index])); 58584a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 58684a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 58784a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani } 588d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani 589d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani @Override 590d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani public int getHelpResource() { 591d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani return R.string.help_url_tether; 592d3fed687e77ed5bfa8fd7b4fed5375e371c9c00bAmith Yamasani } 5933901edbdf5cb7b14d4773b3fc7adb3181519855cRobert Greenwalt} 594