IccPhoneBookInterfaceManagerpublic 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 void | checkThread()
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 void | dispose()
| public java.util.List | getAdnRecordsInEf(int efid)Loads the AdnRecords in efid and returns them as a
List of AdnRecords
throws SecurityException if no READ_CONTACTS permission
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
| protected abstract void | logd(java.lang.String msg)
| protected abstract void | loge(java.lang.String msg)
| public boolean | updateAdnRecordsInEfByIndex(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
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 boolean | updateAdnRecordsInEfBySearch(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
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 int | updateEfForIccType(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 void | updateIccRecords(com.android.internal.telephony.uicc.IccRecords iccRecords)
if (iccRecords != null) {
mAdnCache = iccRecords.getAdnCache();
} else {
mAdnCache = null;
}
| protected void | waitForResult(java.util.concurrent.atomic.AtomicBoolean status)
while (!status.get()) {
try {
mLock.wait();
} catch (InterruptedException e) {
logd("interrupted while trying to update by search");
}
}
|
|