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 Original line Diff line number Diff line
@@ -48,8 +48,6 @@ import java.util.concurrent.Executor;
public abstract class PackageMonitor extends android.content.BroadcastReceiver {
public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    static final String TAG = "PackageMonitor";
    static final String TAG = "PackageMonitor";


    final IntentFilter mPackageFilt;

    Context mRegisteredContext;
    Context mRegisteredContext;
    Handler mRegisteredHandler;
    Handler mRegisteredHandler;
    String[] mDisappearingPackages;
    String[] mDisappearingPackages;
@@ -66,17 +64,32 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {


    private Executor mExecutor;
    private Executor mExecutor;


    final boolean mSupportsPackageRestartQuery;

    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public PackageMonitor() {
    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());
        final boolean isCore = UserHandle.isCore(android.os.Process.myUid());


        mPackageFilt = new IntentFilter();
        IntentFilter filter = new IntentFilter();
        // Settings app sends the broadcast
        // Settings app sends the broadcast
        mPackageFilt.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
        filter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
        mPackageFilt.addDataScheme("package");
        filter.addDataScheme("package");
        if (isCore) {
        if (isCore) {
            mPackageFilt.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        }
        }
        return filter;
    }
    }


    @UnsupportedAppUsage
    @UnsupportedAppUsage
@@ -91,7 +104,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                (thread == null) ? BackgroundThread.getHandler() : new Handler(thread));
                (thread == null) ? BackgroundThread.getHandler() : new Handler(thread));
    }
    }



    /**
    /**
     * Register for notifications of package changes such as install, removal and other events.
     * 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;
        mRegisteredContext = context;
        mRegisteredHandler = Objects.requireNonNull(handler);
        mRegisteredHandler = Objects.requireNonNull(handler);
        if (mSupportsPackageRestartQuery) {
            final IntentFilter filter = getPackageFilter();
            if (user != null) {
            if (user != null) {
            context.registerReceiverAsUser(this, user, mPackageFilt, null, mRegisteredHandler);
                context.registerReceiverAsUser(this, user, filter, null, mRegisteredHandler);
            } else {
            } else {
            context.registerReceiver(this, mPackageFilt, null, mRegisteredHandler);
                context.registerReceiver(this, filter, null, mRegisteredHandler);
            }
        }
        }
        if (mPackageMonitorCallback == null) {
        if (mPackageMonitorCallback == null) {
            PackageManager pm = mRegisteredContext.getPackageManager();
            PackageManager pm = mRegisteredContext.getPackageManager();
@@ -126,7 +141,9 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        if (mRegisteredContext == null) {
        if (mRegisteredContext == null) {
            throw new IllegalStateException("Not registered");
            throw new IllegalStateException("Not registered");
        }
        }
        if (mSupportsPackageRestartQuery) {
            mRegisteredContext.unregisterReceiver(this);
            mRegisteredContext.unregisterReceiver(this);
        }


        PackageManager pm = mRegisteredContext.getPackageManager();
        PackageManager pm = mRegisteredContext.getPackageManager();
        if (pm != null && mPackageMonitorCallback != null) {
        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
     * @param intent the intent that contains package related event information
     */
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public void doHandlePackageEvent(Intent intent) {
    public final void doHandlePackageEvent(Intent intent) {
        mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
        mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
                UserHandle.USER_NULL);
                UserHandle.USER_NULL);
        if (mChangeUserId == UserHandle.USER_NULL) {
        if (mChangeUserId == UserHandle.USER_NULL) {
+18 −0
Original line number Original line 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.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
@@ -94,6 +95,16 @@ public class PackageMonitorTest {
        assertThrows(IllegalStateException.class, spyPackageMonitor::unregister);
        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
    @Test
    public void testPackageMonitorDoHandlePackageEventUidRemoved() throws Exception {
    public void testPackageMonitorDoHandlePackageEventUidRemoved() throws Exception {
        PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
        PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
@@ -471,5 +482,12 @@ public class PackageMonitorTest {
    }
    }


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

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