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

Commit 21601215 authored by fionaxu's avatar fionaxu Committed by android-build-merger
Browse files

rename CarrierIdentifier to CarrierResolver

am: 45a7e67b

Change-Id: I5d047e5a999277de6ccbe89cc52092b5835cd7b7
parents 7c7181b3 45a7e67b
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 {