Fixed get packages for HSUM devices
On HSUM devices, packages installed on secondary users can't
be retrieved by the system users' package manager. Fixed by
using corresponding user's package manager.
Fix: 356827794
Fix: 362253919
Test: Basic telephony functionality tests
Test: atest FrameworksTelephonyTests TeleServicesTests
Flag: com.android.internal.telephony.flags.hsum_broadcast
Change-Id: I34c4a310eb977fed944045a0a7f1cdda4fc41200
diff --git a/flags/misc.aconfig b/flags/misc.aconfig
index 0ebaeba..860c864 100644
--- a/flags/misc.aconfig
+++ b/flags/misc.aconfig
@@ -217,3 +217,15 @@
purpose: PURPOSE_BUGFIX
}
}
+
+# OWNER=jackyu TARGET=25Q2
+flag {
+ name: "hsum_package_manager"
+ namespace: "telephony"
+ description: "Fixed the bug that package manager is not for the right user"
+ bug:"356827794"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index c7c05bc..ca03f5d 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -75,6 +75,7 @@
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.internal.telephony.util.NotificationChannelController;
@@ -2153,10 +2154,13 @@
// TODO(b/355049884): This is looking at sms package of the wrong user!
UserManager userManager =
(UserManager) context.getSystemService(Context.USER_SERVICE);
+ PackageManager pm = context.getPackageManager();
+ if (Flags.hsumPackageManager()) {
+ pm = context.createContextAsUser(UserHandle.CURRENT, 0).getPackageManager();
+ }
if (userManager.isUserUnlocked()) {
- context.startActivityAsUser(context.getPackageManager()
- .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(context)),
- UserHandle.CURRENT);
+ context.startActivityAsUser(pm.getLaunchIntentForPackage(
+ Telephony.Sms.getDefaultSmsPackage(context)), UserHandle.CURRENT);
}
}
}
diff --git a/src/java/com/android/internal/telephony/PhoneSubInfoController.java b/src/java/com/android/internal/telephony/PhoneSubInfoController.java
index 073e242..7ee3de2 100644
--- a/src/java/com/android/internal/telephony/PhoneSubInfoController.java
+++ b/src/java/com/android/internal/telephony/PhoneSubInfoController.java
@@ -785,9 +785,16 @@
*/
@Nullable
private String getCurrentPackageName() {
+ if (mFeatureFlags.hsumPackageManager()) {
+ PackageManager pm = mContext.createContextAsUser(Binder.getCallingUserHandle(), 0)
+ .getPackageManager();
+ if (pm == null) return null;
+ String[] callingPackageNames = pm.getPackagesForUid(Binder.getCallingUid());
+ return (callingPackageNames == null) ? null : callingPackageNames[0];
+ }
if (mPackageManager == null) return null;
- String[] callingUids = mPackageManager.getPackagesForUid(Binder.getCallingUid());
- return (callingUids == null) ? null : callingUids[0];
+ String[] callingPackageNames = mPackageManager.getPackagesForUid(Binder.getCallingUid());
+ return (callingPackageNames == null) ? null : callingPackageNames[0];
}
/**
diff --git a/src/java/com/android/internal/telephony/SmsController.java b/src/java/com/android/internal/telephony/SmsController.java
index 1295f38..e3c409d 100644
--- a/src/java/com/android/internal/telephony/SmsController.java
+++ b/src/java/com/android/internal/telephony/SmsController.java
@@ -224,7 +224,15 @@
}
}
+ @NonNull
private String getCallingPackage() {
+ if (mFlags.hsumPackageManager()) {
+ PackageManager pm = mContext.createContextAsUser(Binder.getCallingUserHandle(), 0)
+ .getPackageManager();
+ String[] packages = pm.getPackagesForUid(Binder.getCallingUid());
+ if (packages == null || packages.length == 0) return "";
+ return packages[0];
+ }
return mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid())[0];
}
@@ -412,9 +420,7 @@
boolean persistMessageForNonDefaultSmsApp, long messageId) {
// This is different from the checking of other method. It prefers the package name
// returned by getCallPackage() for backward-compatibility.
- if (getCallingPackage() != null) {
- callingPackage = getCallingPackage();
- }
+ callingPackage = getCallingPackage();
UserHandle callingUser = Binder.getCallingUserHandle();
Rlog.d(LOG_TAG, "sendMultipartTextForSubscriber caller=" + callingPackage);
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index 87d6d27..353493b 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -4561,6 +4561,10 @@
// Too many packages running with phone uid. Just return one here.
return "com.android.phone";
}
+ if (mFeatureFlags.hsumPackageManager()) {
+ return Arrays.toString(mContext.createContextAsUser(Binder.getCallingUserHandle(), 0)
+ .getPackageManager().getPackagesForUid(Binder.getCallingUid()));
+ }
return Arrays.toString(mContext.getPackageManager().getPackagesForUid(
Binder.getCallingUid()));
}
@@ -4765,9 +4769,16 @@
*/
@Nullable
private String getCurrentPackageName() {
+ if (mFeatureFlags.hsumPackageManager()) {
+ PackageManager pm = mContext.createContextAsUser(Binder.getCallingUserHandle(), 0)
+ .getPackageManager();
+ if (pm == null) return null;
+ String[] callingPackageNames = pm.getPackagesForUid(Binder.getCallingUid());
+ return (callingPackageNames == null) ? null : callingPackageNames[0];
+ }
if (mPackageManager == null) return null;
- String[] callingUids = mPackageManager.getPackagesForUid(Binder.getCallingUid());
- return (callingUids == null) ? null : callingUids[0];
+ String[] callingPackageNames = mPackageManager.getPackagesForUid(Binder.getCallingUid());
+ return (callingPackageNames == null) ? null : callingPackageNames[0];
}
/**
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index dd4d63a..d80c9a2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -582,6 +582,7 @@
doReturn(true).when(mFeatureFlags).minimalTelephonyCdmCheck();
doReturn(true).when(mFeatureFlags).supportNetworkProvider();
doReturn(true).when(mFeatureFlags).hsumBroadcast();
+ doReturn(true).when(mFeatureFlags).hsumPackageManager();
TelephonyManager.disableServiceHandleCaching();
PropertyInvalidatedCache.disableForTestMode();