Change MAP to send one new message event when encrypted storage is unlocked

The MAP service will now send one new message event for all messages
when device storage is unlocked instead of sending an event per message.

Bug: 30809925
Change-Id: Iec902c414c3c229043aa089d19871d80d62f557f
(cherry picked from commit 35b8fc00f781819232b674078d5482a67f250521)
diff --git a/src/com/android/bluetooth/map/BluetoothMapContentObserver.java b/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
index 0f9e23e..f260279 100644
--- 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);
 
@@ -3201,6 +3209,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.
@@ -3411,6 +3465,11 @@
         if (mSmsBroadcastReceiver != null) {
             mSmsBroadcastReceiver.register();
         }
+
+        if (mCeBroadcastReceiver != null) {
+            mCeBroadcastReceiver.register();
+        }
+
         registerPhoneServiceStateListener();
         mInitialized = true;
     }