Methods Summary |
---|
public void | dispose()Call when the IccRecords object is no longer going to be used.
mDestroyed.set(true);
mParentApp = null;
mFh = null;
mCi = null;
mContext = null;
|
public void | dump(java.io.FileDescriptor fd, java.io.PrintWriter pw, java.lang.String[] args)
pw.println("IccRecords: " + this);
pw.println(" mDestroyed=" + mDestroyed);
pw.println(" mCi=" + mCi);
pw.println(" mFh=" + mFh);
pw.println(" mParentApp=" + mParentApp);
pw.println(" recordsLoadedRegistrants: size=" + mRecordsLoadedRegistrants.size());
for (int i = 0; i < mRecordsLoadedRegistrants.size(); i++) {
pw.println(" recordsLoadedRegistrants[" + i + "]="
+ ((Registrant)mRecordsLoadedRegistrants.get(i)).getHandler());
}
pw.println(" mImsiReadyRegistrants: size=" + mImsiReadyRegistrants.size());
for (int i = 0; i < mImsiReadyRegistrants.size(); i++) {
pw.println(" mImsiReadyRegistrants[" + i + "]="
+ ((Registrant)mImsiReadyRegistrants.get(i)).getHandler());
}
pw.println(" mRecordsEventsRegistrants: size=" + mRecordsEventsRegistrants.size());
for (int i = 0; i < mRecordsEventsRegistrants.size(); i++) {
pw.println(" mRecordsEventsRegistrants[" + i + "]="
+ ((Registrant)mRecordsEventsRegistrants.get(i)).getHandler());
}
pw.println(" mNewSmsRegistrants: size=" + mNewSmsRegistrants.size());
for (int i = 0; i < mNewSmsRegistrants.size(); i++) {
pw.println(" mNewSmsRegistrants[" + i + "]="
+ ((Registrant)mNewSmsRegistrants.get(i)).getHandler());
}
pw.println(" mNetworkSelectionModeAutomaticRegistrants: size="
+ mNetworkSelectionModeAutomaticRegistrants.size());
for (int i = 0; i < mNetworkSelectionModeAutomaticRegistrants.size(); i++) {
pw.println(" mNetworkSelectionModeAutomaticRegistrants[" + i + "]="
+ ((Registrant)mNetworkSelectionModeAutomaticRegistrants.get(i)).getHandler());
}
pw.println(" mRecordsRequested=" + mRecordsRequested);
pw.println(" mRecordsToLoad=" + mRecordsToLoad);
pw.println(" mRdnCache=" + mAdnCache);
pw.println(" iccid=" + mIccId);
pw.println(" mMsisdn=" + mMsisdn);
pw.println(" mMsisdnTag=" + mMsisdnTag);
pw.println(" mVoiceMailNum=" + mVoiceMailNum);
pw.println(" mVoiceMailTag=" + mVoiceMailTag);
pw.println(" mNewVoiceMailNum=" + mNewVoiceMailNum);
pw.println(" mNewVoiceMailTag=" + mNewVoiceMailTag);
pw.println(" mIsVoiceMailFixed=" + mIsVoiceMailFixed);
pw.println(" mImsi=" + mImsi);
pw.println(" mMncLength=" + mMncLength);
pw.println(" mMailboxIndex=" + mMailboxIndex);
pw.println(" mSpn=" + mSpn);
pw.flush();
|
public AdnRecordCache | getAdnCache()
return mAdnCache;
|
public abstract int | getDisplayRule(java.lang.String plmn)Returns the SpnDisplayRule based on settings on the SIM and the
specified plmn (currently-registered PLMN). See TS 22.101 Annex A
and TS 51.011 10.3.11 for details.
If the SPN is not found on the SIM, the rule is always PLMN_ONLY.
Generally used for GSM/UMTS and the like SIMs.
|
public java.lang.String | getGid1()Get the Group Identifier Level 1 (GID1) on a SIM for GSM.
return null;
|
public java.lang.String | getIMSI()Get the International Mobile Subscriber ID (IMSI) on a SIM
for GSM, UMTS and like networks. Default is null if IMSI is
not supported or unavailable.
return null;
|
public java.lang.String | getIccId()
return mIccId;
|
public java.lang.String | getIccSimChallengeResponse(int authContext, java.lang.String data)Returns the response of the SIM application on the UICC to authentication
challenge/response algorithm. The data string and challenge response are
Base64 encoded Strings.
Can support EAP-SIM, EAP-AKA with results encoded per 3GPP TS 31.102.
if (DBG) log("getIccSimChallengeResponse:");
try {
synchronized(mLock) {
CommandsInterface ci = mCi;
UiccCardApplication parentApp = mParentApp;
if (ci != null && parentApp != null) {
ci.requestIccSimAuthentication(authContext, data,
parentApp.getAid(),
obtainMessage(EVENT_AKA_AUTHENTICATE_DONE));
try {
mLock.wait();
} catch (InterruptedException e) {
loge("getIccSimChallengeResponse: Fail, interrupted"
+ " while trying to request Icc Sim Auth");
return null;
}
} else {
loge( "getIccSimChallengeResponse: "
+ "Fail, ci or parentApp is null");
return null;
}
}
} catch(Exception e) {
loge( "getIccSimChallengeResponse: "
+ "Fail while trying to request Icc Sim Auth");
return null;
}
if (DBG) log("getIccSimChallengeResponse: return auth_rsp");
return android.util.Base64.encodeToString(auth_rsp.payload, android.util.Base64.NO_WRAP);
|
public IsimRecords | getIsimRecords()Return an interface to retrieve the ISIM records for IMS, if available.
return null;
|
public java.lang.String | getMsisdnAlphaTag()
return mMsisdnTag;
|
public java.lang.String | getMsisdnNumber()
return mMsisdn;
|
public java.lang.String | getNAI()Get the Network Access ID (NAI) on a CSIM for CDMA like networks. Default is null if IMSI is
not supported or unavailable.
return null;
|
public java.lang.String | getOperatorNumeric()Returns the 5 or 6 digit MCC/MNC of the operator that
provided the SIM card. Returns null of SIM is not yet ready
or is not valid for the type of IccCard. Generally used for
GSM/UMTS and the like SIMS
return null;
|
public boolean | getRecordsLoaded()
if (mRecordsToLoad == 0 && mRecordsRequested == true) {
return true;
} else {
return false;
}
|
public java.lang.String | getServiceProviderName()Return Service Provider Name stored in SIM (EF_SPN=0x6F46) or in RUIM (EF_RUIM_SPN=0x6F41).
String providerName = mSpn;
// Check for null pointers, mParentApp can be null after dispose,
// which did occur after removing a SIM.
UiccCardApplication parentApp = mParentApp;
if (parentApp != null) {
UiccCard card = parentApp.getUiccCard();
if (card != null) {
String brandOverride = card.getOperatorBrandOverride();
if (brandOverride != null) {
log("getServiceProviderName: override");
providerName = brandOverride;
} else {
log("getServiceProviderName: no brandOverride");
}
} else {
log("getServiceProviderName: card is null");
}
} else {
log("getServiceProviderName: mParentApp is null");
}
log("getServiceProviderName: providerName=" + providerName);
return providerName;
|
public UsimServiceTable | getUsimServiceTable()
return null;
|
public boolean | getVoiceCallForwardingFlag()Get the current Voice call forwarding flag for GSM/UMTS and the like SIMs
return false;
|
public java.lang.String | getVoiceMailAlphaTag()
return mVoiceMailTag;
|
public java.lang.String | getVoiceMailNumber()
return mVoiceMailNum;
|
public abstract int | getVoiceMessageCount()Called by GsmPhone to update VoiceMail count
|
public void | handleMessage(android.os.Message msg)
AsyncResult ar;
switch (msg.what) {
case EVENT_GET_ICC_RECORD_DONE:
try {
ar = (AsyncResult) msg.obj;
IccRecordLoaded recordLoaded = (IccRecordLoaded) ar.userObj;
if (DBG) log(recordLoaded.getEfName() + " LOADED");
if (ar.exception != null) {
loge("Record Load Exception: " + ar.exception);
} else {
recordLoaded.onRecordLoaded(ar);
}
}catch (RuntimeException exc) {
// I don't want these exceptions to be fatal
loge("Exception parsing SIM record: " + exc);
} finally {
// Count up record load responses even if they are fails
onRecordLoaded();
}
break;
case EVENT_AKA_AUTHENTICATE_DONE:
ar = (AsyncResult)msg.obj;
auth_rsp = null;
if (DBG) log("EVENT_AKA_AUTHENTICATE_DONE");
if (ar.exception != null) {
loge("Exception ICC SIM AKA: " + ar.exception);
} else {
try {
auth_rsp = (IccIoResult)ar.result;
if (DBG) log("ICC SIM AKA: auth_rsp = " + auth_rsp);
} catch (Exception e) {
loge("Failed to parse ICC SIM AKA contents: " + e);
}
}
synchronized (mLock) {
mLock.notifyAll();
}
break;
default:
super.handleMessage(msg);
}
|
public boolean | isCspPlmnEnabled()Return true if "Restriction of menu options for manual PLMN selection"
bit is set or EF_CSP data is unavailable, return false otherwise.
Generally used for GSM/UMTS and the like SIMs.
return false;
|
public boolean | isProvisioned()Indicates wether SIM is in provisioned state or not.
Overridden only if SIM can be dynamically provisioned via OTA.
return true;
|
protected abstract void | log(java.lang.String s)Write string to log file
|
protected abstract void | loge(java.lang.String s)Write error string to log file.
|
protected abstract void | onAllRecordsLoaded()
|
protected void | onIccRefreshInit()Called by subclasses (SimRecords and RuimRecords) whenever
IccRefreshResponse.REFRESH_RESULT_INIT event received
mAdnCache.reset();
UiccCardApplication parentApp = mParentApp;
if ((parentApp != null) &&
(parentApp.getState() == AppState.APPSTATE_READY)) {
// This will cause files to be reread
sendMessage(obtainMessage(EVENT_APP_READY));
}
|
public abstract void | onReady()
|
protected abstract void | onRecordLoaded()
|
public abstract void | onRefresh(boolean fileChanged, int[] fileList)Called by STK Service when REFRESH is received.
|
public void | registerForImsiReady(android.os.Handler h, int what, java.lang.Object obj)
if (mDestroyed.get()) {
return;
}
Registrant r = new Registrant(h, what, obj);
mImsiReadyRegistrants.add(r);
if (mImsi != null) {
r.notifyRegistrant(new AsyncResult(null, null, null));
}
|
public void | registerForNetworkSelectionModeAutomatic(android.os.Handler h, int what, java.lang.Object obj)
Registrant r = new Registrant (h, what, obj);
mNetworkSelectionModeAutomaticRegistrants.add(r);
|
public void | registerForNewSms(android.os.Handler h, int what, java.lang.Object obj)
Registrant r = new Registrant (h, what, obj);
mNewSmsRegistrants.add(r);
|
public void | registerForRecordsEvents(android.os.Handler h, int what, java.lang.Object obj)
Registrant r = new Registrant (h, what, obj);
mRecordsEventsRegistrants.add(r);
/* Notify registrant of all the possible events. This is to make sure registrant is
notified even if event occurred in the past. */
r.notifyResult(EVENT_MWI);
r.notifyResult(EVENT_CFI);
|
public void | registerForRecordsLoaded(android.os.Handler h, int what, java.lang.Object obj)
if (mDestroyed.get()) {
return;
}
Registrant r = new Registrant(h, what, obj);
mRecordsLoadedRegistrants.add(r);
if (mRecordsToLoad == 0 && mRecordsRequested == true) {
r.notifyRegistrant(new AsyncResult(null, null, null));
}
|
public void | setImsi(java.lang.String imsi)Imsi could be set by ServiceStateTrackers in case of cdma
mImsi = imsi;
mImsiReadyRegistrants.notifyRegistrants();
|
public void | setMsisdnNumber(java.lang.String alphaTag, java.lang.String number, android.os.Message onComplete)Set subscriber number to SIM record
The subscriber number is stored in EF_MSISDN (TS 51.011)
When the operation is complete, onComplete will be sent to its handler
mMsisdn = number;
mMsisdnTag = alphaTag;
if (DBG) log("Set MSISDN: " + mMsisdnTag +" " + mMsisdn);
AdnRecord adn = new AdnRecord(mMsisdnTag, mMsisdn);
new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null,
obtainMessage(EVENT_SET_MSISDN_DONE, onComplete));
|
protected void | setServiceProviderName(java.lang.String spn)
mSpn = spn;
|
protected void | setSystemProperty(java.lang.String key, java.lang.String val)
TelephonyManager.getDefault().setTelephonyProperty(mParentApp.getPhoneId(), key, val);
log("[key, value]=" + key + ", " + val);
|
public void | setVoiceCallForwardingFlag(int line, boolean enable, java.lang.String number)Set the voice call forwarding flag for GSM/UMTS and the like SIMs
|
public abstract void | setVoiceMailNumber(java.lang.String alphaTag, java.lang.String voiceNumber, android.os.Message onComplete)Set voice mail number to SIM record
The voice mail number can be stored either in EF_MBDN (TS 51.011) or
EF_MAILBOX_CPHS (CPHS 4.2)
If EF_MBDN is available, store the voice mail number to EF_MBDN
If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS
So the voice mail number will be stored in both EFs if both are available
Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail.
When the operation is complete, onComplete will be sent to its handler
|
public abstract void | setVoiceMessageWaiting(int line, int countWaiting)Sets the SIM voice message waiting indicator records
|
public java.lang.String | toString()
return "mDestroyed=" + mDestroyed
+ " mContext=" + mContext
+ " mCi=" + mCi
+ " mFh=" + mFh
+ " mParentApp=" + mParentApp
+ " recordsLoadedRegistrants=" + mRecordsLoadedRegistrants
+ " mImsiReadyRegistrants=" + mImsiReadyRegistrants
+ " mRecordsEventsRegistrants=" + mRecordsEventsRegistrants
+ " mNewSmsRegistrants=" + mNewSmsRegistrants
+ " mNetworkSelectionModeAutomaticRegistrants="
+ mNetworkSelectionModeAutomaticRegistrants
+ " recordsToLoad=" + mRecordsToLoad
+ " adnCache=" + mAdnCache
+ " recordsRequested=" + mRecordsRequested
+ " iccid=" + mIccId
+ " msisdnTag=" + mMsisdnTag
+ " voiceMailNum=" + mVoiceMailNum
+ " voiceMailTag=" + mVoiceMailTag
+ " newVoiceMailNum=" + mNewVoiceMailNum
+ " newVoiceMailTag=" + mNewVoiceMailTag
+ " isVoiceMailFixed=" + mIsVoiceMailFixed
+ " mImsi=" + mImsi
+ " mncLength=" + mMncLength
+ " mailboxIndex=" + mMailboxIndex
+ " spn=" + mSpn;
|
public void | unregisterForImsiReady(android.os.Handler h)
mImsiReadyRegistrants.remove(h);
|
public void | unregisterForNetworkSelectionModeAutomatic(android.os.Handler h)
mNetworkSelectionModeAutomaticRegistrants.remove(h);
|
public void | unregisterForNewSms(android.os.Handler h)
mNewSmsRegistrants.remove(h);
|
public void | unregisterForRecordsEvents(android.os.Handler h)
mRecordsEventsRegistrants.remove(h);
|
public void | unregisterForRecordsLoaded(android.os.Handler h)
mRecordsLoadedRegistrants.remove(h);
|