Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1232dc2b authored by TYM Tsai's avatar TYM Tsai
Browse files

Control PackageMonitor to register receiver

Add parameter to control PackageMonitor whether register broadcast
receiver.
Also make doHandlePackageEvent() become final method.

Bug: 300309050
Test: atest FrameworksCorePackageMonitorTests
Change-Id: Ib5d885e35327fa49493c1641f319caa01836046d
parent 6e887ee1
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -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 (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();
@@ -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) {
@@ -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) {
+18 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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());
@@ -471,5 +482,12 @@ public class PackageMonitorTest {
    }

    public static class TestPackageMonitor extends PackageMonitor {
        public TestPackageMonitor(boolean b) {
            super(b);
        }

        public TestPackageMonitor() {
            super();
        }
    }
}