Merge "New API getSimPreciseCarrier id to support child-parent relationship"
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index b7d4f86..2eca2e5 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -26,6 +26,7 @@
import static android.provider.Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML;
import static android.provider.Telephony.Carriers.CARRIER_EDITED;
import static android.provider.Telephony.Carriers.CARRIER_ENABLED;
+import static android.provider.Telephony.Carriers.CARRIER_ID;
import static android.provider.Telephony.Carriers.CONTENT_URI;
import static android.provider.Telephony.Carriers.CURRENT;
import static android.provider.Telephony.Carriers.DEFAULT_SORT_ORDER;
@@ -46,8 +47,8 @@
import static android.provider.Telephony.Carriers.NO_SET_SET;
import static android.provider.Telephony.Carriers.NUMERIC;
import static android.provider.Telephony.Carriers.OWNED_BY;
-import static android.provider.Telephony.Carriers.OWNED_BY_OTHERS;
import static android.provider.Telephony.Carriers.OWNED_BY_DPC;
+import static android.provider.Telephony.Carriers.OWNED_BY_OTHERS;
import static android.provider.Telephony.Carriers.PASSWORD;
import static android.provider.Telephony.Carriers.PORT;
import static android.provider.Telephony.Carriers.PROFILE_ID;
@@ -132,8 +133,8 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.zip.CRC32;
import java.util.Set;
+import java.util.zip.CRC32;
public class TelephonyProvider extends ContentProvider
{
@@ -142,7 +143,7 @@
private static final boolean DBG = true;
private static final boolean VDBG = false; // STOPSHIP if true
- private static final int DATABASE_VERSION = 28 << 16;
+ private static final int DATABASE_VERSION = 29 << 16;
private static final int URL_UNKNOWN = 0;
private static final int URL_TELEPHONY = 1;
private static final int URL_CURRENT = 2;
@@ -166,7 +167,8 @@
private static final int URL_ENFORCE_MANAGED = 20;
private static final int URL_PREFERAPNSET = 21;
private static final int URL_PREFERAPNSET_USING_SUBID = 22;
-
+ private static final int URL_SIM_APN_LIST = 23;
+ private static final int URL_SIM_APN_LIST_ID = 24;
private static final String TAG = "TelephonyProvider";
private static final String CARRIERS_TABLE = "carriers";
@@ -265,6 +267,8 @@
CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(USER_EDITABLE, "1");
CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(OWNED_BY, String.valueOf(OWNED_BY_OTHERS));
CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(APN_SET_ID, String.valueOf(NO_SET_SET));
+ CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(CARRIER_ID,
+ String.valueOf(TelephonyManager.UNKNOWN_CARRIER_ID));
CARRIERS_UNIQUE_FIELDS.addAll(CARRIERS_UNIQUE_FIELDS_DEFAULTS.keySet());
@@ -285,6 +289,7 @@
NUMERIC + " TEXT DEFAULT ''," +
MCC + " TEXT DEFAULT ''," +
MNC + " TEXT DEFAULT ''," +
+ CARRIER_ID + " INTEGER DEFAULT " + TelephonyManager.UNKNOWN_CARRIER_ID + "," +
APN + " TEXT DEFAULT ''," +
USER + " TEXT DEFAULT ''," +
SERVER + " TEXT DEFAULT ''," +
@@ -305,8 +310,8 @@
NETWORK_TYPE_BITMASK + " INTEGER DEFAULT 0," +
MVNO_TYPE + " TEXT DEFAULT ''," +
MVNO_MATCH_DATA + " TEXT DEFAULT ''," +
- SUBSCRIPTION_ID + " INTEGER DEFAULT "
- + SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +
+ SUBSCRIPTION_ID + " INTEGER DEFAULT " +
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +
PROFILE_ID + " INTEGER DEFAULT 0," +
MODEM_COGNITIVE + " BOOLEAN DEFAULT 0," +
MAX_CONNS + " INTEGER DEFAULT 0," +
@@ -415,6 +420,8 @@
s_urlMatcher.addURI("telephony", "carriers/filtered/#", URL_FILTERED_ID);
// Only Called by DevicePolicyManager to enforce DPC records.
s_urlMatcher.addURI("telephony", "carriers/enforce_managed", URL_ENFORCE_MANAGED);
+ s_urlMatcher.addURI("telephony", "carriers/sim_apn_list", URL_SIM_APN_LIST);
+ s_urlMatcher.addURI("telephony", "carriers/sim_apn_list/#", URL_SIM_APN_LIST_ID);
s_currentNullMap = new ContentValues(1);
s_currentNullMap.put(CURRENT, "0");
@@ -1030,7 +1037,7 @@
if (oldVersion < (24 << 16 | 6)) {
Cursor c = null;
String[] proj = {"_id"};
- recreateDB(c, db, proj, /* version */24);
+ recreateDB(db, proj, /* version */24);
if (VDBG) {
c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null);
log("dbh.onUpgrade:- after upgrading total number of rows: " + c.getCount());
@@ -1121,11 +1128,27 @@
}
oldVersion = 28 << 16 | 6;
}
+
+ if (oldVersion < (29 << 16 | 6)) {
+ try {
+ // Add a new column Telephony.CARRIER_ID into the database and add UNIQUE
+ // constraint into table. However, sqlite cannot add constraints to an existing
+ // table, so recreate the table.
+ String[] proj = {"_id"};
+ recreateDB(db, proj, /* version */29);
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade skipping " + CARRIERS_TABLE + " upgrade. " +
+ "The table will get created in onOpen.");
+ }
+ }
+ oldVersion = 29 << 16 | 6;
+ }
if (DBG) {
log("dbh.onUpgrade:- db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
}
// when adding fields to onUpgrade, also add a unit test to TelephonyDatabaseHelperTest
- // and update the DATABASE_VERSION field
+ // and update the DATABASE_VERSION field and add a column in copyAllApnValues
}
private void recreateSimInfoDB(Cursor c, SQLiteDatabase db, String[] proj) {
@@ -1233,12 +1256,13 @@
}
}
- private void recreateDB(Cursor c, SQLiteDatabase db, String[] proj, int version) {
+ private void recreateDB(SQLiteDatabase db, String[] proj, int version) {
// Upgrade steps are:
// 1. Create a temp table- done in createCarriersTable()
// 2. copy over APNs from old table to new table - done in copyDataToTmpTable()
// 3. Drop the existing table.
// 4. Copy over the tmp table.
+ Cursor c;
if (VDBG) {
c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null);
log("dbh.onUpgrade:- before upgrading total number of rows: " + c.getCount());
@@ -1256,7 +1280,7 @@
createCarriersTable(db, CARRIERS_TABLE_TMP);
- copyDataToTmpTable(db, c);
+ copyDataToTmpTable(db, c, version);
c.close();
db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE);
@@ -1450,14 +1474,16 @@
db.delete(CARRIERS_TABLE, where, whereArgs);
}
- private void copyDataToTmpTable(SQLiteDatabase db, Cursor c) {
+ private void copyDataToTmpTable(SQLiteDatabase db, Cursor c, int version) {
// Move entries from CARRIERS_TABLE to CARRIERS_TABLE_TMP
if (c != null) {
while (c.moveToNext()) {
ContentValues cv = new ContentValues();
- copyApnValuesV17(cv, c);
- // Sync bearer bitmask and network type bitmask
- getNetworkTypeBitmaskFromCursor(cv, c);
+ copyAllApnValues(cv, c);
+ if (version == 24) {
+ // Sync bearer bitmask and network type bitmask
+ getNetworkTypeBitmaskFromCursor(cv, c);
+ }
try {
db.insertWithOnConflict(CARRIERS_TABLE_TMP, null, cv,
SQLiteDatabase.CONFLICT_ABORT);
@@ -1515,6 +1541,47 @@
getIntValueFromCursor(cv, c, USER_VISIBLE);
}
+ private void copyAllApnValues(ContentValues cv, Cursor c) {
+ // String vals
+ getStringValueFromCursor(cv, c, NAME);
+ getStringValueFromCursor(cv, c, NUMERIC);
+ getStringValueFromCursor(cv, c, MCC);
+ getStringValueFromCursor(cv, c, MNC);
+ getStringValueFromCursor(cv, c, APN);
+ getStringValueFromCursor(cv, c, USER);
+ getStringValueFromCursor(cv, c, SERVER);
+ getStringValueFromCursor(cv, c, PASSWORD);
+ getStringValueFromCursor(cv, c, PROXY);
+ getStringValueFromCursor(cv, c, PORT);
+ getStringValueFromCursor(cv, c, MMSPROXY);
+ getStringValueFromCursor(cv, c, MMSPORT);
+ getStringValueFromCursor(cv, c, MMSC);
+ getStringValueFromCursor(cv, c, TYPE);
+ getStringValueFromCursor(cv, c, PROTOCOL);
+ getStringValueFromCursor(cv, c, ROAMING_PROTOCOL);
+ getStringValueFromCursor(cv, c, MVNO_TYPE);
+ getStringValueFromCursor(cv, c, MVNO_MATCH_DATA);
+
+ // bool/int vals
+ getIntValueFromCursor(cv, c, AUTH_TYPE);
+ getIntValueFromCursor(cv, c, CURRENT);
+ getIntValueFromCursor(cv, c, CARRIER_ENABLED);
+ getIntValueFromCursor(cv, c, BEARER);
+ getIntValueFromCursor(cv, c, SUBSCRIPTION_ID);
+ getIntValueFromCursor(cv, c, PROFILE_ID);
+ getIntValueFromCursor(cv, c, MODEM_COGNITIVE);
+ getIntValueFromCursor(cv, c, MAX_CONNS);
+ getIntValueFromCursor(cv, c, WAIT_TIME);
+ getIntValueFromCursor(cv, c, MAX_CONNS_TIME);
+ getIntValueFromCursor(cv, c, MTU);
+ getIntValueFromCursor(cv, c, NETWORK_TYPE_BITMASK);
+ getIntValueFromCursor(cv, c, BEARER_BITMASK);
+ getIntValueFromCursor(cv, c, EDITED);
+ getIntValueFromCursor(cv, c, USER_VISIBLE);
+ getIntValueFromCursor(cv, c, USER_EDITABLE);
+ getIntValueFromCursor(cv, c, OWNED_BY);
+ getIntValueFromCursor(cv, c, APN_SET_ID);
+ }
private void copyPreservedApnsToNewTable(SQLiteDatabase db, Cursor c) {
// Move entries from CARRIERS_TABLE to CARRIERS_TABLE_TMP
@@ -2482,7 +2549,7 @@
public synchronized Cursor query(Uri url, String[] projectionIn, String selection,
String[] selectionArgs, String sort) {
if (VDBG) log("query: url=" + url + ", projectionIn=" + projectionIn + ", selection="
- + selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
+ + selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
TelephonyManager mTelephonyManager =
(TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
int subId = SubscriptionManager.getDefaultSubscriptionId();
@@ -2594,7 +2661,7 @@
}
//intentional fall through from above case
case URL_FILTERED: {
- if(isManagedApnEnforced()) {
+ if (isManagedApnEnforced()) {
// If enforced, return DPC records only.
constraints.add(IS_OWNED_BY_DPC);
} else {
@@ -2616,6 +2683,19 @@
qb.setTables(SIMINFO_TABLE);
break;
}
+ case URL_SIM_APN_LIST_ID: {
+ subIdString = url.getLastPathSegment();
+ try {
+ subId = Integer.parseInt(subIdString);
+ } catch (NumberFormatException e) {
+ loge("NumberFormatException" + e);
+ return null;
+ }
+ }
+ //intentional fall through from above case
+ case URL_SIM_APN_LIST: {
+ return getSubscriptionMatchingAPNList(qb, projectionIn, sort, subId);
+ }
default: {
return null;
@@ -2674,6 +2754,92 @@
return ret;
}
+ /**
+ * To find the current sim APN.
+ *
+ * There has three steps:
+ * 1. Query the APN based on carrier ID and fall back to query { MCC, MNC, MVNO }.
+ * 2. If can't find the current APN, then query the parent APN. Query based on
+ * MNO carrier id and { MCC, MNC }.
+ * 3. else return empty cursor
+ *
+ */
+ private Cursor getSubscriptionMatchingAPNList(SQLiteQueryBuilder qb, String[] projectionIn,
+ String sort, int subId) {
+
+ Cursor ret;
+ final TelephonyManager tm = ((TelephonyManager)
+ getContext().getSystemService(Context.TELEPHONY_SERVICE))
+ .createForSubscriptionId(subId);
+ SQLiteDatabase db = getReadableDatabase();
+
+ // For query db one time, append step 1 and step 2 condition in one selection and
+ // separate results after the query is completed. Because IMSI has special match rule,
+ // so just query the MCC / MNC and filter the MVNO by ourselves
+ String carrierIDSelection = CARRIER_ID + " =? OR " + NUMERIC + " =? OR "
+ + CARRIER_ID + " =? ";
+
+
+ String mccmnc = tm.getSimOperator();
+ String carrierId = String.valueOf(tm.getSimCarrierId());
+ String mnoCarrierId = String.valueOf(tm.getSimMNOCarrierId());
+
+ ret = qb.query(db, null, carrierIDSelection,
+ new String[]{carrierId, mccmnc, mnoCarrierId}, null, null, sort);
+
+ if (DBG) log("match current APN size: " + ret.getCount());
+
+ MatrixCursor currentCursor = new MatrixCursor(projectionIn);
+ MatrixCursor parentCursor = new MatrixCursor(projectionIn);
+
+ int carrierIdIndex = ret.getColumnIndex(CARRIER_ID);
+ int numericIndex = ret.getColumnIndex(NUMERIC);
+ int mvnoIndex = ret.getColumnIndex(MVNO_TYPE);
+ int mvnoDataIndex = ret.getColumnIndex(MVNO_MATCH_DATA);
+
+ IccRecords iccRecords = getIccRecords(subId);
+
+ //Separate the result into MatrixCursor
+ while (ret.moveToNext()) {
+ List<String> data = new ArrayList<>();
+ for (String column : projectionIn) {
+ data.add(ret.getString(ret.getColumnIndex(column)));
+ }
+
+ if (ret.getString(carrierIdIndex).equals(carrierId)) {
+ // 1. APN query result based on SIM carrier id
+ currentCursor.addRow(data);
+ } else if (!TextUtils.isEmpty(ret.getString(numericIndex)) &&
+ ApnSettingUtils.mvnoMatches(iccRecords,
+ ApnSetting.getMvnoTypeIntFromString(ret.getString(mvnoIndex)),
+ ret.getString(mvnoDataIndex))) {
+ // 1. APN query result based on legacy SIM MCC/MCC and MVNO in case APN carrier id
+ // migration is not 100%. some APNSettings can not find match id.
+ // TODO: remove legacy {mcc,mnc, mvno} support in the future.
+ currentCursor.addRow(data);
+ } else if (ret.getString(carrierIdIndex).equals(mnoCarrierId)) {
+ // 2. APN query result based on SIM MNO carrier id in case no APN found from
+ // exact carrier id fallback to query the MNO carrier id
+ parentCursor.addRow(data);
+ } else if (!TextUtils.isEmpty(ret.getString(numericIndex))) {
+ // 2. APN query result based on SIM MCC/MNC
+ // TODO: remove legacy {mcc, mnc} support in the future.
+ parentCursor.addRow(data);
+ }
+ }
+
+ if (currentCursor.getCount() > 0) {
+ if (DBG) log("match Carrier Id APN: " + currentCursor.getCount());
+ return currentCursor;
+ } else if (parentCursor.getCount() > 0) {
+ if (DBG) log("match MNO Carrier ID APN: " + parentCursor.getCount());
+ return parentCursor;
+ } else {
+ if (DBG) log("APN no match");
+ return new MatrixCursor(projectionIn);
+ }
+ }
+
@Override
public String getType(Uri url)
{
diff --git a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
index d6b989a..d72d2a4 100644
--- a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
@@ -18,31 +18,27 @@
import static android.provider.Telephony.Carriers;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyInt;
import android.content.Context;
import android.database.Cursor;
-import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
import android.support.test.InstrumentationRegistry;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.Log;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
@RunWith(JUnit4.class)
public final class TelephonyDatabaseHelperTest {
@@ -77,6 +73,20 @@
}
@Test
+ public void databaseHelperOnUpgrade_hasCarrierIdField() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasSubscriptionTypeField");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.DatabaseHelper.getVersion(mContext));
+
+ // the upgraded db must have the Telephony.Carriers.CARRIER_ID field
+ Cursor cursor = db.query("carriers", null, null, null, null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "carriers columns: " + Arrays.toString(upgradedColumns));
+ assertTrue(Arrays.asList(upgradedColumns).contains(Carriers.CARRIER_ID));
+ }
+
+ @Test
public void databaseHelperOnUpgrade_columnsMatchNewlyCreatedDb() {
Log.d(TAG, "databaseHelperOnUpgrade_columnsMatchNewlyCreatedDb");
// (5 << 16 | 6) is the first upgrade trigger in onUpgrade
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
index 715f3dd..cf4409a 100644
--- a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -40,7 +40,6 @@
import android.test.mock.MockContentResolver;
import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.SmallTest;
-import android.text.TextUtils;
import android.util.Log;
import junit.framework.TestCase;
@@ -80,6 +79,7 @@
private static final String TEST_OPERATOR = "123456";
private static final String TEST_MCC = "123";
private static final String TEST_MNC = "456";
+
// Used to test the path for URL_TELEPHONY_USING_SUBID with subid 1
private static final Uri CONTENT_URI_WITH_SUBID = Uri.parse(
"content://telephony/carriers/subId/" + TEST_SUBID);
@@ -92,6 +92,8 @@
"content://telephony/carriers/preferapn/subId/" + TEST_SUBID);
private static final Uri URL_WFC_ENABLED_USING_SUBID = Uri.parse(
"content://telephony/siminfo/" + TEST_SUBID);
+ private static final Uri URL_SIM_APN_LIST = Uri.parse(
+ "content://telephony/carriers/sim_apn_list");
private static final String COLUMN_APN_ID = "apn_id";
@@ -1439,4 +1441,167 @@
assertEquals(1, notifyWfcCount);
assertEquals(0, notifyWfcCountWithTestSubId);
}
+
+ @Test
+ @SmallTest
+ public void testGetCurrentAPNList_APNMatchTheCarrierID() {
+ // Test on getCurrentAPNList() step 1
+ TelephonyManager telephonyManager =
+ ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE));
+ doReturn(telephonyManager).when(telephonyManager).createForSubscriptionId(anyInt());
+
+ final String apnName = "apnName";
+ final String carrierName = "name";
+ final int carrierID = 100;
+ final String numeric = TEST_OPERATOR;
+ doReturn(carrierID).when(telephonyManager).getSimCarrierId();
+ doReturn(numeric).when(telephonyManager).getSimOperator();
+
+ // Insert the APN
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Carriers.APN, apnName);
+ contentValues.put(Carriers.NAME, carrierName);
+ contentValues.put(Carriers.CARRIER_ID, carrierID);
+ mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
+
+ final String[] testProjection =
+ {
+ Carriers.APN,
+ Carriers.NAME,
+ Carriers.CARRIER_ID,
+ };
+ Cursor cursor = mContentResolver.query(URL_SIM_APN_LIST,
+ testProjection, null, null, null);
+
+ cursor.moveToFirst();
+ assertEquals(apnName, cursor.getString(0));
+ assertEquals(carrierName, cursor.getString(1));
+ assertEquals(String.valueOf(carrierID), cursor.getString(2));
+ }
+
+ @Test
+ @SmallTest
+ public void testGetCurrentAPNList_APNMatchTheMCCMNCAndMVNO() {
+ // Test on getCurrentAPNList() step 2
+ TelephonyManager telephonyManager =
+ ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE));
+ doReturn(telephonyManager).when(telephonyManager).createForSubscriptionId(anyInt());
+
+ final String apnName = "apnName";
+ final String carrierName = "name";
+ final String numeric = TEST_OPERATOR;
+ final String mvnoType = "spn";
+ final String mvnoData = TelephonyProviderTestable.TEST_SPN;
+ final int carrierId = 100;
+ doReturn(carrierId).when(telephonyManager).getSimCarrierId();
+ doReturn(numeric).when(telephonyManager).getSimOperator();
+ //TelephonyProviderTestable had mock iccreord
+
+ // The DB only have the MCC/MNC and MVNO APN
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Carriers.APN, apnName);
+ contentValues.put(Carriers.NAME, carrierName);
+ contentValues.put(Carriers.NUMERIC, numeric);
+ contentValues.put(Carriers.MVNO_TYPE, mvnoType);
+ contentValues.put(Carriers.MVNO_MATCH_DATA, mvnoData);
+ mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
+
+ final String[] testProjection =
+ {
+ Carriers.APN,
+ Carriers.NAME,
+ Carriers.NUMERIC,
+ Carriers.MVNO_MATCH_DATA
+ };
+ Cursor cursor = mContentResolver.query(URL_SIM_APN_LIST,
+ testProjection, null, null, null);
+
+
+ cursor.moveToFirst();
+ assertEquals(apnName, cursor.getString(0));
+ assertEquals(carrierName, cursor.getString(1));
+ assertEquals(numeric, cursor.getString(2));
+ assertEquals(mvnoData, cursor.getString(3));
+ }
+
+ @Test
+ @SmallTest
+ public void testGetCurrentAPNList_APNMatchTheMNOCarrierID() {
+ // Test on getCurrentAPNList() step 3
+ TelephonyManager telephonyManager =
+ ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE));
+ doReturn(telephonyManager).when(telephonyManager).createForSubscriptionId(anyInt());
+
+ final String apnName = "apnName";
+ final String carrierName = "name";
+ final int carrierId = 100;
+ final int mnoCarrierId = 101;
+ final String numeric = TEST_OPERATOR;
+ doReturn(carrierId).when(telephonyManager).getSimCarrierId();
+ doReturn(mnoCarrierId).when(telephonyManager).getSimMNOCarrierId();
+ doReturn(numeric).when(telephonyManager).getSimOperator();
+
+ // The DB only have the MNO carrier id APN
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Carriers.APN, apnName);
+ contentValues.put(Carriers.NAME, carrierName);
+ contentValues.put(Carriers.CARRIER_ID, mnoCarrierId);
+ mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
+
+ final String[] testProjection =
+ {
+ Carriers.APN,
+ Carriers.NAME,
+ Carriers.CARRIER_ID,
+ };
+ Cursor cursor = mContentResolver.query(URL_SIM_APN_LIST,
+ testProjection, null, null, null);
+
+ cursor.moveToFirst();
+ assertEquals(apnName, cursor.getString(0));
+ assertEquals(carrierName, cursor.getString(1));
+ assertEquals(String.valueOf(mnoCarrierId), cursor.getString(2));
+ }
+
+ @Test
+ @SmallTest
+ public void testGetCurrentAPNList_APNMatchTheParentMCCMNC() {
+ // Test on getCurrentAPNList() step 4
+ TelephonyManager telephonyManager =
+ ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE));
+ doReturn(telephonyManager).when(telephonyManager).createForSubscriptionId(anyInt());
+
+ final String apnName = "apnName";
+ final String carrierName = "name";
+ final String numeric = TEST_OPERATOR;
+ final String mvnoData = TelephonyProviderTestable.TEST_SPN;
+ final int carrierId = 100;
+ final int mnoCarrierId = 101;
+
+ doReturn(carrierId).when(telephonyManager).getSimCarrierId();
+ doReturn(numeric).when(telephonyManager).getSimOperator();
+ doReturn(mvnoData).when(telephonyManager).getSimOperatorName();
+ doReturn(mnoCarrierId).when(telephonyManager).getSimMNOCarrierId();
+
+ // The DB only have the MNO APN
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Carriers.APN, apnName);
+ contentValues.put(Carriers.NAME, carrierName);
+ contentValues.put(Carriers.NUMERIC, numeric);
+ mContentResolver.insert(Carriers.CONTENT_URI, contentValues);
+
+ final String[] testProjection =
+ {
+ Carriers.APN,
+ Carriers.NAME,
+ Carriers.NUMERIC,
+ };
+ Cursor cursor = mContentResolver.query(URL_SIM_APN_LIST,
+ testProjection, null, null, null);
+
+ cursor.moveToFirst();
+ assertEquals(apnName, cursor.getString(0));
+ assertEquals(carrierName, cursor.getString(1));
+ assertEquals(numeric, cursor.getString(2));
+ }
}