Loading core/java/com/android/internal/content/PackageMonitor.java +28 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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. */ Loading Loading @@ -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)) { Loading @@ -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)) { Loading @@ -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)) { Loading core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java +74 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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(); } Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading services/core/java/com/android/server/om/OverlayManagerService.java +141 −143 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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, Loading Loading @@ -533,7 +532,6 @@ public final class OverlayManagerService extends SystemService { traceEnd(TRACE_TAG_RRO); } } } private final class UserReceiver extends BroadcastReceiver { @Override Loading Loading
core/java/com/android/internal/content/PackageMonitor.java +28 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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. */ Loading Loading @@ -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)) { Loading @@ -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)) { Loading @@ -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)) { Loading
core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java +74 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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(); } Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading
services/core/java/com/android/server/om/OverlayManagerService.java +141 −143 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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, Loading Loading @@ -533,7 +532,6 @@ public final class OverlayManagerService extends SystemService { traceEnd(TRACE_TAG_RRO); } } } private final class UserReceiver extends BroadcastReceiver { @Override Loading