Loading src/java/com/android/internal/telephony/CarrierIdentifier.java→src/java/com/android/internal/telephony/CarrierResolver.java +62 −28 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.net.Uri; import android.os.Handler; import android.os.Message; import android.provider.Telephony; import android.service.carrier.CarrierIdentifier; import android.telephony.Rlog; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; Loading @@ -46,13 +47,13 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * CarrierIdentifier identifies the subscription carrier and returns a canonical carrier Id * and a user friendly carrier name. CarrierIdentifier reads subscription info and check against * CarrierResolver identifies the subscription carrier and returns a canonical carrier Id * and a user friendly carrier name. CarrierResolver reads subscription info and check against * all carrier matching rules stored in CarrierIdProvider. It is msim aware, each phone has a * dedicated CarrierIdentifier. * dedicated CarrierResolver. */ public class CarrierIdentifier extends Handler { private static final String LOG_TAG = CarrierIdentifier.class.getSimpleName(); public class CarrierResolver extends Handler { private static final String LOG_TAG = CarrierResolver.class.getSimpleName(); private static final boolean DBG = true; private static final boolean VDBG = Rlog.isLoggable(LOG_TAG, Log.VERBOSE); Loading Loading @@ -126,8 +127,8 @@ public class CarrierIdentifier extends Handler { } } public CarrierIdentifier(Phone phone) { logd("Creating CarrierIdentifier[" + phone.getPhoneId() + "]"); public CarrierResolver(Phone phone) { logd("Creating CarrierResolver[" + phone.getPhoneId() + "]"); mContext = phone.getContext(); mPhone = phone; mTelephonyMgr = TelephonyManager.from(mContext); Loading Loading @@ -182,7 +183,7 @@ public class CarrierIdentifier extends Handler { if (!equals(mPreferApn, preferApn, true)) { logd("[updatePreferApn] from:" + mPreferApn + " to:" + preferApn); mPreferApn = preferApn; matchCarrier(); matchCarrier(getSubscriptionMatchingRule(), true); } break; case ICC_CHANGED_EVENT: Loading Loading @@ -231,7 +232,7 @@ public class CarrierIdentifier extends Handler { while (cursor.moveToNext()) { mCarrierMatchingRulesOnMccMnc.add(makeCarrierMatchingRule(cursor)); } matchCarrier(); matchCarrier(getSubscriptionMatchingRule(), true); } } finally { if (cursor != null) { Loading Loading @@ -386,7 +387,7 @@ public class CarrierIdentifier extends Handler { public void match(CarrierMatchingRule subscriptionRule) { mScore = 0; if (mMccMnc != null) { if (!CarrierIdentifier.equals(subscriptionRule.mMccMnc, mMccMnc, false)) { if (!CarrierResolver.equals(subscriptionRule.mMccMnc, mMccMnc, false)) { mScore = SCORE_INVALID; return; } Loading @@ -409,7 +410,7 @@ public class CarrierIdentifier extends Handler { if (mGid1 != null) { // full string match. carrier matching should cover the corner case that gid1 // with garbage tail due to SIM manufacture issues. if (!CarrierIdentifier.equals(subscriptionRule.mGid1, mGid1, true)) { if (!CarrierResolver.equals(subscriptionRule.mGid1, mGid1, true)) { mScore = SCORE_INVALID; return; } Loading @@ -418,21 +419,21 @@ public class CarrierIdentifier extends Handler { if (mGid2 != null) { // full string match. carrier matching should cover the corner case that gid2 // with garbage tail due to SIM manufacture issues. if (!CarrierIdentifier.equals(subscriptionRule.mGid2, mGid2, true)) { if (!CarrierResolver.equals(subscriptionRule.mGid2, mGid2, true)) { mScore = SCORE_INVALID; return; } mScore += SCORE_GID2; } if (mPlmn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mPlmn, mPlmn, true)) { if (!CarrierResolver.equals(subscriptionRule.mPlmn, mPlmn, true)) { mScore = SCORE_INVALID; return; } mScore += SCORE_PLMN; } if (mSpn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mSpn, mSpn, true)) { if (!CarrierResolver.equals(subscriptionRule.mSpn, mSpn, true)) { mScore = SCORE_INVALID; return; } Loading @@ -449,7 +450,7 @@ public class CarrierIdentifier extends Handler { } if (mApn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mApn, mApn, true)) { if (!CarrierResolver.equals(subscriptionRule.mApn, mApn, true)) { mScore = SCORE_INVALID; return; } Loading Loading @@ -496,15 +497,7 @@ public class CarrierIdentifier extends Handler { } } /** * find the best matching carrier from candidates with matched MCCMNC and notify * all interested parties on carrier id change. */ private void matchCarrier() { if (!SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { logd("[matchCarrier]" + "skip before sim records loaded"); return; } private CarrierMatchingRule getSubscriptionMatchingRule() { final String mccmnc = mTelephonyMgr.getSimOperatorNumericForPhone(mPhone.getPhoneId()); final String iccid = mPhone.getIccSerialNumber(); final String gid1 = mPhone.getGroupIdLevel1(); Loading @@ -525,12 +518,23 @@ public class CarrierIdentifier extends Handler { + " spn: " + spn + " apn: " + apn); } CarrierMatchingRule subscriptionRule = new CarrierMatchingRule( return new CarrierMatchingRule( mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, null /** fetching privilege access rule is handled by CarrierMatchingRule#match **/, TelephonyManager.UNKNOWN_CARRIER_ID, null); } /** * find the best matching carrier from candidates with matched MCCMNC. * @param update if true, update cached mCarrierId and notify registrants on carrier id change. * @return the best matching carrier id. */ private int matchCarrier(CarrierMatchingRule subscriptionRule, boolean update) { int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID; if (update && !SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { logd("[matchCarrier]" + "skip before sim records loaded"); return carrierId; } int maxScore = CarrierMatchingRule.SCORE_INVALID; CarrierMatchingRule maxRule = null; Loading @@ -539,9 +543,13 @@ public class CarrierIdentifier extends Handler { if (rule.mScore > maxScore) { maxScore = rule.mScore; maxRule = rule; carrierId = rule.mCid; } } // skip updating the cached carrierId if (!update) { return carrierId; } if (maxScore == CarrierMatchingRule.SCORE_INVALID) { logd("[matchCarrier - no match] cid: " + TelephonyManager.UNKNOWN_CARRIER_ID + " name: " + null); Loading Loading @@ -569,6 +577,7 @@ public class CarrierIdentifier extends Handler { TelephonyMetrics.getInstance().writeCarrierIdMatchingEvent( mPhone.getPhoneId(), getCarrierListVersion(), mCarrierId, unknownMccmncToLog, unknownGid1ToLog); return carrierId; } public int getCarrierListVersion() { Loading @@ -587,6 +596,31 @@ public class CarrierIdentifier extends Handler { return mCarrierName; } /** * a util function to convert carrierIdentifier to the best matching carrier id. * If there is no exact match for MVNO, will fallback to match its MNO. */ public int getCarrierIdFromIdentifier(CarrierIdentifier carrierIdentifier) { final String mccmnc = carrierIdentifier.getMcc() + carrierIdentifier.getMnc(); final String gid1 = carrierIdentifier.getGid1(); final String gid2 = carrierIdentifier.getGid2(); final String imsi = carrierIdentifier.getImsi(); final String spn = carrierIdentifier.getSpn(); if (VDBG) { logd("[matchCarrier]" + " mnnmnc:" + mccmnc + " gid1: " + gid1 + " gid2: " + gid2 + " imsi: " + Rlog.pii(LOG_TAG, imsi) + " spn: " + spn); } CarrierMatchingRule rule = new CarrierMatchingRule(mccmnc, imsi, null, gid1, gid2, null, spn, null, null, -1, null); // not trigger the updating logic for internal conversion. return matchCarrier(rule, false); } private static boolean equals(String a, String b, boolean ignoreCase) { if (a == null && b == null) return true; if (a != null && b != null) { Loading @@ -603,7 +637,7 @@ public class CarrierIdentifier extends Handler { } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); ipw.println("mCarrierIdLocalLogs:"); ipw.println("mCarrierResolverLocalLogs:"); ipw.increaseIndent(); mCarrierIdLocalLog.dump(fd, pw, args); ipw.decreaseIndent(); Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +5 −5 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ public class GsmCdmaPhone extends Phone { private ArrayList <MmiCode> mPendingMMIs = new ArrayList<MmiCode>(); private IccPhoneBookInterfaceManager mIccPhoneBookIntManager; // Used for identify the carrier of current subscription private CarrierIdentifier mCarrerIdentifier; private CarrierResolver mCarrerResolver; private int mPrecisePhoneType; Loading Loading @@ -226,7 +226,7 @@ public class GsmCdmaPhone extends Phone { mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); // DcTracker uses SST so needs to be created after it is instantiated mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); mCarrerIdentifier = mTelephonyComponentFactory.makeCarrierIdentifier(this); mCarrerResolver = mTelephonyComponentFactory.makeCarrierResolver(this); mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); mDeviceStateMonitor = mTelephonyComponentFactory.makeDeviceStateMonitor(this); Loading Loading @@ -1555,17 +1555,17 @@ public class GsmCdmaPhone extends Phone { @Override public int getCarrierId() { return mCarrerIdentifier.getCarrierId(); return mCarrerResolver.getCarrierId(); } @Override public String getCarrierName() { return mCarrerIdentifier.getCarrierName(); return mCarrerResolver.getCarrierName(); } @Override public int getCarrierIdListVersion() { return mCarrerIdentifier.getCarrierListVersion(); return mCarrerResolver.getCarrierListVersion(); } @Override Loading src/java/com/android/internal/telephony/TelephonyComponentFactory.java +2 −2 Original line number Diff line number Diff line Loading @@ -97,8 +97,8 @@ public class TelephonyComponentFactory { return new CarrierActionAgent(phone); } public CarrierIdentifier makeCarrierIdentifier(Phone phone) { return new CarrierIdentifier(phone); public CarrierResolver makeCarrierResolver(Phone phone) { return new CarrierResolver(phone); } public IccPhoneBookInterfaceManager makeIccPhoneBookInterfaceManager(Phone phone) { Loading tests/telephonytests/src/com/android/internal/telephony/CarrierIdentifierTest.java→tests/telephonytests/src/com/android/internal/telephony/CarrierResolverTest.java +62 −39 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.net.Uri; import android.os.HandlerThread; import android.provider.Telephony.CarrierId; import android.provider.Telephony.Carriers; import android.service.carrier.CarrierIdentifier; import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -38,7 +39,7 @@ import org.junit.Test; import java.util.Arrays; public class CarrierIdentifierTest extends TelephonyTest { public class CarrierResolverTest extends TelephonyTest { private static final String MCCMNC = "311480"; private static final String NAME = "VZW"; private static final int CID_VZW = 1; Loading @@ -63,41 +64,41 @@ public class CarrierIdentifierTest extends TelephonyTest { private static final int ICC_CHANGED_EVENT = 3; private static final int PREFER_APN_SET_EVENT = 5; private CarrierIdentifier mCarrierIdentifier; private CarrierIdentifierHandler mCarrierIdentifierHandler; private CarrierResolver mCarrierResolver; private CarrierResolverHandler mCarrierCarrierResolverHandler; private class CarrierIdentifierHandler extends HandlerThread { private CarrierIdentifierHandler(String name) { private class CarrierResolverHandler extends HandlerThread { private CarrierResolverHandler(String name) { super(name); } @Override public void onLooperPrepared() { mCarrierIdentifier = new CarrierIdentifier(mPhone); mCarrierResolver = new CarrierResolver(mPhone); setReady(true); } } @Before public void setUp() throws Exception { logd("CarrierIdentifierTest +Setup!"); logd("CarrierResolverTest +Setup!"); super.setUp(getClass().getSimpleName()); ((MockContentResolver) mContext.getContentResolver()).addProvider( CarrierId.AUTHORITY, new CarrierIdContentProvider()); // start handler thread mCarrierIdentifierHandler = new CarrierIdentifierHandler(getClass().getSimpleName()); mCarrierIdentifierHandler.start(); mCarrierCarrierResolverHandler = new CarrierResolverHandler(getClass().getSimpleName()); mCarrierCarrierResolverHandler.start(); waitUntilReady(); mCarrierIdentifier.sendEmptyMessage(ICC_CHANGED_EVENT); logd("CarrierIdentifierTest -Setup!"); mCarrierResolver.sendEmptyMessage(ICC_CHANGED_EVENT); logd("CarrierResolverTest -Setup!"); } @After public void tearDown() throws Exception { logd("CarrierIdentifier -tearDown"); mCarrierIdentifier.removeCallbacksAndMessages(null); mCarrierIdentifier = null; mCarrierIdentifierHandler.quit(); logd("CarrierResolver -tearDown"); mCarrierResolver.removeCallbacksAndMessages(null); mCarrierResolver = null; mCarrierCarrierResolverHandler.quit(); super.tearDown(); } Loading @@ -107,22 +108,22 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); doReturn(SPN_FI).when(mSimRecords).getServiceProviderName(); mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_FI, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_FI, mCarrierIdentifier.getCarrierName()); assertEquals(CID_FI, mCarrierResolver.getCarrierId()); assertEquals(NAME_FI, mCarrierResolver.getCarrierName()); doReturn(GID1).when(mPhone).getGroupIdLevel1(); mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_TMO, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_TMO, mCarrierIdentifier.getCarrierName()); assertEquals(CID_TMO, mCarrierResolver.getCarrierId()); assertEquals(NAME_TMO, mCarrierResolver.getCarrierName()); } @Test Loading @@ -131,15 +132,15 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); // trigger sim absent event mCarrierIdentifier.sendEmptyMessage(SIM_ABSENT_EVENT); mCarrierResolver.sendEmptyMessage(SIM_ABSENT_EVENT); waitForMs(200); assertEquals(CID_UNKNOWN, mCarrierIdentifier.getCarrierId()); assertNull(mCarrierIdentifier.getCarrierName()); assertEquals(CID_UNKNOWN, mCarrierResolver.getCarrierId()); assertNull(mCarrierResolver.getCarrierName()); } @Test Loading @@ -149,10 +150,32 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn("12345").when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_UNKNOWN, mCarrierIdentifier.getCarrierId()); assertNull(mCarrierIdentifier.getCarrierName()); assertEquals(CID_UNKNOWN, mCarrierResolver.getCarrierId()); assertNull(mCarrierResolver.getCarrierName()); } @Test @SmallTest public void testGetCarrierIdFromIdentifier() { // trigger sim loading event mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); CarrierIdentifier identifier = new CarrierIdentifier(null, null, null, null, null, null); int carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_UNKNOWN, carrierid); identifier = new CarrierIdentifier(MCCMNC.substring(0, 3), MCCMNC.substring(3), null, null, null, null); carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_VZW, carrierid); identifier = new CarrierIdentifier(MCCMNC.substring(0, 3), MCCMNC.substring(3), SPN_FI, null, null, null); carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_FI, carrierid); } @Test Loading @@ -161,17 +184,17 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); // mock apn ((MockContentResolver) mContext.getContentResolver()).addProvider( Carriers.CONTENT_URI.getAuthority(), new CarrierIdContentProvider()); mCarrierIdentifier.sendEmptyMessage(PREFER_APN_SET_EVENT); mCarrierResolver.sendEmptyMessage(PREFER_APN_SET_EVENT); waitForMs(200); assertEquals(CID_DOCOMO, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_DOCOMO, mCarrierIdentifier.getCarrierName()); assertEquals(CID_DOCOMO, mCarrierResolver.getCarrierId()); assertEquals(NAME_DOCOMO, mCarrierResolver.getCarrierName()); } private class CarrierIdContentProvider extends MockContentProvider { Loading Loading
src/java/com/android/internal/telephony/CarrierIdentifier.java→src/java/com/android/internal/telephony/CarrierResolver.java +62 −28 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.net.Uri; import android.os.Handler; import android.os.Message; import android.provider.Telephony; import android.service.carrier.CarrierIdentifier; import android.telephony.Rlog; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; Loading @@ -46,13 +47,13 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * CarrierIdentifier identifies the subscription carrier and returns a canonical carrier Id * and a user friendly carrier name. CarrierIdentifier reads subscription info and check against * CarrierResolver identifies the subscription carrier and returns a canonical carrier Id * and a user friendly carrier name. CarrierResolver reads subscription info and check against * all carrier matching rules stored in CarrierIdProvider. It is msim aware, each phone has a * dedicated CarrierIdentifier. * dedicated CarrierResolver. */ public class CarrierIdentifier extends Handler { private static final String LOG_TAG = CarrierIdentifier.class.getSimpleName(); public class CarrierResolver extends Handler { private static final String LOG_TAG = CarrierResolver.class.getSimpleName(); private static final boolean DBG = true; private static final boolean VDBG = Rlog.isLoggable(LOG_TAG, Log.VERBOSE); Loading Loading @@ -126,8 +127,8 @@ public class CarrierIdentifier extends Handler { } } public CarrierIdentifier(Phone phone) { logd("Creating CarrierIdentifier[" + phone.getPhoneId() + "]"); public CarrierResolver(Phone phone) { logd("Creating CarrierResolver[" + phone.getPhoneId() + "]"); mContext = phone.getContext(); mPhone = phone; mTelephonyMgr = TelephonyManager.from(mContext); Loading Loading @@ -182,7 +183,7 @@ public class CarrierIdentifier extends Handler { if (!equals(mPreferApn, preferApn, true)) { logd("[updatePreferApn] from:" + mPreferApn + " to:" + preferApn); mPreferApn = preferApn; matchCarrier(); matchCarrier(getSubscriptionMatchingRule(), true); } break; case ICC_CHANGED_EVENT: Loading Loading @@ -231,7 +232,7 @@ public class CarrierIdentifier extends Handler { while (cursor.moveToNext()) { mCarrierMatchingRulesOnMccMnc.add(makeCarrierMatchingRule(cursor)); } matchCarrier(); matchCarrier(getSubscriptionMatchingRule(), true); } } finally { if (cursor != null) { Loading Loading @@ -386,7 +387,7 @@ public class CarrierIdentifier extends Handler { public void match(CarrierMatchingRule subscriptionRule) { mScore = 0; if (mMccMnc != null) { if (!CarrierIdentifier.equals(subscriptionRule.mMccMnc, mMccMnc, false)) { if (!CarrierResolver.equals(subscriptionRule.mMccMnc, mMccMnc, false)) { mScore = SCORE_INVALID; return; } Loading @@ -409,7 +410,7 @@ public class CarrierIdentifier extends Handler { if (mGid1 != null) { // full string match. carrier matching should cover the corner case that gid1 // with garbage tail due to SIM manufacture issues. if (!CarrierIdentifier.equals(subscriptionRule.mGid1, mGid1, true)) { if (!CarrierResolver.equals(subscriptionRule.mGid1, mGid1, true)) { mScore = SCORE_INVALID; return; } Loading @@ -418,21 +419,21 @@ public class CarrierIdentifier extends Handler { if (mGid2 != null) { // full string match. carrier matching should cover the corner case that gid2 // with garbage tail due to SIM manufacture issues. if (!CarrierIdentifier.equals(subscriptionRule.mGid2, mGid2, true)) { if (!CarrierResolver.equals(subscriptionRule.mGid2, mGid2, true)) { mScore = SCORE_INVALID; return; } mScore += SCORE_GID2; } if (mPlmn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mPlmn, mPlmn, true)) { if (!CarrierResolver.equals(subscriptionRule.mPlmn, mPlmn, true)) { mScore = SCORE_INVALID; return; } mScore += SCORE_PLMN; } if (mSpn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mSpn, mSpn, true)) { if (!CarrierResolver.equals(subscriptionRule.mSpn, mSpn, true)) { mScore = SCORE_INVALID; return; } Loading @@ -449,7 +450,7 @@ public class CarrierIdentifier extends Handler { } if (mApn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mApn, mApn, true)) { if (!CarrierResolver.equals(subscriptionRule.mApn, mApn, true)) { mScore = SCORE_INVALID; return; } Loading Loading @@ -496,15 +497,7 @@ public class CarrierIdentifier extends Handler { } } /** * find the best matching carrier from candidates with matched MCCMNC and notify * all interested parties on carrier id change. */ private void matchCarrier() { if (!SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { logd("[matchCarrier]" + "skip before sim records loaded"); return; } private CarrierMatchingRule getSubscriptionMatchingRule() { final String mccmnc = mTelephonyMgr.getSimOperatorNumericForPhone(mPhone.getPhoneId()); final String iccid = mPhone.getIccSerialNumber(); final String gid1 = mPhone.getGroupIdLevel1(); Loading @@ -525,12 +518,23 @@ public class CarrierIdentifier extends Handler { + " spn: " + spn + " apn: " + apn); } CarrierMatchingRule subscriptionRule = new CarrierMatchingRule( return new CarrierMatchingRule( mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, null /** fetching privilege access rule is handled by CarrierMatchingRule#match **/, TelephonyManager.UNKNOWN_CARRIER_ID, null); } /** * find the best matching carrier from candidates with matched MCCMNC. * @param update if true, update cached mCarrierId and notify registrants on carrier id change. * @return the best matching carrier id. */ private int matchCarrier(CarrierMatchingRule subscriptionRule, boolean update) { int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID; if (update && !SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { logd("[matchCarrier]" + "skip before sim records loaded"); return carrierId; } int maxScore = CarrierMatchingRule.SCORE_INVALID; CarrierMatchingRule maxRule = null; Loading @@ -539,9 +543,13 @@ public class CarrierIdentifier extends Handler { if (rule.mScore > maxScore) { maxScore = rule.mScore; maxRule = rule; carrierId = rule.mCid; } } // skip updating the cached carrierId if (!update) { return carrierId; } if (maxScore == CarrierMatchingRule.SCORE_INVALID) { logd("[matchCarrier - no match] cid: " + TelephonyManager.UNKNOWN_CARRIER_ID + " name: " + null); Loading Loading @@ -569,6 +577,7 @@ public class CarrierIdentifier extends Handler { TelephonyMetrics.getInstance().writeCarrierIdMatchingEvent( mPhone.getPhoneId(), getCarrierListVersion(), mCarrierId, unknownMccmncToLog, unknownGid1ToLog); return carrierId; } public int getCarrierListVersion() { Loading @@ -587,6 +596,31 @@ public class CarrierIdentifier extends Handler { return mCarrierName; } /** * a util function to convert carrierIdentifier to the best matching carrier id. * If there is no exact match for MVNO, will fallback to match its MNO. */ public int getCarrierIdFromIdentifier(CarrierIdentifier carrierIdentifier) { final String mccmnc = carrierIdentifier.getMcc() + carrierIdentifier.getMnc(); final String gid1 = carrierIdentifier.getGid1(); final String gid2 = carrierIdentifier.getGid2(); final String imsi = carrierIdentifier.getImsi(); final String spn = carrierIdentifier.getSpn(); if (VDBG) { logd("[matchCarrier]" + " mnnmnc:" + mccmnc + " gid1: " + gid1 + " gid2: " + gid2 + " imsi: " + Rlog.pii(LOG_TAG, imsi) + " spn: " + spn); } CarrierMatchingRule rule = new CarrierMatchingRule(mccmnc, imsi, null, gid1, gid2, null, spn, null, null, -1, null); // not trigger the updating logic for internal conversion. return matchCarrier(rule, false); } private static boolean equals(String a, String b, boolean ignoreCase) { if (a == null && b == null) return true; if (a != null && b != null) { Loading @@ -603,7 +637,7 @@ public class CarrierIdentifier extends Handler { } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); ipw.println("mCarrierIdLocalLogs:"); ipw.println("mCarrierResolverLocalLogs:"); ipw.increaseIndent(); mCarrierIdLocalLog.dump(fd, pw, args); ipw.decreaseIndent(); Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +5 −5 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ public class GsmCdmaPhone extends Phone { private ArrayList <MmiCode> mPendingMMIs = new ArrayList<MmiCode>(); private IccPhoneBookInterfaceManager mIccPhoneBookIntManager; // Used for identify the carrier of current subscription private CarrierIdentifier mCarrerIdentifier; private CarrierResolver mCarrerResolver; private int mPrecisePhoneType; Loading Loading @@ -226,7 +226,7 @@ public class GsmCdmaPhone extends Phone { mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); // DcTracker uses SST so needs to be created after it is instantiated mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); mCarrerIdentifier = mTelephonyComponentFactory.makeCarrierIdentifier(this); mCarrerResolver = mTelephonyComponentFactory.makeCarrierResolver(this); mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); mDeviceStateMonitor = mTelephonyComponentFactory.makeDeviceStateMonitor(this); Loading Loading @@ -1555,17 +1555,17 @@ public class GsmCdmaPhone extends Phone { @Override public int getCarrierId() { return mCarrerIdentifier.getCarrierId(); return mCarrerResolver.getCarrierId(); } @Override public String getCarrierName() { return mCarrerIdentifier.getCarrierName(); return mCarrerResolver.getCarrierName(); } @Override public int getCarrierIdListVersion() { return mCarrerIdentifier.getCarrierListVersion(); return mCarrerResolver.getCarrierListVersion(); } @Override Loading
src/java/com/android/internal/telephony/TelephonyComponentFactory.java +2 −2 Original line number Diff line number Diff line Loading @@ -97,8 +97,8 @@ public class TelephonyComponentFactory { return new CarrierActionAgent(phone); } public CarrierIdentifier makeCarrierIdentifier(Phone phone) { return new CarrierIdentifier(phone); public CarrierResolver makeCarrierResolver(Phone phone) { return new CarrierResolver(phone); } public IccPhoneBookInterfaceManager makeIccPhoneBookInterfaceManager(Phone phone) { Loading
tests/telephonytests/src/com/android/internal/telephony/CarrierIdentifierTest.java→tests/telephonytests/src/com/android/internal/telephony/CarrierResolverTest.java +62 −39 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.net.Uri; import android.os.HandlerThread; import android.provider.Telephony.CarrierId; import android.provider.Telephony.Carriers; import android.service.carrier.CarrierIdentifier; import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -38,7 +39,7 @@ import org.junit.Test; import java.util.Arrays; public class CarrierIdentifierTest extends TelephonyTest { public class CarrierResolverTest extends TelephonyTest { private static final String MCCMNC = "311480"; private static final String NAME = "VZW"; private static final int CID_VZW = 1; Loading @@ -63,41 +64,41 @@ public class CarrierIdentifierTest extends TelephonyTest { private static final int ICC_CHANGED_EVENT = 3; private static final int PREFER_APN_SET_EVENT = 5; private CarrierIdentifier mCarrierIdentifier; private CarrierIdentifierHandler mCarrierIdentifierHandler; private CarrierResolver mCarrierResolver; private CarrierResolverHandler mCarrierCarrierResolverHandler; private class CarrierIdentifierHandler extends HandlerThread { private CarrierIdentifierHandler(String name) { private class CarrierResolverHandler extends HandlerThread { private CarrierResolverHandler(String name) { super(name); } @Override public void onLooperPrepared() { mCarrierIdentifier = new CarrierIdentifier(mPhone); mCarrierResolver = new CarrierResolver(mPhone); setReady(true); } } @Before public void setUp() throws Exception { logd("CarrierIdentifierTest +Setup!"); logd("CarrierResolverTest +Setup!"); super.setUp(getClass().getSimpleName()); ((MockContentResolver) mContext.getContentResolver()).addProvider( CarrierId.AUTHORITY, new CarrierIdContentProvider()); // start handler thread mCarrierIdentifierHandler = new CarrierIdentifierHandler(getClass().getSimpleName()); mCarrierIdentifierHandler.start(); mCarrierCarrierResolverHandler = new CarrierResolverHandler(getClass().getSimpleName()); mCarrierCarrierResolverHandler.start(); waitUntilReady(); mCarrierIdentifier.sendEmptyMessage(ICC_CHANGED_EVENT); logd("CarrierIdentifierTest -Setup!"); mCarrierResolver.sendEmptyMessage(ICC_CHANGED_EVENT); logd("CarrierResolverTest -Setup!"); } @After public void tearDown() throws Exception { logd("CarrierIdentifier -tearDown"); mCarrierIdentifier.removeCallbacksAndMessages(null); mCarrierIdentifier = null; mCarrierIdentifierHandler.quit(); logd("CarrierResolver -tearDown"); mCarrierResolver.removeCallbacksAndMessages(null); mCarrierResolver = null; mCarrierCarrierResolverHandler.quit(); super.tearDown(); } Loading @@ -107,22 +108,22 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); doReturn(SPN_FI).when(mSimRecords).getServiceProviderName(); mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_FI, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_FI, mCarrierIdentifier.getCarrierName()); assertEquals(CID_FI, mCarrierResolver.getCarrierId()); assertEquals(NAME_FI, mCarrierResolver.getCarrierName()); doReturn(GID1).when(mPhone).getGroupIdLevel1(); mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_TMO, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_TMO, mCarrierIdentifier.getCarrierName()); assertEquals(CID_TMO, mCarrierResolver.getCarrierId()); assertEquals(NAME_TMO, mCarrierResolver.getCarrierName()); } @Test Loading @@ -131,15 +132,15 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); // trigger sim absent event mCarrierIdentifier.sendEmptyMessage(SIM_ABSENT_EVENT); mCarrierResolver.sendEmptyMessage(SIM_ABSENT_EVENT); waitForMs(200); assertEquals(CID_UNKNOWN, mCarrierIdentifier.getCarrierId()); assertNull(mCarrierIdentifier.getCarrierName()); assertEquals(CID_UNKNOWN, mCarrierResolver.getCarrierId()); assertNull(mCarrierResolver.getCarrierName()); } @Test Loading @@ -149,10 +150,32 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn("12345").when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_UNKNOWN, mCarrierIdentifier.getCarrierId()); assertNull(mCarrierIdentifier.getCarrierName()); assertEquals(CID_UNKNOWN, mCarrierResolver.getCarrierId()); assertNull(mCarrierResolver.getCarrierName()); } @Test @SmallTest public void testGetCarrierIdFromIdentifier() { // trigger sim loading event mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); CarrierIdentifier identifier = new CarrierIdentifier(null, null, null, null, null, null); int carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_UNKNOWN, carrierid); identifier = new CarrierIdentifier(MCCMNC.substring(0, 3), MCCMNC.substring(3), null, null, null, null); carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_VZW, carrierid); identifier = new CarrierIdentifier(MCCMNC.substring(0, 3), MCCMNC.substring(3), SPN_FI, null, null, null); carrierid = mCarrierResolver.getCarrierIdFromIdentifier(identifier); assertEquals(CID_FI, carrierid); } @Test Loading @@ -161,17 +184,17 @@ public class CarrierIdentifierTest extends TelephonyTest { int phoneId = mPhone.getPhoneId(); doReturn(MCCMNC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(phoneId)); // trigger sim loading event mCarrierIdentifier.sendEmptyMessage(SIM_LOAD_EVENT); mCarrierResolver.sendEmptyMessage(SIM_LOAD_EVENT); waitForMs(200); assertEquals(CID_VZW, mCarrierIdentifier.getCarrierId()); assertEquals(NAME, mCarrierIdentifier.getCarrierName()); assertEquals(CID_VZW, mCarrierResolver.getCarrierId()); assertEquals(NAME, mCarrierResolver.getCarrierName()); // mock apn ((MockContentResolver) mContext.getContentResolver()).addProvider( Carriers.CONTENT_URI.getAuthority(), new CarrierIdContentProvider()); mCarrierIdentifier.sendEmptyMessage(PREFER_APN_SET_EVENT); mCarrierResolver.sendEmptyMessage(PREFER_APN_SET_EVENT); waitForMs(200); assertEquals(CID_DOCOMO, mCarrierIdentifier.getCarrierId()); assertEquals(NAME_DOCOMO, mCarrierIdentifier.getCarrierName()); assertEquals(CID_DOCOMO, mCarrierResolver.getCarrierId()); assertEquals(NAME_DOCOMO, mCarrierResolver.getCarrierName()); } private class CarrierIdContentProvider extends MockContentProvider { Loading