• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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