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

Commit 3f0694cc authored by Brandon Liu's avatar Brandon Liu Committed by Android (Google) Code Review
Browse files

Merge "Migrate OverlayManagerService to PackageMonitor" into main

parents b0045a82 8016bc3e
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -204,6 +204,14 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        return false;
    }

    /**
     * Direct reflection of {@link Intent#ACTION_PACKAGE_CHANGED
     * Intent.ACTION_PACKAGE_CHANGED} being received, this callback
     * has extras passed in.
     */
    public void onPackageChangedWithExtras(String packageName, Bundle extras) {
    }

    public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
        return false;
    }
@@ -237,12 +245,25 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    public void onPackageDisappeared(String packageName, int reason) {
    }

    /**
     * Called when a package disappears with extras passed in.
     */
    public void onPackageDisappearedWithExtras(String packageName, Bundle extras) {
    }

    /**
     * Called when a package appears for any reason.
     */
    public void onPackageAppeared(String packageName, int reason) {
    }


    /**
     * Called when a package appears with extras passed in.
     */
    public void onPackageAppearedWithExtras(String packageName, Bundle extras) {
    }

    /**
     * Called when an existing package is updated or its disabled state changes.
     */
@@ -381,6 +402,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                    mChangeType = PACKAGE_PERMANENT_CHANGE;
                    onPackageAdded(pkg, uid);
                }
                onPackageAppearedWithExtras(pkg, intent.getExtras());
                onPackageAppeared(pkg, mChangeType);
            }
        } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
@@ -403,6 +425,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                        onPackageRemovedAllUsers(pkg, uid);
                    }
                }
                onPackageDisappearedWithExtras(pkg, intent.getExtras());
                onPackageDisappeared(pkg, mChangeType);
            }
        } else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
@@ -417,6 +440,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                if (onPackageChanged(pkg, uid, mModifiedComponents)) {
                    mSomePackagesChanged = true;
                }
                onPackageChangedWithExtras(pkg, intent.getExtras());
                onPackageModified(pkg);
            }
        } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) {
+74 −1
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.internal.content;

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;
@@ -28,6 +27,7 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;

@@ -36,6 +36,7 @@ import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@@ -45,6 +46,7 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class PackageMonitorTest {
    private static final String FAKE_PACKAGE_NAME = "com.android.internal.content.fakeapp";
    private static final String FAKE_EXTRA_REASON = "android.intent.extra.fakereason";
    private static final int FAKE_PACKAGE_UID = 123;
    private static final int FAKE_USER_ID = 0;
    private static final int WAIT_CALLBACK_CALLED_IN_MS = 300;
@@ -245,6 +247,7 @@ public class PackageMonitorTest {
        intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
        intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
        intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
        intent.putExtra(Intent.EXTRA_REASON, FAKE_EXTRA_REASON);
        String [] packageList = new String[]{FAKE_PACKAGE_NAME};
        intent.putExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, packageList);
        spyPackageMonitor.doHandlePackageEvent(intent);
@@ -253,6 +256,20 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1))
                .onPackageChanged(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID), eq(packageList));
        verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));

        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(spyPackageMonitor, times(1)).onPackageChangedWithExtras(eq(FAKE_PACKAGE_NAME),
                argumentCaptor.capture());

        Bundle capturedExtras = argumentCaptor.getValue();
        Bundle expectedExtras = intent.getExtras();
        assertThat(capturedExtras.getInt(Intent.EXTRA_USER_HANDLE))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_USER_HANDLE));
        assertThat(capturedExtras.getInt(Intent.EXTRA_UID))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_UID));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REASON))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REASON));

        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
    }
@@ -272,6 +289,21 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1))
                .onPackageUpdateStarted(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));

        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(spyPackageMonitor, times(1)).onPackageDisappearedWithExtras(eq(FAKE_PACKAGE_NAME),
                argumentCaptor.capture());
        Bundle capturedExtras = argumentCaptor.getValue();
        Bundle expectedExtras = intent.getExtras();
        assertThat(capturedExtras.getInt(Intent.EXTRA_USER_HANDLE))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_USER_HANDLE));
        assertThat(capturedExtras.getInt(Intent.EXTRA_UID))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_UID));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REPLACING))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REPLACING));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REMOVED_FOR_ALL_USERS))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REMOVED_FOR_ALL_USERS));

        verify(spyPackageMonitor, times(1))
                .onPackageDisappeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
