1c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk/* 2c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * Copyright 2014, The Android Open Source Project 3c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * 4c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 5c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * you may not use this file except in compliance with the License. 6c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * You may obtain a copy of the License at 7c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * 8c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 9c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * 10c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * Unless required by applicable law or agreed to in writing, software 11c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 12c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * See the License for the specific language governing permissions and 14c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * limitations under the License. 15c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk */ 16c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 17c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monkpackage com.android.managedprovisioning; 18c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 198933e465dc99e721eb45adf2f089244175e8a9ceJason Monkimport android.net.ProxyInfo; 20808bdc569c7da3a587696d228c645db7bd82b2c5Lorenzo Colittiimport android.net.IpConfiguration.ProxySettings; 21c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monkimport android.net.wifi.WifiConfiguration; 22c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monkimport android.net.wifi.WifiManager; 23c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monkimport android.text.TextUtils; 24c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 25c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk/** 26c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * Utility class for configuring a new WiFi network. 27c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk */ 28c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monkpublic class WifiConfig { 29c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 30c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk private final WifiManager mWifiManager; 31c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 32c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk enum SecurityType { 33c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk NONE, 34c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk WPA, 35c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk WEP; 36c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 37c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 38c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk public WifiConfig(WifiManager manager) { 39c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk mWifiManager = manager; 40c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 41c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 42c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk /** 43c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk * Adds a new WiFi network. 44c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk */ 45c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk public int addNetwork(String ssid, boolean hidden, String type, String password, 462daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk String proxyHost, int proxyPort, String proxyBypassHosts, String pacUrl) { 47c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if (!mWifiManager.isWifiEnabled()) { 48c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk mWifiManager.setWifiEnabled(true); 49c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 50c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 51c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk WifiConfiguration wifiConf = new WifiConfiguration(); 52c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk SecurityType securityType; 53c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if (type == null || TextUtils.isEmpty(type)) { 54c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk securityType = SecurityType.NONE; 55c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } else { 56c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk securityType = Enum.valueOf(SecurityType.class, type.toUpperCase()); 57c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 58c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk // If we have a password, and no security type, assume WPA. 59c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk // TODO: Remove this when the programmer supports it. 60c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if (securityType.equals(SecurityType.NONE) && !TextUtils.isEmpty(password)) { 61c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk securityType = SecurityType.WPA; 62c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 63c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 64c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.SSID = ssid; 65c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.status = WifiConfiguration.Status.ENABLED; 66c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.hiddenSSID = hidden; 67c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk switch (securityType) { 68c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk case NONE: 69c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 70c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 71c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk break; 72c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk case WPA: 73c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk updateForWPAConfiguration(wifiConf, password); 74c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk break; 75c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk case WEP: 76c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk updateForWEPConfiguration(wifiConf, password); 77c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk break; 78c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 79c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 802daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk updateForProxy(wifiConf, proxyHost, proxyPort, proxyBypassHosts, pacUrl); 81c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 82c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk int netId = mWifiManager.addNetwork(wifiConf); 83c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 84c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if (netId != -1) { 85c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk // Setting disableOthers to 'true' should trigger a connection attempt. 86c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk mWifiManager.enableNetwork(netId, true); 87c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk mWifiManager.saveConfiguration(); 88c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 89c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 90c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk return netId; 91c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 92c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 93c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk protected void updateForWPAConfiguration(WifiConfiguration wifiConf, String wifiPassword) { 94c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 95c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 96c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA 97c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2 98c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 99c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 100c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 101c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 102c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if (!TextUtils.isEmpty(wifiPassword)) { 103c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.preSharedKey = "\"" + wifiPassword + "\""; 104c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 105c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 106c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 107c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk protected void updateForWEPConfiguration(WifiConfiguration wifiConf, String password) { 108c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 109c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 110c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 111c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 112c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 113c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 114c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 115c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk int length = password.length(); 116c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk if ((length == 10 || length == 26 || length == 58) && password.matches("[0-9A-Fa-f]*")) { 117c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.wepKeys[0] = password; 118c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } else { 119c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.wepKeys[0] = '"' + password + '"'; 120c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 121c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk wifiConf.wepTxKeyIndex = 0; 122c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 123c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk 124c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk private void updateForProxy(WifiConfiguration wifiConf, String proxyHost, int proxyPort, 1252daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk String proxyBypassHosts, String pacUrl) { 1262daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk if (TextUtils.isEmpty(proxyHost) && TextUtils.isEmpty(pacUrl)) { 127c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk return; 128c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 1292daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk if (!TextUtils.isEmpty(proxyHost)) { 1302daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk ProxyInfo proxy = new ProxyInfo(proxyHost, proxyPort, proxyBypassHosts); 1312daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk wifiConf.setProxy(ProxySettings.STATIC, proxy); 1322daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk } else { 1332daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk ProxyInfo proxy = new ProxyInfo(pacUrl); 1342daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk wifiConf.setProxy(ProxySettings.PAC, proxy); 1352daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk } 136c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk } 137c6d71b86baf721d5de568248d1f538cc7d4adcd0Jason Monk} 138