merge in oc-release history after reset to master
diff --git a/src/com/android/bluetooth/btservice/AdapterProperties.java b/src/com/android/bluetooth/btservice/AdapterProperties.java
index 34b0301..dd53446 100644
--- a/src/com/android/bluetooth/btservice/AdapterProperties.java
+++ b/src/com/android/bluetooth/btservice/AdapterProperties.java
@@ -78,6 +78,10 @@
     private boolean mIsExtendedScanSupported;
     private boolean mIsDebugLogSupported;
     private boolean mIsActivityAndEnergyReporting;
+    private boolean mIsLe2MPhySupported;
+    private boolean mIsLeCodedPhySupported;
+    private boolean mIsLeExtendedAdvertisingSupported;
+    private boolean mIsLePeriodicAdvertisingSupported;
 
     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -281,6 +285,34 @@
     }
 
     /**
+     * @return the mIsLe2MPhySupported
+     */
+    boolean isLe2MPhySupported() {
+        return mIsLe2MPhySupported;
+    }
+
+    /**
+     * @return the mIsLeCodedPhySupported
+     */
+    boolean isLeCodedPhySupported() {
+        return mIsLeCodedPhySupported;
+    }
+
+    /**
+     * @return the mIsLeExtendedAdvertisingSupported
+     */
+    boolean isLeExtendedAdvertisingSupported() {
+        return mIsLeExtendedAdvertisingSupported;
+    }
+
+    /**
+     * @return the mIsLePeriodicAdvertisingSupported
+     */
+    boolean isLePeriodicAdvertisingSupported() {
+        return mIsLePeriodicAdvertisingSupported;
+    }
+
+    /**
      * @return total number of trackable advertisements
      */
     int getTotalNumOfTrackableAdvertisements() {
@@ -593,6 +625,10 @@
                             + (0xFF & ((int)val[10]));
         mIsExtendedScanSupported = ((0xFF & ((int)val[12])) != 0);
         mIsDebugLogSupported = ((0xFF & ((int)val[13])) != 0);
+        mIsLe2MPhySupported = ((0xFF & ((int) val[14])) != 0);
+        mIsLeCodedPhySupported = ((0xFF & ((int) val[15])) != 0);
+        mIsLeExtendedAdvertisingSupported = ((0xFF & ((int) val[16])) != 0);
+        mIsLePeriodicAdvertisingSupported = ((0xFF & ((int) val[17])) != 0);
 
         Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller"
                 + " mNumOfAdvertisementInstancesSupported = "
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 44efe4c..42da477 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -1333,19 +1333,27 @@
          }
 
          public boolean isLe2MPhySupported() {
-             return false;
+             AdapterService service = getService();
+             if (service == null) return false;
+             return service.isLe2MPhySupported();
          }
 
          public boolean isLeCodedPhySupported() {
-             return false;
+             AdapterService service = getService();
+             if (service == null) return false;
+             return service.isLeCodedPhySupported();
          }
 
          public boolean isLeExtendedAdvertisingSupported() {
-             return false;
+             AdapterService service = getService();
+             if (service == null) return false;
+             return service.isLeExtendedAdvertisingSupported();
          }
 
          public boolean isLePeriodicAdvertisingSupported() {
-             return false;
+             AdapterService service = getService();
+             if (service == null) return false;
+             return service.isLePeriodicAdvertisingSupported();
          }
 
          public boolean isActivityAndEnergyReportingSupported() {
@@ -1895,6 +1903,26 @@
         return mAdapterProperties.isActivityAndEnergyReportingSupported();
     }
 
+    public boolean isLe2MPhySupported() {
+        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+        return mAdapterProperties.isLe2MPhySupported();
+    }
+
+    public boolean isLeCodedPhySupported() {
+        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+        return mAdapterProperties.isLeCodedPhySupported();
+    }
+
+    public boolean isLeExtendedAdvertisingSupported() {
+        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+        return mAdapterProperties.isLeExtendedAdvertisingSupported();
+    }
+
+    public boolean isLePeriodicAdvertisingSupported() {
+        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+        return mAdapterProperties.isLePeriodicAdvertisingSupported();
+    }
+
     private BluetoothActivityEnergyInfo reportActivityInfo() {
         enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, "Need BLUETOOTH permission");
         if (mAdapterProperties.getState() != BluetoothAdapter.STATE_ON ||
diff --git a/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandler.java b/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandler.java
index 31184d8..cbea8c5 100644
--- a/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandler.java
+++ b/src/com/android/bluetooth/pbapclient/PbapClientConnectionHandler.java
@@ -61,8 +61,20 @@
     private static final int PBAP_FEATURE_BROWSING = 0x00000002;
     private static final int PBAP_FEATURE_DOWNLOADING = 0x00000001;
 
+    private static final long PBAP_FILTER_VERSION = 1 << 0;
+    private static final long PBAP_FILTER_FN = 1 << 1;
+    private static final long PBAP_FILTER_N = 1 << 2;
+    private static final long PBAP_FILTER_PHOTO = 1 << 3;
+    private static final long PBAP_FILTER_ADR = 1 << 5;
+    private static final long PBAP_FILTER_TEL = 1 << 7;
+    private static final long PBAP_FILTER_EMAIL = 1 << 8;
+    private static final long PBAP_FILTER_NICKNAME = 1 << 23;
+
     private static final int PBAP_SUPPORTED_FEATURE =
             PBAP_FEATURE_DEFAULT_IMAGE_FORMAT | PBAP_FEATURE_BROWSING | PBAP_FEATURE_DOWNLOADING;
+    private static final long PBAP_REQUESTED_FIELDS = PBAP_FILTER_VERSION | PBAP_FILTER_FN
+            | PBAP_FILTER_N | PBAP_FILTER_PHOTO | PBAP_FILTER_ADR | PBAP_FILTER_TEL
+            | PBAP_FILTER_NICKNAME;
     private static final int PBAP_V1_2 = 0x0102;
     private static final int L2CAP_INVALID_PSM = -1;
 
@@ -206,8 +218,8 @@
                     }
                     // Start at contact 1 to exclued Owner Card PBAP 1.1 sec 3.1.5.2
                     BluetoothPbapRequestPullPhoneBook request =
-                            new BluetoothPbapRequestPullPhoneBook(PB_PATH, mAccount, 0,
-                                    VCARD_TYPE_30, 0, 1);
+                            new BluetoothPbapRequestPullPhoneBook(
+                                    PB_PATH, mAccount, PBAP_REQUESTED_FIELDS, VCARD_TYPE_30, 0, 1);
                     request.execute(mObexSession);
                     PhonebookPullRequest processor =
                             new PhonebookPullRequest(mPbapClientStateMachine.getContext(),
diff --git a/src/com/android/bluetooth/pbapclient/PhonebookPullRequest.java b/src/com/android/bluetooth/pbapclient/PhonebookPullRequest.java
index eee4321..8881baf 100644
--- a/src/com/android/bluetooth/pbapclient/PhonebookPullRequest.java
+++ b/src/com/android/bluetooth/pbapclient/PhonebookPullRequest.java
@@ -43,7 +43,7 @@
 import java.util.List;
 
 public class PhonebookPullRequest extends PullRequest {
-    private static final int MAX_OPS = 500;
+    private static final int MAX_OPS = 250;
     private static final boolean VDBG = false;
     private static final String TAG = "PbapPhonebookPullRequest";