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

Commit 4e94fc3b authored by Bobby Wang's avatar Bobby Wang Committed by Gerrit - the friendly Code Review server
Browse files

PhoneBook: Specify file path when reading EFs of PBR

Some cards, like UICC with USIM application, have the same file ID for
phonebook EFs (3GPP TS 31.102, 4.4.2). The path may get mapped to
unexpected EF resulting in incorrect behavior.

To avoid this, specify the EF Id and the path to uniquely identify
phonebook EFs when reading contacts.

CRs-Fixed: 786410

Change-Id: I7e877a2357e76995c4378a901750ef33377fcefb
parent b2c6b7c0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -384,7 +384,8 @@ public abstract class IccPhoneBookInterfaceManager {
            AtomicBoolean status = new AtomicBoolean(false);
            Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE, status);
            if (mAdnCache != null) {
                mAdnCache.requestLoadAllAdnLike(efid, mAdnCache.extensionEfForEf(efid), response);
                mAdnCache.requestLoadAllAdnLike(efid,
                        mAdnCache.extensionEfForEf(efid), null, response);
                waitForResult(status);
            } else {
                loge("Failure while trying to load from SIM due to uninitialised adncache");
+17 −6
Original line number Diff line number Diff line
@@ -230,6 +230,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
                    return;
                }
                mFh.loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG),
                        getPBPath(fileIds.get(USIM_EFEMAIL_TAG)),
                        obtainMessage(EVENT_EMAIL_LOAD_DONE, recNum));

                log("readEmailFileAndWait email efid is : " + fileIds.get(USIM_EFEMAIL_TAG));
