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

Commit 395ac1e2 authored by Alan Stokes's avatar Alan Stokes Committed by Android (Google) Code Review
Browse files

Merge "Update API for uninstalled installers."

parents eacd2154 a9b4a6cd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -11421,6 +11421,7 @@ package android.content.pm {
  public final class InstallSourceInfo implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public String getInitiatingPackageName();
    method @Nullable public android.content.pm.SigningInfo getInitiatingPackageSigningInfo();
    method @Nullable public String getInstallingPackageName();
    method @Nullable public String getOriginatingPackageName();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
+19 −4
Original line number Diff line number Diff line
@@ -29,32 +29,39 @@ public final class InstallSourceInfo implements Parcelable {

    @Nullable private final String mInitiatingPackageName;

    @Nullable private final SigningInfo mInitiatingPackageSigningInfo;

    @Nullable private final String mOriginatingPackageName;

    @Nullable private final String mInstallingPackageName;

    /** @hide */
    public InstallSourceInfo(@Nullable String initiatingPackageName,
            @Nullable SigningInfo initiatingPackageSigningInfo,
            @Nullable String originatingPackageName, @Nullable String installingPackageName) {
        this.mInitiatingPackageName = initiatingPackageName;
        this.mOriginatingPackageName = originatingPackageName;
        this.mInstallingPackageName = installingPackageName;
        mInitiatingPackageName = initiatingPackageName;
        mInitiatingPackageSigningInfo = initiatingPackageSigningInfo;
        mOriginatingPackageName = originatingPackageName;
        mInstallingPackageName = installingPackageName;
    }

    @Override
    public int describeContents() {
        return 0;
        return mInitiatingPackageSigningInfo == null
                ? 0 : mInitiatingPackageSigningInfo.describeContents();
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeString(mInitiatingPackageName);
        dest.writeParcelable(mInitiatingPackageSigningInfo, flags);
        dest.writeString(mOriginatingPackageName);
        dest.writeString(mInstallingPackageName);
    }

    private InstallSourceInfo(Parcel source) {
        mInitiatingPackageName = source.readString();
        mInitiatingPackageSigningInfo = source.readParcelable(SigningInfo.class.getClassLoader());
        mOriginatingPackageName = source.readString();
        mInstallingPackageName = source.readString();
    }
@@ -65,6 +72,14 @@ public final class InstallSourceInfo implements Parcelable {
        return mInitiatingPackageName;
    }

    /**
     * Information about the signing certificates used to sign the initiating package, if available.
     */
    @Nullable
    public SigningInfo getInitiatingPackageSigningInfo() {
        return mInitiatingPackageSigningInfo;
    }

    /**
     * The name of the package on behalf of which the initiating package requested the installation,
     * or null if not available.
+5 −0
Original line number Diff line number Diff line
@@ -6053,6 +6053,11 @@ public abstract class PackageManager {
     * If the calling application does not hold the INSTALL_PACKAGES permission then
     * the result will always return {@code null} from
     * {@link InstallSourceInfo#getOriginatingPackageName()}.
     * <p>
     * If the package that requested the install has been uninstalled, then information about it
     * will only be returned from {@link InstallSourceInfo#getInitiatingPackageName()} and
     * {@link InstallSourceInfo#getInitiatingPackageSigningInfo()} if the calling package is
     * requesting its own install information and is not an instant app.
     *
     * @param packageName The name of the package to query
     * @throws NameNotFoundException if the given package name is not installed
+29 −6
Original line number Diff line number Diff line
@@ -190,6 +190,7 @@ import android.content.pm.SELinuxUtil;
import android.content.pm.ServiceInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
import android.content.pm.VerifierDeviceIdentity;
@@ -20021,8 +20022,9 @@ public class PackageManagerService extends IPackageManager.Stub
        String initiatingPackageName;
        String originatingPackageName;
        final InstallSource installSource;
        synchronized (mLock) {
            final InstallSource installSource = getInstallSourceLocked(packageName, callingUid);
            installSource = getInstallSourceLocked(packageName, callingUid);
            if (installSource == null) {
                return null;
            }
@@ -20036,9 +20038,16 @@ public class PackageManagerService extends IPackageManager.Stub
            }
            if (installSource.isInitiatingPackageUninstalled) {
                // TODO(b/146555198) Allow the app itself to see the info
                // (at least for non-instant apps)
                // We can't check visibility in the usual way, since the initiating package is no
                // longer present. So we apply simpler rules to whether to expose the info:
                // 1. Instant apps can't see it.
                // 2. Otherwise only the installed app itself can see it.
                final boolean isInstantApp = getInstantAppPackageName(callingUid) != null;
                if (!isInstantApp && isCallerSameApp(packageName, callingUid)) {
                    initiatingPackageName = installSource.initiatingPackageName;
                } else {
                    initiatingPackageName = null;
                }
            } else {
                // All installSource strings are interned, so == is ok here
                if (installSource.initiatingPackageName == installSource.installerPackageName) {
@@ -20063,13 +20072,27 @@ public class PackageManagerService extends IPackageManager.Stub
            }
        }
        // Remaining work can safely be done outside the lock. (Note that installSource is
        // immutable so it's ok to carry on reading from it.)
        if (originatingPackageName != null && mContext.checkCallingOrSelfPermission(
                Manifest.permission.INSTALL_PACKAGES) != PackageManager.PERMISSION_GRANTED) {
            originatingPackageName = null;
        }
        return new InstallSourceInfo(initiatingPackageName, originatingPackageName,
                installerPackageName);
        // If you can see the initiatingPackageName, and we have valid signing info for it,
        // then we let you see that too.
        final SigningInfo initiatingPackageSigningInfo;
        final PackageSignatures signatures = installSource.initiatingPackageSignatures;
        if (initiatingPackageName != null && signatures != null
                && signatures.mSigningDetails != SigningDetails.UNKNOWN) {
            initiatingPackageSigningInfo = new SigningInfo(signatures.mSigningDetails);
        } else {
            initiatingPackageSigningInfo = null;
        }
        return new InstallSourceInfo(initiatingPackageName, initiatingPackageSigningInfo,
                originatingPackageName, installerPackageName);
    }
    @GuardedBy("mLock")