diff options
-rw-r--r-- | core/java/com/android/internal/content/PackageMonitor.java | 43 | ||||
-rw-r--r-- | core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java | 18 |
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(); + } } } |