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

Commit 8016bc3e authored by Brandon Liu's avatar Brandon Liu
Browse files

Migrate OverlayManagerService to PackageMonitor

go/oms-to-packagemonitor

Bug: b/280626834, b/292298615
Test: Updated and verified affected tests pass
Change-Id: Ia6c0fb955fd15681e2757cb7e09d54c9c0307efd
parent b2b28ed1
Loading
Loading
Loading
Loading
+28 −4
Original line number Original line Diff line number Diff line
@@ -204,6 +204,14 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        return false;
        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) {
    public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
        return false;
        return false;
    }
    }
@@ -237,12 +245,25 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    public void onPackageDisappeared(String packageName, int reason) {
    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.
     * Called when a package appears for any reason.
     */
     */
    public void onPackageAppeared(String packageName, int 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.
     * 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;
                    mChangeType = PACKAGE_PERMANENT_CHANGE;
                    onPackageAdded(pkg, uid);
                    onPackageAdded(pkg, uid);
                }
                }
                onPackageAppearedWithExtras(pkg, intent.getExtras());
                onPackageAppeared(pkg, mChangeType);
                onPackageAppeared(pkg, mChangeType);
            }
            }
        } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
        } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
@@ -403,6 +425,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                        onPackageRemovedAllUsers(pkg, uid);
                        onPackageRemovedAllUsers(pkg, uid);
                    }
                    }
                }
                }
                onPackageDisappearedWithExtras(pkg, intent.getExtras());
                onPackageDisappeared(pkg, mChangeType);
                onPackageDisappeared(pkg, mChangeType);
            }
            }
        } else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
        } 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)) {
                if (onPackageChanged(pkg, uid, mModifiedComponents)) {
                    mSomePackagesChanged = true;
                    mSomePackagesChanged = true;
                }
                }
                onPackageChangedWithExtras(pkg, intent.getExtras());
                onPackageModified(pkg);
                onPackageModified(pkg);
            }
            }
        } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) {
        } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) {
+74 −1
Original line number Original line Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.internal.content;
package com.android.internal.content;


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


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


@@ -45,6 +46,7 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
@RunWith(AndroidJUnit4.class)
public class PackageMonitorTest {
public class PackageMonitorTest {
    private static final String FAKE_PACKAGE_NAME = "com.android.internal.content.fakeapp";
    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_PACKAGE_UID = 123;
    private static final int FAKE_USER_ID = 0;
    private static final int FAKE_USER_ID = 0;
    private static final int WAIT_CALLBACK_CALLED_IN_MS = 300;
    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.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
        intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
        intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
        intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
        intent.putExtra(Intent.EXTRA_REASON, FAKE_EXTRA_REASON);
        String [] packageList = new String[]{FAKE_PACKAGE_NAME};
        String [] packageList = new String[]{FAKE_PACKAGE_NAME};
        intent.putExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, packageList);
        intent.putExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, packageList);
        spyPackageMonitor.doHandlePackageEvent(intent);
        spyPackageMonitor.doHandlePackageEvent(intent);
@@ -253,6 +256,20 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1))
        verify(spyPackageMonitor, times(1))
                .onPackageChanged(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID), eq(packageList));
                .onPackageChanged(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID), eq(packageList));
        verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));
        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)).onSomePackagesChanged();
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
    }
    }
@@ -272,6 +289,21 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1))
        verify(spyPackageMonitor, times(1))
                .onPackageUpdateStarted(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
                .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))
        verify(spyPackageMonitor, times(1))
                .onPackageDisappeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
                .onPackageDisappeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
