Merge "Revert "Move carrier privilege status checks to CarrierPrivilege...""
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 4182af1..bfc69a5 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -42,6 +42,7 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.ComponentInfo;
+import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.AsyncResult;
@@ -227,7 +228,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -6832,28 +6832,39 @@
 
     @Override
     public int getCarrierPrivilegeStatus(int subId) {
-        // No permission needed; this only lets the caller inspect their own status.
-        return getCarrierPrivilegeStatusForUidWithPermission(subId, Binder.getCallingUid());
+        final Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("getCarrierPrivilegeStatus: Invalid subId");
+            return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
+        }
+        UiccPort port = UiccController.getInstance().getUiccPort(phone.getPhoneId());
+        if (port == null) {
+            loge("getCarrierPrivilegeStatus: No UICC");
+            return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
+        }
+
+        return getCarrierPrivilegeStatusFromCarrierConfigRules(
+            port.getCarrierPrivilegeStatusForCurrentTransaction(
+                phone.getContext().getPackageManager()), Binder.getCallingUid(), phone);
     }
 
     @Override
     public int getCarrierPrivilegeStatusForUid(int subId, int uid) {
         enforceReadPrivilegedPermission("getCarrierPrivilegeStatusForUid");
-        return getCarrierPrivilegeStatusForUidWithPermission(subId, uid);
-    }
-
-    private int getCarrierPrivilegeStatusForUidWithPermission(int subId, int uid) {
-        Phone phone = getPhone(subId);
+        final Phone phone = getPhone(subId);
         if (phone == null) {
             loge("getCarrierPrivilegeStatusForUid: Invalid subId");
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
         }
-        CarrierPrivilegesTracker cpt = phone.getCarrierPrivilegesTracker();
-        if (cpt == null) {
-            loge("getCarrierPrivilegeStatusForUid: No CarrierPrivilegesTracker");
+        UiccProfile profile =
+                UiccController.getInstance().getUiccProfileForPhone(phone.getPhoneId());
+        if (profile == null) {
+            loge("getCarrierPrivilegeStatusForUid: No UICC");
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
         }
-        return cpt.getCarrierPrivilegeStatusForUid(uid);
+        return getCarrierPrivilegeStatusFromCarrierConfigRules(
+                profile.getCarrierPrivilegeStatusForUid(
+                        phone.getContext().getPackageManager(), uid), uid, phone);
     }
 
     @Override
@@ -6862,40 +6873,39 @@
         if (TextUtils.isEmpty(pkgName)) {
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
         }
-        Phone phone = getPhone(subId);
-        if (phone == null) {
-            loge("checkCarrierPrivilegesForPackage: Invalid subId");
-            return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
-        }
-        CarrierPrivilegesTracker cpt = phone.getCarrierPrivilegesTracker();
-        if (cpt == null) {
-            loge("checkCarrierPrivilegesForPackage: No CarrierPrivilegesTracker");
+
+        int phoneId = SubscriptionManager.getPhoneId(subId);
+        UiccPort port = UiccController.getInstance().getUiccPort(phoneId);
+        if (port == null) {
+            loge("checkCarrierPrivilegesForPackage: No UICC on subId " + subId);
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
         }
-        return cpt.getCarrierPrivilegeStatusForPackage(pkgName);
+        return getCarrierPrivilegeStatusFromCarrierConfigRules(
+            port.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName),
+            getPhone(phoneId), pkgName);
     }
 
     @Override
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
-        enforceReadPrivilegedPermission("checkCarrierPrivilegesForPackageAnyPhone");
-        if (TextUtils.isEmpty(pkgName)) {
+        // TODO(b/186774706): Remove @RequiresPermission from TelephonyManager API
+        if (TextUtils.isEmpty(pkgName))
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
-        }
         int result = TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
