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
