IccRecords.java revision 1c1ffa0cab8b56274970736d7f3b8c00c01c3d2b
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; 341c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // ***** 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 431c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // ***** 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 571c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt protected int mncLength = UNINITIALIZED; 58767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int mailboxIndex = 0; // 0 is no mailbox dailing number associated 59767a662ecde33c3979bf02b793d392aca0403162Wink Saville 60767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String spn; 61767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int spnDisplayCondition; 62767a662ecde33c3979bf02b793d392aca0403162Wink Saville 631c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // ***** Constants 641c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt 651c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // Markers for mncLength 661c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt protected static final int UNINITIALIZED = -1; 671c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt protected static final int UNKNOWN = 0; 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville 69767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Bitmasks for SPN display rules. 70767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int SPN_RULE_SHOW_SPN = 0x01; 71767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int SPN_RULE_SHOW_PLMN = 0x02; 72767a662ecde33c3979bf02b793d392aca0403162Wink Saville 731c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // ***** Event Constants 74767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_SET_MSISDN_DONE = 30; 75767a662ecde33c3979bf02b793d392aca0403162Wink Saville 761c1ffa0cab8b56274970736d7f3b8c00c01c3d2bRobert Greenwalt // ***** Constructor 77767a662ecde33c3979bf02b793d392aca0403162Wink Saville 78767a662ecde33c3979bf02b793d392aca0403162Wink Saville public IccRecords(PhoneBase p) { 79767a662ecde33c3979bf02b793d392aca0403162Wink Saville this.phone = p; 80767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 81767a662ecde33c3979bf02b793d392aca0403162Wink Saville 82767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRadioOffOrNotAvailable(); 83767a662ecde33c3979bf02b793d392aca0403162Wink Saville 84767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Public Methods 85767a662ecde33c3979bf02b793d392aca0403162Wink Saville public AdnRecordCache getAdnCache() { 86767a662ecde33c3979bf02b793d392aca0403162Wink Saville return adnCache; 87767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 88767a662ecde33c3979bf02b793d392aca0403162Wink Saville 89767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void registerForRecordsLoaded(Handler h, int what, Object obj) { 90767a662ecde33c3979bf02b793d392aca0403162Wink Saville Registrant r = new Registrant(h, what, obj); 91767a662ecde33c3979bf02b793d392aca0403162Wink Saville recordsLoadedRegistrants.add(r); 92767a662ecde33c3979bf02b793d392aca0403162Wink Saville 93767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (recordsToLoad == 0 && recordsRequested == true) { 94767a662ecde33c3979bf02b793d392aca0403162Wink Saville r.notifyRegistrant(new AsyncResult(null, null, null)); 95767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 96767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 97767a662ecde33c3979bf02b793d392aca0403162Wink Saville 98767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void unregisterForRecordsLoaded(Handler h) { 99767a662ecde33c3979bf02b793d392aca0403162Wink Saville recordsLoadedRegistrants.remove(h); 100767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 101767a662ecde33c3979bf02b793d392aca0403162Wink Saville 102767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getMsisdnNumber() { 103767a662ecde33c3979bf02b793d392aca0403162Wink Saville return msisdn; 104767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 105767a662ecde33c3979bf02b793d392aca0403162Wink Saville 106767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 107767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Set subscriber number to SIM record 108767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 109767a662ecde33c3979bf02b793d392aca0403162Wink Saville * The subscriber number is stored in EF_MSISDN (TS 51.011) 110767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 111767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When the operation is complete, onComplete will be sent to its handler 112767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 113767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters) 114767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param number dailing nubmer (up to 20 digits) 115767a662ecde33c3979bf02b793d392aca0403162Wink Saville * if the number starts with '+', then set to international TOA 116767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param onComplete 117767a662ecde33c3979bf02b793d392aca0403162Wink Saville * onComplete.obj will be an AsyncResult 118767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception == null on success 119767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 120767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 121767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void setMsisdnNumber(String alphaTag, String number, 122767a662ecde33c3979bf02b793d392aca0403162Wink Saville Message onComplete) { 123767a662ecde33c3979bf02b793d392aca0403162Wink Saville 124767a662ecde33c3979bf02b793d392aca0403162Wink Saville msisdn = number; 125767a662ecde33c3979bf02b793d392aca0403162Wink Saville msisdnTag = alphaTag; 126767a662ecde33c3979bf02b793d392aca0403162Wink Saville 127767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("Set MSISDN: " + msisdnTag +" " + msisdn); 128767a662ecde33c3979bf02b793d392aca0403162Wink Saville 129767a662ecde33c3979bf02b793d392aca0403162Wink Saville 130767a662ecde33c3979bf02b793d392aca0403162Wink Saville AdnRecord adn = new AdnRecord(msisdnTag, msisdn); 131767a662ecde33c3979bf02b793d392aca0403162Wink Saville 132767a662ecde33c3979bf02b793d392aca0403162Wink Saville new AdnRecordLoader(phone).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, 133767a662ecde33c3979bf02b793d392aca0403162Wink Saville obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); 134767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 135767a662ecde33c3979bf02b793d392aca0403162Wink Saville 136767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getMsisdnAlphaTag() { 137767a662ecde33c3979bf02b793d392aca0403162Wink Saville return msisdnTag; 138767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 139767a662ecde33c3979bf02b793d392aca0403162Wink Saville 140767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getVoiceMailNumber() { 141767a662ecde33c3979bf02b793d392aca0403162Wink Saville return voiceMailNum; 142767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 143767a662ecde33c3979bf02b793d392aca0403162Wink Saville 144767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 145767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Return Service Provider Name stored in SIM (EF_SPN=0x6F46) or in RUIM (EF_RUIM_SPN=0x6F41) 146767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return null if SIM is not yet ready or no RUIM entry 147767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getServiceProviderName() { 149767a662ecde33c3979bf02b793d392aca0403162Wink Saville return spn; 150767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 151767a662ecde33c3979bf02b793d392aca0403162Wink Saville 152767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 153767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Set voice mail number to SIM record 154767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 155767a662ecde33c3979bf02b793d392aca0403162Wink Saville * The voice mail number can be stored either in EF_MBDN (TS 51.011) or 156767a662ecde33c3979bf02b793d392aca0403162Wink Saville * EF_MAILBOX_CPHS (CPHS 4.2) 157767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If EF_MBDN is available, store the voice mail number to EF_MBDN 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 162767a662ecde33c3979bf02b793d392aca0403162Wink Saville * So the voice mail number will be stored in both EFs if both are available 163767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail. 165767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 166767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When the operation is complete, onComplete will be sent to its handler 167767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 168767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters) 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param voiceNumber dailing nubmer (upto 20 digits) 170767a662ecde33c3979bf02b793d392aca0403162Wink Saville * if the number is start with '+', then set to international TOA 171767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param onComplete 172767a662ecde33c3979bf02b793d392aca0403162Wink Saville * onComplete.obj will be an AsyncResult 173767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception == null on success 174767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 175767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 176767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void setVoiceMailNumber(String alphaTag, String voiceNumber, 177767a662ecde33c3979bf02b793d392aca0403162Wink Saville Message onComplete); 178767a662ecde33c3979bf02b793d392aca0403162Wink Saville 179767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getVoiceMailAlphaTag() { 180767a662ecde33c3979bf02b793d392aca0403162Wink Saville return voiceMailTag; 181767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 182767a662ecde33c3979bf02b793d392aca0403162Wink Saville 183767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Sets the SIM voice message waiting indicator records 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 186767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param countWaiting The number of messages waiting, if known. Use 187767a662ecde33c3979bf02b793d392aca0403162Wink Saville * -1 to indicate that an unknown number of 188767a662ecde33c3979bf02b793d392aca0403162Wink Saville * messages are waiting 189767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 190767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void setVoiceMessageWaiting(int line, int countWaiting); 191767a662ecde33c3979bf02b793d392aca0403162Wink Saville 192767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** @return true if there are messages waiting, false otherwise. */ 193767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean getVoiceMessageWaiting() { 194767a662ecde33c3979bf02b793d392aca0403162Wink Saville return countVoiceMessages != 0; 195767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville 197767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 198767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns number of voice messages waiting, if available 199767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If not available (eg, on an older CPHS SIM) -1 is returned if 200767a662ecde33c3979bf02b793d392aca0403162Wink Saville * getVoiceMessageWaiting() is true 201767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 202ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause public int getVoiceMessageCount() { 203767a662ecde33c3979bf02b793d392aca0403162Wink Saville return countVoiceMessages; 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 205767a662ecde33c3979bf02b793d392aca0403162Wink Saville 206767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 207767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Called by STK Service when REFRESH is received. 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param fileChanged indicates whether any files changed 209767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param fileList if non-null, a list of EF files that changed 210767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 211767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void onRefresh(boolean fileChanged, int[] fileList); 212767a662ecde33c3979bf02b793d392aca0403162Wink Saville 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean getRecordsLoaded() { 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (recordsToLoad == 0 && recordsRequested == true) { 216767a662ecde33c3979bf02b793d392aca0403162Wink Saville return true; 217767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 218767a662ecde33c3979bf02b793d392aca0403162Wink Saville return false; 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 220767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 221767a662ecde33c3979bf02b793d392aca0403162Wink Saville 222767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Overridden from Handler 223767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract void handleMessage(Message msg); 224767a662ecde33c3979bf02b793d392aca0403162Wink Saville 225767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRecordLoaded(); 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville 227767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onAllRecordsLoaded(); 228767a662ecde33c3979bf02b793d392aca0403162Wink Saville 229767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 230767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Returns the SpnDisplayRule based on settings on the SIM and the 231767a662ecde33c3979bf02b793d392aca0403162Wink Saville * specified plmn (currently-registered PLMN). See TS 22.101 Annex A 232767a662ecde33c3979bf02b793d392aca0403162Wink Saville * and TS 51.011 10.3.11 for details. 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 234767a662ecde33c3979bf02b793d392aca0403162Wink Saville * If the SPN is not found on the SIM, the rule is always PLMN_ONLY. 235767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 236767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract int getDisplayRule(String plmn); 237767a662ecde33c3979bf02b793d392aca0403162Wink Saville 238767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void log(String s); 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville} 240