Merge tag 'android-7.1.0_r7' into aosp-7.1

Android 7.1.0 release 7

Conflicts:
	src/com/android/bluetooth/avrcp/Avrcp.java
	src/com/android/bluetooth/btservice/AdapterService.java
	src/com/android/bluetooth/btservice/RemoteDevices.java
	src/com/android/bluetooth/hfp/HeadsetStateMachine.java
	src/com/android/bluetooth/map/BluetoothMapContentObserver.java
	src/com/android/bluetooth/map/BluetoothMapService.java
	src/com/android/bluetooth/opp/BluetoothOppSendFileInfo.java
	src/com/android/bluetooth/pan/PanService.java
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 6f0d47f..7299fbe 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -2260,8 +2260,8 @@
     }
 
      boolean setPairingConfirmation(BluetoothDevice device, boolean accept) {
-        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
-                                       "Need BLUETOOTH ADMIN permission");
+        enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
+                                       "Need BLUETOOTH PRIVILEGED permission");
         DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
         if (deviceProp == null || deviceProp.getBondState() != BluetoothDevice.BOND_BONDING) {
             return false;
diff --git a/src/com/android/bluetooth/map/BluetoothMapContentObserver.java b/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
index 6edc556..8465274 100755
--- a/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
+++ b/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
@@ -173,7 +173,9 @@
     public static final String EXTRA_MESSAGE_SENT_TIMESTAMP = "timestamp";
 
     private SmsBroadcastReceiver mSmsBroadcastReceiver = new SmsBroadcastReceiver();
+    private CeBroadcastReceiver mCeBroadcastReceiver = new CeBroadcastReceiver();
 
+    private boolean mStorageUnlocked = false;
     private boolean mInitialized = false;
 
 
@@ -481,6 +483,12 @@
                 Log.w(TAG, "onChange() with URI == null - not handled.");
                 return;
             }
+
+            if (!mStorageUnlocked) {
+                Log.v(TAG, "Ignore events until storage is completely unlocked");
+                return;
+            }
+
             if (V) Log.d(TAG, "onChange on thread: " + Thread.currentThread().getId()
                     + " Uri: " + uri.toString() + " selfchange: " + selfChange);
 
@@ -3198,6 +3206,52 @@
         }
     }
 
+    private class CeBroadcastReceiver extends BroadcastReceiver {
+        public void register() {
+            UserManager manager = UserManager.get(mContext);
+            if (manager == null || manager.isUserUnlocked()) {
+                mStorageUnlocked = true;
+                return;
+            }
+
+            Handler handler = new Handler(Looper.getMainLooper());
+            IntentFilter intentFilter = new IntentFilter();
+            intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
+            mContext.registerReceiver(this, intentFilter, null, handler);
+        }
+
+        public void unregister() {
+            try {
+                mContext.unregisterReceiver(this);
+            } catch (IllegalArgumentException e) {
+                /* do nothing */
+            }
+        }
+
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            Log.d(TAG, "onReceive: action"  + action);
+
+            if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
+                try {
+                    initMsgList();
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Error initializing SMS/MMS message lists.");
+                }
+
+                for (String folder : FOLDER_SMS_MAP.values()) {
+                    Event evt = new Event(EVENT_TYPE_NEW, -1, folder, mSmsType);
+                    sendEvent(evt);
+                }
+                mStorageUnlocked = true;
+                /* After unlock this BroadcastReceiver is never needed */
+                unregister();
+            } else {
+                Log.d(TAG, "onReceive: Unknown action " + action);
+            }
+        }
+    }
+
     /**
      * Handle MMS sent intents in disconnected(MNS) state, where we do not need to send any
      * notifications.
@@ -3408,6 +3462,11 @@
         if (mSmsBroadcastReceiver != null) {
             mSmsBroadcastReceiver.register();
         }
+
+        if (mCeBroadcastReceiver != null) {
+            mCeBroadcastReceiver.register();
+        }
+
         registerPhoneServiceStateListener();
         mInitialized = true;
     }