Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45a7e67b authored by fionaxu's avatar fionaxu Committed by chen xu
Browse files

rename CarrierIdentifier to CarrierResolver

1. rename CarrierIdentifier to CarrierResolver
2. util function to convert CarrierIdentifier to carrierid

Bug: 69807697
Change-Id: Icd7bf0878cffd8a48be77dc7fa0cbebe7c4dbbb1
Merged-in: Icd7bf0878cffd8a48be77dc7fa0cbebe7c4dbbb1
parent 82aee5a3
Loading
Loading
Loading
Loading
+62 −28
Original line number Diff line number Diff line
@@ -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;
@@ -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);

@@ -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);
@@ -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:
@@ -231,7 +232,7 @@ public class CarrierIdentifier extends Handler {
                    while (cursor.moveToNext()) {
                        mCarrierMatchingRulesOnMccMnc.add(makeCarrierMatchingRule(cursor));
                    }
                    matchCarrier();
                    matchCarrier(getSubscriptionMatchingRule(), true);
                }
            } finally {
                if (cursor != null) {
@@ -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;
                }
@@ -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;
                }
@@ -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;
                }
@@ -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;
                }
@@ -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();
@@ -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;

@@ -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);
@@ -569,6 +577,7 @@ public class CarrierIdentifier extends Handler {
        TelephonyMetrics.getInstance().writeCarrierIdMatchingEvent(
                mPhone.getPhoneId(), getCarrierListVersion(), mCarrierId,
                unknownMccmncToLog, unknownGid1ToLog);
        return carrierId;
    }

    public int getCarrierListVersion() {
@@ -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) {
@@ -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();
+5 −5
Original line number Diff line number Diff line
@@ -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;

@@ -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);
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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) {
+62 −39
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
    }

@@ -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
@@ -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
@@ -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
@@ -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 {