1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/* 2a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Copyright (C) 2013 The Android Open Source Project 3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * you may not use this file except in compliance with the License. 6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * You may obtain a copy of the License at 7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unless required by applicable law or agreed to in writing, software 11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See the License for the specific language governing permissions and 14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * limitations under the License. 15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony.imsphone; 18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Context; 20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.res.Resources; 21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult; 22a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingamimport android.os.Bundle; 23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler; 24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.PhoneNumberUtils; 26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.text.SpannableStringBuilder; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.text.TextUtils; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganeshimport com.android.ims.ImsException; 3101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganeshimport com.android.ims.ImsReasonInfo; 32a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingamimport com.android.ims.ImsSsInfo; 3301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganeshimport com.android.ims.ImsUtInterface; 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallForwardInfo; 35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CommandException; 36772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingamimport com.android.internal.telephony.CallStateException; 37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CommandsInterface; 38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IccRecords; 39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_NONE; 41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; 42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_FAX; 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_SMS; 45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA_SYNC; 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA_ASYNC; 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_PACKET; 48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_PAD; 49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_MAX; 50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.MmiCode; 52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone; 53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.regex.Pattern; 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.regex.Matcher; 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * The motto for this file is: 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * "NOTE: By using the # as a separator, most cases are expected to be unambiguous." 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * -- TS 22.030 6.5.2 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide} 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepublic final class ImsPhoneMmiCode extends Handler implements MmiCode { 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static final String LOG_TAG = "ImsPhoneMmiCode"; 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constants 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Max Size of the Short Code (aka Short String from TS 22.030 6.5.2) 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MAX_LENGTH_SHORT_CODE = 2; 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // TS 22.030 6.5.2 Every Short String USSD command will end with #-key 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // (known as #-String) 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final char END_OF_USSD_COMMAND = '#'; 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // From TS 22.030 6.5.2 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String ACTION_ACTIVATE = "*"; 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String ACTION_DEACTIVATE = "#"; 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String ACTION_INTERROGATE = "*#"; 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String ACTION_REGISTER = "**"; 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String ACTION_ERASURE = "##"; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Supp Service codes from TS 22.030 Annex B 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Called line presentation 88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CLIP = "30"; 89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CLIR = "31"; 9001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final String SC_COLP = "76"; 9101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final String SC_COLR = "77"; 9201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 9301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh //Calling name presentation 9401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final String SC_CNAP = "300"; 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Call Forwarding 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CFU = "21"; 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CFB = "67"; 99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CFNRy = "61"; 100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CFNR = "62"; 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CF_All = "002"; 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_CF_All_Conditional = "004"; 104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Call Waiting 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_WAIT = "43"; 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Call Barring 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BAOC = "33"; 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BAOIC = "331"; 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BAOICxH = "332"; 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BAIC = "35"; 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BAICr = "351"; 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BA_ALL = "330"; 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BA_MO = "333"; 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_BA_MT = "353"; 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // Incoming/Anonymous call barring 12001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final String SC_BS_MT = "156"; 12101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final String SC_BAICa = "157"; 12201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Supp Service Password registration 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_PWD = "03"; 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // PIN/PIN2/PUK/PUK2 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_PIN = "04"; 128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_PIN2 = "042"; 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_PUK = "05"; 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String SC_PUK2 = "052"; 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Event Constants 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 13401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_SET_COMPLETE = 0; 13501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_QUERY_CF_COMPLETE = 1; 13601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_USSD_COMPLETE = 2; 13701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_QUERY_COMPLETE = 3; 13801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_SET_CFF_COMPLETE = 4; 13901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_USSD_CANCEL_COMPLETE = 5; 14001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_GET_CLIR_COMPLETE = 6; 14101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int EVENT_SUPP_SVC_QUERY_COMPLETE = 7; 14201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 14301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh //***** Calling Line Presentation Constants 14401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int NUM_PRESENTATION_ALLOWED = 0; 14501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private static final int NUM_PRESENTATION_RESTRICTED = 1; 146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 147a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam //***** Supplementary Service Query Bundle Keys 148a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // Used by IMS Service layer to put supp. serv. query 149a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // responses into the ssInfo Bundle. 150a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam public static final String UT_BUNDLE_KEY_CLIR = "queryClir"; 151a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam public static final String UT_BUNDLE_KEY_SSINFO = "imsSsInfo"; 152a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 153a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam //***** Calling Line Identity Restriction Constants 154a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // The 'm' parameter from TS 27.007 7.7 155a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_NOT_PROVISIONED = 0; 156a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_PROVISIONED_PERMANENT = 1; 157a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_PRESENTATION_RESTRICTED_TEMPORARY = 3; 158a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_PRESENTATION_ALLOWED_TEMPORARY = 4; 159a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // The 'n' parameter from TS 27.007 7.7 160a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_DEFAULT = 0; 161a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_INVOCATION = 1; 162a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private static final int CLIR_SUPPRESSION = 2; 163a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Instance Variables 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private ImsPhone mPhone; 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private Context mContext; 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private IccRecords mIccRecords; 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mAction; // One of ACTION_* 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mSc; // Service Code 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mSia, mSib, mSic; // Service Info a,b,c 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mPoundString; // Entire MMI string up to and including # 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mDialingNumber; 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mPwd; // For password registration 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mIsPendingUSSD; 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mIsUssdRequest; 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mIsCallFwdReg; 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private State mState = State.PENDING; 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence mMessage; 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Class Variables 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // See TS 22.030 6.5.2 "Structure of the MMI" 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static Pattern sPatternSuppService = Pattern.compile( 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville "((\\*|#|\\*#|\\*\\*|##)(\\d{2,3})(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*))?)?)?)?#)(.*)"); 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/* 1 2 3 4 5 6 7 8 9 10 11 12 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1 = Full string up to and including # 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2 = action (activation/interrogation/registration/erasure) 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3 = service code 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 5 = SIA 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 7 = SIB 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 9 = SIC 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 10 = dialing number 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*/ 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_POUND_STRING = 1; 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_ACTION = 2; 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //(activation/interrogation/registration/erasure) 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_SERVICE_CODE = 3; 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_SIA = 5; 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_SIB = 7; 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_SIC = 9; 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_PWD_CONFIRM = 11; 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int MATCH_GROUP_DIALING_NUMBER = 12; 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static private String[] sTwoDigitNumberPattern; 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Public Class methods 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Some dial strings in GSM are defined to do non-call setup 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * things, such as modify or query supplementary service settings (eg, call 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * forwarding). These are generally referred to as "MMI codes". 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * We look to see if the dial string contains a valid MMI code (potentially 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * with a dial string at the end as well) and return info here. 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * If the dial string contains no MMI code, we return an instance with 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * only "dialingNumber" set 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Please see flow chart in TS 22.030 6.5.3.2 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static ImsPhoneMmiCode 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville newFromDialString(String dialString, ImsPhone phone) { 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Matcher m; 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode ret = null; 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville m = sPatternSuppService.matcher(dialString); 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Is this formatted like a standard supplementary service code? 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (m.matches()) { 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = new ImsPhoneMmiCode(phone); 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mPoundString = makeEmptyNull(m.group(MATCH_GROUP_POUND_STRING)); 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mAction = makeEmptyNull(m.group(MATCH_GROUP_ACTION)); 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mSc = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE)); 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mSia = makeEmptyNull(m.group(MATCH_GROUP_SIA)); 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mSib = makeEmptyNull(m.group(MATCH_GROUP_SIB)); 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mSic = makeEmptyNull(m.group(MATCH_GROUP_SIC)); 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mPwd = makeEmptyNull(m.group(MATCH_GROUP_PWD_CONFIRM)); 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mDialingNumber = makeEmptyNull(m.group(MATCH_GROUP_DIALING_NUMBER)); 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // According to TS 22.030 6.5.2 "Structure of the MMI", 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // the dialing number should not ending with #. 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The dialing number ending # is treated as unique USSD, 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // eg, *400#16 digit number# to recharge the prepaid card 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // in India operator(Mumbai MTNL) 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ret.mDialingNumber != null && 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mDialingNumber.endsWith("#") && 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dialString.endsWith("#")){ 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = new ImsPhoneMmiCode(phone); 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mPoundString = dialString; 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (dialString.endsWith("#")) { 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // TS 22.030 sec 6.5.3.2 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // "Entry of any characters defined in the 3GPP TS 23.038 [8] Default Alphabet 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // (up to the maximum defined in 3GPP TS 24.080 [10]), followed by #SEND". 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = new ImsPhoneMmiCode(phone); 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mPoundString = dialString; 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isTwoDigitShortCode(phone.getContext(), dialString)) { 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Is a country-specific exception to short codes as defined in TS 22.030, 6.5.3.2 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = null; 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isShortCode(dialString, phone)) { 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // this may be a short code, as defined in TS 22.030, 6.5.3.2 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = new ImsPhoneMmiCode(phone); 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mDialingNumber = dialString; 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static ImsPhoneMmiCode 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville newNetworkInitiatedUssd (String ussdMessage, 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isUssdRequest, ImsPhone phone) { 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode ret; 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret = new ImsPhoneMmiCode(phone); 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mMessage = ussdMessage; 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mIsUssdRequest = isUssdRequest; 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If it's a request, set to PENDING so that it's cancelable. 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isUssdRequest) { 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mIsPendingUSSD = true; 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mState = State.PENDING; 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mState = State.COMPLETE; 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static ImsPhoneMmiCode newFromUssdUserInput(String ussdMessge, 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhone phone) { 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode ret = new ImsPhoneMmiCode(phone); 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mMessage = ussdMessge; 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mState = State.PENDING; 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ret.mIsPendingUSSD = true; 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ret; 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Private Class methods 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** make empty strings be null. 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Regexp returns empty strings for empty groups 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static String 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville makeEmptyNull (String s) { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (s != null && s.length() == 0) return null; 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return s; 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** returns true of the string is empty or null */ 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static boolean 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isEmptyOrNull(CharSequence s) { 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return s == null || (s.length() == 0); 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static int 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville scToCallForwardReason(String sc) { 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc == null) { 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("invalid call forward sc"); 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc.equals(SC_CF_All)) { 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_ALL; 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_CFU)) { 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_UNCONDITIONAL; 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_CFB)) { 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_BUSY; 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_CFNR)) { 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_NOT_REACHABLE; 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_CFNRy)) { 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_NO_REPLY; 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_CF_All_Conditional)) { 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CF_REASON_ALL_CONDITIONAL; 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("invalid call forward sc"); 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static int 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville siToServiceClass(String si) { 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (si == null || si.length() == 0) { 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return SERVICE_CLASS_NONE; 356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // NumberFormatException should cause MMI fail 358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int serviceCode = Integer.parseInt(si, 10); 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (serviceCode) { 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 10: return SERVICE_CLASS_SMS + SERVICE_CLASS_FAX + SERVICE_CLASS_VOICE; 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 11: return SERVICE_CLASS_VOICE; 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 12: return SERVICE_CLASS_SMS + SERVICE_CLASS_FAX; 364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 13: return SERVICE_CLASS_FAX; 365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 16: return SERVICE_CLASS_SMS; 367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 19: return SERVICE_CLASS_FAX + SERVICE_CLASS_VOICE; 369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 20: return SERVICE_CLASS_DATA_ASYNC + SERVICE_CLASS_DATA_SYNC; 371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 21: return SERVICE_CLASS_PAD + SERVICE_CLASS_DATA_ASYNC; 373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 22: return SERVICE_CLASS_PACKET + SERVICE_CLASS_DATA_SYNC; 374a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 24: return SERVICE_CLASS_DATA_SYNC; 375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 25: return SERVICE_CLASS_DATA_ASYNC; 376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 26: return SERVICE_CLASS_DATA_SYNC + SERVICE_CLASS_VOICE; 377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case 99: return SERVICE_CLASS_PACKET; 378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 380a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException("unsupported MMI service code " + si); 381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 382a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 383a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static int 386a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville siToTime (String si) { 387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (si == null || si.length() == 0) { 388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // NumberFormatException should cause MMI fail 391a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return Integer.parseInt(si, 10); 392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 394a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static boolean 396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isServiceCodeCallForwarding(String sc) { 397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sc != null && 398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (sc.equals(SC_CFU) 399a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || sc.equals(SC_CFB) || sc.equals(SC_CFNRy) 400a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || sc.equals(SC_CFNR) || sc.equals(SC_CF_All) 401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || sc.equals(SC_CF_All_Conditional)); 402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static boolean 405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isServiceCodeCallBarring(String sc) { 406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Resources resource = Resources.getSystem(); 407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc != null) { 408a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String[] barringMMI = resource.getStringArray( 409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.array.config_callBarringMMI); 410a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (barringMMI != null) { 411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (String match : barringMMI) { 412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc.equals(match)) return true; 413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static String 420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville scToBarringFacility(String sc) { 421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc == null) { 422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("invalid call barring sc"); 423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sc.equals(SC_BAOC)) { 426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BAOC; 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BAOIC)) { 428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BAOIC; 429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BAOICxH)) { 430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BAOICxH; 431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BAIC)) { 432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BAIC; 433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BAICr)) { 434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BAICr; 435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BA_ALL)) { 436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BA_ALL; 437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BA_MO)) { 438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BA_MO; 439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (sc.equals(SC_BA_MT)) { 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CB_FACILITY_BA_MT; 441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("invalid call barring sc"); 443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Constructor 447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode(ImsPhone phone) { 449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The telephony unit-test cases may create ImsPhoneMmiCode's 450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // in secondary threads 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville super(phone.getHandler().getLooper()); 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone = phone; 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mContext = phone.getContext(); 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords = mPhone.mDefaultPhone.mIccRecords.get(); 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** MmiCode implementation 458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public State 461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getState() { 462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mState; 463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public CharSequence 467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getMessage() { 468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mMessage; 469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Phone getPhone() { return mPhone; } 473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // inherited javadoc suffices 475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cancel() { 478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Complete or failed cannot be cancelled 479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mState == State.COMPLETE || mState == State.FAILED) { 480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.CANCELLED; 484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIsPendingUSSD) { 486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.cancelUSSD(); 487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone (this); 489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isCancelable() { 495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* Can only cancel pending USSD sessions. */ 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mIsPendingUSSD; 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Instance Methods 500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String getDialingNumber() { 502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDialingNumber; 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Does this dial string contain a structured or unstructured MMI code? */ 506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isMMI() { 508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPoundString != null; 509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* Is this a 1 or 2 digit "short code" as defined in TS 22.030 sec 6.5.3.2? */ 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isShortCode() { 514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPoundString == null 515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && mDialingNumber != null && mDialingNumber.length() <= 2; 516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static private boolean 520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isTwoDigitShortCode(Context context, String dialString) { 521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "isTwoDigitShortCode"); 522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 5236103b5df6705c89193f452c35eaf5e9a26c188cfJing Zhao if (dialString == null || dialString.length() > 2) return false; 524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sTwoDigitNumberPattern == null) { 526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sTwoDigitNumberPattern = context.getResources().getStringArray( 527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.array.config_twoDigitNumberPattern); 528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (String dialnumber : sTwoDigitNumberPattern) { 531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "Two Digit Number Pattern " + dialnumber); 532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.equals(dialnumber)) { 533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "Two Digit Number Pattern -true"); 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "Two Digit Number Pattern -false"); 538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Helper function for newFromDialString. Returns true if dialString appears 543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * to be a short code AND conditions are correct for it to be treated as 544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * such. 545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static private boolean isShortCode(String dialString, ImsPhone phone) { 547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Refer to TS 22.030 Figure 3.5.3.2: 548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString == null) { 549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 552a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Illegal dial string characters will give a ZERO length. 553a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // At this point we do not want to crash as any application with 554a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // call privileges may send a non dial string. 555a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // It return false as when the dialString is equal to NULL. 556a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.length() == 0) { 557a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 558a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 559a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 560a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (PhoneNumberUtils.isLocalEmergencyNumber(phone.getContext(), dialString)) { 561a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 562a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return isShortCodeUSSD(dialString, phone); 564a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 567a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 568a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Helper function for isShortCode. Returns true if dialString appears to be 569a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * a short code and it is a USSD structure 570a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 571a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * According to the 3PGG TS 22.030 specification Figure 3.5.3.2: A 1 or 2 572a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * digit "short code" is treated as USSD if it is entered while on a call or 573a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * does not satisfy the condition (exactly 2 digits && starts with '1'), there 574a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * are however exceptions to this rule (see below) 575a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 576a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Exception (1) to Call initiation is: If the user of the device is already in a call 577a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * and enters a Short String without any #-key at the end and the length of the Short String is 578a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * equal or less then the MAX_LENGTH_SHORT_CODE [constant that is equal to 2] 579a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 580a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * The phone shall initiate a USSD/SS commands. 581a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 582a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville static private boolean isShortCodeUSSD(String dialString, ImsPhone phone) { 583a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString != null && dialString.length() <= MAX_LENGTH_SHORT_CODE) { 584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (phone.isInCall()) { 585a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.length() != MAX_LENGTH_SHORT_CODE || 589a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dialString.charAt(0) != '1') { 590a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 591a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 593a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 596a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 597a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if the Service Code is PIN/PIN2/PUK/PUK2-related 598a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 599a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isPinPukCommand() { 600a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mSc != null && (mSc.equals(SC_PIN) || mSc.equals(SC_PIN2) 601a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || mSc.equals(SC_PUK) || mSc.equals(SC_PUK2)); 602a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 603a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 604a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 605a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See TS 22.030 Annex B. 606a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * In temporary mode, to suppress CLIR for a single call, enter: 607a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * " * 31 # [called number] SEND " 608a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * In temporary mode, to invoke CLIR for a single call enter: 609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * " # 31 # [called number] SEND " 610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isTemporaryModeCLIR() { 613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mSc != null && mSc.equals(SC_CLIR) && mDialingNumber != null 614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && (isActivate() || isDeactivate()); 615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 617a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * returns CommandsInterface.CLIR_* 619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See also isTemporaryModeCLIR() 620a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 621a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int 622a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getCLIRMode() { 623a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSc != null && mSc.equals(SC_CLIR)) { 624a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isActivate()) { 625a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CLIR_SUPPRESSION; 626a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isDeactivate()) { 627a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CLIR_INVOCATION; 628a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 629a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 630a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 631a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CommandsInterface.CLIR_DEFAULT; 632a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 633a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 634a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isActivate() { 635a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mAction != null && mAction.equals(ACTION_ACTIVATE); 636a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 637a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 638a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isDeactivate() { 639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mAction != null && mAction.equals(ACTION_DEACTIVATE); 640a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 641a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 642a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isInterrogate() { 643a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mAction != null && mAction.equals(ACTION_INTERROGATE); 644a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 645a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 646a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isRegister() { 647a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mAction != null && mAction.equals(ACTION_REGISTER); 648a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 649a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 650a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isErasure() { 651a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mAction != null && mAction.equals(ACTION_ERASURE); 652a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 653a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 655a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Returns true if this is a USSD code that's been submitted to the 656a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * network...eg, after processCode() is called 657a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 658a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isPendingUSSD() { 659a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mIsPendingUSSD; 660a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 661a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 662a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isUssdRequest() { 664a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mIsUssdRequest; 665a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 666a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 667a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isSupportedOverImsPhone() { 669a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isShortCode()) return true; 670a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville else if (mDialingNumber != null) return false; 671a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville else if (isServiceCodeCallForwarding(mSc) 672a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || isServiceCodeCallBarring(mSc) 67301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_WAIT)) 67401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_CLIR)) 67501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_CLIP)) 67601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_COLR)) 67701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_COLP)) 67801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_BS_MT)) 67901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh || (mSc != null && mSc.equals(SC_BAICa))) { 680a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 681a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int serviceClass = siToServiceClass(mSib); 682a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (serviceClass != SERVICE_CLASS_NONE 683a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && serviceClass != SERVICE_CLASS_VOICE) { 684a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 685a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 686a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 687a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isPinPukCommand() 688a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (mSc != null 689a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && (mSc.equals(SC_PWD) || mSc.equals(SC_CLIP) || mSc.equals(SC_CLIR)))) { 690a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 691a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mPoundString != null) return true; 692a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 693a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 694a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 695a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 696a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Process a MMI code or short code...anything that isn't a dialing number */ 697a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 698772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam processCode () throws CallStateException { 699a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 700a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isShortCode()) { 701a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "isShortCode"); 702a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 703a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // These just get treated as USSD. 704772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "Sending short code '" 705772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam + mDialingNumber + "' over CS pipe."); 706772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam throw new CallStateException(ImsPhone.CS_FALLBACK); 707a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isServiceCodeCallForwarding(mSc)) { 708a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "is CF"); 709a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 710a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String dialingNumber = mSia; 711a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int reason = scToCallForwardReason(mSc); 7121d60bf2949d68b587886411543752a7922529804Omkar Kolangade int serviceClass = siToServiceClass(mSib); 713a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int time = siToTime(mSic); 714a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 715a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isInterrogate()) { 716a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.getCallForwardingOption(reason, 717a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville obtainMessage(EVENT_QUERY_CF_COMPLETE, this)); 718a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 719a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int cfAction; 720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 721a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isActivate()) { 722a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // 3GPP TS 22.030 6.5.2 723a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // a call forwarding request with a single * would be 724a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // interpreted as registration if containing a forwarded-to 725a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // number, or an activation if not 726a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isEmptyOrNull(dialingNumber)) { 727a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfAction = CommandsInterface.CF_ACTION_ENABLE; 728a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsCallFwdReg = false; 729a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 730a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfAction = CommandsInterface.CF_ACTION_REGISTRATION; 731a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsCallFwdReg = true; 732a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 733a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isDeactivate()) { 734a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfAction = CommandsInterface.CF_ACTION_DISABLE; 735a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isRegister()) { 736a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfAction = CommandsInterface.CF_ACTION_REGISTRATION; 737a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isErasure()) { 738a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfAction = CommandsInterface.CF_ACTION_ERASURE; 739a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 740a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("invalid action"); 741a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 742a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 743a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int isSettingUnconditional = 744a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((reason == CommandsInterface.CF_REASON_UNCONDITIONAL) || 745a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (reason == CommandsInterface.CF_REASON_ALL)) ? 1 : 0; 746a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 747a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int isEnableDesired = 748a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((cfAction == CommandsInterface.CF_ACTION_ENABLE) || 749a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (cfAction == CommandsInterface.CF_ACTION_REGISTRATION)) ? 1 : 0; 750a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 751a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "is CF setCallForward"); 752a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.setCallForwardingOption(cfAction, reason, 7531d60bf2949d68b587886411543752a7922529804Omkar Kolangade dialingNumber, serviceClass, time, obtainMessage( 754a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville EVENT_SET_CFF_COMPLETE, 755a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isSettingUnconditional, 756a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isEnableDesired, this)); 757a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 758a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isServiceCodeCallBarring(mSc)) { 759a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // sia = password 760a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // sib = basic service group 761a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // service group is not supported 762a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 763a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String password = mSia; 764a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String facility = scToBarringFacility(mSc); 765a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 766a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isInterrogate()) { 767a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.getCallBarring(facility, 76801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE, this)); 769a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isActivate() || isDeactivate()) { 770a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.setCallBarring(facility, isActivate(), password, 771a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville obtainMessage(EVENT_SET_COMPLETE, this)); 772a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 773a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("Invalid or Unsupported MMI Code"); 774a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 77501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && mSc.equals(SC_CLIR)) { 77601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // NOTE: Since these supplementary services are accessed only 77701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // via MMI codes, methods have not been added to ImsPhone. 77801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // Only the UT interface handle is used. 77901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isActivate()) { 78001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 78101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCLIR(CommandsInterface.CLIR_INVOCATION, 78201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 78301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 78401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCLIR."); 78501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 78601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isDeactivate()) { 78701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 78801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCLIR(CommandsInterface.CLIR_SUPPRESSION, 78901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 79001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 79101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCLIR."); 79201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 79301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isInterrogate()) { 79401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 79501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 79601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .queryCLIR(obtainMessage(EVENT_GET_CLIR_COMPLETE, this)); 79701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 79801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for queryCLIR."); 79901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 80001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 80101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh throw new RuntimeException ("Invalid or Unsupported MMI Code"); 80201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 80301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && mSc.equals(SC_CLIP)) { 80401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // NOTE: Refer to the note above. 80501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isInterrogate()) { 80601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 80701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 80801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .queryCLIP(obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE, this)); 80901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 81001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for queryCLIP."); 81101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 81201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isActivate() || isDeactivate()) { 81301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 81401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCLIP(isActivate(), 81501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 81601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 81701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCLIP."); 81801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 81901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 82001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh throw new RuntimeException ("Invalid or Unsupported MMI Code"); 82101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 82201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && mSc.equals(SC_COLP)) { 82301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // NOTE: Refer to the note above. 82401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isInterrogate()) { 82501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 82601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 82701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .queryCOLP(obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE, this)); 82801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 82901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for queryCOLP."); 83001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 83101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isActivate() || isDeactivate()) { 83201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 83301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCOLP(isActivate(), 83401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 83501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 83601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCOLP."); 83701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 83801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 83901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh throw new RuntimeException ("Invalid or Unsupported MMI Code"); 84001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 84101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && mSc.equals(SC_COLR)) { 84201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // NOTE: Refer to the note above. 84301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isActivate()) { 84401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 84501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCOLR(NUM_PRESENTATION_ALLOWED, 84601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 84701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 84801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCOLR."); 84901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 85001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isDeactivate()) { 85101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 85201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface().updateCOLR(NUM_PRESENTATION_RESTRICTED, 85301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SET_COMPLETE, this)); 85401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 85501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updateCOLR."); 85601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 85701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isInterrogate()) { 85801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 85901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 860a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam .queryCOLR(obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE, this)); 86101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 86201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for queryCOLR."); 86301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 86401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 86501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh throw new RuntimeException ("Invalid or Unsupported MMI Code"); 86601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 86701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && (mSc.equals(SC_BS_MT))) { 86801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 86901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isInterrogate()) { 87001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 87101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .queryCallBarring(ImsUtInterface.CB_BS_MT, 87201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE,this)); 87301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (isActivate() || isDeactivate()) { 87401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh processIcbMmiCodeForUpdate(); 87501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 87601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // TODO: isRegister() case needs to be handled. 87701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 87801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for ICB."); 87901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 88001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc != null && mSc.equals(SC_BAICa)) { 88101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh // TODO: Should we route through queryCallBarring() here? 88201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 88301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (isInterrogate()) { 88401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 88501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .queryCallBarring(ImsUtInterface.CB_BIC_ACR, 88601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE,this)); 88701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 88801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 88901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for ICBa."); 89001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 891a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mSc != null && mSc.equals(SC_WAIT)) { 892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // sia = basic service group 8931d60bf2949d68b587886411543752a7922529804Omkar Kolangade int serviceClass = siToServiceClass(mSib); 8941d60bf2949d68b587886411543752a7922529804Omkar Kolangade 895a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isActivate() || isDeactivate()) { 8961d60bf2949d68b587886411543752a7922529804Omkar Kolangade mPhone.setCallWaiting(isActivate(), serviceClass, 897a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville obtainMessage(EVENT_SET_COMPLETE, this)); 898a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isInterrogate()) { 899a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.getCallWaiting(obtainMessage(EVENT_QUERY_COMPLETE, this)); 900a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 901a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("Invalid or Unsupported MMI Code"); 902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 903a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mPoundString != null) { 904772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "Sending pound string '" 905772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam + mDialingNumber + "' over CS pipe."); 906772f5f72ef0b872d1a0cb1a099e7d78998f1dac2Uma Maheswari Ramalingam throw new CallStateException(ImsPhone.CS_FALLBACK); 907a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 908a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw new RuntimeException ("Invalid or Unsupported MMI Code"); 909a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (RuntimeException exc) { 911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = mContext.getText(com.android.internal.R.string.mmiError); 913a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 914a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 915a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 916a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 917a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 918a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called from ImsPhone 919a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 920a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * An unsolicited USSD NOTIFY or REQUEST has come in matching 921a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * up with this pending USSD request 922a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 923a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Note: If REQUEST, this exchange is complete, but the session remains 924a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * active (ie, the network expects user input). 925a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 926a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 927a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onUssdFinished(String ussdMessage, boolean isUssdRequest) { 928a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mState == State.PENDING) { 929a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ussdMessage == null) { 930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = mContext.getText(com.android.internal.R.string.mmiComplete); 931a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 932a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = ussdMessage; 933a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 934a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsUssdRequest = isUssdRequest; 935a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If it's a request, leave it PENDING so that it's cancelable. 936a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!isUssdRequest) { 937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 938a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 942a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 943a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 944a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 945a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called from ImsPhone 946a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 947a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * The radio has reset, and this is still pending 948a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 949a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 950a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 951a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onUssdFinishedError() { 952a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mState == State.PENDING) { 953a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 954a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = mContext.getText(com.android.internal.R.string.mmiError); 955a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 956a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 957a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 958a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 959a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 960a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void sendUssd(String ussdMessage) { 961a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Treat this as a USSD string 962a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsPendingUSSD = true; 963a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 964a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Note that unlike most everything else, the USSD complete 965a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // response does not complete this MMI code...we wait for 966a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // an unsolicited USSD "Notify" or "Request". 967a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The matching up of this is done in ImsPhone. 968a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 969a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.sendUSSD(ussdMessage, 970a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville obtainMessage(EVENT_USSD_COMPLETE, this)); 971a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 972a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 973a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Called from ImsPhone.handleMessage; not a Handler subclass */ 974a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 975a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 976a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville handleMessage (Message msg) { 977a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar; 978a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 979a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (msg.what) { 980a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_SET_COMPLETE: 981a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) (msg.obj); 982a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 983a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSetComplete(msg, ar); 984a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 985a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 986a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_SET_CFF_COMPLETE: 987a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) (msg.obj); 988a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* 990a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * msg.arg1 = 1 means to set unconditional voice call forwarding 991a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * msg.arg2 = 1 means to enable voice call forwarding 992a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 993a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((ar.exception == null) && (msg.arg1 == 1)) { 994a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean cffEnabled = (msg.arg2 == 1); 995a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIccRecords != null) { 996a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled, mDialingNumber); 997a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 998a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 999a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1000a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSetComplete(msg, ar); 1001a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1002a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1003a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_QUERY_CF_COMPLETE: 1004a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) (msg.obj); 1005a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onQueryCfComplete(ar); 1006a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1007a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1008a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_QUERY_COMPLETE: 1009a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) (msg.obj); 1010a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onQueryComplete(ar); 1011a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1012a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1013a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_USSD_COMPLETE: 1014a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) (msg.obj); 1015a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1016a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception != null) { 1017a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 1018a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = getErrorMessage(ar); 1019a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1020a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 1021a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1022a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1023a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Note that unlike most everything else, the USSD complete 1024a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // response does not complete this MMI code...we wait for 1025a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // an unsolicited USSD "Notify" or "Request". 1026a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The matching up of this is done in ImsPhone. 1027a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1028a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1029a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1030a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_USSD_CANCEL_COMPLETE: 1031a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 1032a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1033a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 103401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh case EVENT_SUPP_SVC_QUERY_COMPLETE: 103501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh ar = (AsyncResult) (msg.obj); 103601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh onSuppSvcQueryComplete(ar); 103701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh break; 103801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 1039a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case EVENT_GET_CLIR_COMPLETE: 1040a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam ar = (AsyncResult) (msg.obj); 1041a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam onQueryClirComplete(ar); 1042a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1043a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1044a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 1045a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1046a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1047a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1048a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1049a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Private instance methods 1050a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 105101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private void 105201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh processIcbMmiCodeForUpdate () { 105301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh String dialingNumber = mSia; 105401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh String[] icbNum = null; 105501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 105601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (dialingNumber != null) { 105701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh icbNum = dialingNumber.split("\\$"); 105801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 105901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 106001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh try { 106101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.mCT.getUtInterface() 106201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh .updateCallBarring(ImsUtInterface.CB_BS_MT, 106301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh isActivate(), 106401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh obtainMessage(EVENT_SUPP_SVC_QUERY_COMPLETE,this), 106501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh icbNum); 106601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } catch (ImsException e) { 106701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh Rlog.d(LOG_TAG, "Could not get UT handle for updating ICB."); 106801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 106901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 107001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 1071a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence getErrorMessage(AsyncResult ar) { 1072a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.mmiError); 1073a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1074a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1075a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence getScString() { 1076a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSc != null) { 1077a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isServiceCodeCallBarring(mSc)) { 1078a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.BaMmi); 1079a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isServiceCodeCallForwarding(mSc)) { 1080a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.CfMmi); 1081a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mSc.equals(SC_PWD)) { 1082a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.PwdMmi); 1083a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mSc.equals(SC_WAIT)) { 1084a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.CwMmi); 108501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc.equals(SC_CLIP)) { 108601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh return mContext.getText(com.android.internal.R.string.ClipMmi); 108701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else if (mSc.equals(SC_CLIR)) { 108801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh return mContext.getText(com.android.internal.R.string.ClirMmi); 10899b0a3372e511d97bc57fd5a9e01f9d189871af04Etan Cohen } else if (mSc.equals(SC_COLP)) { 10909b0a3372e511d97bc57fd5a9e01f9d189871af04Etan Cohen return mContext.getText(com.android.internal.R.string.ColpMmi); 10919b0a3372e511d97bc57fd5a9e01f9d189871af04Etan Cohen } else if (mSc.equals(SC_COLR)) { 10929b0a3372e511d97bc57fd5a9e01f9d189871af04Etan Cohen return mContext.getText(com.android.internal.R.string.ColrMmi); 1093a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1094a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1095a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1096a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ""; 1097a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1098a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1099a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 1100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSetComplete(Message msg, AsyncResult ar){ 1101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder sb = new StringBuilder(getScString()); 1102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("\n"); 1103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception != null) { 1105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 110601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 1107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception instanceof CommandException) { 1108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CommandException.Error err = ((CommandException)(ar.exception)).getCommandError(); 1109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (err == CommandException.Error.PASSWORD_INCORRECT) { 1110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.passwordIncorrect)); 1112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.mmiError)); 1115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 111701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh ImsException error = (ImsException) ar.exception; 111801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (error.getMessage() != null) { 111901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(error.getMessage()); 112001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 112101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 112201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 1123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isActivate()) { 1125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIsCallFwdReg) { 1127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.serviceRegistered)); 1129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.serviceEnabled)); 1132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isDeactivate()) { 1134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.serviceDisabled)); 1137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isRegister()) { 1138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.serviceRegistered)); 1141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (isErasure()) { 1142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.serviceErased)); 1145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 1147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText( 1148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.mmiError)); 1149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = sb; 1152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 1153a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 1156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @param serviceClass 1 bit of the service class bit vectory 1157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return String to be used for call forward query MMI response text. 1158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Returns null if unrecognized 1159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence 1162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville serviceClassToCFString (int serviceClass) { 1163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (serviceClass) { 1164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_VOICE: 1165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassVoice); 1166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_DATA: 1167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassData); 1168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_FAX: 1169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassFAX); 1170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_SMS: 1171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassSMS); 1172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_DATA_SYNC: 1173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassDataSync); 1174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_DATA_ASYNC: 1175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassDataAsync); 1176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_PACKET: 1177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassPacket); 1178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case SERVICE_CLASS_PAD: 1179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mContext.getText(com.android.internal.R.string.serviceClassPAD); 1180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 1181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 1182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** one CallForwardInfo + serviceClassMask -> one line of text */ 1186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence 1187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville makeCFQueryResultMessage(CallForwardInfo info, int serviceClassMask) { 1188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CharSequence template; 1189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String sources[] = {"{0}", "{1}", "{2}"}; 1190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CharSequence destinations[] = new CharSequence[3]; 1191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean needTimeTemplate; 1192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // CF_REASON_NO_REPLY also has a time value associated with 1194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // it. All others don't. 1195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville needTimeTemplate = 1197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (info.reason == CommandsInterface.CF_REASON_NO_REPLY); 1198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (info.status == 1) { 1200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (needTimeTemplate) { 1201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville template = mContext.getText( 1202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.cfTemplateForwardedTime); 1203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville template = mContext.getText( 1205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.cfTemplateForwarded); 1206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (info.status == 0 && isEmptyOrNull(info.number)) { 1208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville template = mContext.getText( 1209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.cfTemplateNotForwarded); 1210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { /* (info.status == 0) && !isEmptyOrNull(info.number) */ 1211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // A call forward record that is not active but contains 1212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // a phone number is considered "registered" 1213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (needTimeTemplate) { 1215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville template = mContext.getText( 1216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.cfTemplateRegisteredTime); 1217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville template = mContext.getText( 1219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville com.android.internal.R.string.cfTemplateRegistered); 1220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // In the template (from strings.xmls) 1224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // {0} is one of "bearerServiceCode*" 1225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // {1} is dialing number 1226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // {2} is time in seconds 1227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville destinations[0] = serviceClassToCFString(info.serviceClass & serviceClassMask); 1229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville destinations[1] = PhoneNumberUtils.stringFromStringAndTOA(info.number, info.toa); 1230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville destinations[2] = Integer.toString(info.timeSeconds); 1231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (info.reason == CommandsInterface.CF_REASON_UNCONDITIONAL && 1233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (info.serviceClass & serviceClassMask) 1234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville == CommandsInterface.SERVICE_CLASS_VOICE) { 1235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean cffEnabled = (info.status == 1); 1236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIccRecords != null) { 1237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled, info.number); 1238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return TextUtils.replace(template, sources, destinations); 1242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 1246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onQueryCfComplete(AsyncResult ar) { 1247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder sb = new StringBuilder(getScString()); 1248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("\n"); 1249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception != null) { 1251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 125201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 125301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (ar.exception instanceof ImsException) { 125401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh ImsException error = (ImsException) ar.exception; 125501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (error.getMessage() != null) { 125601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(error.getMessage()); 125701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 125801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 125901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 126001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 126101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh else { 126201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 126301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 1264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CallForwardInfo infos[]; 1266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville infos = (CallForwardInfo[]) ar.result; 1268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos.length == 0) { 1270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Assume the default is not active 1271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText(com.android.internal.R.string.serviceDisabled)); 1272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Set unconditional CFF in SIM to false 1274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIccRecords != null) { 1275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords.setVoiceCallForwardingFlag(1, false, null); 1276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville SpannableStringBuilder tb = new SpannableStringBuilder(); 1280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Each bit in the service class gets its own result line 1282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // The service classes may be split up over multiple 1283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // CallForwardInfos. So, for each service class, find out 1284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // which CallForwardInfo represents it and then build 1285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // the response text based on that 1286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int serviceClassMask = 1 1288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ; serviceClassMask <= SERVICE_CLASS_MAX 1289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ; serviceClassMask <<= 1 1290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ) { 1291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = infos.length; i < s ; i++) { 1292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((serviceClassMask & infos[i].serviceClass) != 0) { 1293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville tb.append(makeCFQueryResultMessage(infos[i], 1294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville serviceClassMask)); 1295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville tb.append("\n"); 1296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(tb); 1300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = sb; 1306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 1307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 131001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh private void onSuppSvcQueryComplete(AsyncResult ar) { 131101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh StringBuilder sb = new StringBuilder(getScString()); 131201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append("\n"); 131301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 131401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (ar.exception != null) { 131501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mState = State.FAILED; 131601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 131701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (ar.exception instanceof ImsException) { 131801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh ImsException error = (ImsException) ar.exception; 131901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (error.getMessage() != null) { 132001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(error.getMessage()); 132101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 132201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 132301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 132401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 132501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 132601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 1327a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1328a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.FAILED; 1329a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam ImsSsInfo ssInfo = null; 1330a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (ar.result instanceof Bundle) { 1331a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Rlog.d(LOG_TAG, "Received CLIP/COLP/COLR Response."); 1332a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // Response for CLIP, COLP and COLR queries. 1333a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Bundle ssInfoResp = (Bundle) ar.result; 1334a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam ssInfo = (ImsSsInfo) ssInfoResp.getParcelable(UT_BUNDLE_KEY_SSINFO); 1335a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (ssInfo != null) { 1336a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Rlog.d(LOG_TAG, "ImsSsInfo mStatus = " + ssInfo.mStatus); 1337a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (ssInfo.mStatus == ImsSsInfo.DISABLED) { 1338a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.serviceDisabled)); 1339a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1340a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else if (ssInfo.mStatus == ImsSsInfo.ENABLED) { 1341a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.serviceEnabled)); 1342a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1343a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1344a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.mmiError)); 1345a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1346a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1347a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.mmiError)); 1348a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1349a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1350a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1351a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Rlog.d(LOG_TAG, "Received Call Barring Response."); 1352a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // Response for Call Barring queries. 1353a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam int[] cbInfos = (int[]) ar.result; 1354a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // Check if ImsPhone has received call barring 1355a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // enabled for service class voice. 1356a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (cbInfos[0] == 1) { 1357a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.serviceEnabled)); 1358a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1359a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1360a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText(com.android.internal.R.string.serviceDisabled)); 1361a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1362a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1363a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1364a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1365a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1366a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1367a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mMessage = sb; 1368a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mPhone.onMMIDone(this); 1369a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1370a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1371a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam private void onQueryClirComplete(AsyncResult ar) { 1372a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam StringBuilder sb = new StringBuilder(getScString()); 1373a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append("\n"); 1374a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.FAILED; 1375a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1376a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (ar.exception != null) { 1377a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1378a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (ar.exception instanceof ImsException) { 1379a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam ImsException error = (ImsException) ar.exception; 1380a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam if (error.getMessage() != null) { 1381a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(error.getMessage()); 1382a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1383a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(getErrorMessage(ar)); 1384a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1385a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1386a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } else { 1387a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Bundle ssInfo = (Bundle) ar.result; 1388a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam int[] clirInfo = ssInfo.getIntArray(UT_BUNDLE_KEY_CLIR); 1389a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // clirInfo[0] = The 'n' parameter from TS 27.007 7.7 1390a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // clirInfo[1] = The 'm' parameter from TS 27.007 7.7 1391a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam Rlog.d(LOG_TAG, "CLIR param n=" + clirInfo[0] 1392a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam + " m=" + clirInfo[1]); 1393a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam 1394a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // 'm' parameter. 1395a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam switch (clirInfo[1]) { 1396a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_NOT_PROVISIONED: 1397a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1398a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.serviceNotProvisioned)); 1399a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1400a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1401a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_PROVISIONED_PERMANENT: 1402a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1403a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRPermanent)); 1404a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1405a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1406a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_PRESENTATION_RESTRICTED_TEMPORARY: 1407a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // 'n' parameter. 1408a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam switch (clirInfo[0]) { 1409a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_DEFAULT: 1410a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1411a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOnNextCallOn)); 1412a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1413a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1414a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_INVOCATION: 1415a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1416a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOnNextCallOn)); 1417a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1418a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1419a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_SUPPRESSION: 1420a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1421a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOnNextCallOff)); 1422a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1423a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1424a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam default: 1425a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1426a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.mmiError)); 1427a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.FAILED; 1428a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1429a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1430a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_PRESENTATION_ALLOWED_TEMPORARY: 1431a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam // 'n' parameter. 1432a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam switch (clirInfo[0]) { 1433a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_DEFAULT: 1434a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1435a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOffNextCallOff)); 1436a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1437a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1438a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_INVOCATION: 1439a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1440a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOffNextCallOn)); 1441a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1442a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1443a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam case CLIR_SUPPRESSION: 1444a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1445a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.CLIRDefaultOffNextCallOff)); 1446a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.COMPLETE; 1447a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1448a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam default: 1449a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1450a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.mmiError)); 1451a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.FAILED; 1452a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 1453a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam break; 1454a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam default: 1455a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam sb.append(mContext.getText( 1456a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam com.android.internal.R.string.mmiError)); 1457a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam mState = State.FAILED; 1458a8cd97e94b97b924e44377476cfe4e1fbfe49daeUma Maheswari Ramalingam } 145901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 146001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 146101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mMessage = sb; 146201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh mPhone.onMMIDone(this); 146301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 146401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 1465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 1466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onQueryComplete(AsyncResult ar) { 1467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder sb = new StringBuilder(getScString()); 1468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("\n"); 1469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception != null) { 1471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.FAILED; 147201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 147301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (ar.exception instanceof ImsException) { 147401b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh ImsException error = (ImsException) ar.exception; 147501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh if (error.getMessage() != null) { 147601b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(error.getMessage()); 147701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 147801b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 147901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 148001b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } else { 148101b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh sb.append(getErrorMessage(ar)); 148201b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh } 148301b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh 1484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int[] ints = (int[])ar.result; 1486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ints.length != 0) { 1488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ints[0] == 0) { 1489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText(com.android.internal.R.string.serviceDisabled)); 1490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mSc.equals(SC_WAIT)) { 1491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Call Waiting includes additional data in the response. 1492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(createQueryCallWaitingResultMessage(ints[1])); 1493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (ints[0] == 1) { 1494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // for all other services, treat it as a boolean 1495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText(com.android.internal.R.string.serviceEnabled)); 1496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText(com.android.internal.R.string.mmiError)); 1498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(mContext.getText(com.android.internal.R.string.mmiError)); 1501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.COMPLETE; 1503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMessage = sb; 1506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.onMMIDone(this); 1507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CharSequence 1510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville createQueryCallWaitingResultMessage(int serviceClass) { 1511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder sb = new StringBuilder( 1512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mContext.getText(com.android.internal.R.string.serviceEnabledFor)); 1513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int classMask = 1 1515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ; classMask <= SERVICE_CLASS_MAX 1516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ; classMask <<= 1 1517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ) { 1518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((classMask & serviceClass) != 0) { 1519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("\n"); 1520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append(serviceClassToCFString(classMask & serviceClass)); 1521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sb; 1524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*** 1527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * TODO: It would be nice to have a method here that can take in a dialstring and 1528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * figure out if there is an MMI code embedded within it. This code would replace 1529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * some of the string parsing functionality in the Phone App's 1530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * SpecialCharSequenceMgr class. 1531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String toString() { 1535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville StringBuilder sb = new StringBuilder("ImsPhoneMmiCode {"); 1536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("State=" + getState()); 1538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mAction != null) sb.append(" action=" + mAction); 1539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSc != null) sb.append(" sc=" + mSc); 1540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSia != null) sb.append(" sia=" + mSia); 1541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSib != null) sb.append(" sib=" + mSib); 1542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mSic != null) sb.append(" sic=" + mSic); 1543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPoundString != null) sb.append(" poundString=" + mPoundString); 1544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDialingNumber != null) sb.append(" dialingNumber=" + mDialingNumber); 1545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPwd != null) sb.append(" pwd=" + mPwd); 1546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sb.append("}"); 1547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sb.toString(); 1548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 1550