Register change Uri and notify changes in bugreportServices.

Bug: 28767380
Change-Id: Ia4d1f5a2e44881d300f2869c628d4990406caf40
(cherry picked from commit 6c9ff513c6d7d3de7ab8920d88111c2b1dc1bb1f)
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 474e3e6..6bc4df7 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -815,6 +815,14 @@
      */
     private void onBugreportFinished(int id, Intent intent) {
         final File bugreportFile = getFileExtra(intent, EXTRA_BUGREPORT);
+        // Since BugreportProvider and BugreportProgressService aren't tightly coupled,
+        // we need to make sure they are explicitly tied to a single unique notification URI
+        // so that the service can alert the provider of changes it has done (ie. new bug
+        // reports)
+        // See { @link Cursor#setNotificationUri } and {@link ContentResolver#notifyChanges }
+        final Uri notificationUri = BugreportStorageProvider.getNotificationUri();
+        mContext.getContentResolver().notifyChange(notificationUri, null, false);
+
         if (bugreportFile == null) {
             // Should never happen, dumpstate always set the file.
             Log.wtf(TAG, "Missing " + EXTRA_BUGREPORT + " on intent " + intent);
diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
index 0f92fa6..8b07599 100644
--- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
+++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
@@ -19,9 +19,11 @@
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.database.MatrixCursor.RowBuilder;
+import android.net.Uri;
 import android.os.CancellationSignal;
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
+import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.provider.DocumentsContract.Root;
 import android.provider.DocumentsProvider;
@@ -32,6 +34,7 @@
 import java.io.FileNotFoundException;
 
 public class BugreportStorageProvider extends DocumentsProvider {
+    private static final String AUTHORITY = "com.android.shell.documents";
     private static final String DOC_ID_ROOT = "bugreport";
 
     private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
@@ -103,6 +106,7 @@
                 for (File file : files) {
                     addFileRow(result, file);
                 }
+                result.setNotificationUri(getContext().getContentResolver(), getNotificationUri());
             }
         }
         return result;
@@ -130,6 +134,12 @@
         }
     }
 
+    // This is used by BugreportProgressService so that the notification uri shared by
+    // BugreportProgressService and BugreportStorageProvider are guaranteed the same and unique
+    protected static Uri getNotificationUri() {
+      return DocumentsContract.buildChildDocumentsUri(AUTHORITY, DOC_ID_ROOT);
+    }
+
     private static String[] resolveRootProjection(String[] projection) {
         return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
     }