Loading api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -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); core/java/android/content/pm/InstallSourceInfo.java +19 −4 Original line number Diff line number Diff line Loading @@ -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(); } Loading @@ -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. Loading core/java/android/content/pm/PackageManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/core/java/com/android/server/pm/PackageManagerService.java +29 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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) { Loading @@ -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") Loading
api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -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);
core/java/android/content/pm/InstallSourceInfo.java +19 −4 Original line number Diff line number Diff line Loading @@ -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(); } Loading @@ -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. Loading
core/java/android/content/pm/PackageManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/core/java/com/android/server/pm/PackageManagerService.java +29 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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) { Loading @@ -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")