@@ -295,6 +327,21 @@ public class PackageMonitorTest {
                .onPackageRemoved(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
        verify(spyPackageMonitor, times(1))
                .onPackageRemovedAllUsers(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));

        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(spyPackageMonitor, times(1)).onPackageDisappearedWithExtras(eq(FAKE_PACKAGE_NAME),
                argumentCaptor.capture());
        Bundle capturedExtras = argumentCaptor.getValue();
        Bundle expectedExtras = intent.getExtras();
        assertThat(capturedExtras.getInt(Intent.EXTRA_USER_HANDLE))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_USER_HANDLE));
        assertThat(capturedExtras.getInt(Intent.EXTRA_UID))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_UID));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REPLACING))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REPLACING));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REMOVED_FOR_ALL_USERS))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REMOVED_FOR_ALL_USERS));

        verify(spyPackageMonitor, times(1)).onPackageDisappeared(eq(FAKE_PACKAGE_NAME),
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
@@ -316,6 +363,19 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1))
                .onPackageUpdateFinished(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
        verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));

        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(spyPackageMonitor, times(1)).onPackageAppearedWithExtras(eq(FAKE_PACKAGE_NAME),
                argumentCaptor.capture());
        Bundle capturedExtras = argumentCaptor.getValue();
        Bundle expectedExtras = intent.getExtras();
        assertThat(capturedExtras.getInt(Intent.EXTRA_USER_HANDLE))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_USER_HANDLE));
        assertThat(capturedExtras.getInt(Intent.EXTRA_UID))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_UID));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REPLACING))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REPLACING));

        verify(spyPackageMonitor, times(1))
                .onPackageAppeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
