Check remote device uuids for phone book access permission

Only give phone book access permission for remote devices that
handle PBAP.
Bug: 18140961

Change-Id: I128f15460b151d7e0a47cd9b4b15dae10ec586c5
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
index fd8489b..be031ea 100755
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
@@ -17,12 +17,14 @@
 package com.android.settings.bluetooth;
 
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothUuid;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
+import android.os.ParcelUuid;
 import android.text.Editable;
 import android.text.Html;
 import android.text.InputFilter;
@@ -111,6 +113,7 @@
 
         mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
         mType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
+        mDevice.fetchUuidsWithSdp();
 
         switch (mType) {
             case BluetoothDevice.PAIRING_VARIANT_PIN:
@@ -318,7 +321,7 @@
         }
     }
 
-    private void allowPhonebookAccess() {
+    private void processPhonebookAccess() {
         CachedBluetoothDevice cachedDevice = mCachedDeviceManager.findDevice(mDevice);
         if (cachedDevice == null) {
             cachedDevice = mCachedDeviceManager.addDevice(
@@ -326,11 +329,14 @@
                     mBluetoothManager.getProfileManager(),
                     mDevice);
         }
-        cachedDevice.setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED);
+        ParcelUuid[] uuids = mDevice.getUuids();
+        if (BluetoothUuid.containsAnyUuid(uuids, PbapServerProfile.PBAB_CLIENT_UUIDS)) {
+            cachedDevice.setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED);
+        }
     }
 
     private void onPair(String value) {
-        allowPhonebookAccess();
+        processPhonebookAccess();
 
         switch (mType) {
             case BluetoothDevice.PAIRING_VARIANT_PIN:
diff --git a/src/com/android/settings/bluetooth/PbapServerProfile.java b/src/com/android/settings/bluetooth/PbapServerProfile.java
index 87e51a5..6e48b12 100755
--- a/src/com/android/settings/bluetooth/PbapServerProfile.java
+++ b/src/com/android/settings/bluetooth/PbapServerProfile.java
@@ -21,7 +21,9 @@
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothPbap;
 import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothUuid;
 import android.content.Context;
+import android.os.ParcelUuid;
 import android.util.Log;
 
 import com.android.settings.R;
@@ -44,6 +46,13 @@
     // Order of this profile in device profiles list
     private static final int ORDINAL = 6;
 
+    // The UUIDs indicate that remote device might access pbap server
+    static final ParcelUuid[] PBAB_CLIENT_UUIDS = {
+        BluetoothUuid.HSP,
+        BluetoothUuid.Handsfree,
+        BluetoothUuid.PBAP_PCE
+    };
+
     // These callbacks run on the main thread.
     private final class PbapServiceListener
             implements BluetoothPbap.ServiceListener {