本文講解UICCCardApplication
/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
根據UiccCard 對象和IccCardStatus 的IccCardApplicationStatus[] 數組創建UiccCardApplication 對象,其構造方法:
public UiccCardApplication(UiccCard uiccCard, IccCardApplicationStatus as, Context c, CommandsInterface ci) { if (DBG) log("Creating UiccApp: " + as); mUiccCard = uiccCard; ....... mCi = ci; 根據app_type類型實例化IccFileHandler和IccRecords mIccFh = createIccFileHandler(as.app_type); mIccRecords = createIccRecords(as.app_type, mContext, mCi); if (mAppState == AppState.APPSTATE_READY) { queryFdn(); queryPin1State();//查詢PIN1碼狀態 } mCi.registerForNotAvailable(mHandler, EVENT_RADIO_UNAVAILABLE, null);//注冊消息EVENT_RADIO_UNAVAILABLE }
app_type 卡類型,定義在IccCardApplicationStatus 類中
public enum AppType{ APPTYPE_UNKNOWN, APPTYPE_SIM, //GSM卡 APPTYPE_USIM, //WCDMA卡 APPTYPE_RUIM, //CDMA卡 APPTYPE_CSIM, APPTYPE_ISIM }
app_state 卡狀態,定義在IccCardApplicationStatus 類中
public enum AppState{ APPSTATE_UNKNOWN, //卡不存在 APPSTATE_DETECTED, //卡已經檢測到 APPSTATE_PIN, //卡已經被PIN碼鎖定 APPSTATE_PUK, //卡已經被PUK碼鎖定 APPSTATE_SUBSCRIPTION_PERSO, //卡已經被網絡鎖定 APPSTATE_READY; //卡已經准備好了 }
PIN碼的狀態,定義在IccCardStatus 類中
public enum PinState { PINSTATE_UNKNOWN, //PIN碼狀態不確定 PINSTATE_ENABLED_NOT_VERIFIED, //PIN碼鎖定,用戶輸入的PIN碼錯誤,無法進入手機 PINSTATE_ENABLED_VERIFIED, //PIN碼鎖定,用戶輸入的PIN碼正確,進入手機 PINSTATE_DISABLED, //沒有進行PIN碼鎖定 PINSTATE_ENABLED_BLOCKED, //PIN碼解鎖失敗,提示輸入PUK碼 PINSTATE_ENABLED_PERM_BLOCKED; //PUK碼解鎖失敗后,永久鎖定 }
SIM卡狀態,定義在IccCardStatus 類中
public enum CardState { CARDSTATE_ABSENT, //表示掉卡 CARDSTATE_PRESENT, //表示卡正常
CARDSTATE_ERROR; //表示卡出現了錯誤 }
PersoSubState 描述卡被網絡鎖定的信息,對國內用戶來說意義不大;
createIccFileHandler() 方法根據app_type 創建不同的IccFileHandler 對象:
private IccFileHandler createIccFileHandler(AppType type) { switch (type) { case APPTYPE_SIM: return new SIMFileHandler(this, mAid, mCi); case APPTYPE_RUIM: return new RuimFileHandler(this, mAid, mCi); case APPTYPE_USIM: return new UsimFileHandler(this, mAid, mCi); case APPTYPE_CSIM: return new CsimFileHandler(this, mAid, mCi); case APPTYPE_ISIM: return new IsimFileHandler(this, mAid, mCi); default: return null; } }
createIccRecords() 方法根據app_type 創建不同的IccRecords 對象:
private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) { if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) { return new SIMRecords(this, c, ci); } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){ return new RuimRecords(this, c, ci); } else if (type == AppType.APPTYPE_ISIM) { return new IsimUiccRecords(this, c, ci); } else { // Unknown app type (maybe detection is still in progress) return null; } }
UICCApplication 類的更新方法update():
public void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) { if (DBG) log(mAppType + " update. New " + as); AppType oldAppType = mAppType; AppState oldAppState = mAppState; if (mAppType != oldAppType) { //app_type 更新 if (mIccFh != null) { mIccFh.dispose();} if (mIccRecords != null) { mIccRecords.dispose();} mIccFh = createIccFileHandler(as.app_type); mIccRecords = createIccRecords(as.app_type, c, ci); } if (mAppState != oldAppState) { //app_state 更新 if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState); // If the app state turns to APPSTATE_READY, then query FDN status, //as it might have failed in earlier attempt. if (mAppState == AppState.APPSTATE_READY) { //如果卡已經准備好 queryFdn(); queryPin1State(); } notifyPinLockedRegistrantsIfNeeded(null); //發出PIN碼鎖定通知,所以監聽者將會接收到此通知 notifyReadyRegistrantsIfNeeded(null); } } }