@@ -336,6 +396,19 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1))
                .onPackageAdded(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));

        ArgumentCaptor<Bundle> argumentCaptor = ArgumentCaptor.forClass(Bundle.class);
        verify(spyPackageMonitor, times(1)).onPackageAppearedWithExtras(eq(FAKE_PACKAGE_NAME),
                argumentCaptor.capture());
        Bundle capturedExtras = argumentCaptor.getValue();
        Bundle expectedExtras = intent.getExtras();
        assertThat(capturedExtras.getInt(Intent.EXTRA_USER_HANDLE))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_USER_HANDLE));
        assertThat(capturedExtras.getInt(Intent.EXTRA_UID))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_UID));
        assertThat(capturedExtras.getInt(Intent.EXTRA_REPLACING))
                .isEqualTo(expectedExtras.getInt(Intent.EXTRA_REPLACING));

        verify(spyPackageMonitor, times(1)).onPackageAppeared(eq(FAKE_PACKAGE_NAME),
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+141 −143
Original line number Diff line number Diff line
@@ -18,9 +18,6 @@ package com.android.server.om;

import static android.app.AppGlobals.getPackageManager;
import static android.content.Intent.ACTION_OVERLAY_CHANGED;
import static android.content.Intent.ACTION_PACKAGE_ADDED;
import static android.content.Intent.ACTION_PACKAGE_CHANGED;
import static android.content.Intent.ACTION_PACKAGE_REMOVED;
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.EXTRA_PACKAGE_NAME;
@@ -31,10 +28,10 @@ import static android.content.om.OverlayManagerTransaction.Request.TYPE_SET_DISA
import static android.content.om.OverlayManagerTransaction.Request.TYPE_SET_ENABLED;
import static android.content.om.OverlayManagerTransaction.Request.TYPE_UNREGISTER_FABRICATED;
import static android.content.pm.PackageManager.SIGNATURE_MATCH;
import static android.os.Process.INVALID_UID;
import static android.os.Trace.TRACE_TAG_RRO;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceEnd;

import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException;

import android.annotation.NonNull;
@@ -82,6 +79,7 @@ import android.util.EventLog;
import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.content.PackageMonitor;
import com.android.internal.content.om.OverlayConfig;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
@@ -261,6 +259,8 @@ public final class OverlayManagerService extends SystemService {

    private final OverlayActorEnforcer mActorEnforcer;

    private final PackageMonitor mPackageMonitor = new OverlayManagerPackageMonitor();

    private int mPrevStartedUserId = -1;

    public OverlayManagerService(@NonNull final Context context) {
@@ -277,16 +277,9 @@ public final class OverlayManagerService extends SystemService {
                    OverlayConfig.getSystemInstance(), getDefaultOverlayPackages());
            mActorEnforcer = new OverlayActorEnforcer(mPackageManager);

            HandlerThread packageReceiverThread = new HandlerThread(TAG);
            packageReceiverThread.start();

            final IntentFilter packageFilter = new IntentFilter();
            packageFilter.addAction(ACTION_PACKAGE_ADDED);
            packageFilter.addAction(ACTION_PACKAGE_CHANGED);
            packageFilter.addAction(ACTION_PACKAGE_REMOVED);
            packageFilter.addDataScheme("package");
            getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL,
                    packageFilter, null, packageReceiverThread.getThreadHandler());
            HandlerThread packageMonitorThread = new HandlerThread(TAG);
            packageMonitorThread.start();
            mPackageMonitor.register(context, packageMonitorThread.getLooper(), true);

            final IntentFilter userFilter = new IntentFilter();
            userFilter.addAction(ACTION_USER_ADDED);
@@ -372,59 +365,65 @@ public final class OverlayManagerService extends SystemService {
        return defaultPackages.toArray(new String[defaultPackages.size()]);
    }

    private final class PackageReceiver extends BroadcastReceiver {
    private final class OverlayManagerPackageMonitor extends PackageMonitor {

        @Override
        public void onReceive(@NonNull final Context context, @NonNull final Intent intent) {
            final String action = intent.getAction();
            if (action == null) {
                Slog.e(TAG, "Cannot handle package broadcast with null action");
                return;
        public void onPackageAppearedWithExtras(String packageName, Bundle extras) {
            handlePackageAdd(packageName, extras);
        }
            final Uri data = intent.getData();
            if (data == null) {
                Slog.e(TAG, "Cannot handle package broadcast with null data");
                return;

        @Override
        public void onPackageChangedWithExtras(String packageName, Bundle extras) {
            handlePackageChange(packageName, extras);
        }
            final String packageName = data.getSchemeSpecificPart();

            final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
            final boolean systemUpdateUninstall =
                    intent.getBooleanExtra(Intent.EXTRA_SYSTEM_UPDATE_UNINSTALL, false);
        @Override
        public void onPackageDisappearedWithExtras(String packageName, Bundle extras) {
            handlePackageRemove(packageName, extras);
        }
    }

    private int[] getUserIds(int uid) {
        final int[] userIds;
            final int extraUid = intent.getIntExtra(Intent.EXTRA_UID, UserHandle.USER_NULL);
            if (extraUid == UserHandle.USER_NULL) {
        if (uid == INVALID_UID) {
            userIds = mUserManager.getUserIds();
        } else {
                userIds = new int[] { UserHandle.getUserId(extraUid) };
            userIds = new int[] { UserHandle.getUserId(uid) };
        }
        return userIds;
    }

            switch (action) {
                case ACTION_PACKAGE_ADDED:
    private void handlePackageAdd(String packageName, Bundle extras) {
        final boolean replacing = extras.getBoolean(Intent.EXTRA_REPLACING, false);
        final int uid = extras.getInt(Intent.EXTRA_UID, 0);
        final int[] userIds = getUserIds(uid);
        if (replacing) {
            onPackageReplaced(packageName, userIds);
        } else {
            onPackageAdded(packageName, userIds);
        }
                    break;
                case ACTION_PACKAGE_CHANGED:
                    // ignore the intent if it was sent by the package manager as a result of the
                    // overlay manager having sent ACTION_OVERLAY_CHANGED
                    if (!ACTION_OVERLAY_CHANGED.equals(intent.getStringExtra(EXTRA_REASON))) {
    }

    private void handlePackageChange(String packageName, Bundle extras) {
        final int uid = extras.getInt(Intent.EXTRA_UID, 0);
        final int[] userIds = getUserIds(uid);
        if (!ACTION_OVERLAY_CHANGED.equals(extras.getString(EXTRA_REASON))) {
            onPackageChanged(packageName, userIds);
        }
                    break;
                case ACTION_PACKAGE_REMOVED:
    }

    private void handlePackageRemove(String packageName, Bundle extras) {
        final boolean replacing = extras.getBoolean(Intent.EXTRA_REPLACING, false);
        final boolean systemUpdateUninstall =
                extras.getBoolean(Intent.EXTRA_SYSTEM_UPDATE_UNINSTALL, false);
        final int uid = extras.getInt(Intent.EXTRA_UID, 0);
        final int[] userIds = getUserIds(uid);

        if (replacing) {
            onPackageReplacing(packageName, systemUpdateUninstall, userIds);
        } else {
            onPackageRemoved(packageName, userIds);
        }
                    break;
                default:
                    // do nothing
                    break;
            }
    }

    private void onPackageAdded(@NonNull final String packageName,
@@ -533,7 +532,6 @@ public final class OverlayManagerService extends SystemService {
            traceEnd(TRACE_TAG_RRO);
        }
    }
    }

    private final class UserReceiver extends BroadcastReceiver {
        @Override