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

Commit 7d7d8e38 authored by TYM Tsai's avatar TYM Tsai Committed by Android (Google) Code Review
Browse files

Merge "Control PackageMonitor to register receiver" into main

parents 4f7bc4a3 1232dc2b
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();
        }
    }
}