Merge "Read Bluetooth connection params from NFC bump."
diff --git a/src/com/android/managedprovisioning/MessageParser.java b/src/com/android/managedprovisioning/MessageParser.java
index 387faa5..8b3fa25 100644
--- a/src/com/android/managedprovisioning/MessageParser.java
+++ b/src/com/android/managedprovisioning/MessageParser.java
@@ -42,6 +42,10 @@
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_MAC_ADDRESS;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_UUID;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_DEVICE_ID;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_USE_PROXY;
 import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -107,7 +111,11 @@
  * applicable {@link #EXTRA_PROVISIONING_WIFI_HIDDEN},
  * {@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, {@link #EXTRA_PROVISIONING_WIFI_PASSWORD},
  * {@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, {@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT},
- * {@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}.
+ * {@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}. The optional fields
+ * {@link #EXTRA_PROVISIONING_BT_MAC_ADDRESS}, {@link #EXTRA_PROVISIONING_BT_UUID}, and
+ * {@link #EXTRA_PROVISIONING_BT_DEVICE_ID} define how to connect to a remote device over Bluetooth.
+ * The boolean {@link #EXTRA_PROVISIONING_BT_USE_PROXY}, if true, will allow this device to proxy
+ * network activity over the defined Bluetooth connection during initial setup.
  * A typical use case would be the {@link BootReminder} sending the intent after device encryption
  * and reboot.
  *
@@ -135,7 +143,10 @@
         EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
         EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION,
         EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER,
-        EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM
+        EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM,
+        EXTRA_PROVISIONING_BT_MAC_ADDRESS,
+        EXTRA_PROVISIONING_BT_UUID,
+        EXTRA_PROVISIONING_BT_DEVICE_ID
     };
 
     protected static final String[] DEVICE_OWNER_LONG_EXTRAS = {
@@ -152,7 +163,8 @@
         EXTRA_PROVISIONING_WIFI_HIDDEN,
         EXTRA_PROVISIONING_STARTED_BY_NFC,
         EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
-        EXTRA_PROVISIONING_SKIP_ENCRYPTION
+        EXTRA_PROVISIONING_SKIP_ENCRYPTION,
+        EXTRA_PROVISIONING_BT_USE_PROXY
     };
 
     protected static final String[] DEVICE_OWNER_PERSISTABLE_BUNDLE_EXTRAS = {
@@ -207,6 +219,12 @@
 
         bundle.putParcelable(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.mAdminExtrasBundle);
         bundle.putBoolean(EXTRA_PROVISIONING_SKIP_ENCRYPTION, params.mSkipEncryption);
+
+        // Bluetooth parameters
+        bundle.putString(EXTRA_PROVISIONING_BT_MAC_ADDRESS, params.mBluetoothMac);
+        bundle.putString(EXTRA_PROVISIONING_BT_UUID, params.mBluetoothUuid);
+        bundle.putString(EXTRA_PROVISIONING_BT_DEVICE_ID, params.mBluetoothDeviceIdentifier);
+        bundle.putBoolean(EXTRA_PROVISIONING_BT_USE_PROXY, params.mUseBluetoothProxy);
     }
 
     public ProvisioningParams parseIntent(Intent intent)
@@ -324,6 +342,13 @@
                 params.mSkipEncryption = Boolean.parseBoolean(s);
             }
 
+            params.mBluetoothMac = props.getProperty(EXTRA_PROVISIONING_BT_MAC_ADDRESS);
+            params.mBluetoothUuid = props.getProperty(EXTRA_PROVISIONING_BT_UUID);
+            params.mBluetoothDeviceIdentifier = props.getProperty(EXTRA_PROVISIONING_BT_DEVICE_ID);
+            if ((s = props.getProperty(EXTRA_PROVISIONING_BT_USE_PROXY)) != null) {
+                params.mUseBluetoothProxy = Boolean.parseBoolean(s);
+            }
+
             deserializeAdminExtrasBundle(params, props);
 
             checkValidityOfProvisioningParams(params);
@@ -413,6 +438,11 @@
                 EXTRA_PROVISIONING_SKIP_ENCRYPTION,
                 ProvisioningParams.DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION);
 
+        params.mBluetoothMac = intent.getStringExtra(EXTRA_PROVISIONING_BT_MAC_ADDRESS);
+        params.mBluetoothUuid = intent.getStringExtra(EXTRA_PROVISIONING_BT_UUID);
+        params.mBluetoothDeviceIdentifier = intent.getStringExtra(EXTRA_PROVISIONING_BT_DEVICE_ID);
+        params.mUseBluetoothProxy = intent.getBooleanExtra(EXTRA_PROVISIONING_BT_USE_PROXY, false);
+
         try {
             params.mAdminExtrasBundle = (PersistableBundle) intent.getParcelableExtra(
                     EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
diff --git a/src/com/android/managedprovisioning/ProvisioningParams.java b/src/com/android/managedprovisioning/ProvisioningParams.java
index 762e9ee..5088f11 100644
--- a/src/com/android/managedprovisioning/ProvisioningParams.java
+++ b/src/com/android/managedprovisioning/ProvisioningParams.java
@@ -74,6 +74,11 @@
     public boolean mLeaveAllSystemAppsEnabled;
     public boolean mSkipEncryption;
 
+    public String mBluetoothMac;
+    public String mBluetoothUuid;
+    public String mBluetoothDeviceIdentifier;
+    public boolean mUseBluetoothProxy;
+
     public String inferDeviceAdminPackageName() {
         if (mDeviceAdminComponentName != null) {
             return mDeviceAdminComponentName.getPackageName();
@@ -144,6 +149,10 @@
         out.writeInt(mStartedByNfc ? 1 : 0);
         out.writeInt(mLeaveAllSystemAppsEnabled ? 1 : 0);
         out.writeInt(mSkipEncryption ? 1 : 0);
+        out.writeString(mBluetoothMac);
+        out.writeString(mBluetoothUuid);
+        out.writeString(mBluetoothDeviceIdentifier);
+        out.writeInt(mUseBluetoothProxy ? 1 : 0);
     }
 
     public static final Parcelable.Creator<ProvisioningParams> CREATOR
@@ -183,6 +192,10 @@
             params.mStartedByNfc = in.readInt() == 1;
             params.mLeaveAllSystemAppsEnabled = in.readInt() == 1;
             params.mSkipEncryption = in.readInt() == 1;
+            params.mBluetoothMac = in.readString();
+            params.mBluetoothUuid = in.readString();
+            params.mBluetoothDeviceIdentifier = in.readString();
+            params.mUseBluetoothProxy = in.readInt() == 1;
             return params;
         }