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