Add PAC URL support to Device Owner Wifi setup

Trying to keep some feature parity between EDU and enterprise.

Change-Id: I5a48d8babe2a3d2940efd21dac54c4aaf11e48ab
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
index 0923601..d133a4e 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -132,7 +132,7 @@
         mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid,
                 params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword,
                 params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts,
-                new AddWifiNetworkTask.Callback() {
+                params.mWifiPacUrl, new AddWifiNetworkTask.Callback() {
                         @Override
                         public void onSuccess() {
                             if (mDownloadPackageTask.downloadLocationWasProvided()) {
diff --git a/src/com/android/managedprovisioning/MessageParser.java b/src/com/android/managedprovisioning/MessageParser.java
index 4b6d7cf..98dc0ec 100644
--- a/src/com/android/managedprovisioning/MessageParser.java
+++ b/src/com/android/managedprovisioning/MessageParser.java
@@ -79,6 +79,7 @@
     private static final String WIFI_PROXY_HOST_KEY = "wifiProxyHost";
     private static final String WIFI_PROXY_PORT_KEY = "wifiProxyPort"; // int
     private static final String WIFI_PROXY_BYPASS_KEY = "wifiProxyBypassHosts";
+    private static final String WIFI_PAC_URL_KEY = "wifiPacUrl";
     private static final String DEVICE_ADMIN_PACKAGE_KEY = "deviceAdminPackage";
     private static final String OWNER_KEY = "owner";
     private static final String DOWNLOAD_LOCATION_KEY = "downloadLocation";
@@ -99,6 +100,7 @@
     private static final int OWNER_ID = 11;
     private static final int DOWNLOAD_LOCATION_ID = 12;
     private static final int HASH_ID = 13;
+    private static final int WIFI_PAC_URL_ID = 14;
 
     // Map from keys to ids.
     private static final HashMap<String, Integer> mKeyToId = new HashMap<String, Integer>();
@@ -114,6 +116,7 @@
         mKeyToId.put(WIFI_PROXY_HOST_KEY, WIFI_PROXY_HOST_ID);
         mKeyToId.put(WIFI_PROXY_PORT_KEY, WIFI_PROXY_PORT_ID);
         mKeyToId.put(WIFI_PROXY_BYPASS_KEY, WIFI_PROXY_BYPASS_ID);
+        mKeyToId.put(WIFI_PAC_URL_KEY, WIFI_PAC_URL_ID);
         mKeyToId.put(DEVICE_ADMIN_PACKAGE_KEY, DEVICE_ADMIN_PACKAGE_ID);
         mKeyToId.put(OWNER_KEY, OWNER_ID);
         mKeyToId.put(DOWNLOAD_LOCATION_KEY, DOWNLOAD_LOCATION_ID);
@@ -231,6 +234,9 @@
             case WIFI_PROXY_BYPASS_ID:
                 params.mWifiProxyBypassHosts = value;
                 break;
+            case WIFI_PAC_URL_ID:
+                params.mWifiPacUrl = value;
+                break;
             case DEVICE_ADMIN_PACKAGE_ID:
                 params.mDeviceAdminPackageName = value;
                 break;
diff --git a/src/com/android/managedprovisioning/ProvisioningParams.java b/src/com/android/managedprovisioning/ProvisioningParams.java
index a8fa912..072a4ba 100644
--- a/src/com/android/managedprovisioning/ProvisioningParams.java
+++ b/src/com/android/managedprovisioning/ProvisioningParams.java
@@ -33,6 +33,7 @@
     public static String mWifiProxyHost;
     public static int mWifiProxyPort = 0;
     public static String mWifiProxyBypassHosts;
+    public static String mWifiPacUrl;
 
     public static String mDeviceAdminPackageName; // Package name of the device admin package.
     public static String mOwner; // Human readable name of the institution that owns this device.
diff --git a/src/com/android/managedprovisioning/WifiConfig.java b/src/com/android/managedprovisioning/WifiConfig.java
index 6ad6cce..b20bcba 100644
--- a/src/com/android/managedprovisioning/WifiConfig.java
+++ b/src/com/android/managedprovisioning/WifiConfig.java
@@ -43,7 +43,7 @@
      * Adds a new WiFi network.
      */
     public int addNetwork(String ssid, boolean hidden, String type, String password,
-            String proxyHost, int proxyPort, String proxyBypassHosts) {
+            String proxyHost, int proxyPort, String proxyBypassHosts, String pacUrl) {
         if (!mWifiManager.isWifiEnabled()) {
             mWifiManager.setWifiEnabled(true);
         }
@@ -77,7 +77,7 @@
                 break;
         }
 
-        updateForProxy(wifiConf, proxyHost, proxyPort, proxyBypassHosts);
+        updateForProxy(wifiConf, proxyHost, proxyPort, proxyBypassHosts, pacUrl);
 
         int netId = mWifiManager.addNetwork(wifiConf);
 
@@ -122,11 +122,16 @@
     }
 
     private void updateForProxy(WifiConfiguration wifiConf, String proxyHost, int proxyPort,
-            String proxyBypassHosts) {
-        if (proxyHost == null) {
+            String proxyBypassHosts, String pacUrl) {
+        if (TextUtils.isEmpty(proxyHost) && TextUtils.isEmpty(pacUrl)) {
             return;
         }
-        ProxyInfo proxy = new ProxyInfo(proxyHost, proxyPort, proxyBypassHosts);
-        wifiConf.setProxy(ProxySettings.STATIC, proxy);
+        if (!TextUtils.isEmpty(proxyHost)) {
+            ProxyInfo proxy = new ProxyInfo(proxyHost, proxyPort, proxyBypassHosts);
+            wifiConf.setProxy(ProxySettings.STATIC, proxy);
+        } else {
+            ProxyInfo proxy = new ProxyInfo(pacUrl);
+            wifiConf.setProxy(ProxySettings.PAC, proxy);
+        }
     }
 }
diff --git a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
index 5d40a97..6756bbc 100644
--- a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
+++ b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
@@ -36,6 +36,7 @@
     private final String mProxyHost;
     private final int mProxyPort;
     private final String mProxyBypassHosts;
+    private final String mPacUrl;
     private final Callback mCallback;
 
     private WifiManager mWifiManager;
@@ -43,7 +44,7 @@
 
     public AddWifiNetworkTask(Context context, String ssid, boolean hidden, String securityType,
             String password, String proxyHost, int proxyPort, String proxyBypassHosts,
-            Callback callback) {
+            String pacUrl, Callback callback) {
         mCallback = callback;
         mContext = context;
         mSsid = ssid;
@@ -53,6 +54,7 @@
         mProxyHost = proxyHost;
         mProxyPort = proxyPort;
         mProxyBypassHosts = proxyBypassHosts;
+        mPacUrl = pacUrl;
         mWifiManager  = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
     }
 
@@ -71,7 +73,7 @@
         mNetworkMonitor = new NetworkMonitor(mContext, this);
 
         int netId = wifiConfig.addNetwork(mSsid, mHidden, mSecurityType, mPassword, mProxyHost,
-                mProxyPort, mProxyBypassHosts);
+                mProxyPort, mProxyBypassHosts, mPacUrl);
 
         if (netId == -1) {
             ProvisionLogger.loge("Failed to save network.");