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

Commit d767b44c authored by Amit Mahajan's avatar Amit Mahajan
Browse files

Read ICCID before broadcasting intent for network locked SIM.

Test: Basic telephony sanity
Bug: 64131518
Change-Id: I4cf20e96c598c7709a63a55f0addab758768744a
parent 227e2a1e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -393,12 +393,12 @@ public class IccCardProxy extends Handler implements IccCard {
        }
        if (mUiccApplication != null) {
            mUiccApplication.registerForReady(this, EVENT_APP_READY, null);
            mUiccApplication.registerForNetworkLocked(this, EVENT_NETWORK_LOCKED, null);
        }
        if (mIccRecords != null) {
            mIccRecords.registerForImsiReady(this, EVENT_IMSI_READY, null);
            mIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
            mIccRecords.registerForLockedRecordsLoaded(this, EVENT_ICC_LOCKED, null);
            mIccRecords.registerForNetworkLockedRecordsLoaded(this, EVENT_NETWORK_LOCKED, null);
            mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
        }
    }
@@ -408,12 +408,12 @@ public class IccCardProxy extends Handler implements IccCard {
        if (mUiccCard != null) mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this);
        if (mUiccApplication != null) {
            mUiccApplication.unregisterForReady(this);
            mUiccApplication.unregisterForNetworkLocked(this);
        }
        if (mIccRecords != null) {
            mIccRecords.unregisterForImsiReady(this);
            mIccRecords.unregisterForRecordsLoaded(this);
            mIccRecords.unregisterForLockedRecordsLoaded(this);
            mIccRecords.unregisterForNetworkLockedRecordsLoaded(this);
            mIccRecords.unregisterForRecordsEvents(this);
        }
    }
