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

Commit a31a74b9 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Setting Session commited broadcast when an existing apk is enabled for

a different user

Test: Manual tests and CTS
Bug: 38204385
Change-Id: Ic3bddbc2e6070c11b11f0685077db7737f2b8849
parent 731c4195
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -1696,15 +1696,27 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public int installExistingPackage(String packageName) throws NameNotFoundException {
        return installExistingPackageAsUser(packageName, mContext.getUserId());
        return installExistingPackage(packageName, PackageManager.INSTALL_REASON_UNKNOWN);
    }

    @Override
    public int installExistingPackage(String packageName, int installReason)
            throws NameNotFoundException {
        return installExistingPackageAsUser(packageName, installReason, mContext.getUserId());
    }

    @Override
    public int installExistingPackageAsUser(String packageName, int userId)
            throws NameNotFoundException {
        return installExistingPackageAsUser(packageName, PackageManager.INSTALL_REASON_UNKNOWN,
                userId);
    }

    private int installExistingPackageAsUser(String packageName, int installReason, int userId)
            throws NameNotFoundException {
        try {
            int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/,
                    PackageManager.INSTALL_REASON_UNKNOWN);
                    installReason);
            if (res == INSTALL_FAILED_INVALID_URI) {
                throw new NameNotFoundException("Package " + packageName + " doesn't exist");
            }
+8 −0
Original line number Diff line number Diff line
@@ -4628,6 +4628,14 @@ public abstract class PackageManager {
     */
    public abstract int installExistingPackage(String packageName) throws NameNotFoundException;

    /**
     * If there is already an application with the given package name installed
     * on the system for other users, also install it for the calling user.
     * @hide
     */
    public abstract int installExistingPackage(String packageName, @InstallReason int installReason)
            throws NameNotFoundException;

    /**
     * If there is already an application with the given package name installed
     * on the system for other users, also install it for the specified user.
+1 −16
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import static com.android.server.pm.PackageInstallerService.prepareExternalStage
import static com.android.server.pm.PackageInstallerService.prepareStageDir;

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
@@ -46,7 +45,6 @@ import android.content.pm.PackageParser.ApkLite;
import android.content.pm.PackageParser.PackageLite;
import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.os.Binder;
import android.os.Bundle;
import android.os.FileBridge;
@@ -56,7 +54,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.ProxyFileDescriptorCallback;
import android.os.RemoteException;
import android.os.RevocableFileDescriptor;
import android.os.UserHandle;
@@ -1168,19 +1165,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        // Send broadcast to default launcher only if it's a new install
        final boolean isNewInstall = extras == null || !extras.getBoolean(Intent.EXTRA_REPLACING);
        if (success && isNewInstall) {
            UserManagerService ums = UserManagerService.getInstance();
            if (ums != null) {
                final UserInfo parent = ums.getProfileParent(userId);
                final int launcherUid = (parent != null) ? parent.id : userId;
                final ComponentName launcherComponent = mPm.getDefaultHomeActivity(launcherUid);
                if (launcherComponent != null) {
                    Intent launcherIntent = new Intent(PackageInstaller.ACTION_SESSION_COMMITTED)
                            .putExtra(PackageInstaller.EXTRA_SESSION, generateInfo())
                            .putExtra(Intent.EXTRA_USER, UserHandle.of(userId))
                            .setPackage(launcherComponent.getPackageName());
                    mContext.sendBroadcastAsUser(launcherIntent, UserHandle.of(launcherUid));
                }
            }
            mPm.sendSessionCommitBroadcast(generateInfo(), userId);
        }

        mCallback.onSessionFinished(this, success);
+23 −1
Original line number Diff line number Diff line
@@ -13607,6 +13607,12 @@ public class PackageManagerService extends IPackageManager.Stub
            int userId) {
        final boolean isSystem = isSystemApp(pkgSetting) || isUpdatedSystemApp(pkgSetting);
        sendPackageAddedForNewUsers(packageName, isSystem, pkgSetting.appId, userId);
        // Send a session commit broadcast
        final PackageInstaller.SessionInfo info = new PackageInstaller.SessionInfo();
        info.installReason = pkgSetting.getInstallReason(userId);
        info.appPackageName = packageName;
        sendSessionCommitBroadcast(info, userId);
    }
    public void sendPackageAddedForNewUsers(String packageName, boolean isSystem, int appId, int... userIds) {
@@ -20122,11 +20128,27 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
        return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
    }
    public void sendSessionCommitBroadcast(PackageInstaller.SessionInfo sessionInfo, int userId) {
        UserManagerService ums = UserManagerService.getInstance();
        if (ums != null) {
            final UserInfo parent = ums.getProfileParent(userId);
            final int launcherUid = (parent != null) ? parent.id : userId;
            final ComponentName launcherComponent = getDefaultHomeActivity(launcherUid);
            if (launcherComponent != null) {
                Intent launcherIntent = new Intent(PackageInstaller.ACTION_SESSION_COMMITTED)
                        .putExtra(PackageInstaller.EXTRA_SESSION, sessionInfo)
                        .putExtra(Intent.EXTRA_USER, UserHandle.of(userId))
                        .setPackage(launcherComponent.getPackageName());
                mContext.sendBroadcastAsUser(launcherIntent, UserHandle.of(launcherUid));
            }
        }
    }
    /**
     * Report the 'Home' activity which is currently set as "always use this one". If non is set
     * then reports the most likely home activity or null if there are more than one.
     */
    public ComponentName getDefaultHomeActivity(int userId) {
    private ComponentName getDefaultHomeActivity(int userId) {
        List<ResolveInfo> allHomeCandidates = new ArrayList<>();
        ComponentName cn = getHomeActivitiesAsUser(allHomeCandidates, userId);
        if (cn != null) {
+9 −0
Original line number Diff line number Diff line
@@ -982,6 +982,15 @@ public class MockPackageManager extends PackageManager {
        throw new UnsupportedOperationException();
    }

    /**
     * @hide
     */
    @Override
    public int installExistingPackage(String packageName, int installReason)
            throws NameNotFoundException {
        throw new UnsupportedOperationException();
    }

    /**
     * @hide
     */
Loading