summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/content/PackageMonitor.java43
-rw-r--r--core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java18
2 files changed, 48 insertions, 13 deletions
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 5705b7ea5cf2..7ac553c56bf7 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -48,8 +48,6 @@ import java.util.concurrent.Executor;
public abstract class PackageMonitor extends android.content.BroadcastReceiver {
static final String TAG = "PackageMonitor";
- final IntentFilter mPackageFilt;
-
Context mRegisteredContext;
Handler mRegisteredHandler;
String[] mDisappearingPackages;
@@ -66,17 +64,32 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
private Executor mExecutor;
+ final boolean mSupportsPackageRestartQuery;
+
@UnsupportedAppUsage
public PackageMonitor() {
+ this(true);
+ }
+
+ /**
+ * The constructor of PackageMonitor whose parameters clearly indicate whether support
+ * querying package restart event.
+ */
+ public PackageMonitor(boolean supportsPackageRestartQuery) {
+ mSupportsPackageRestartQuery = supportsPackageRestartQuery;
+ }
+
+ private IntentFilter getPackageFilter() {
final boolean isCore = UserHandle.isCore(android.os.Process.myUid());
- mPackageFilt = new IntentFilter();
+ IntentFilter filter = new IntentFilter();
// Settings app sends the broadcast
- mPackageFilt.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
- mPackageFilt.addDataScheme("package");
+ filter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
+ filter.addDataScheme("package");
if (isCore) {
- mPackageFilt.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+ filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
}
+ return filter;
}
@UnsupportedAppUsage
@@ -91,7 +104,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
(thread == null) ? BackgroundThread.getHandler() : new Handler(thread));
}
-
/**
* Register for notifications of package changes such as install, removal and other events.
*/
@@ -101,10 +113,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
}
mRegisteredContext = context;
mRegisteredHandler = Objects.requireNonNull(handler);
- if (user != null) {
- context.registerReceiverAsUser(this, user, mPackageFilt, null, mRegisteredHandler);
- } else {
- context.registerReceiver(this, mPackageFilt, null, mRegisteredHandler);
+ if (mSupportsPackageRestartQuery) {
+ final IntentFilter filter = getPackageFilter();
+ if (user != null) {
+ context.registerReceiverAsUser(this, user, filter, null, mRegisteredHandler);
+ } else {
+ context.registerReceiver(this, filter, null, mRegisteredHandler);
+ }
}
if (mPackageMonitorCallback == null) {
PackageManager pm = mRegisteredContext.getPackageManager();
@@ -126,7 +141,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
if (mRegisteredContext == null) {
throw new IllegalStateException("Not registered");
}
- mRegisteredContext.unregisterReceiver(this);
+ if (mSupportsPackageRestartQuery) {
+ mRegisteredContext.unregisterReceiver(this);
+ }
PackageManager pm = mRegisteredContext.getPackageManager();
if (pm != null && mPackageMonitorCallback != null) {
@@ -378,7 +395,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
* @param intent the intent that contains package related event information
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public void doHandlePackageEvent(Intent intent) {
+ public final void doHandlePackageEvent(Intent intent) {
mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL);
if (mChangeUserId == UserHandle.USER_NULL) {
diff --git a/core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java b/core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java
index 9cb91229ce58..03cb17e9087f 100644
--- a/core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java
+++ b/core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -95,6 +96,16 @@ public class PackageMonitorTest {
}
@Test
+ public void testPackageMonitorNotRegisterWithoutSupportPackageRestartQuery() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor(false));
+
+ spyPackageMonitor.register(mMockContext, UserHandle.ALL, mMockHandler);
+
+ verify(mMockContext, never()).registerReceiverAsUser(any(), eq(UserHandle.ALL), any(),
+ eq(null), eq(mMockHandler));
+ }
+
+ @Test
public void testPackageMonitorDoHandlePackageEventUidRemoved() throws Exception {
PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
@@ -471,5 +482,12 @@ public class PackageMonitorTest {
}
public static class TestPackageMonitor extends PackageMonitor {
+ public TestPackageMonitor(boolean b) {
+ super(b);
+ }
+
+ public TestPackageMonitor() {
+ super();
+ }
}
}