+48 −7
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -56,6 +55,7 @@ public abstract class IccRecords extends Handler implements IccConstants {

    protected RegistrantList mRecordsLoadedRegistrants = new RegistrantList();
    protected RegistrantList mLockedRecordsLoadedRegistrants = new RegistrantList();
    protected RegistrantList mNetworkLockedRecordsLoadedRegistrants = new RegistrantList();
    protected RegistrantList mImsiReadyRegistrants = new RegistrantList();
    protected RegistrantList mRecordsEventsRegistrants = new RegistrantList();
    protected RegistrantList mNewSmsRegistrants = new RegistrantList();
@@ -68,9 +68,15 @@ public abstract class IccRecords extends Handler implements IccConstants {

    // ***** Cached SIM State; cleared on channel close

    // SIM is not locked
    protected static final int LOCKED_RECORDS_REQ_REASON_NONE = 0;
    // Records requested for PIN or PUK locked SIM
    protected static final int LOCKED_RECORDS_REQ_REASON_LOCKED = 0;
    // Records requested for network locked SIM
    protected static final int LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED = 0;

    protected boolean mRecordsRequested = false; // true if we've made requests for the sim records
    protected boolean mLockedRecordsRequested = false; // true if parent app is locked and we've
                                                       // made requests for the sim records
    protected int mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;

    protected String mIccId;  // Includes only decimals (no hex)
    protected String mFullIccId;  // Includes hex characters in ICCID
@@ -159,7 +165,7 @@ public abstract class IccRecords extends Handler implements IccConstants {
                + " recordsToLoad=" + mRecordsToLoad
                + " adnCache=" + mAdnCache
                + " recordsRequested=" + mRecordsRequested
                + " lockedRecordsRequested=" + mLockedRecordsRequested
                + " lockedRecordsReqReason=" + mLockedRecordsReqReason
                + " iccid=" + iccIdToPrint
                + " msisdnTag=" + mMsisdnTag
                + " voiceMailNum=" + Rlog.pii(VDBG, mVoiceMailNum)
@@ -310,7 +316,7 @@ public abstract class IccRecords extends Handler implements IccConstants {
    }

    /**
     * Register to be notified when records are loaded for a locked SIM
     * Register to be notified when records are loaded for a PIN or PUK locked SIM
     */
    public void registerForLockedRecordsLoaded(Handler h, int what, Object obj) {
        if (mDestroyed.get()) {
@@ -332,6 +338,29 @@ public abstract class IccRecords extends Handler implements IccConstants {
        mLockedRecordsLoadedRegistrants.remove(h);
    }

    /**
     * Register to be notified when records are loaded for a network locked SIM
     */
    public void registerForNetworkLockedRecordsLoaded(Handler h, int what, Object obj) {
        if (mDestroyed.get()) {
            return;
        }

        Registrant r = new Registrant(h, what, obj);
        mNetworkLockedRecordsLoadedRegistrants.add(r);

        if (getNetworkLockedRecordsLoaded()) {
            r.notifyRegistrant(new AsyncResult(null, null, null));
        }
    }

    /**
     * Unregister corresponding to registerForLockedRecordsLoaded()
     */
    public void unregisterForNetworkLockedRecordsLoaded(Handler h) {
        mNetworkLockedRecordsLoadedRegistrants.remove(h);
    }

    public void registerForImsiReady(Handler h, int what, Object obj) {
        if (mDestroyed.get()) {
            return;
@@ -582,7 +611,13 @@ public abstract class IccRecords extends Handler implements IccConstants {
    }

    protected boolean getLockedRecordsLoaded() {
        return mRecordsToLoad == 0 && mLockedRecordsRequested;
        return mRecordsToLoad == 0
                && mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_LOCKED;
    }

    protected boolean getNetworkLockedRecordsLoaded() {
        return mRecordsToLoad == 0
                && mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED;
    }

    //***** Overridden from Handler
@@ -882,6 +917,12 @@ public abstract class IccRecords extends Handler implements IccConstants {
            pw.println("  mLockedRecordsLoadedRegistrants[" + i + "]="
                    + ((Registrant) mLockedRecordsLoadedRegistrants.get(i)).getHandler());
        }
        pw.println(" mNetworkLockedRecordsLoadedRegistrants: size="
                + mNetworkLockedRecordsLoadedRegistrants.size());
        for (int i = 0; i < mNetworkLockedRecordsLoadedRegistrants.size(); i++) {
            pw.println("  mLockedRecordsLoadedRegistrants[" + i + "]="
                    + ((Registrant) mNetworkLockedRecordsLoadedRegistrants.get(i)).getHandler());
        }
        pw.println(" mImsiReadyRegistrants: size=" + mImsiReadyRegistrants.size());
        for (int i = 0; i < mImsiReadyRegistrants.size(); i++) {
            pw.println("  mImsiReadyRegistrants[" + i + "]="
@@ -904,7 +945,7 @@ public abstract class IccRecords extends Handler implements IccConstants {
                    + ((Registrant)mNetworkSelectionModeAutomaticRegistrants.get(i)).getHandler());
        }
        pw.println(" mRecordsRequested=" + mRecordsRequested);
        pw.println(" mLockedRecordsRequested=" + mLockedRecordsRequested);
        pw.println(" mLockedRecordsReqReason=" + mLockedRecordsReqReason);
        pw.println(" mRecordsToLoad=" + mRecordsToLoad);
        pw.println(" mRdnCache=" + mAdnCache);

+12 −11
Original line number Diff line number Diff line
@@ -16,19 +16,12 @@

package com.android.internal.telephony.uicc;

import static com.android.internal.telephony.uicc.IccConstants.EF_DOMAIN;
import static com.android.internal.telephony.uicc.IccConstants.EF_IMPI;
import static com.android.internal.telephony.uicc.IccConstants.EF_IMPU;
import static com.android.internal.telephony.uicc.IccConstants.EF_IST;
import static com.android.internal.telephony.uicc.IccConstants.EF_PCSCF;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncResult;
import android.os.Message;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.text.TextUtils;

import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.gsm.SimTlv;
@@ -83,7 +76,7 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
        mRecordsRequested = false;  // No load request is made till SIM ready
        //todo: currently locked state for ISIM is not handled well and may cause app state to not
        //be broadcast
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;

        // recordsToLoad is set to 0 because no requests are made yet
        mRecordsToLoad = 0;
@@ -191,7 +184,7 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
        auth_rsp = null;

        mRecordsRequested = false;
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;
    }

    private class EfIsimImpiLoaded implements IccRecords.IccRecordLoaded {
@@ -289,7 +282,7 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {

        if (getRecordsLoaded()) {
            onAllRecordsLoaded();
        } else if (getLockedRecordsLoaded()) {
        } else if (getLockedRecordsLoaded() || getNetworkLockedRecordsLoaded()) {
            onLockedAllRecordsLoaded();
        } else if (mRecordsToLoad < 0) {
            loge("recordsToLoad <0, programmer error suspected");
@@ -299,7 +292,15 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {

    private void onLockedAllRecordsLoaded() {
        if (DBG) log("SIM locked; record load complete");
        if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_LOCKED) {
            mLockedRecordsLoadedRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
        } else if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED) {
            mNetworkLockedRecordsLoadedRegistrants.notifyRegistrants(
                    new AsyncResult(null, null, null));
        } else {
            loge("onLockedAllRecordsLoaded: unexpected mLockedRecordsReqReason "
                    + mLockedRecordsReqReason);
        }
    }

    @Override
+21 −7
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ public class RuimRecords extends IccRecords {
    private static final int EVENT_GET_SMS_DONE = 22;

    private static final int EVENT_APP_LOCKED = 32;
    private static final int EVENT_APP_NETWORK_LOCKED = 33;

    public RuimRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
        super(app, c, ci);
@@ -105,7 +106,7 @@ public class RuimRecords extends IccRecords {
        mAdnCache = new AdnRecordCache(mFh);

        mRecordsRequested = false;  // No load request is made till SIM ready
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;

        // recordsToLoad is set to 0 because no requests are made yet
        mRecordsToLoad = 0;
@@ -117,6 +118,7 @@ public class RuimRecords extends IccRecords {

        mParentApp.registerForReady(this, EVENT_APP_READY, null);
        mParentApp.registerForLocked(this, EVENT_APP_LOCKED, null);
        mParentApp.registerForNetworkLocked(this, EVENT_APP_NETWORK_LOCKED, null);
        if (DBG) log("RuimRecords X ctor this=" + this);
    }

@@ -125,6 +127,8 @@ public class RuimRecords extends IccRecords {
        if (DBG) log("Disposing RuimRecords " + this);
        //Unregister for all events
        mParentApp.unregisterForReady(this);
        mParentApp.unregisterForLocked(this);
        mParentApp.unregisterForNetworkLocked(this);
        resetRecords();
        super.dispose();
    }
@@ -152,7 +156,7 @@ public class RuimRecords extends IccRecords {
        // read requests made so far are not valid. This is set to
        // true only when fresh set of read requests are made.
        mRecordsRequested = false;
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;
    }

    public String getMdnNumber() {
@@ -605,7 +609,8 @@ public class RuimRecords extends IccRecords {
                break;

                case EVENT_APP_LOCKED:
                    onLocked();
                case EVENT_APP_NETWORK_LOCKED:
                    onLocked(msg.what);
                    break;

            case EVENT_GET_DEVICE_IDENTITY_DONE:
@@ -745,7 +750,7 @@ public class RuimRecords extends IccRecords {

        if (getRecordsLoaded()) {
            onAllRecordsLoaded();
        } else if (getLockedRecordsLoaded()) {
        } else if (getLockedRecordsLoaded() || getNetworkLockedRecordsLoaded()) {
            onLockedAllRecordsLoaded();
        } else if (mRecordsToLoad < 0) {
            loge("recordsToLoad <0, programmer error suspected");
@@ -754,7 +759,15 @@ public class RuimRecords extends IccRecords {
    }

    private void onLockedAllRecordsLoaded() {
        if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_LOCKED) {
            mLockedRecordsLoadedRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
        } else if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED) {
            mNetworkLockedRecordsLoadedRegistrants.notifyRegistrants(
                    new AsyncResult(null, null, null));
        } else {
            loge("onLockedAllRecordsLoaded: unexpected mLockedRecordsReqReason "
                    + mLockedRecordsReqReason);
        }
    }

    @Override
@@ -815,9 +828,10 @@ public class RuimRecords extends IccRecords {
        mCi.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
    }

    private void onLocked() {
    private void onLocked(int msg) {
        if (DBG) log("only fetch EF_ICCID in locked state");
        mLockedRecordsRequested = true;
        mLockedRecordsReqReason = msg == EVENT_APP_LOCKED ? LOCKED_RECORDS_REQ_REASON_LOCKED :
                LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED;

        mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE));
        mRecordsToLoad++;
+20 −7
Original line number Diff line number Diff line
@@ -174,6 +174,7 @@ public class SIMRecords extends IccRecords {
    private static final int SYSTEM_EVENT_BASE = 0x100;
    private static final int EVENT_CARRIER_CONFIG_CHANGED = 1 + SYSTEM_EVENT_BASE;
    private static final int EVENT_APP_LOCKED = 2 + SYSTEM_EVENT_BASE;
    private static final int EVENT_APP_NETWORK_LOCKED = 3 + SYSTEM_EVENT_BASE;


    // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.
@@ -211,7 +212,7 @@ public class SIMRecords extends IccRecords {
        mVmConfig = new VoiceMailConstants();

        mRecordsRequested = false;  // No load request is made till SIM ready
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;

        // recordsToLoad is set to 0 because no requests are made yet
        mRecordsToLoad = 0;
@@ -222,6 +223,7 @@ public class SIMRecords extends IccRecords {
        resetRecords();
        mParentApp.registerForReady(this, EVENT_APP_READY, null);
        mParentApp.registerForLocked(this, EVENT_APP_LOCKED, null);
        mParentApp.registerForNetworkLocked(this, EVENT_APP_NETWORK_LOCKED, null);
        if (DBG) log("SIMRecords X ctor this=" + this);

        IntentFilter intentfilter = new IntentFilter();
@@ -245,6 +247,7 @@ public class SIMRecords extends IccRecords {
        mCi.unSetOnSmsOnSim(this);
        mParentApp.unregisterForReady(this);
        mParentApp.unregisterForLocked(this);
        mParentApp.unregisterForNetworkLocked(this);
        mContext.unregisterReceiver(mReceiver);
        resetRecords();
        super.dispose();
@@ -289,7 +292,7 @@ public class SIMRecords extends IccRecords {
        // read requests made so far are not valid. This is set to
        // true only when fresh set of read requests are made.
        mRecordsRequested = false;
        mLockedRecordsRequested = false;
        mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;
    }

    //***** Public Methods
@@ -664,7 +667,8 @@ public class SIMRecords extends IccRecords {
                    break;

                case EVENT_APP_LOCKED:
                    onLocked();
                case EVENT_APP_NETWORK_LOCKED:
                    onLocked(msg.what);
                    break;

                /* IO events */
@@ -1519,7 +1523,7 @@ public class SIMRecords extends IccRecords {

        if (getRecordsLoaded()) {
            onAllRecordsLoaded();
        } else if (getLockedRecordsLoaded()) {
        } else if (getLockedRecordsLoaded() || getNetworkLockedRecordsLoaded()) {
            onLockedAllRecordsLoaded();
        } else if (mRecordsToLoad < 0) {
            loge("recordsToLoad <0, programmer error suspected");
@@ -1554,7 +1558,15 @@ public class SIMRecords extends IccRecords {

    private void onLockedAllRecordsLoaded() {
        setSimLanguageFromEF();
        if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_LOCKED) {
            mLockedRecordsLoadedRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
        } else if (mLockedRecordsReqReason == LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED) {
            mNetworkLockedRecordsLoadedRegistrants.notifyRegistrants(
                    new AsyncResult(null, null, null));
        } else {
            loge("onLockedAllRecordsLoaded: unexpected mLockedRecordsReqReason "
                    + mLockedRecordsReqReason);
        }
    }

    @Override
@@ -1674,9 +1686,10 @@ public class SIMRecords extends IccRecords {
        fetchSimRecords();
    }

    private void onLocked() {
    private void onLocked(int msg) {
        if (DBG) log("only fetch EF_LI, EF_PL and EF_ICCID in locked state");
        mLockedRecordsRequested = true;
        mLockedRecordsReqReason = msg == EVENT_APP_LOCKED ? LOCKED_RECORDS_REQ_REASON_LOCKED :
                LOCKED_RECORDS_REQ_REASON_NETWORK_LOCKED;

        loadEfLiAndEfPl();

Loading