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

Commit 30e06b2c authored by Rakesh Pallerla's avatar Rakesh Pallerla Committed by Linux Build Service Account
Browse files

Add support for Local Phonebook.

Add support for adding and modifying the contacts to
phonebook in USIM_ADF directory i.e. local phonebook.

Change-Id: I03e5c585649571791512f5a5fedf5e412d1fcbaf
CRs-Fixed: 634412

Add Null Pointer check for PhoneBook query results.
Change-Id: Ifd26f5062e539dc0f22232a9c34852c643cd7cdf
parent bdadd2f5
Loading
Loading
Loading
Loading
+93 −31
Original line number Diff line number Diff line
@@ -36,13 +36,17 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    //***** Instance Variables
    final static String LOG_TAG = "AdnRecordCache";
    private IccFileHandler mFh;
    private UsimPhoneBookManager mUsimPhoneBookManager;
    private UsimPhoneBookManager mUsimPhoneBookManager, mUsimLocalPhoneBookManager,
        mUsimGlobalPhoneBookManager;

    private int mAdncountofIcc = 0;

    // Indexed by EF ID
    SparseArray<ArrayList<AdnRecord>> mAdnLikeFiles
    SparseArray<ArrayList<AdnRecord>> mGlobalAdnLikeFiles
        = new SparseArray<ArrayList<AdnRecord>>();
    SparseArray<ArrayList<AdnRecord>> mLocalAdnLikeFiles
        = new SparseArray<ArrayList<AdnRecord>>();
    SparseArray<ArrayList<AdnRecord>> mAdnLikeFiles = mGlobalAdnLikeFiles;

    // People waiting for ADN-like files to be loaded
    SparseArray<ArrayList<Message>> mAdnLikeWaiters
@@ -54,6 +58,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    //EXT file Used/free records.
    SparseArray<int[]> extRecList = new SparseArray<int[]>();

    private boolean mUseLocalPb = false;
    //***** Event Constants

    static final int EVENT_LOAD_ALL_ADN_LIKE_DONE = 1;
@@ -62,13 +67,21 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    // *****USIM TAG Constants
    private static final int USIM_EFANR_TAG   = 0xC4;
    private static final int USIM_EFEMAIL_TAG = 0xCA;
    //***** Constructor

    //Update ADN Return Codes
    private static final int UPDATE_ADN_SUCCESS = 0;
    private static final int UPDATE_ADN_EF_NOT_KNOWN = 1;
    private static final int UPDATE_ADN_NO_ADN_LIST = 2;
    private static final int UPDATE_ADN_NO_ADN_RECORD = 3;
    private static final int UPDATE_ADN_PENDING = 4;


    //***** Constructor
    AdnRecordCache(IccFileHandler fh) {
        mFh = fh;
        mUsimPhoneBookManager = new UsimPhoneBookManager(mFh, this);
        mUsimGlobalPhoneBookManager = new UsimPhoneBookManager(mFh, this);
        mUsimLocalPhoneBookManager = new UsimPhoneBookManager(mFh, this);
        mUsimPhoneBookManager = mUsimGlobalPhoneBookManager;
    }

    //***** Called from SIMRecords
