IccRecords.java revision 767a662ecde33c3979bf02b793d392aca0403162
1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/* 2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2006 The Android Open Source Project 3767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License. 6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at 7767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 8767a662ecde33c3979bf02b793d392aca0403162Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software 11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and 14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License. 15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 16767a662ecde33c3979bf02b793d392aca0403162Wink Saville 17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony; 18767a662ecde33c3979bf02b793d392aca0403162Wink Saville 19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult; 20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler; 21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message; 22767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant; 23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RegistrantList; 24767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log; 25767a662ecde33c3979bf02b793d392aca0403162Wink Saville 26767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.ArrayList; 27767a662ecde33c3979bf02b793d392aca0403162Wink Saville 28767a662ecde33c3979bf02b793d392aca0403162Wink Saville/** 29767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide} 30767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 31767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic abstract class IccRecords extends Handler implements IccConstants { 32767a662ecde33c3979bf02b793d392aca0403162Wink Saville 33767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final boolean DBG = true; 34767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Instance Variables 35767a662ecde33c3979bf02b793d392aca0403162Wink Saville 36767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected PhoneBase phone; 37767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected RegistrantList recordsLoadedRegistrants = new RegistrantList(); 38767a662ecde33c3979bf02b793d392aca0403162Wink Saville 39767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int recordsToLoad; // number of pending load requests 40767a662ecde33c3979bf02b793d392aca0403162Wink Saville 41767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected AdnRecordCache adnCache; 42767a662ecde33c3979bf02b793d392aca0403162Wink Saville 43767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Cached SIM State; cleared on channel close 44767a662ecde33c3979bf02b793d392aca0403162Wink Saville 45767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean recordsRequested = false; // true if we've made requests for the sim records 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville 47767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String iccid; 48767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String msisdn = null; // My mobile number 49767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String msisdnTag = null; 50767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String voiceMailNum = null; 51767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String voiceMailTag = null; 52767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String newVoiceMailNum = null; 53767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String newVoiceMailTag = null; 54767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean isVoiceMailFixed = false; 55767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int countVoiceMessages = 0; 56767a662ecde33c3979bf02b793d392aca0403162Wink Saville 57767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int mncLength = 0; // 0 is used to indicate that the value 58767a662ecde33c3979bf02b793d392aca0403162Wink Saville // is not initialized 59767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int mailboxIndex = 0; // 0 is no mailbox dailing number associated 60767a662ecde33c3979bf02b793d392aca0403162Wink Saville 61767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String spn; 62767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int spnDisplayCondition; 63767a662ecde33c3979bf02b793d392aca0403162Wink Saville 64767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Constants 65767a662ecde33c3979bf02b793d392aca0403162Wink Saville 66767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Bitmasks for SPN display rules. 67767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int SPN_RULE_SHOW_SPN = 0x01; 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int SPN_RULE_SHOW_PLMN = 0x02; 69767a662ecde33c3979bf02b793d392aca0403162Wink Saville 70767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Event Constants 71767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_SET_MSISDN_DONE = 30; 72767a662ecde33c3979bf02b793d392aca0403162Wink Saville 73767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Constructor 74767a662ecde33c3979bf02b793d392aca0403162Wink Saville 75767a662ecde33c3979bf02b793d392aca0403162Wink Saville public IccRecords(PhoneBase p) { 76767a662ecde33c3979bf02b793d392aca0403162Wink Saville this.phone = p; 77767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 78767a662ecde33c3979bf02b793d392aca0403162Wink Saville 79767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRadioOffOrNotAvailable(); 80767a662ecde33c3979bf02b793d392aca0403162Wink Saville 81767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Public Methods 82767a662ecde33c3979bf02b793d392aca0403162Wink Saville public AdnRecordCache getAdnCache() { 83767a662ecde33c3979bf02b793d392aca0403162Wink Saville return adnCache; 84767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 85767a662ecde33c3979bf02b793d392aca0403162Wink Saville 86767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void registerForRecordsLoaded(Handler h, int what, Object obj) { 87767a662ecde33c3979bf02b793d392aca0403162Wink Saville Registrant r = new Registrant(h, what, obj); 88767a662ecde33c3979bf02b793d392aca0403162Wink Saville recordsLoadedRegistrants.add(r); 89767a662ecde33c3979bf02b793d392aca0403162Wink Saville 90767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (recordsToLoad == 0 && recordsRequested == true) { 91767a662ecde33c3979bf02b793d392aca0403162Wink Saville r.notifyRegistrant(new AsyncResult(null, null, null)); 92767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 93767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 94767a662ecde33c3979bf02b793d392aca0403162Wink Saville 95767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void unregisterForRecordsLoaded(Handler h) { 96767a662ecde33c3979bf02b793d392aca0403162Wink Saville recordsLoadedRegistrants.remove(h); 97767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 98767a662ecde33c3979bf02b793d392aca0403162Wink Saville 99767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getMsisdnNumber() { 100767a662ecde33c3979bf02b793d392aca0403162Wink Saville return msisdn; 101767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 102767a662ecde33c3979bf02b793d392aca0403162Wink Saville 103767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 104767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Set subscriber number to SIM record 105767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 106767a662ecde33c3979bf02b793d392aca0403162Wink Saville * The subscriber number is stored in EF_MSISDN (TS 51.011) 107767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 108767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When the operation is complete, onComplete will be sent to its handler 109767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 110767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters) 111767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param number dailing nubmer (up to 20 digits) 112767a662ecde33c3979bf02b793d392aca0403162Wink Saville * if the number starts with '+', then set to international TOA 113767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param onComplete 114767a662ecde33c3979bf02b793d392aca0403162Wink Saville * onComplete.obj will be an AsyncResult 115767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception == null on success 116767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 117767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 118767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void setMsisdnNumber(String alphaTag, String number, 119767a662ecde33c3979bf02b793d392aca0403162Wink Saville Message onComplete) { 120767a662ecde33c3979bf02b793d392aca0403162Wink Saville 121767a662ecde33c3979bf02b793d392aca0403162Wink Saville msisdn = number; 122767a662ecde33c3979bf02b793d392aca0403162Wink Saville msisdnTag = alphaTag; 123767a662ecde33c3979bf02b793d392aca0403162Wink Saville 124767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("Set MSISDN: " + msisdnTag +" " + msisdn); 125767a662ecde33c3979bf02b793d392aca0403162Wink Saville 126767a662ecde33c3979bf02b793d392aca0403162Wink Saville 127767a662ecde33c3979bf02b793d392aca0403162Wink Saville AdnRecord adn = new AdnRecord(msisdnTag, msisdn); 128767a662ecde33c3979bf02b793d392aca0403162Wink Saville 129767a662ecde33c3979bf02b793d392aca0403162Wink Saville new AdnRecordLoader(phone).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, 130767a662ecde33c3979bf02b793d392aca0403162Wink Saville obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); 131767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 132767a662ecde33c3979bf02b793d392aca0403162Wink Saville 133767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getMsisdnAlphaTag() { 134767a662ecde33c3979bf02b793d392aca0403162Wink Saville return msisdnTag; 135767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 136767a662ecde33c3979bf02b793d392aca0403162Wink Saville 137767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getVoiceMailNumber() { 138767a662ecde33c3979bf02b793d392aca0403162Wink Saville return voiceMailNum; 139767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 140767a662ecde33c3979bf02b793d392aca0403162Wink Saville 141767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 142767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Return Service Provider Name stored in SIM (EF_SPN=0x6F46) or in RUIM (EF_RUIM_SPN=0x6F41) 143767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return null if SIM is not yet ready or no RUIM entry 144767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 145767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getServiceProviderName() { 146767a662ecde33c3979bf02b793d392aca0403162Wink Saville return spn; 147767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville 149767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 150767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Set voice mail number to SIM record 151767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 152767a662ecde33c3979bf02b793d392aca0403162Wink Saville * The voice mail number can be stored either in EF_MBDN (TS 51.011) or 153767a662ecde33c3979bf02b793d392aca0403162Wink Saville * EF_MAILBOX_CPHS (CPHS 4.2) 154767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 155767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If EF_MBDN is available, store the voice mail number to EF_MBDN 156767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 157767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville * So the voice mail number will be stored in both EFs if both are available 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail. 162767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 163767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When the operation is complete, onComplete will be sent to its handler 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 165767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters) 166767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param voiceNumber dailing nubmer (upto 20 digits) 167767a662ecde33c3979bf02b793d392aca0403162Wink Saville * if the number is start with '+', then set to international TOA 168767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param onComplete 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville * onComplete.obj will be an AsyncResult 170767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception == null on success 171767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 172767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 173767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void setVoiceMailNumber(String alphaTag, String voiceNumber, 174767a662ecde33c3979bf02b793d392aca0403162Wink Saville Message onComplete); 175767a662ecde33c3979bf02b793d392aca0403162Wink Saville 176767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getVoiceMailAlphaTag() { 177767a662ecde33c3979bf02b793d392aca0403162Wink Saville return voiceMailTag; 178767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 179767a662ecde33c3979bf02b793d392aca0403162Wink Saville 180767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 181767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Sets the SIM voice message waiting indicator records 182767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 183767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param countWaiting The number of messages waiting, if known. Use 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville * -1 to indicate that an unknown number of 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville * messages are waiting 186767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 187767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void setVoiceMessageWaiting(int line, int countWaiting); 188767a662ecde33c3979bf02b793d392aca0403162Wink Saville 189767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** @return true if there are messages waiting, false otherwise. */ 190767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean getVoiceMessageWaiting() { 191767a662ecde33c3979bf02b793d392aca0403162Wink Saville return countVoiceMessages != 0; 192767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 193767a662ecde33c3979bf02b793d392aca0403162Wink Saville 194767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 195767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns number of voice messages waiting, if available 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If not available (eg, on an older CPHS SIM) -1 is returned if 197767a662ecde33c3979bf02b793d392aca0403162Wink Saville * getVoiceMessageWaiting() is true 198767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 199767a662ecde33c3979bf02b793d392aca0403162Wink Saville public int getCountVoiceMessages() { 200767a662ecde33c3979bf02b793d392aca0403162Wink Saville return countVoiceMessages; 201767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 202767a662ecde33c3979bf02b793d392aca0403162Wink Saville 203767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Called by STK Service when REFRESH is received. 205767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param fileChanged indicates whether any files changed 206767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param fileList if non-null, a list of EF files that changed 207767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void onRefresh(boolean fileChanged, int[] fileList); 209767a662ecde33c3979bf02b793d392aca0403162Wink Saville 210767a662ecde33c3979bf02b793d392aca0403162Wink Saville 211767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean getRecordsLoaded() { 212767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (recordsToLoad == 0 && recordsRequested == true) { 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville return true; 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville return false; 216767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 217767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 218767a662ecde33c3979bf02b793d392aca0403162Wink Saville 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Overridden from Handler 220767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void handleMessage(Message msg); 221767a662ecde33c3979bf02b793d392aca0403162Wink Saville 222767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRecordLoaded(); 223767a662ecde33c3979bf02b793d392aca0403162Wink Saville 224767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onAllRecordsLoaded(); 225767a662ecde33c3979bf02b793d392aca0403162Wink Saville 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 227767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the SpnDisplayRule based on settings on the SIM and the 228767a662ecde33c3979bf02b793d392aca0403162Wink Saville * specified plmn (currently-registered PLMN). See TS 22.101 Annex A 229767a662ecde33c3979bf02b793d392aca0403162Wink Saville * and TS 51.011 10.3.11 for details. 230767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 231767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If the SPN is not found on the SIM, the rule is always PLMN_ONLY. 232767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract int getDisplayRule(String plmn); 234767a662ecde33c3979bf02b793d392aca0403162Wink Saville 235767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void log(String s); 236767a662ecde33c3979bf02b793d392aca0403162Wink Saville} 237767a662ecde33c3979bf02b793d392aca0403162Wink Saville 238