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

Commit 95a9bfe2 authored by Christopher Tate's avatar Christopher Tate
Browse files

When installing/enabling a system app, bootstrap it

Specifically, send it a BOOT_COMPLETED broadcast just as it would have
received during device (or user) startup.

Bug 8594153

Change-Id: I847c16df56d038a25758e594f951bc15348edc19
parent 203aa72e
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -6055,6 +6055,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        long callingId = Binder.clearCallingIdentity();
        try {
            boolean sendAdded = false;
            boolean isSystem = false;
            Bundle extras = new Bundle(1);

            // writer
@@ -6068,12 +6069,29 @@ public class PackageManagerService extends IPackageManager.Stub {
                    mSettings.writePackageRestrictionsLPr(userId);
                    extras.putInt(Intent.EXTRA_UID, UserHandle.getUid(userId, pkgSetting.appId));
                    sendAdded = true;
                    isSystem = (pkgSetting.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
                }
            }

            if (sendAdded) {
                sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
                        packageName, extras, null, null, new int[] {userId});
                if (isSystem) {
                    // The just-installed/enabled app is bundled on the system, so presumed
                    // to be able to run automatically without needing an explicit launch.
                    // Send it a BOOT_COMPLETED if it would ordinarily have gotten one.
                    Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED)
                            .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                            .setPackage(packageName);
                    try {
                        IActivityManager am = ActivityManagerNative.getDefault();
                        am.broadcastIntent(null, bcIntent, null, null, 0, null, null, null,
                                android.app.AppOpsManager.OP_NONE, false, false, userId);
                    } catch (RemoteException e) {
                        // shouldn't happen
                        Slog.w(TAG, "Unable to bootstrap installed package", e);
                    }
                }
            }
        } finally {
            Binder.restoreCallingIdentity(callingId);