From c6905cfb1133627dfd500491c60b6528a3e593e0 Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Tue, 17 May 2016 14:13:24 -0700 Subject: Register change Uri and notify changes in bugreportServices. Bug: 28767380 Change-Id: Ia4d1f5a2e44881d300f2869c628d4990406caf40 (cherry picked from commit 6c9ff513c6d7d3de7ab8920d88111c2b1dc1bb1f) (cherry picked from commit 93fafd67a6127a35ba9b7a0f7de3a0b54309d4c2) --- .../Shell/src/com/android/shell/BugreportProgressService.java | 8 ++++++++ .../Shell/src/com/android/shell/BugreportStorageProvider.java | 10 ++++++++++ 2 files changed, 18 insertions(+) (limited to 'packages/Shell/src') diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 474e3e64ad3d..6bc4df71fc5c 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -815,6 +815,14 @@ public class BugreportProgressService extends Service { */ 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 0f92fa6e8add..8b0759942df8 100644 --- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java +++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java @@ -19,9 +19,11 @@ package com.android.shell; 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.File; 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 @@ public class BugreportStorageProvider extends DocumentsProvider { for (File file : files) { addFileRow(result, file); } + result.setNotificationUri(getContext().getContentResolver(), getNotificationUri()); } } return result; @@ -130,6 +134,12 @@ public class BugreportStorageProvider extends DocumentsProvider { } } + // 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; } -- cgit v1.2.3-59-g8ed1b