Home | History | Annotate | Download | only in managedprovisioning
      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 
     38     public WifiConfig(WifiManager manager) {
     39         mWifiManager = manager;
     40     }
     41 
     42     /**
     43      * Adds a new WiFi network.
     44      */
     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 
     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 
    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 
    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