Fix call to ImsManager#getInstance
am: b574d5f303
Change-Id: I233e7c3f981c04a5da2db593aee53cd983b5b47d
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index e1a9592..3e6c041 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -2030,14 +2030,18 @@
/**
* Returns the target SDK version number for a given package name.
*
+ * This call MUST be invoked before clearing the calling UID.
+ *
* @return target SDK if the package is found or INT_MAX.
*/
private int getTargetSdk(String packageName) {
try {
- final ApplicationInfo ai = mApp.getPackageManager().getApplicationInfo(
- packageName, 0);
+ final ApplicationInfo ai = mApp.getPackageManager().getApplicationInfoAsUser(
+ packageName, 0, UserHandle.getUserId(Binder.getCallingUid()));
if (ai != null) return ai.targetSdkVersion;
} catch (PackageManager.NameNotFoundException unexpected) {
+ loge("Failed to get package info for pkg="
+ + packageName + ", uid=" + Binder.getCallingUid());
}
return Integer.MAX_VALUE;
}
@@ -4749,6 +4753,52 @@
}
}
+ private int getCarrierPrivilegeStatusFromCarrierConfigRules(int privilegeFromSim,
+ Phone phone) {
+ //load access rules from carrier configs, and check those as well: b/139133814
+ SubscriptionController subController = SubscriptionController.getInstance();
+ if (privilegeFromSim == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS
+ || subController == null) return privilegeFromSim;
+
+ int uid = Binder.getCallingUid();
+ PackageManager pkgMgr = phone.getContext().getPackageManager();
+ String[] packages = pkgMgr.getPackagesForUid(uid);
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ SubscriptionInfo subInfo = subController.getSubscriptionInfo(phone.getSubId());
+ SubscriptionManager subManager = (SubscriptionManager)
+ phone.getContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ for (String pkg : packages) {
+ if (subManager.canManageSubscription(subInfo, pkg)) {
+ return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+ }
+ }
+ return privilegeFromSim;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private int getCarrierPrivilegeStatusFromCarrierConfigRules(int privilegeFromSim, Phone phone,
+ String pkgName) {
+ //load access rules from carrier configs, and check those as well: b/139133814
+ SubscriptionController subController = SubscriptionController.getInstance();
+ if (privilegeFromSim == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS
+ || subController == null) return privilegeFromSim;
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ SubscriptionInfo subInfo = subController.getSubscriptionInfo(phone.getSubId());
+ SubscriptionManager subManager = (SubscriptionManager)
+ phone.getContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ return subManager.canManageSubscription(subInfo, pkgName)
+ ? TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS : privilegeFromSim;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
@Override
public int getCarrierPrivilegeStatus(int subId) {
final Phone phone = getPhone(subId);
@@ -4761,8 +4811,10 @@
loge("getCarrierPrivilegeStatus: No UICC");
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
}
- return card.getCarrierPrivilegeStatusForCurrentTransaction(
- phone.getContext().getPackageManager());
+
+ return getCarrierPrivilegeStatusFromCarrierConfigRules(
+ card.getCarrierPrivilegeStatusForCurrentTransaction(
+ phone.getContext().getPackageManager()), phone);
}
@Override
@@ -4778,7 +4830,9 @@
loge("getCarrierPrivilegeStatus: No UICC");
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
}
- return profile.getCarrierPrivilegeStatusForUid(phone.getContext().getPackageManager(), uid);
+ return getCarrierPrivilegeStatusFromCarrierConfigRules(
+ profile.getCarrierPrivilegeStatusForUid(
+ phone.getContext().getPackageManager(), uid), phone);
}
@Override
@@ -4793,8 +4847,9 @@
loge("checkCarrierPrivilegesForPackage: No UICC on subId " + subId);
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
}
-
- return card.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName);
+ return getCarrierPrivilegeStatusFromCarrierConfigRules(
+ card.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName),
+ getPhone(phoneId), pkgName);
}
@Override
@@ -4809,7 +4864,9 @@
continue;
}
- result = card.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName);
+ result = getCarrierPrivilegeStatusFromCarrierConfigRules(
+ card.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName),
+ getPhone(i), pkgName);
if (result == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
break;
}
@@ -4844,9 +4901,9 @@
if (packages == null) {
// Only check packages in user 0 for now
packages = pm.getInstalledPackagesAsUser(
- PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
- | PackageManager.GET_SIGNATURES, UserHandle.USER_SYSTEM);
+ PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
+ | PackageManager.GET_SIGNATURES, UserHandle.USER_SYSTEM);
}
for (int p = packages.size() - 1; p >= 0; p--) {
PackageInfo pkgInfo = packages.get(p);
diff --git a/src/com/android/services/telephony/GsmConnection.java b/src/com/android/services/telephony/GsmConnection.java
index 999c6f5..47434c0 100644
--- a/src/com/android/services/telephony/GsmConnection.java
+++ b/src/com/android/services/telephony/GsmConnection.java
@@ -72,9 +72,8 @@
int capabilities = super.buildConnectionCapabilities();
capabilities |= CAPABILITY_MUTE;
// Overwrites TelephonyConnection.buildConnectionCapabilities() and resets the hold options
- // because all GSM calls should hold, even if the carrier config option is set to not show
- // hold for IMS calls.
- if (!shouldTreatAsEmergencyCall()) {
+ // because all GSM calls should hold.
+ if (!shouldTreatAsEmergencyCall() && !isImsConnection()) {
capabilities |= CAPABILITY_SUPPORT_HOLD;
if (isHoldable() && (getState() == STATE_ACTIVE || getState() == STATE_HOLDING)) {
capabilities |= CAPABILITY_HOLD;