@@ -242,7 +243,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
            } else {
                // Read all Email files per Record
                for (int efid: mPbrFile.mEmailFileIds.get(recNum)) {
                    mFh.loadEFLinearFixedPart(efid, getValidRecordNums(recNum),
                    mFh.loadEFLinearFixedPart(efid, getPBPath(efid), getValidRecordNums(recNum),
                        obtainMessage(EVENT_EMAIL_LOAD_DONE, recNum));

                    log("readEmailFileAndWait email efid is : " + efid + " recNum:" + recNum);
@@ -287,6 +288,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
                    return;
                }
                mFh.loadEFLinearFixedAll(fileIds.get(USIM_EFANR_TAG),
                        getPBPath(fileIds.get(USIM_EFANR_TAG)),
                        obtainMessage(EVENT_ANR_LOAD_DONE, recNum));
                log("readAnrFileAndWait anr efid is : " + fileIds.get(USIM_EFANR_TAG));
                try {
@@ -297,7 +299,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
            } else {
                // Read all Anr files for each Adn Record
                for (int efid: mPbrFile.mAnrFileIds.get(recNum)) {
                    mFh.loadEFLinearFixedPart(efid, getValidRecordNums(recNum),
                    mFh.loadEFLinearFixedPart(efid, getPBPath(efid), getValidRecordNums(recNum),
                        obtainMessage(EVENT_ANR_LOAD_DONE, recNum));
                    log("readAnrFileAndWait anr efid is : " + efid + " recNum:" + recNum);
                    try {
@@ -324,7 +326,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {

    private void readIapFileAndWait(int efid, int recNum) {
        log("pbrIndex is " + recNum + ",iap efid is : " + efid);
        mFh.loadEFLinearFixedPart(efid, getValidRecordNums(recNum),
        mFh.loadEFLinearFixedPart(efid, getPBPath(efid), getValidRecordNums(recNum),
                obtainMessage(EVENT_IAP_LOAD_DONE, recNum));
        try {
            mLock.wait();
@@ -361,7 +363,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
        }
        if (mSuccess) {
            synchronized (mLock) {
                mFh.getEFLinearRecordSize(efid,
                mFh.getEFLinearRecordSize(efid, getPBPath(efid),
                        obtainMessage(EVENT_EF_EMAIL_RECORD_SIZE_DONE, adnRecNum, efid, emails));
                try {
                    mLock.wait();
@@ -402,7 +404,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
            mSuccess = true;
        }
        synchronized (mLock) {
            mFh.getEFLinearRecordSize(efid,
            mFh.getEFLinearRecordSize(efid, getPBPath(efid),
                    obtainMessage(EVENT_EF_ANR_RECORD_SIZE_DONE, adnRecNum, efid, anrs));
            try {
                mLock.wait();
@@ -439,7 +441,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
        log("updateIapFile  efid=" + efid + ", recordNumber= " + recordNumber + ", adnRecNum="
                + adnRecNum);
        synchronized (mLock) {
            mFh.getEFLinearRecordSize(efid,
            mFh.getEFLinearRecordSize(efid, getPBPath(efid),
                    obtainMessage(EVENT_EF_IAP_RECORD_SIZE_DONE, adnRecNum, recordNumber, tag));
            try {
                mLock.wait();
@@ -734,6 +736,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
        }
        log("readAdnFileAndWait adn efid is : " + fileIds.get(USIM_EFADN_TAG));
        mAdnCache.requestLoadAllAdnLike(fileIds.get(USIM_EFADN_TAG), extEf,
                getPBPath(fileIds.get(USIM_EFADN_TAG)),
                obtainMessage(EVENT_USIM_ADN_LOAD_DONE, recNum));
        try {
            mLock.wait();
@@ -1073,6 +1076,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {

                mFh.updateEFLinearFixed(
                        efid,
                        getPBPath(efid),
                        recordNumber,
                        data,
                        null,
@@ -1135,6 +1139,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {

                mFh.updateEFLinearFixed(
                        efid,
                        getPBPath(efid),
                        recordNumber,
                        data,
                        null,
@@ -1245,6 +1250,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
                            + " with value= " + IccUtils.bytesToHexString(record_data));
                    mFh.updateEFLinearFixed(
                            efid,
                            getPBPath(efid),
                            recordIndex + 1,
                            record_data,
                            null,
@@ -1526,4 +1532,9 @@ public class UsimPhoneBookManager extends Handler implements IccConstants {
            return 0;
        }
    }

    public String getPBPath(int efid) {
        //Only support global PB
        return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -176,8 +176,8 @@ public class AdnRecord implements Parcelable {

    @Override
    public String toString() {
        return "ADN Record '" + mAlphaTag + "' '" + mNumber + " " + mEmails + " "
                + mAdditionalNumbers + "'";
        return "ADN Record 'Tag:" + mAlphaTag + "', Num:'" + mNumber + ", Emails:" +
            Arrays.toString(mEmails) + ", Anrs:" + Arrays.toString(mAdditionalNumbers) + "'";
    }

    public boolean isEmpty() {
+10 −8
Original line number Diff line number Diff line
@@ -278,7 +278,8 @@ public final class AdnRecordCache extends Handler implements IccConstants {
        }

        if (efid == EF_PBR) {
            updateEmailAndAnr(efid, oldAdn, newAdn, index, pin2, response);
            updateEmailAndAnr(efid, mUsimPhoneBookManager.getPBPath(efid),
                    oldAdn, newAdn, index, pin2, response);
        } else {
            mUserWriteResponse.put(efid, response);
            new AdnRecordLoader(mFh).updateEF(newAdn, efid, extensionEF,
@@ -293,7 +294,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
     * record
     */
    public void
    requestLoadAllAdnLike (int efid, int extensionEf, Message response) {
    requestLoadAllAdnLike (int efid, int extensionEf, String path, Message response) {
        ArrayList<Message> waiters;
        ArrayList<AdnRecord> result;

@@ -345,7 +346,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
            return;
        }

        new AdnRecordLoader(mFh).loadAllFromEF(efid, extensionEf,
        new AdnRecordLoader(mFh).loadAllFromEF(efid, extensionEf, path,
                obtainMessage(EVENT_LOAD_ALL_ADN_LIKE_DONE, efid, 0));
    }

@@ -421,8 +422,8 @@ public final class AdnRecordCache extends Handler implements IccConstants {

    }

    private void updateEmailAndAnr(int efid, AdnRecord oldAdn, AdnRecord newAdn, int index,
            String pin2, Message response) {
    private void updateEmailAndAnr(int efid, String path, AdnRecord oldAdn,
            AdnRecord newAdn, int index, String pin2, Message response) {
        int extensionEF;
        extensionEF = extensionEfForEf(newAdn.mEfid);
        boolean success = false;
@@ -437,7 +438,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
        if (success) {
            mUserWriteResponse.put(efid, response);
            new AdnRecordLoader(mFh).updateEF(newAdn, newAdn.mEfid, extensionEF,
                    newAdn.mRecordNumber, pin2,
                    path, newAdn.mRecordNumber, pin2,
                    obtainMessage(EVENT_UPDATE_ADN_DONE, efid, index, newAdn));
        } else {
            sendErrorResponse(response, "update anr failed");
@@ -576,7 +577,8 @@ public final class AdnRecordCache extends Handler implements IccConstants {
        }

        if (efid == EF_PBR) {
            updateEmailAndAnr(efid, oldAdnList.get(index - 1), newAdn, index, pin2, response);
            updateEmailAndAnr(efid, mUsimPhoneBookManager.getPBPath(efid),
                    oldAdnList.get(index - 1), newAdn, index, pin2, response);
        } else {
            mUserWriteResponse.put(efid, response);
            new AdnRecordLoader(mFh).updateEF(newAdn, efid, extensionEF, index, pin2,
+60 −17
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ public class AdnRecordLoader extends Handler {
    private IccFileHandler mFh;
    int mEf;
    int mExtensionEF;
    String mPath;
    int mPendingExtLoads;
    Message mUserResponse;
    String mPin2;
@@ -87,10 +88,12 @@ public class AdnRecordLoader extends Handler {
        mUserResponse = response;

        if (ef == IccConstants.EF_ADN) {
            mPath = getEFPath(ef);
            mFh.loadEFLinearFixed(
                        ef, getEFPath(ef), recordNumber,
                        obtainMessage(EVENT_ADN_LOAD_DONE));
        } else {
            mPath = null;
            mFh.loadEFLinearFixed(
                    ef, recordNumber,
                    obtainMessage(EVENT_ADN_LOAD_DONE));
@@ -104,10 +107,11 @@ public class AdnRecordLoader extends Handler {
     * or response.obj.exception is set
     */
    public void
    loadAllFromEF(int ef, int extensionEF,
    loadAllFromEF(int ef, int extensionEF, String path,
                Message response) {
        mEf = ef;
        mExtensionEF = extensionEF;
        mPath = path;
        mUserResponse = response;

        /* If we are loading from EF_ADN, specifically
@@ -115,9 +119,12 @@ public class AdnRecordLoader extends Handler {
         * the fileid is not unique.
         */
        if (ef == IccConstants.EF_ADN) {
            mPath = getEFPath(ef);
        }

        if (mPath != null) {
            mFh.loadEFLinearFixedAll(
                    ef, getEFPath(ef),
                        ef, mPath,
                        obtainMessage(EVENT_ADN_LOAD_ALL_DONE));
        } else {
            mFh.loadEFLinearFixedAll(
@@ -134,26 +141,50 @@ public class AdnRecordLoader extends Handler {
     * @param adn is set with alphaTag and phone number
     * @param ef EF fileid
     * @param extensionEF extension EF fileid
     * @param ef EF path
     * @param recordNumber 1-based record index
     * @param pin2 for CHV2 operations, must be null if pin2 is not needed
     * @param response will be sent to its handler when completed
     */
    public void
    updateEF(AdnRecord adn, int ef, int extensionEF, int recordNumber,
    updateEF(AdnRecord adn, int ef, int extensionEF, String path, int recordNumber,
            String pin2, Message response) {
        mEf = ef;
        mExtensionEF = extensionEF;
        mPath = path;
        mRecordNumber = recordNumber;
        mUserResponse = response;
        mPin2 = pin2;

        if (ef == IccConstants.EF_ADN) {
            mFh.getEFLinearRecordSize( ef, getEFPath(ef),
        if (path != null) {
            mFh.getEFLinearRecordSize(ef, path,
                    obtainMessage(EVENT_EF_LINEAR_RECORD_SIZE_DONE, adn));
        } else {
            mFh.getEFLinearRecordSize(ef,
                    obtainMessage(EVENT_EF_LINEAR_RECORD_SIZE_DONE, adn));
        }

    }

    /**
     * Write adn to a EF SIM record
     * It will get the record size of EF record and compose hex adn array
     * then write the hex array to EF record
     *
     * @param adn is set with alphaTag and phone number
     * @param ef EF fileid
     * @param extensionEF extension EF fileid
     * @param recordNumber 1-based record index
     * @param pin2 for CHV2 operations, must be null if pin2 is not needed
     * @param response will be sent to its handler when completed
     */
    public void
    updateEF(AdnRecord adn, int ef, int extensionEF, int recordNumber,
            String pin2, Message response) {
        String path = null;
        if (ef == IccConstants.EF_ADN) {
            path = getEFPath(ef);
        }
        updateEF(adn, ef, extensionEF, path, recordNumber, pin2, response);
    }

    //***** Overridden from Handler
@@ -194,8 +225,8 @@ public class AdnRecordLoader extends Handler {
                                ar.exception);
                    }

                    if (mEf == IccConstants.EF_ADN) {
                        mFh.updateEFLinearFixed(mEf, getEFPath(mEf), mRecordNumber,
                    if (mPath != null) {
                        mFh.updateEFLinearFixed(mEf, mPath, mRecordNumber,
                                data, mPin2, obtainMessage(EVENT_UPDATE_RECORD_DONE));
                    } else {
                        mFh.updateEFLinearFixed(mEf, mRecordNumber,
@@ -239,10 +270,16 @@ public class AdnRecordLoader extends Handler {

                        mPendingExtLoads = 1;

                        if (mPath != null) {
                            mFh.loadEFLinearFixed(
                                mExtensionEF, mPath, adn.mExtRecord,
                                obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
                        } else {
                            mFh.loadEFLinearFixed(
                                mExtensionEF, adn.mExtRecord,
                                obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
                        }
                    }
                break;

                case EVENT_EXT_RECORD_LOAD_DONE:
@@ -289,11 +326,17 @@ public class AdnRecordLoader extends Handler {

                            mPendingExtLoads++;

                            if (mPath != null) {
                                mFh.loadEFLinearFixed(
                                    mExtensionEF, mPath, adn.mExtRecord,
                                    obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
                            } else {
                                mFh.loadEFLinearFixed(
                                    mExtensionEF, adn.mExtRecord,
                                    obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn));
                            }
                        }
                    }
                break;
            }
        } catch (RuntimeException exc) {
Loading