Merge "Remove hidden API usage"
diff --git a/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java b/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java
index 3173adc..d245543 100644
--- a/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java
+++ b/src/com/android/bluetooth/avrcp/AvrcpVolumeManager.java
@@ -176,7 +176,8 @@
                         + " deviceVolume=" + deviceVolume
                         + " sDeviceMaxVolume=" + sDeviceMaxVolume);
         mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, deviceVolume,
-                AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_BLUETOOTH_ABS_VOLUME);
+                (deviceVolume != getVolume(device, -1) ? AudioManager.FLAG_SHOW_UI : 0)
+                    | AudioManager.FLAG_BLUETOOTH_ABS_VOLUME);
         storeVolumeForDevice(device);
     }
 
diff --git a/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java b/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java
index f25f367..c838584 100644
--- a/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java
+++ b/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java
@@ -797,7 +797,8 @@
         return keyStore;
     }
 
-    private SecretKey getOrCreateSecretKey() {
+    // The getOrGenerate semantic on keystore is not thread safe, need to synchronized it.
+    private synchronized SecretKey getOrCreateSecretKey() {
         SecretKey secretKey = null;
         try {
             KeyStore keyStore = getKeyStore();
diff --git a/src/com/android/bluetooth/hid/HidHostService.java b/src/com/android/bluetooth/hid/HidHostService.java
index 3ac49e2..10d414d 100644
--- a/src/com/android/bluetooth/hid/HidHostService.java
+++ b/src/com/android/bluetooth/hid/HidHostService.java
@@ -16,6 +16,8 @@
 
 package com.android.bluetooth.hid;
 
+import static com.android.bluetooth.Utils.enforceBluetoothAdminPermission;
+import static com.android.bluetooth.Utils.enforceBluetoothPermission;
 import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission;
 
 import android.bluetooth.BluetoothDevice;
@@ -339,6 +341,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothPrivilegedPermission(service);
             return service.connect(device);
         }
 
@@ -348,6 +351,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothPrivilegedPermission(service);
             return service.disconnect(device);
         }
 
@@ -357,7 +361,7 @@
             if (service == null) {
                 return BluetoothHidHost.STATE_DISCONNECTED;
             }
-            enforceBluetoothPrivilegedPermission(service);
+            enforceBluetoothPermission(service);
             return service.getConnectionState(device);
         }
 
@@ -367,7 +371,7 @@
             if (service == null) {
                 return new ArrayList<>();
             }
-            enforceBluetoothPrivilegedPermission(service);
+            enforceBluetoothPermission(service);
             return getDevicesMatchingConnectionStates(new int[]{BluetoothProfile.STATE_CONNECTED});
         }
 
@@ -377,6 +381,7 @@
             if (service == null) {
                 return new ArrayList<BluetoothDevice>(0);
             }
+            enforceBluetoothPermission(service);
             return service.getDevicesMatchingConnectionStates(states);
         }
 
@@ -386,6 +391,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothPrivilegedPermission(service);
             return service.setConnectionPolicy(device, connectionPolicy);
         }
 
@@ -395,6 +401,7 @@
             if (service == null) {
                 return BluetoothProfile.CONNECTION_POLICY_UNKNOWN;
             }
+            enforceBluetoothPrivilegedPermission(service);
             return service.getConnectionPolicy(device);
         }
 
@@ -405,6 +412,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.getProtocolMode(device);
         }
 
@@ -414,6 +422,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.virtualUnplug(device);
         }
 
@@ -423,6 +432,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.setProtocolMode(device, protocolMode);
         }
 
@@ -433,6 +443,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.getReport(device, reportType, reportId, bufferSize);
         }
 
@@ -442,6 +453,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.setReport(device, reportType, report);
         }
 
@@ -451,6 +463,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.sendData(device, report);
         }
 
@@ -460,6 +473,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.setIdleTime(device, idleTime);
         }
 
@@ -469,6 +483,7 @@
             if (service == null) {
                 return false;
             }
+            enforceBluetoothAdminPermission(service);
             return service.getIdleTime(device);
         }
     }
@@ -485,8 +500,6 @@
      */
     public boolean connect(BluetoothDevice device) {
         if (DBG) Log.d(TAG, "connect: " + device.getAddress());
-        enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
-                "Need BLUETOOTH_PRIVILEGED permission");
         if (getConnectionState(device) != BluetoothHidHost.STATE_DISCONNECTED) {
             Log.e(TAG, "Hid Device not disconnected: " + device);
             return false;
@@ -509,8 +522,6 @@
      */
     public boolean disconnect(BluetoothDevice device) {
         if (DBG) Log.d(TAG, "disconnect: " + device.getAddress());
-        enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
-                "Need BLUETOOTH_PRIVILEGED permission");
         Message msg = mHandler.obtainMessage(MESSAGE_DISCONNECT, device);
         mHandler.sendMessage(msg);
         return true;
@@ -535,7 +546,6 @@
 
     List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
         if (DBG) Log.d(TAG, "getDevicesMatchingConnectionStates()");
-        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
         List<BluetoothDevice> inputDevices = new ArrayList<BluetoothDevice>();
 
         for (BluetoothDevice device : mInputDevices.keySet()) {
@@ -566,8 +576,6 @@
      * @return true if connectionPolicy is set, false on error
      */
     public boolean setConnectionPolicy(BluetoothDevice device, int connectionPolicy) {
-        enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
-                "Need BLUETOOTH_PRIVILEGED permission");
         if (DBG) {
             Log.d(TAG, "setConnectionPolicy: " + device.getAddress());
         }
@@ -597,8 +605,6 @@
      * @hide
      */
     public int getConnectionPolicy(BluetoothDevice device) {
-        enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
-                "Need BLUETOOTH_PRIVILEGED permission");
         if (DBG) {
             Log.d(TAG, "getConnectionPolicy: " + device.getAddress());
         }
@@ -608,7 +614,6 @@
 
     /* The following APIs regarding test app for compliance */
     boolean getProtocolMode(BluetoothDevice device) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "getProtocolMode: " + device.getAddress());
         }
@@ -624,7 +629,6 @@
     }
 
     boolean virtualUnplug(BluetoothDevice device) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "virtualUnplug: " + device.getAddress());
         }
@@ -638,7 +642,6 @@
     }
 
     boolean setProtocolMode(BluetoothDevice device, int protocolMode) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "setProtocolMode: " + device.getAddress());
         }
@@ -654,7 +657,6 @@
     }
 
     boolean getReport(BluetoothDevice device, byte reportType, byte reportId, int bufferSize) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "getReport: " + device.getAddress());
         }
@@ -674,7 +676,6 @@
     }
 
     boolean setReport(BluetoothDevice device, byte reportType, String report) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "setReport: " + device.getAddress());
         }
@@ -694,7 +695,6 @@
     }
 
     boolean sendData(BluetoothDevice device, String report) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) {
             Log.d(TAG, "sendData: " + device.getAddress());
         }
@@ -707,7 +707,6 @@
     }
 
     boolean getIdleTime(BluetoothDevice device) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) Log.d(TAG, "getIdleTime: " + device.getAddress());
         int state = this.getConnectionState(device);
         if (state != BluetoothHidHost.STATE_CONNECTED) {
@@ -719,7 +718,6 @@
     }
 
     boolean setIdleTime(BluetoothDevice device, byte idleTime) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
         if (DBG) Log.d(TAG, "setIdleTime: " + device.getAddress());
         int state = this.getConnectionState(device);
         if (state != BluetoothHidHost.STATE_CONNECTED) {