@@ -295,6 +327,21 @@ public class PackageMonitorTest {
                .onPackageRemoved(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
                .onPackageRemoved(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
        verify(spyPackageMonitor, times(1))
        verify(spyPackageMonitor, times(1))
                .onPackageRemovedAllUsers(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
                .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),
        verify(spyPackageMonitor, times(1)).onPackageDisappeared(eq(FAKE_PACKAGE_NAME),
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
@@ -316,6 +363,19 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1))
        verify(spyPackageMonitor, times(1))
                .onPackageUpdateFinished(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
                .onPackageUpdateFinished(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
        verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));
        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))
        verify(spyPackageMonitor, times(1))
                .onPackageAppeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
                .onPackageAppeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
@@ -336,6 +396,19 @@ public class PackageMonitorTest {
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1))
        verify(spyPackageMonitor, times(1))
                .onPackageAdded(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
                .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),
        verify(spyPackageMonitor, times(1)).onPackageAppeared(eq(FAKE_PACKAGE_NAME),
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
                eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
        verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+141 −143
Original line number Original line Diff line number Diff line
@@ -18,9 +18,6 @@ package com.android.server.om;


import static android.app.AppGlobals.getPackageManager;
import static android.app.AppGlobals.getPackageManager;
import static android.content.Intent.ACTION_OVERLAY_CHANGED;
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_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.EXTRA_PACKAGE_NAME;
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_SET_ENABLED;
import static android.content.om.OverlayManagerTransaction.Request.TYPE_UNREGISTER_FABRICATED;
import static android.content.om.OverlayManagerTransaction.Request.TYPE_UNREGISTER_FABRICATED;
import static android.content.pm.PackageManager.SIGNATURE_MATCH;
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.TRACE_TAG_RRO;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceEnd;
import static android.os.Trace.traceEnd;

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


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


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


    private final OverlayActorEnforcer mActorEnforcer;
    private final OverlayActorEnforcer mActorEnforcer;


    private final PackageMonitor mPackageMonitor = new OverlayManagerPackageMonitor();

    private int mPrevStartedUserId = -1;
    private int mPrevStartedUserId = -1;


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


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

            mPackageMonitor.register(context, packageMonitorThread.getLooper(), true);
            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());


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


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

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

            if (data == null) {
        @Override
                Slog.e(TAG, "Cannot handle package broadcast with null data");
        public void onPackageChangedWithExtras(String packageName, Bundle extras) {
                return;
            handlePackageChange(packageName, extras);
        }
        }
            final String packageName = data.getSchemeSpecificPart();


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


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


            switch (action) {
    private void handlePackageAdd(String packageName, Bundle extras) {
                case ACTION_PACKAGE_ADDED:
        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) {
        if (replacing) {
            onPackageReplaced(packageName, userIds);
            onPackageReplaced(packageName, userIds);
        } else {
        } else {
            onPackageAdded(packageName, userIds);
            onPackageAdded(packageName, userIds);
        }
        }
                    break;
    }
                case ACTION_PACKAGE_CHANGED:

                    // ignore the intent if it was sent by the package manager as a result of the
    private void handlePackageChange(String packageName, Bundle extras) {
                    // overlay manager having sent ACTION_OVERLAY_CHANGED
        final int uid = extras.getInt(Intent.EXTRA_UID, 0);
                    if (!ACTION_OVERLAY_CHANGED.equals(intent.getStringExtra(EXTRA_REASON))) {
        final int[] userIds = getUserIds(uid);
        if (!ACTION_OVERLAY_CHANGED.equals(extras.getString(EXTRA_REASON))) {
            onPackageChanged(packageName, userIds);
            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) {
        if (replacing) {
            onPackageReplacing(packageName, systemUpdateUninstall, userIds);
            onPackageReplacing(packageName, systemUpdateUninstall, userIds);
        } else {
        } else {
            onPackageRemoved(packageName, userIds);
            onPackageRemoved(packageName, userIds);
        }
        }
                    break;
                default:
                    // do nothing
                    break;
            }
    }
    }


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


    private final class UserReceiver extends BroadcastReceiver {
    private final class UserReceiver extends BroadcastReceiver {
        @Override
        @Override