Merge "Ensure correct installer name is shown in UpdateOwnership dialog" into main
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
index dbf0b48..ef418a5 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -81,6 +81,12 @@
String callingPackage = getCallingPackage();
String callingAttributionTag = null;
+ // Uid of the source package, coming from ActivityManager
+ int callingUid = getLaunchedFromUid();
+ if (callingUid == Process.INVALID_UID) {
+ Log.w(TAG, "Could not determine the launching uid.");
+ }
+
final boolean isSessionInstall =
PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL.equals(intent.getAction())
|| PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction());
@@ -90,24 +96,24 @@
final int sessionId = (isSessionInstall
? intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1)
: -1);
+ int originatingUidFromSession = callingUid;
if (callingPackage == null && sessionId != -1) {
PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId);
- callingPackage = (sessionInfo != null) ? sessionInfo.getInstallerPackageName() : null;
- callingAttributionTag =
- (sessionInfo != null) ? sessionInfo.getInstallerAttributionTag() : null;
+ if (sessionInfo != null) {
+ callingPackage = sessionInfo.getInstallerPackageName();
+ callingAttributionTag = sessionInfo.getInstallerAttributionTag();
+ originatingUidFromSession = sessionInfo.getOriginatingUid();
+ }
}
final ApplicationInfo sourceInfo = getSourceInfo(callingPackage);
- // Uid of the source package, coming from ActivityManager
- int callingUid = getLaunchedFromUid();
- if (callingUid == Process.INVALID_UID) {
- Log.e(TAG, "Could not determine the launching uid.");
- }
+
// Uid of the source package, with a preference to uid from ApplicationInfo
final int originatingUid = sourceInfo != null ? sourceInfo.uid : callingUid;
if (callingUid == Process.INVALID_UID && sourceInfo == null) {
+ Log.e(TAG, "Cannot determine caller since UID is invalid and sourceInfo is null");
mAbortInstall = true;
}
@@ -127,7 +133,7 @@
&& originatingUid != Process.INVALID_UID) {
final int targetSdkVersion = getMaxTargetSdkVersionForUid(this, originatingUid);
if (targetSdkVersion < 0) {
- Log.w(TAG, "Cannot get target sdk version for uid " + originatingUid);
+ Log.e(TAG, "Cannot get target sdk version for uid " + originatingUid);
// Invalid originating uid supplied. Abort install.
mAbortInstall = true;
} else if (targetSdkVersion >= Build.VERSION_CODES.O && !isUidRequestingPermission(
@@ -139,6 +145,8 @@
}
if (sessionId != -1 && !isCallerSessionOwner(originatingUid, sessionId)) {
+ Log.e(TAG, "UID " + originatingUid + " is not the owner of session " +
+ sessionId);
mAbortInstall = true;
}
@@ -178,6 +186,8 @@
callingAttributionTag);
nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINAL_SOURCE_INFO, sourceInfo);
nextActivity.putExtra(Intent.EXTRA_ORIGINATING_UID, originatingUid);
+ nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINATING_UID_FROM_SESSION_INFO,
+ originatingUidFromSession);
if (isSessionInstall) {
nextActivity.setClass(this, PackageInstallerActivity.class);
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index 7dc157f..7240fb9 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -83,6 +83,8 @@
static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
static final String EXTRA_STAGED_SESSION_ID = "EXTRA_STAGED_SESSION_ID";
static final String EXTRA_APP_SNIPPET = "EXTRA_APP_SNIPPET";
+ static final String EXTRA_ORIGINATING_UID_FROM_SESSION_INFO =
+ "EXTRA_ORIGINATING_UID_FROM_SESSION_INFO";
private static final String ALLOW_UNKNOWN_SOURCES_KEY =
PackageInstallerActivity.class.getName() + "ALLOW_UNKNOWN_SOURCES_KEY";
@@ -91,7 +93,14 @@
private Uri mOriginatingURI;
private Uri mReferrerURI;
private int mOriginatingUid = Process.INVALID_UID;
- private String mOriginatingPackage; // The package name corresponding to #mOriginatingUid
+ /**
+ * The package name corresponding to #mOriginatingUid
+ */
+ private String mOriginatingPackage;
+ /**
+ * The package name corresponding to the app updater in the update-ownership confirmation dialog
+ */
+ private String mOriginatingPackageFromSessionInfo;
private int mActivityResultCode = Activity.RESULT_CANCELED;
private int mPendingUserActionReason = -1;
@@ -144,7 +153,8 @@
viewToEnable = mDialog.requireViewById(R.id.install_confirm_question_update);
final CharSequence existingUpdateOwnerLabel = getExistingUpdateOwnerLabel();
- final CharSequence requestedUpdateOwnerLabel = getApplicationLabel(mCallingPackage);
+ final CharSequence requestedUpdateOwnerLabel =
+ getApplicationLabel(mOriginatingPackageFromSessionInfo);
if (!TextUtils.isEmpty(existingUpdateOwnerLabel)
&& mPendingUserActionReason == PackageInstaller.REASON_REMIND_OWNERSHIP) {
String updateOwnerString =
@@ -376,6 +386,11 @@
Process.INVALID_UID);
mOriginatingPackage = (mOriginatingUid != Process.INVALID_UID)
? getPackageNameForUid(mOriginatingUid) : null;
+ int originatingUidFromSessionInfo =
+ intent.getIntExtra(EXTRA_ORIGINATING_UID_FROM_SESSION_INFO, Process.INVALID_UID);
+ mOriginatingPackageFromSessionInfo = (originatingUidFromSessionInfo != Process.INVALID_UID)
+ ? getPackageNameForUid(originatingUidFromSessionInfo) : mCallingPackage;
+
final Object packageSource;
if (PackageInstaller.ACTION_CONFIRM_INSTALL.equals(action)) {