FileDocCategorySizeDatePackage
IccPhoneBookInterfaceManager.javaAPI DocAndroid 5.1 API12084Thu Mar 12 22:22:54 GMT 2015com.android.internal.telephony

IccPhoneBookInterfaceManager

public abstract class IccPhoneBookInterfaceManager extends Object
SimPhoneBookInterfaceManager to provide an inter-process communication to access ADN-like SIM records.

Fields Summary
protected static final boolean
DBG
protected PhoneBase
mPhone
private com.android.internal.telephony.uicc.UiccCardApplication
mCurrentApp
protected com.android.internal.telephony.uicc.AdnRecordCache
mAdnCache
protected final Object
mLock
protected int[]
mRecordSize
protected boolean
mSuccess
private boolean
mIs3gCard
protected List
mRecords
protected static final boolean
ALLOW_SIM_OP_IN_UI_THREAD
protected static final int
EVENT_GET_SIZE_DONE
protected static final int
EVENT_LOAD_DONE
protected static final int
EVENT_UPDATE_DONE
protected android.os.Handler
mBaseHandler
Constructors Summary
public IccPhoneBookInterfaceManager(PhoneBase phone)


       
        this.mPhone = phone;
        IccRecords r = phone.mIccRecords.get();
        if (r != null) {
            mAdnCache = r.getAdnCache();
        }
    
Methods Summary
protected voidcheckThread()

        if (!ALLOW_SIM_OP_IN_UI_THREAD) {
            // Make sure this isn't the UI thread, since it will block
            if (mBaseHandler.getLooper().equals(Looper.myLooper())) {
                loge("query() called on the main UI thread!");
                throw new IllegalStateException(
                        "You cannot call query on this provder from the main UI thread.");
            }
        }
    
public voiddispose()

    
public java.util.ListgetAdnRecordsInEf(int efid)
Loads the AdnRecords in efid and returns them as a List of AdnRecords throws SecurityException if no READ_CONTACTS permission

param
efid the EF id of a ADN-like ICC
return
List of AdnRecord


        if (mPhone.getContext().checkCallingOrSelfPermission(
                android.Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException(
                    "Requires android.permission.READ_CONTACTS permission");
        }

        efid = updateEfForIccType(efid);
        if (DBG) logd("getAdnRecordsInEF: efid=" + efid);

        synchronized(mLock) {
            checkThread();
            AtomicBoolean status = new AtomicBoolean(false);
            Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE, status);
            if (mAdnCache != null) {
                mAdnCache.requestLoadAllAdnLike(efid, mAdnCache.extensionEfForEf(efid), response);
                waitForResult(status);
            } else {
                loge("Failure while trying to load from SIM due to uninitialised adncache");
            }
        }
        return mRecords;
    
public abstract int[]getAdnRecordsSize(int efid)
Get the capacity of records in efid

param
efid the EF id of a ADN-like ICC
return
int[3] array recordSizes[0] is the single record length recordSizes[1] is the total length of the EF file recordSizes[2] is the number of records in the EF file

protected abstract voidlogd(java.lang.String msg)

protected abstract voidloge(java.lang.String msg)

public booleanupdateAdnRecordsInEfByIndex(int efid, java.lang.String newTag, java.lang.String newPhoneNumber, int index, java.lang.String pin2)
Update an ADN-like EF record by record index This is useful for iteration the whole ADN file, such as write the whole phone book or erase/format the whole phonebook. Currently the email field if set in the ADN record is ignored. throws SecurityException if no WRITE_CONTACTS permission

param
efid must be one among EF_ADN, EF_FDN, and EF_SDN
param
newTag adn tag to be stored
param
newPhoneNumber adn number to be stored Set both newTag and newPhoneNubmer to "" means to replace the old record with empty one, aka, delete old record
param
index is 1-based adn record index to be updated
param
pin2 required to update EF_FDN, otherwise must be null
return
true for success


        if (mPhone.getContext().checkCallingOrSelfPermission(
                android.Manifest.permission.WRITE_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException(
                    "Requires android.permission.WRITE_CONTACTS permission");
        }

        if (DBG) logd("updateAdnRecordsInEfByIndex: efid=" + efid +
                " Index=" + index + " ==> " +
                "("+ newTag + "," + newPhoneNumber + ")"+ " pin2=" + pin2);
        synchronized(mLock) {
            checkThread();
            mSuccess = false;
            AtomicBoolean status = new AtomicBoolean(false);
            Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, status);
            AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber);
            if (mAdnCache != null) {
                mAdnCache.updateAdnByIndex(efid, newAdn, index, pin2, response);
                waitForResult(status);
            } else {
                loge("Failure while trying to update by index due to uninitialised adncache");
            }
        }
        return mSuccess;
    
public booleanupdateAdnRecordsInEfBySearch(int efid, java.lang.String oldTag, java.lang.String oldPhoneNumber, java.lang.String newTag, java.lang.String newPhoneNumber, java.lang.String pin2)
Replace oldAdn with newAdn in ADN-like record in EF getAdnRecordsInEf must be called at least once before this function, otherwise an error will be returned. Currently the email field if set in the ADN record is ignored. throws SecurityException if no WRITE_CONTACTS permission

param
efid must be one among EF_ADN, EF_FDN, and EF_SDN
param
oldTag adn tag to be replaced
param
oldPhoneNumber adn number to be replaced Set both oldTag and oldPhoneNubmer to "" means to replace an empty record, aka, insert new record
param
newTag adn tag to be stored
param
newPhoneNumber adn number ot be stored Set both newTag and newPhoneNubmer to "" means to replace the old record with empty one, aka, delete old record
param
pin2 required to update EF_FDN, otherwise must be null
return
true for success



        if (mPhone.getContext().checkCallingOrSelfPermission(
                android.Manifest.permission.WRITE_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException(
                    "Requires android.permission.WRITE_CONTACTS permission");
        }


        if (DBG) logd("updateAdnRecordsInEfBySearch: efid=" + efid +
                " ("+ oldTag + "," + oldPhoneNumber + ")"+ "==>" +
                " ("+ newTag + "," + newPhoneNumber + ")"+ " pin2=" + pin2);

        efid = updateEfForIccType(efid);

        synchronized(mLock) {
            checkThread();
            mSuccess = false;
            AtomicBoolean status = new AtomicBoolean(false);
            Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, status);
            AdnRecord oldAdn = new AdnRecord(oldTag, oldPhoneNumber);
            AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber);
            if (mAdnCache != null) {
                mAdnCache.updateAdnBySearch(efid, oldAdn, newAdn, pin2, response);
                waitForResult(status);
            } else {
                loge("Failure while trying to update by search due to uninitialised adncache");
            }
        }
        return mSuccess;
    
private intupdateEfForIccType(int efid)

        // Check if we are trying to read ADN records
        if (efid == IccConstants.EF_ADN) {
            if (mPhone.getCurrentUiccAppType() == AppType.APPTYPE_USIM) {
                return IccConstants.EF_PBR;
            }
        }
        return efid;
    
public voidupdateIccRecords(com.android.internal.telephony.uicc.IccRecords iccRecords)

        if (iccRecords != null) {
            mAdnCache = iccRecords.getAdnCache();
        } else {
            mAdnCache = null;
        }
    
protected voidwaitForResult(java.util.concurrent.atomic.AtomicBoolean status)

        while (!status.get()) {
            try {
                mLock.wait();
            } catch (InterruptedException e) {
                logd("interrupted while trying to update by search");
            }
        }