@@ -77,8 +90,10 @@ public final class AdnRecordCache extends Handler implements IccConstants {
     * Called from SIMRecords.onRadioNotAvailable and SIMRecords.handleSimRefresh.
     */
    public void reset() {
        mAdnLikeFiles.clear();
        mUsimPhoneBookManager.reset();
        mGlobalAdnLikeFiles.clear();
        mLocalAdnLikeFiles.clear();
        mUsimGlobalPhoneBookManager.reset();
        mUsimLocalPhoneBookManager.reset();

        clearWaiters();
        clearUserWriters();
@@ -176,7 +191,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
            sendErrorResponse(response, "Have pending update for EF:" + efid);
            return;
        }

        useLocalPb(false);
        mUserWriteResponse.put(efid, response);

        new AdnRecordLoader(mFh).updateEF(adn, efid, extensionEF,
@@ -201,17 +216,43 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    public void updateAdnBySearch(int efid, AdnRecord oldAdn, AdnRecord newAdn,
            String pin2, Message response) {

        int extensionEF;
        extensionEF = extensionEfForEf(efid);
        int result;
        result = updateAdnBySearchOnEf(false, efid, oldAdn, newAdn, pin2, response);

        if (extensionEF < 0) {
        if (UPDATE_ADN_SUCCESS != result && efid == EF_PBR) {
            //Update failed on global PB, do update on local PB now.
            result = updateAdnBySearchOnEf(true, efid, oldAdn, newAdn, pin2, response);
        }

        switch(result) {
            case UPDATE_ADN_EF_NOT_KNOWN:
                sendErrorResponse(response, "EF is not known ADN-like EF:" + efid);
            return;
                break;
            case UPDATE_ADN_NO_ADN_LIST:
                sendErrorResponse(response, "Adn list not exist for EF:" + efid);
                break;
            case UPDATE_ADN_NO_ADN_RECORD:
                sendErrorResponse(response, "Adn record don't exist for " + oldAdn);
                break;
            case UPDATE_ADN_PENDING:
                sendErrorResponse(response, "Have pending update for EF:" + efid);
                break;
        }

    }

    private int updateAdnBySearchOnEf(boolean useLocalPb, int efid, AdnRecord oldAdn,
            AdnRecord newAdn, String pin2, Message response) {

        int extensionEF;
        extensionEF = extensionEfForEf(efid);

        if (extensionEF < 0) return UPDATE_ADN_EF_NOT_KNOWN;

        ArrayList<AdnRecord> oldAdnList = null;
        try {
            if (efid == EF_PBR) {
                useLocalPb(useLocalPb);
                oldAdnList = mUsimPhoneBookManager.loadEfFilesFromUsim();
            } else {
                oldAdnList = getRecordsIfLoaded(efid);
@@ -224,10 +265,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
            oldAdnList = null;
        }

        if (oldAdnList == null) {
            sendErrorResponse(response, "Adn list not exist for EF:" + efid);
            return;
        }
        if (oldAdnList == null) return UPDATE_ADN_NO_ADN_LIST;

        int index = -1;
        int count = 1;
@@ -267,14 +305,11 @@ public final class AdnRecordCache extends Handler implements IccConstants {
            count++;
        }

        Log.d("AdnRecordCache", "updateAdnBySearch, update oldADN:" + oldAdn.toString() +
                ", newAdn:" + newAdn.toString() + ",index :" + index);

        if (index == -1) {
            sendErrorResponse(response, "Adn record don't exist for " + oldAdn);
            return;
        }
        if (index == -1) return UPDATE_ADN_NO_ADN_RECORD;

        Log.d("AdnRecordCache",
                "update oldADN:" + oldAdn.toString() + ", newAdn:" + newAdn.toString() + ",index :"
                        + index);
        if (efid == EF_PBR) {
            AdnRecord foundAdn = oldAdnList.get(index-1);
            newAdn.mEfid = foundAdn.mEfid;
@@ -290,10 +325,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {

        Message pendingResponse = mUserWriteResponse.get(efid);

        if (pendingResponse != null) {
            sendErrorResponse(response, "Have pending update for EF:" + efid);
            return;
        }
        if (pendingResponse != null) return UPDATE_ADN_PENDING;

        if (efid == EF_PBR) {
            updateEmailAndAnr(efid, mUsimPhoneBookManager.getPBPath(),
@@ -304,6 +336,21 @@ public final class AdnRecordCache extends Handler implements IccConstants {
                    index, pin2,
                    obtainMessage(EVENT_UPDATE_ADN_DONE, efid, index, newAdn));
        }

        return UPDATE_ADN_SUCCESS;
    }

    private void useLocalPb(boolean useLocalPb) {
        if (mUseLocalPb == useLocalPb) {
            //Same state, IGNORE!!!
            return;
        }
        Log.d("AdnRecordCache","Using " + (useLocalPb ? "Local" : "Global") + " Phonebook");
        mUseLocalPb = useLocalPb;
        mFh.useLocalPb(useLocalPb);
        mAdnLikeFiles = useLocalPb ? mLocalAdnLikeFiles : mGlobalAdnLikeFiles;
        mUsimPhoneBookManager =
                useLocalPb ? mUsimLocalPhoneBookManager : mUsimGlobalPhoneBookManager;
    }


@@ -317,7 +364,16 @@ public final class AdnRecordCache extends Handler implements IccConstants {
        ArrayList<AdnRecord> result;

        if (efid == EF_PBR) {
            ArrayList<AdnRecord> combinedResult = new ArrayList<AdnRecord>();
            //First Load from gloabl and then load from local PhoneBook.
            useLocalPb(false);
            result = mUsimPhoneBookManager.loadEfFilesFromUsim();
            if (null != result) combinedResult.addAll(result);
            useLocalPb(true);
            result = mUsimPhoneBookManager.loadEfFilesFromUsim();
            if (null != result) combinedResult.addAll(result);

            if (!combinedResult.isEmpty()) result = combinedResult;
        } else {
            result = getRecordsIfLoaded(efid);
        }
@@ -565,6 +621,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
            sendErrorResponse(response, "EF is not known ADN-like EF:" + efid);
            return;
        }
        useLocalPb(false);

        ArrayList<AdnRecord> oldAdnList = null;
        try {
@@ -613,18 +670,22 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    }

    public int getAnrCount() {
        return mUsimPhoneBookManager.getAnrCount();
        return mUsimGlobalPhoneBookManager.getAnrCount() +
                mUsimLocalPhoneBookManager.getAnrCount();
    }

    public int getEmailCount() {
        return mUsimPhoneBookManager.getEmailCount();
        return mUsimGlobalPhoneBookManager.getEmailCount() +
                mUsimLocalPhoneBookManager.getEmailCount();
    }
    public int getSpareAnrCount() {
        return mUsimPhoneBookManager.getSpareAnrCount();
        return mUsimGlobalPhoneBookManager.getSpareAnrCount() +
                mUsimLocalPhoneBookManager.getSpareAnrCount();
    }

    public int getSpareEmailCount() {
        return mUsimPhoneBookManager.getSpareEmailCount();
        return mUsimGlobalPhoneBookManager.getSpareEmailCount() +
                mUsimLocalPhoneBookManager.getSpareEmailCount();
    }

    public int getAdnCount() {
@@ -636,6 +697,7 @@ public final class AdnRecordCache extends Handler implements IccConstants {
    }

    public int getUsimAdnCount() {
        return mUsimPhoneBookManager.getUsimAdnCount();
        return mUsimGlobalPhoneBookManager.getUsimAdnCount() +
                mUsimLocalPhoneBookManager.getUsimAdnCount();
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -52,8 +52,12 @@ public final class CsimFileHandler extends IccFileHandler implements IccConstant
            // The EFids in UICC phone book entries are decided by the card manufacturer.
            // So if we don't match any of the cases above and if its a UICC return
            // the global 3g phone book path.
            if (mUseLocalPb) {
                return MF_SIM + DF_ADF + DF_PHONEBOOK;
            } else {
                return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
            }
        }
        return path;
    }

+10 −2
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
    protected final CommandsInterface mCi;
    protected final UiccCardApplication mParentApp;
    protected final String mAid;
    protected boolean mUseLocalPb = false;

    static class LoadLinearFixedContext {

@@ -729,14 +730,21 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
        case EF_PL:
            return MF_SIM;
        case EF_PBR:
            // we only support global phonebook.
            if (mUseLocalPb) {
                return MF_SIM + DF_ADF + DF_PHONEBOOK;
            } else {
                return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
            }
        case EF_IMG:
            return MF_SIM + DF_TELECOM + DF_GRAPHICS;
        }
        return null;
    }

    public void useLocalPb (boolean useLocalPb) {
        logd("Using " + (useLocalPb ? "Local": "Global") + " Phonebook");
        mUseLocalPb = useLocalPb;
    }
    protected abstract String getEFPath(int efid);
    protected abstract void logd(String s);

+10 −3
Original line number Diff line number Diff line
@@ -65,16 +65,23 @@ public final class UsimFileHandler extends IccFileHandler implements IccConstant
            return MF_SIM + DF_ADF;

        case EF_PBR:
            // we only support global phonebook.
            if (mUseLocalPb) {
                return MF_SIM + DF_ADF + DF_PHONEBOOK;
            } else {
                return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
            }
        }
        String path = getCommonIccEFPath(efid);
        if (path == null) {
            // The EFids in USIM phone book entries are decided by the card manufacturer.
            // So if we don't match any of the cases above and if its a USIM return
            // the phone book path.
            if (mUseLocalPb) {
                return MF_SIM + DF_ADF + DF_PHONEBOOK;
            } else {
                return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
            }
        }
        return path;
    }