Loading core/java/com/android/internal/content/PackageMonitor.java +30 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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. */ Loading @@ -101,10 +113,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } mRegisteredContext = context; mRegisteredHandler = Objects.requireNonNull(handler); if (mSupportsPackageRestartQuery) { final IntentFilter filter = getPackageFilter(); if (user != null) { context.registerReceiverAsUser(this, user, mPackageFilt, null, mRegisteredHandler); context.registerReceiverAsUser(this, user, filter, null, mRegisteredHandler); } else { context.registerReceiver(this, mPackageFilt, null, mRegisteredHandler); context.registerReceiver(this, filter, null, mRegisteredHandler); } } if (mPackageMonitorCallback == null) { PackageManager pm = mRegisteredContext.getPackageManager(); Loading @@ -126,7 +141,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { if (mRegisteredContext == null) { throw new IllegalStateException("Not registered"); } if (mSupportsPackageRestartQuery) { mRegisteredContext.unregisterReceiver(this); } PackageManager pm = mRegisteredContext.getPackageManager(); if (pm != null && mPackageMonitorCallback != null) { Loading Loading @@ -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) { Loading core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -94,6 +95,16 @@ public class PackageMonitorTest { assertThrows(IllegalStateException.class, spyPackageMonitor::unregister); } @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()); Loading Loading @@ -471,5 +482,12 @@ public class PackageMonitorTest { } public static class TestPackageMonitor extends PackageMonitor { public TestPackageMonitor(boolean b) { super(b); } public TestPackageMonitor() { super(); } } } Loading
core/java/com/android/internal/content/PackageMonitor.java +30 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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. */ Loading @@ -101,10 +113,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } mRegisteredContext = context; mRegisteredHandler = Objects.requireNonNull(handler); if (mSupportsPackageRestartQuery) { final IntentFilter filter = getPackageFilter(); if (user != null) { context.registerReceiverAsUser(this, user, mPackageFilt, null, mRegisteredHandler); context.registerReceiverAsUser(this, user, filter, null, mRegisteredHandler); } else { context.registerReceiver(this, mPackageFilt, null, mRegisteredHandler); context.registerReceiver(this, filter, null, mRegisteredHandler); } } if (mPackageMonitorCallback == null) { PackageManager pm = mRegisteredContext.getPackageManager(); Loading @@ -126,7 +141,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { if (mRegisteredContext == null) { throw new IllegalStateException("Not registered"); } if (mSupportsPackageRestartQuery) { mRegisteredContext.unregisterReceiver(this); } PackageManager pm = mRegisteredContext.getPackageManager(); if (pm != null && mPackageMonitorCallback != null) { Loading Loading @@ -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) { Loading
core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -94,6 +95,16 @@ public class PackageMonitorTest { assertThrows(IllegalStateException.class, spyPackageMonitor::unregister); } @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()); Loading Loading @@ -471,5 +482,12 @@ public class PackageMonitorTest { } public static class TestPackageMonitor extends PackageMonitor { public TestPackageMonitor(boolean b) { super(b); } public TestPackageMonitor() { super(); } } }