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