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

Commit ceadaa5d authored by Amit Mahajan's avatar Amit Mahajan Committed by Gerrit Code Review
Browse files

Merge "Read ICCID before broadcasting intent for network locked SIM."

parents 227e2a1e d767b44c
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