-        for (int phoneId = 0; phoneId < TelephonyManager.getDefault().getPhoneCount(); phoneId++) {
-            Phone phone = PhoneFactory.getPhone(phoneId);
-            if (phone == null) {
-                continue;
+        for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) {
+            UiccPort port = UiccController.getInstance().getUiccPort(i);
+            if (port == null) {
+              // No UICC in that slot.
+              continue;
             }
-            CarrierPrivilegesTracker cpt = phone.getCarrierPrivilegesTracker();
-            if (cpt == null) {
-                continue;
-            }
-            result = cpt.getCarrierPrivilegeStatusForPackage(pkgName);
+
+            result = getCarrierPrivilegeStatusFromCarrierConfigRules(
+                port.getCarrierPrivilegeStatus(mApp.getPackageManager(), pkgName),
+                getPhone(i), pkgName);
             if (result == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
                 break;
             }
         }
+
         return result;
     }
 
@@ -6917,22 +6927,43 @@
     @Override
     public List<String> getPackagesWithCarrierPrivileges(int phoneId) {
         enforceReadPrivilegedPermission("getPackagesWithCarrierPrivileges");
-        Phone phone = PhoneFactory.getPhone(phoneId);
-        if (phone == null) {
-            return Collections.emptyList();
+        PackageManager pm = mApp.getPackageManager();
+        List<String> privilegedPackages = new ArrayList<>();
+        List<PackageInfo> packages = null;
+        UiccPort port = UiccController.getInstance().getUiccPort(phoneId);
+        // has UICC in that slot.
+        if (port != null) {
+            if (port.hasCarrierPrivilegeRules()) {
+                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_SIGNING_CERTIFICATES,
+                            UserHandle.SYSTEM.getIdentifier());
+                }
+                for (int p = packages.size() - 1; p >= 0; p--) {
+                    PackageInfo pkgInfo = packages.get(p);
+                    if (pkgInfo != null && pkgInfo.packageName != null
+                            && getCarrierPrivilegeStatusFromCarrierConfigRules(
+                                    port.getCarrierPrivilegeStatus(pkgInfo),
+                                    getPhone(phoneId), pkgInfo.packageName)
+                            == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+                        privilegedPackages.add(pkgInfo.packageName);
+                    }
+                }
+            }
         }
-        CarrierPrivilegesTracker cpt = phone.getCarrierPrivilegesTracker();
-        if (cpt == null) {
-            return Collections.emptyList();
-        }
-        return new ArrayList<>(cpt.getPackagesWithCarrierPrivileges());
+        return privilegedPackages;
     }
 
     @Override
     public List<String> getPackagesWithCarrierPrivilegesForAllPhones() {
         enforceReadPrivilegedPermission("getPackagesWithCarrierPrivilegesForAllPhones");
-        Set<String> privilegedPackages = new ArraySet<>();
+
         final long identity = Binder.clearCallingIdentity();
+
+        List<String> privilegedPackages = new ArrayList<>();
         try {
             for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) {
                 privilegedPackages.addAll(getPackagesWithCarrierPrivileges(i));
@@ -6940,7 +6971,7 @@
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
-        return new ArrayList<>(privilegedPackages);
+        return privilegedPackages;
     }
 
     private String getIccId(int subId) {
@@ -8723,16 +8754,12 @@
 
     private boolean haveCarrierPrivilegeAccess(UiccPort port, String callingPackage) {
         UiccProfile profile = port.getUiccProfile();
-        if (profile == null) {
+        if (profile == null ||
+                profile.getCarrierPrivilegeStatus(mApp.getPackageManager(), callingPackage)
+                != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
             return false;
         }
-        Phone phone = PhoneFactory.getPhone(profile.getPhoneId());
-        if (phone == null) {
-            return false;
-        }
-        CarrierPrivilegesTracker cpt = phone.getCarrierPrivilegesTracker();
-        return cpt != null && cpt.getCarrierPrivilegeStatusForPackage(callingPackage)
-                == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+        return true;
     }
 
     @Override