Adjust APN filtering via SPN and PNN

* Support filtering MVNOs via 'pnn' stored on the SIM
* Handle cases with missing carrier ID

Issue: FP4-915
Issue: FP4-1186
Issue: FP4-1630
Change-Id: Ibf840c298c7b2baf38dfe25089f3ad34bbda7d13
Depends-On: Ic296a62fab2d76a3303f72cdfd5bda383739a374
(cherry picked from commit 543f1cc172c097100e8782a11609e5cafce3af5e)
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index aca1edb..7fe8042 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -140,6 +140,10 @@
 import java.util.zip.CheckedInputStream;
 import java.util.zip.CRC32;
 
+import com.android.internal.telephony.dataconnection.ApnSettingUtils;
+import com.android.internal.telephony.uicc.IccRecords;
+import com.android.internal.telephony.uicc.UiccController;
+
 public class TelephonyProvider extends ContentProvider
 {
     private static final String DATABASE_NAME = "telephony.db";
@@ -3186,8 +3190,13 @@
         // For query db one time, append all conditions in one selection and separate results after
         // the query is completed. IMSI has special match rule, so just query the MCC / MNC and
         // filter the MVNO by ourselves
-        qb.appendWhereStandalone(NUMERIC + " = '" + mccmnc + "' OR " +
+        if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
+            qb.appendWhereStandalone(NUMERIC + " = '" + mccmnc + "' OR " +
                 CARRIER_ID + " = '" + carrierId + "'");
+        }
+        else {
+            qb.appendWhereStandalone(NUMERIC + " = '" + mccmnc + "'");
+        }
 
         ret = qb.query(db, null, selection, selectionArgs, null, null, sort);
         if (ret == null) {
@@ -3197,6 +3206,13 @@
 
         if (DBG) log("match current APN size:  " + ret.getCount());
 
+        IccRecords iccRecords = UiccController.getInstance().getIccRecords(
+                SubscriptionManager.getPhoneId(subId), UiccController.APP_FAM_3GPP);
+        if (iccRecords == null) {
+            loge("iccRecords is null");
+            return null;
+        }
+
         String[] columnNames = projectionIn != null ? projectionIn : ret.getColumnNames();
         MatrixCursor currentCursor = new MatrixCursor(columnNames);
         MatrixCursor parentCursor = new MatrixCursor(columnNames);
@@ -3215,9 +3231,8 @@
             }
 
             boolean isMVNOAPN = !TextUtils.isEmpty(ret.getString(numericIndex))
-                    && tm.matchesCurrentSimOperator(ret.getString(numericIndex),
-                            getMvnoTypeIntFromString(ret.getString(mvnoIndex)),
-                            ret.getString(mvnoDataIndex));
+                    && ApnSettingUtils.mvnoMatches(iccRecords,
+                            ret.getString(mvnoIndex), ret.getString(mvnoDataIndex), subId);
             boolean isMNOAPN = !TextUtils.isEmpty(ret.getString(numericIndex))
                     && ret.getString(numericIndex).equals(mccmnc)
                     && TextUtils.isEmpty(ret.getString(mvnoIndex));
@@ -4087,6 +4102,9 @@
                         + " AND " + IS_NOT_OWNED_BY_DPC;
             }
         }
+
+        where = NUMERIC + "='" + simOperator + "'"
+                + " AND " + IS_NOT_OWNED_BY_DPC;
         return where;
     }