BtHelper: Bring back vendor-specific event

* HF Indicator no longer works with SystemUI battery indicator
  so no need to keep it
* And we don't want to show fake percentage to "batteryLevel * 10 + 5"%

Change-Id: I6cd4cb8db3551aeefbce5eb83cd0b78b29575612
diff --git a/src/com/android/bluetooth/bthelper/pods/Pod.java b/src/com/android/bluetooth/bthelper/pods/Pod.java
index c5382dc..f0cd4f6 100644
--- a/src/com/android/bluetooth/bthelper/pods/Pod.java
+++ b/src/com/android/bluetooth/bthelper/pods/Pod.java
@@ -31,8 +31,13 @@
         return status;
     }
 
-    public int parseStatus () {
-        return (status == MAX_CONNECTED_STATUS) ? 100 : ((status < MAX_CONNECTED_STATUS) ? ((status * 10 + 5)) : BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
+    public int parseStatus(boolean arg) {
+        if (arg) {
+            return (status == MAX_CONNECTED_STATUS || (status < MAX_CONNECTED_STATUS && status > 0)) ? 
+                    status - 1 : BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
+        }
+
+        return (status == MAX_CONNECTED_STATUS) ? 100 : ((status < MAX_CONNECTED_STATUS) ? (status * 10) : BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
     }
 
     public boolean isCharging () {
diff --git a/src/com/android/bluetooth/bthelper/pods/PodsService.java b/src/com/android/bluetooth/bthelper/pods/PodsService.java
index 40b0a79..69d69ad 100644
--- a/src/com/android/bluetooth/bthelper/pods/PodsService.java
+++ b/src/com/android/bluetooth/bthelper/pods/PodsService.java
@@ -12,6 +12,7 @@
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadset;
 import android.bluetooth.BluetoothManager;
 import android.bluetooth.le.BluetoothLeScanner;
 import android.bluetooth.le.ScanSettings;
@@ -50,41 +51,22 @@
 public class PodsService extends Service {
 
     /**
-     * Intent used to broadcast the headset's indicator status
+     * A vendor-specific AT command
      *
-     * <p>This intent will have 3 extras:
-     * <ul>
-     * <li> {@link #EXTRA_HF_INDICATORS_IND_ID} - The Assigned number of headset Indicator which
-     * is supported by the headset ( as indicated by AT+BIND command in the SLC
-     * sequence) or whose value is changed (indicated by AT+BIEV command) </li>
-     * <li> {@link #EXTRA_HF_INDICATORS_IND_VALUE} - Updated value of headset indicator. </li>
-     * <li> {@link BluetoothDevice#EXTRA_DEVICE} - Remote device. </li>
-     * </ul>
-     * <p>{@link #EXTRA_HF_INDICATORS_IND_ID} is defined by Bluetooth SIG and each of the indicators
-     * are given an assigned number. Below shows the assigned number of Indicator added so far
-     * - Enhanced Safety - 1, Valid Values: 0 - Disabled, 1 - Enabled
-     * - Battery Level - 2, Valid Values: 0~100 - Remaining level of Battery
      */
-    private static final String ACTION_HF_INDICATORS_VALUE_CHANGED =
-            "android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED";
+    private static final String VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV = "+IPHONEACCEV";
 
     /**
-     * A int extra field in {@link #ACTION_HF_INDICATORS_VALUE_CHANGED}
-     * intents that contains the assigned number of the headset indicator as defined by
-     * Bluetooth SIG that is being sent. Value range is 0-65535 as defined in HFP 1.7
+     * Battery level indicator associated with
+     * {@link #VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV}
+     *
      */
-    private static final String EXTRA_HF_INDICATORS_IND_ID =
-            "android.bluetooth.headset.extra.HF_INDICATORS_IND_ID";
+    private static final int VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL = 1;
 
-    /**
-     * A int extra field in {@link #ACTION_HF_INDICATORS_VALUE_CHANGED}
-     * intents that contains the value of the Headset indicator that is being sent.
+    /*
+     * Apple, Inc.
      */
-    private static final String EXTRA_HF_INDICATORS_IND_VALUE =
-            "android.bluetooth.headset.extra.HF_INDICATORS_IND_VALUE";
-
-    // Match up with bthf_hf_ind_type_t of bt_hf.h
-    private static final int HF_INDICATOR_BATTERY_LEVEL_STATUS = 2;
+    private static final int APPLE = 0x004C;
 
     /**
      * Broadcast Action: Indicates the battery level of a remote device has
@@ -106,6 +88,9 @@
 
     private static final String COMPANION_TYPE_NONE = "COMPANION_NONE";
 
+    /** A vendor-specific command for unsolicited result code. */
+    public static final String VENDOR_RESULT_CODE_COMMAND_ANDROID = "+ANDROID";
+
     private BluetoothLeScanner btScanner;
     private PodsStatus status = PodsStatus.DISCONNECTED;
 
@@ -343,9 +328,11 @@
                 final boolean leftCharging = regularPods.isCharging(RegularPods.LEFT);
                 final boolean rightCharging = regularPods.isCharging(RegularPods.RIGHT);
                 final boolean caseCharging = regularPods.isCharging(RegularPods.CASE);
-                final int leftBattery = regularPods.getParsedStatus(RegularPods.LEFT);
-                final int rightBattery = regularPods.getParsedStatus(RegularPods.RIGHT);
-                final int caseBattery = regularPods.getParsedStatus(RegularPods.CASE);
+                final int leftBattery = regularPods.getParsedStatus(false, RegularPods.LEFT);
+                final int rightBattery = regularPods.getParsedStatus(false, RegularPods.RIGHT);
+                final int leftBatteryArg = regularPods.getParsedStatus(true, RegularPods.LEFT);
+                final int rightBatteryArg = regularPods.getParsedStatus(true, RegularPods.RIGHT);
+                final int caseBattery = regularPods.getParsedStatus(false, RegularPods.CASE);
 
                 device.setMetadata(device.METADATA_UNTETHERED_LEFT_CHARGING, (leftCharging + "").toUpperCase().getBytes());
                 device.setMetadata(device.METADATA_UNTETHERED_RIGHT_CHARGING, (rightCharging + "").toUpperCase().getBytes());
@@ -355,7 +342,7 @@
                 device.setMetadata(device.METADATA_UNTETHERED_CASE_BATTERY, (caseBattery + "").getBytes());
 
                 chargingMain = leftCharging && rightCharging;
-                batteryUnified = Math.min(leftBattery, rightBattery);
+                batteryUnified = Math.min(leftBatteryArg, rightBatteryArg);
             }
         } else {
             final SinglePods singlePods = (SinglePods)airpods;
@@ -369,7 +356,7 @@
                     && setMetadata(device, device.METADATA_MAIN_ICON, resToUri(singlePods.getDrawable()).toString().getBytes());
             }
             chargingMain = singlePods.isCharging();
-            batteryUnified = singlePods.getParsedStatus();
+            batteryUnified = singlePods.getParsedStatus(false);
         }
 
         if (statusChanged) {
@@ -381,7 +368,19 @@
         }
 
         if (statusChanged) {
-            broadcastHfIndicatorEventIntent(batteryUnified, device);
+            final Object[] arguments = new Object[] {
+                1, // Number of key(IndicatorType)/value pairs
+                VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL, // IndicatorType: Battery Level
+                batteryUnified, // Battery Level
+            };
+
+            broadcastVendorSpecificEventIntent(
+                    VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV,
+                    APPLE,
+                    BluetoothHeadset.AT_CMD_TYPE_SET,
+                    arguments,
+                    device);
+
             statusChanged = false;
         }
     }
@@ -394,12 +393,20 @@
 
     // Send broadcasts to Android Settings Intelligence, Bluetooth app, System Settings
     // to reflect current device status changes
-    private void broadcastHfIndicatorEventIntent (int battery, BluetoothDevice device) {
+    private void broadcastVendorSpecificEventIntent(
+        String command, int companyId, int commandType,
+        Object[] arguments, BluetoothDevice device
+    ) {
         // Update battery status for this device
-        final Intent intent = new Intent(ACTION_HF_INDICATORS_VALUE_CHANGED);
-        intent.putExtra(EXTRA_HF_INDICATORS_IND_ID, HF_INDICATOR_BATTERY_LEVEL_STATUS);
-        intent.putExtra(EXTRA_HF_INDICATORS_IND_VALUE, battery);
+        final Intent intent = new Intent(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT);
+        intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD, command);
+        intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE, commandType);
+        // assert: all elements of args are Serializable
+        intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS, arguments);
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+        intent.putExtra(BluetoothDevice.EXTRA_NAME, device.getName());
+        intent.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "."
+                + Integer.toString(companyId));
         sendBroadcastAsUserMultiplePermissions(intent, UserHandle.ALL, btPermissions);
 
         if (statusChanged) {
diff --git a/src/com/android/bluetooth/bthelper/pods/models/RegularPods.java b/src/com/android/bluetooth/bthelper/pods/models/RegularPods.java
index 9678605..6573486 100644
--- a/src/com/android/bluetooth/bthelper/pods/models/RegularPods.java
+++ b/src/com/android/bluetooth/bthelper/pods/models/RegularPods.java
@@ -25,8 +25,8 @@
         return pods[pos];
     }
 
-    public int getParsedStatus (int pos) {
-        return pods[pos].parseStatus();
+    public int getParsedStatus(boolean arg, int pos) {
+        return pods[pos].parseStatus(arg);
     }
 
     public String getColor () {
diff --git a/src/com/android/bluetooth/bthelper/pods/models/SinglePods.java b/src/com/android/bluetooth/bthelper/pods/models/SinglePods.java
index a6172a7..af4e26e 100644
--- a/src/com/android/bluetooth/bthelper/pods/models/SinglePods.java
+++ b/src/com/android/bluetooth/bthelper/pods/models/SinglePods.java
@@ -25,8 +25,8 @@
         return pod;
     }
 
-    public int getParsedStatus () {
-        return pod.parseStatus();
+    public int getParsedStatus(boolean arg) {
+        return pod.parseStatus(arg);
     }
 
     public String getColor () {