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 1953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiakimport android.app.Activity; 20800a988b95a4b9bc2bca2562108e54cd8bd21ee1Sudheer Shankaimport android.app.ActivityManager; 2153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiakimport android.app.Notification; 2253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiakimport android.app.NotificationManager; 2353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiakimport android.app.PendingIntent; 2453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiakimport android.content.BroadcastReceiver; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Context; 2604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.content.Intent; 27d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajanimport android.net.Uri; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult; 29df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordonimport android.os.Bundle; 30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler; 31a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message; 32af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiakimport android.os.PersistableBundle; 3304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.os.PowerManager; 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Registrant; 35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.RegistrantList; 3616b58d13bde6487c6993831ca63385915be8956epkanwarimport android.os.ResultReceiver; 3704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.os.PowerManager.WakeLock; 3804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.os.SystemProperties; 3904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.os.UserHandle; 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4116b58d13bde6487c6993831ca63385915be8956epkanwarimport android.telecom.VideoProfile; 42af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiakimport android.telephony.CarrierConfigManager; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.PhoneNumberUtils; 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 45322793ca2dfe1be9c088f88336a68921d4718addMeng Wangimport android.telephony.ServiceState; 4604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport android.telephony.SubscriptionManager; 47322793ca2dfe1be9c088f88336a68921d4718addMeng Wangimport android.telephony.TelephonyManager; 4816b58d13bde6487c6993831ca63385915be8956epkanwarimport android.telephony.UssdResponse; 49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.text.TextUtils; 50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCallForwardInfo; 522999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunnimport com.android.ims.ImsCallProfile; 5304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport com.android.ims.ImsEcbm; 5404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport com.android.ims.ImsEcbmStateListener; 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsException; 566e501e7dd96ad52ce80479ed1f85dfd71e8d060bPavel Zhamaitsiakimport com.android.ims.ImsManager; 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsReasonInfo; 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsSsInfo; 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsUtInterface; 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAOC; 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAOIC; 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAOICxH; 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAIC; 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAICr; 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BA_ALL; 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BA_MO; 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BA_MT; 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE; 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE; 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE; 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION; 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL; 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL; 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY; 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE; 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY; 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL; 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_NONE; 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 83ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajanimport com.android.internal.annotations.VisibleForTesting; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Call; 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallForwardInfo; 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException; 87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallTracker; 88a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CommandException; 89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CommandsInterface; 90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection; 911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.GsmCdmaPhone; 9216b58d13bde6487c6993831ca63385915be8956epkanwarimport com.android.internal.telephony.MmiCode; 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone; 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneConstants; 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneNotifier; 96ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.TelephonyComponentFactory; 9704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport com.android.internal.telephony.TelephonyIntents; 9804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingamimport com.android.internal.telephony.TelephonyProperties; 99df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordonimport com.android.internal.telephony.UUSInfo; 10008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganeshimport com.android.internal.telephony.gsm.SuppServiceNotification; 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IccRecords; 1027c29cabeb38ae8cb4f5764c2dc0a768de22d2f92fionaxuimport com.android.internal.telephony.util.NotificationChannelController; 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 104dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yuimport java.io.FileDescriptor; 105dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yuimport java.io.PrintWriter; 10631399e10cf6d07509c4fbc294e24a9323214767fpkanwarimport java.util.ArrayDeque; 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.ArrayList; 10831399e10cf6d07509c4fbc294e24a9323214767fpkanwarimport java.util.Deque; 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.List; 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide} 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 114888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohenpublic class ImsPhone extends ImsPhoneBase { 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String LOG_TAG = "ImsPhone"; 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final boolean DBG = true; 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final boolean VDBG = false; // STOPSHIP if true 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 119ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_SET_CALL_BARRING_DONE = EVENT_LAST + 1; 120ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_GET_CALL_BARRING_DONE = EVENT_LAST + 2; 121ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_SET_CALL_WAITING_DONE = EVENT_LAST + 3; 122ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_GET_CALL_WAITING_DONE = EVENT_LAST + 4; 123ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_SET_CLIR_DONE = EVENT_LAST + 5; 124ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_GET_CLIR_DONE = EVENT_LAST + 6; 125ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private static final int EVENT_DEFAULT_PHONE_DATA_STATE_CHANGED = EVENT_LAST + 7; 126322793ca2dfe1be9c088f88336a68921d4718addMeng Wang private static final int EVENT_SERVICE_STATE_CHANGED = EVENT_LAST + 8; 127322793ca2dfe1be9c088f88336a68921d4718addMeng Wang private static final int EVENT_VOICE_CALL_ENDED = EVENT_LAST + 9; 128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 12904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam static final int RESTART_ECM_TIMER = 0; // restart Ecm timer 130ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer 13104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 13204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // Default Emergency Callback Mode exit timer 13304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000; 13404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Instance Variables 1361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Phone mDefaultPhone; 137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCallTracker mCT; 138fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn ImsExternalCallTracker mExternalCallTracker; 139ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private ArrayList <ImsPhoneMmiCode> mPendingMMIs = new ArrayList<ImsPhoneMmiCode>(); 140ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private ServiceState mSS = new ServiceState(); 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // To redial silently through GSM or CDMA when dialing through IMS fails 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private String mLastDialString; 144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 145ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private WakeLock mWakeLock; 14604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 14704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // mEcmExitRespRegistrant is informed after the phone has been exited the emergency 14804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // callback mode keep track of if phone is in emergency callback mode 14904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private Registrant mEcmExitRespRegistrant; 15004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 15104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private final RegistrantList mSilentRedialRegistrants = new RegistrantList(); 15204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 153bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com private boolean mImsRegistered = false; 154288268d5528e0df03f348e303954813cb188c55bRekha Kumar 155322793ca2dfe1be9c088f88336a68921d4718addMeng Wang private boolean mRoaming = false; 156322793ca2dfe1be9c088f88336a68921d4718addMeng Wang 15708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh // List of Registrants to send supplementary service notifications to. 1588762e33ba987774e43aa9f4e216ebdb084d3a03eTyler Gunn private RegistrantList mSsnRegistrants = new RegistrantList(); 15908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 16004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // A runnable which is used to automatically exit from Ecm after a period of time. 16104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private Runnable mExitEcmRunnable = new Runnable() { 16204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam @Override 16304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void run() { 16404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam exitEmergencyCallbackMode(); 16504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 16604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam }; 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1680da16b3708f3394e9d72d8dd525a50ad37aa8a65Amit Mahajan private Uri[] mCurrentSubscriberUris; 169d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan 1700da16b3708f3394e9d72d8dd525a50ad37aa8a65Amit Mahajan protected void setCurrentSubscriberUris(Uri[] currentSubscriberUris) { 1710da16b3708f3394e9d72d8dd525a50ad37aa8a65Amit Mahajan this.mCurrentSubscriberUris = currentSubscriberUris; 172d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan } 173d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan 174d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan @Override 175d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan public Uri[] getCurrentSubscriberUris() { 1760da16b3708f3394e9d72d8dd525a50ad37aa8a65Amit Mahajan return mCurrentSubscriberUris; 177d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan } 178d2b1b9dbc1f6a4fa960c9b5762f82e503cc37c27Amit Mahajan 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Create Cf (Call forward) so that dialling number & 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // mIsCfu (true if reason is call forward unconditional) 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // mOnComplete (Message object passed by client) can be packed & 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // given as a single Cf object as user data to UtInterface. 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static class Cf { 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville final String mSetCfNumber; 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville final Message mOnComplete; 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville final boolean mIsCfu; 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Cf(String cfNumber, boolean isCfu, Message onComplete) { 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSetCfNumber = cfNumber; 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsCfu = isCfu; 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOnComplete = onComplete; 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Constructors 196ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan public ImsPhone(Context context, PhoneNotifier notifier, Phone defaultPhone) { 197ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan this(context, notifier, defaultPhone, false); 198ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan } 199ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan 200ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan @VisibleForTesting 201ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan public ImsPhone(Context context, PhoneNotifier notifier, Phone defaultPhone, 202ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan boolean unitTestMode) { 203ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan super("ImsPhone", context, notifier, unitTestMode); 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 205ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan mDefaultPhone = defaultPhone; 20691c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn // The ImsExternalCallTracker needs to be defined before the ImsPhoneCallTracker, as the 20791c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn // ImsPhoneCallTracker uses a thread to spool up the ImsManager. Part of this involves 20891c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn // setting the multiendpoint listener on the external call tracker. So we need to ensure 20991c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn // the external call tracker is available first to avoid potential timing issues. 210fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mExternalCallTracker = 21191c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn TelephonyComponentFactory.getInstance().makeImsExternalCallTracker(this); 21291c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn mCT = TelephonyComponentFactory.getInstance().makeImsPhoneCallTracker(this); 21391c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn mCT.registerPhoneStateListener(mExternalCallTracker); 21491c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn mExternalCallTracker.setCallPuller(mCT); 21593da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSS.setStateOff(); 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhoneId = mDefaultPhone.getPhoneId(); 21904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 22004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 22104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 22204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mWakeLock.setReferenceCounted(false); 22359d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh 22459d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh if (mDefaultPhone.getServiceStateTracker() != null) { 22559d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh mDefaultPhone.getServiceStateTracker() 22659d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh .registerForDataRegStateOrRatChanged(this, 227c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan EVENT_DEFAULT_PHONE_DATA_STATE_CHANGED, null); 22859d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh } 22959d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh updateDataServiceState(); 230322793ca2dfe1be9c088f88336a68921d4718addMeng Wang 231322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mDefaultPhone.registerForServiceStateChanged(this, EVENT_SERVICE_STATE_CHANGED, null); 2326b8591100999ba4f12f8b519c0444fb89cb8617aMeng Wang // Force initial roaming state update later, on EVENT_CARRIER_CONFIG_CHANGED. 2336b8591100999ba4f12f8b519c0444fb89cb8617aMeng Wang // Settings provider or CarrierConfig may not be loaded now. 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 236ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan //todo: get rid of this function. It is not needed since parentPhone obj never changes 237c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void dispose() { 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "dispose"); 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Nothing to dispose in Phone 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //super.dispose(); 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPendingMMIs.clear(); 24391c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn mExternalCallTracker.tearDown(); 24491c714c06cc426b4f1af05a758c4d560b16f6d24Tyler Gunn mCT.unregisterPhoneStateListener(mExternalCallTracker); 245322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mCT.unregisterForVoiceCallEnded(this); 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.dispose(); 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Force all referenced classes to unregister their former registered events 24959d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh if (mDefaultPhone != null && mDefaultPhone.getServiceStateTracker() != null) { 25059d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh mDefaultPhone.getServiceStateTracker(). 25159d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh unregisterForDataRegStateOrRatChanged(this); 252322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mDefaultPhone.unregisterForServiceStateChanged(this); 25359d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh } 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ServiceState 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getServiceState() { 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mSS; 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void setServiceState(int state) { 263410298cb95b110609193941807aff6c9676d2304Jack Yu mSS.setVoiceRegState(state); 26459d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh updateDataServiceState(); 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public CallTracker getCallTracker() { 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT; 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 272fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public ImsExternalCallTracker getExternalCallTracker() { 273fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return mExternalCallTracker; 274fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 275fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public List<? extends ImsPhoneMmiCode> 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getPendingMmiCodes() { 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mPendingMMIs; 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 2846d05f561549a66b597a5119665ccc3bf8a962d16Andrew Lee acceptCall(int videoState) throws CallStateException { 2852999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn mCT.acceptCall(videoState); 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville rejectCall() throws CallStateException { 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.rejectCall(); 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switchHoldingAndActive() throws CallStateException { 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.switchWaitingOrHoldingAndActive(); 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean canConference() { 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.canConference(); 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean canDial() { 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.canDial(); 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void conference() { 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.conference(); 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void clearDisconnected() { 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.clearDisconnected(); 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean canTransfer() { 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.canTransfer(); 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void explicitCallTransfer() { 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.explicitCallTransfer(); 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getForegroundCall() { 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.mForegroundCall; 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getBackgroundCall() { 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.mBackgroundCall; 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public ImsPhoneCall 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getRingingCall() { 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.mRingingCall; 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleCallDeflectionIncallSupplementaryService( 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String dialString) { 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.length() > 1) { 350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (getRingingCall().getState() != ImsPhoneCall.State.IDLE) { 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 0: rejectCall"); 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.rejectCall(); 357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException e) { 358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "reject failed", e); 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.REJECT); 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (getBackgroundCall().getState() != ImsPhoneCall.State.IDLE) { 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 0: hangupWaitingOrBackground"); 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.hangup(getBackgroundCall()); 365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException e) { 366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "hangup failed", e); 367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 37331399e10cf6d07509c4fbc294e24a9323214767fpkanwar private void sendUssdResponse(String ussdRequest, CharSequence message, int returnCode, 37431399e10cf6d07509c4fbc294e24a9323214767fpkanwar ResultReceiver wrappedCallback) { 37531399e10cf6d07509c4fbc294e24a9323214767fpkanwar UssdResponse response = new UssdResponse(ussdRequest, message); 37631399e10cf6d07509c4fbc294e24a9323214767fpkanwar Bundle returnData = new Bundle(); 37731399e10cf6d07509c4fbc294e24a9323214767fpkanwar returnData.putParcelable(TelephonyManager.USSD_RESPONSE, response); 37831399e10cf6d07509c4fbc294e24a9323214767fpkanwar wrappedCallback.send(returnCode, returnData); 37931399e10cf6d07509c4fbc294e24a9323214767fpkanwar 38031399e10cf6d07509c4fbc294e24a9323214767fpkanwar } 38131399e10cf6d07509c4fbc294e24a9323214767fpkanwar 38216b58d13bde6487c6993831ca63385915be8956epkanwar @Override 383feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn public boolean handleUssdRequest(String ussdRequest, ResultReceiver wrappedCallback) 384feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn throws CallStateException { 385feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn if (mPendingMMIs.size() > 0) { 386feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // There are MMI codes in progress; fail attempt now. 387feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn Rlog.i(LOG_TAG, "handleUssdRequest: queue full: " + Rlog.pii(LOG_TAG, ussdRequest)); 38831399e10cf6d07509c4fbc294e24a9323214767fpkanwar sendUssdResponse(ussdRequest, null, TelephonyManager.USSD_RETURN_FAILURE, 38931399e10cf6d07509c4fbc294e24a9323214767fpkanwar wrappedCallback ); 39031399e10cf6d07509c4fbc294e24a9323214767fpkanwar return true; 39131399e10cf6d07509c4fbc294e24a9323214767fpkanwar } 39216b58d13bde6487c6993831ca63385915be8956epkanwar try { 39331399e10cf6d07509c4fbc294e24a9323214767fpkanwar dialInternal(ussdRequest, VideoProfile.STATE_AUDIO_ONLY, null, wrappedCallback); 394feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } catch (CallStateException cse) { 395feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn if (CS_FALLBACK.equals(cse.getMessage())) { 396feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn throw cse; 397feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } else { 398feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn Rlog.w(LOG_TAG, "Could not execute USSD " + cse); 399feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn sendUssdResponse(ussdRequest, null, TelephonyManager.USSD_RETURN_FAILURE, 400feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn wrappedCallback); 401feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } 40216b58d13bde6487c6993831ca63385915be8956epkanwar } catch (Exception e) { 403feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn Rlog.w(LOG_TAG, "Could not execute USSD " + e); 404feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn sendUssdResponse(ussdRequest, null, TelephonyManager.USSD_RETURN_FAILURE, 405feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn wrappedCallback); 40631399e10cf6d07509c4fbc294e24a9323214767fpkanwar return false; 40716b58d13bde6487c6993831ca63385915be8956epkanwar } 40831399e10cf6d07509c4fbc294e24a9323214767fpkanwar return true; 40916b58d13bde6487c6993831ca63385915be8956epkanwar } 41016b58d13bde6487c6993831ca63385915be8956epkanwar 411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleCallWaitingIncallSupplementaryService( 412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String dialString) { 413a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int len = dialString.length(); 414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (len > 2) { 416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 417a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall call = getForegroundCall(); 420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (len > 1) { 423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "not support 1X SEND"); 424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.HANGUP); 425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (call.getState() != ImsPhoneCall.State.IDLE) { 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 1: hangup foreground"); 428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.hangup(call); 429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 1: switchWaitingOrHoldingAndActive"); 431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.switchWaitingOrHoldingAndActive(); 432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException e) { 435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "hangup failed", e); 436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.HANGUP); 437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleCallHoldIncallSupplementaryService(String dialString) { 443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int len = dialString.length(); 444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (len > 2) { 446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (len > 1) { 450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "separate not supported"); 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.SEPARATE); 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (getRingingCall().getState() != ImsPhoneCall.State.IDLE) { 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 2: accept ringing call"); 4562999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn mCT.acceptCall(ImsCallProfile.CALL_TYPE_VOICE); 457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 2: switchWaitingOrHoldingAndActive"); 459a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.switchWaitingOrHoldingAndActive(); 460a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException e) { 462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "switch failed", e); 463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.SWITCH); 464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleMultipartyIncallSupplementaryService( 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String dialString) { 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.length() > 1) { 473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 3: merge calls"); 477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville conference(); 478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleEctIncallSupplementaryService(String dialString) { 482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int len = dialString.length(); 484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (len != 1) { 486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "MmiCode 4: not support explicit call transfer"); 490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.TRANSFER); 491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean handleCcbsIncallSupplementaryService(String dialString) { 495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dialString.length() > 1) { 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.i(LOG_TAG, "MmiCode 5: CCBS not supported!"); 500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Treat it as an "unknown" service. 501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifySuppServiceFailed(Phone.SuppService.UNKNOWN); 502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 50508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh public void notifySuppSvcNotification(SuppServiceNotification suppSvc) { 50608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh Rlog.d(LOG_TAG, "notifySuppSvcNotification: suppSvc = " + suppSvc); 50708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 50808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh AsyncResult ar = new AsyncResult(null, suppSvc, null); 50908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mSsnRegistrants.notifyRegistrants(ar); 51008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 51108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean handleInCallMmiCommands(String dialString) { 514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!isInCall()) { 515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 516a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (TextUtils.isEmpty(dialString)) { 519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 520a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 521a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 522a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean result = false; 523a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville char ch = dialString.charAt(0); 524a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (ch) { 525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '0': 526a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleCallDeflectionIncallSupplementaryService( 527a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dialString); 528a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 529a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '1': 530a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleCallWaitingIncallSupplementaryService( 531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dialString); 532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '2': 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleCallHoldIncallSupplementaryService(dialString); 535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '3': 537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleMultipartyIncallSupplementaryService(dialString); 538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '4': 540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleEctIncallSupplementaryService(dialString); 541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case '5': 543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = handleCcbsIncallSupplementaryService(dialString); 544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 545a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return result; 550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 552a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isInCall() { 553a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall.State foregroundCallState = getForegroundCall().getState(); 554a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall.State backgroundCallState = getBackgroundCall().getState(); 555a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall.State ringingCallState = getRingingCall().getState(); 556a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 557a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (foregroundCallState.isAlive() || 558a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville backgroundCallState.isAlive() || 559a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ringingCallState.isAlive()); 560a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 561a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 562468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian @Override 563468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian public boolean isInEcm() { 564468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian return mDefaultPhone.isInEcm(); 565468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian } 566468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian 567468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian @Override 568468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian public void setIsInEcm(boolean isInEcm){ 569468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian mDefaultPhone.setIsInEcm(isInEcm); 570468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian } 571468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian 57275ba09a17a669f4906268088a769836aa87d8241fionaxu public void notifyNewRingingConnection(Connection c) { 57338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen mDefaultPhone.notifyNewRingingConnectionP(c); 57438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen } 57538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen 57608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh void notifyUnknownConnection(Connection c) { 57708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mDefaultPhone.notifyUnknownConnectionP(c); 57808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 57908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 580ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 581288268d5528e0df03f348e303954813cb188c55bRekha Kumar public void notifyForVideoCapabilityChanged(boolean isVideoCapable) { 582288268d5528e0df03f348e303954813cb188c55bRekha Kumar mIsVideoCapable = isVideoCapable; 583288268d5528e0df03f348e303954813cb188c55bRekha Kumar mDefaultPhone.notifyForVideoCapabilityChanged(isVideoCapable); 584288268d5528e0df03f348e303954813cb188c55bRekha Kumar } 585288268d5528e0df03f348e303954813cb188c55bRekha Kumar 586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection 5886bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn dial(String dialString, int videoState) throws CallStateException { 58916b58d13bde6487c6993831ca63385915be8956epkanwar return dialInternal(dialString, videoState, null, null); 5906bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn } 5916bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn 592df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon @Override 593df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon public Connection 594df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) 595df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon throws CallStateException { 596df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon // ignore UUSInfo 59716b58d13bde6487c6993831ca63385915be8956epkanwar return dialInternal (dialString, videoState, intentExtras, null); 598df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon } 599df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon 60016b58d13bde6487c6993831ca63385915be8956epkanwar protected Connection dialInternal(String dialString, int videoState, Bundle intentExtras) 60116b58d13bde6487c6993831ca63385915be8956epkanwar throws CallStateException { 60216b58d13bde6487c6993831ca63385915be8956epkanwar return dialInternal(dialString, videoState, intentExtras, null); 60316b58d13bde6487c6993831ca63385915be8956epkanwar } 60416b58d13bde6487c6993831ca63385915be8956epkanwar 60516b58d13bde6487c6993831ca63385915be8956epkanwar private Connection dialInternal(String dialString, int videoState, 60616b58d13bde6487c6993831ca63385915be8956epkanwar Bundle intentExtras, ResultReceiver wrappedCallback) 6076bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn throws CallStateException { 608a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Need to make sure dialString gets parsed properly 609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String newDialString = PhoneNumberUtils.stripSeparators(dialString); 610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // handle in-call MMI first if applicable 612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (handleInCallMmiCommands(newDialString)) { 613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDefaultPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { 617df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon return mCT.dial(dialString, videoState, intentExtras); 618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 620a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Only look at the Network portion for mmi 621a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString); 622a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode mmi = 623feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn ImsPhoneMmiCode.newFromDialString(networkPortion, this, wrappedCallback); 624a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, 625feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn "dialInternal: dialing w/ mmi '" + mmi + "'..."); 626a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 627a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mmi == null) { 628df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon return mCT.dial(dialString, videoState, intentExtras); 629a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (mmi.isTemporaryModeCLIR()) { 630df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon return mCT.dial(mmi.getDialingNumber(), mmi.getCLIRMode(), videoState, intentExtras); 631a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (!mmi.isSupportedOverImsPhone()) { 632a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If the mmi is not supported by IMS service, 633a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // try to initiate dialing with default phone 634feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // Note: This code is never reached; there is a bug in isSupportedOverImsPhone which 635feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // causes it to return true even though the "processCode" method ultimately throws the 636feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // exception. 637feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn Rlog.i(LOG_TAG, "dialInternal: USSD not supported by IMS; fallback to CS."); 638888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen throw new CallStateException(CS_FALLBACK); 639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 640feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn mPendingMMIs.add(mmi); 641feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 642feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn 643feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn try { 644feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn mmi.processCode(); 645feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } catch (CallStateException cse) { 646feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn if (CS_FALLBACK.equals(cse.getMessage())) { 647feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn Rlog.i(LOG_TAG, "dialInternal: fallback to GSM required."); 648feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // Make sure we remove from the list of pending MMIs since it will handover to 649feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn // GSM. 650feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn mPendingMMIs.remove(mmi); 651feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn throw cse; 652feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } 653feefaf43d83ee53c9f9798206a387448f233f7a9Tyler Gunn } 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 655a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 656a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 657a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 658a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 659a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 660a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 661a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendDtmf(char c) { 662a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!PhoneNumberUtils.is12Key(c)) { 663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, 664a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville "sendDtmf called with invalid character '" + c + "'"); 665a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 6669f5345c094210aa5d6606b7705a85a7bc17e831dAmit Mahajan if (mCT.getState() == PhoneConstants.State.OFFHOOK) { 667d9aa1a75304b1c04c352198b9269f40a2a059f74Andrew Lee mCT.sendDtmf(c, null); 668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 669a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 670a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 671a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 672a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 673a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 674a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville startDtmf(char c) { 675c204cc0f515864b36187d60f6ab79af28885d36eUma Maheswari Ramalingam if (!(PhoneNumberUtils.is12Key(c) || (c >= 'A' && c <= 'D'))) { 676a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, 677a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville "startDtmf called with invalid character '" + c + "'"); 678a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 679c204cc0f515864b36187d60f6ab79af28885d36eUma Maheswari Ramalingam mCT.startDtmf(c); 680a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 681a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 682a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 683a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 684a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 685a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville stopDtmf() { 686c204cc0f515864b36187d60f6ab79af28885d36eUma Maheswari Ramalingam mCT.stopDtmf(); 687a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 688a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 68975ba09a17a669f4906268088a769836aa87d8241fionaxu public void notifyIncomingRing() { 690a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "notifyIncomingRing"); 691a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = new AsyncResult(null, null, null); 692a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendMessage(obtainMessage(EVENT_CALL_RING, ar)); 693a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 694a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 695a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 696a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setMute(boolean muted) { 697a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.setMute(muted); 698a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 699a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 700a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 701b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh public void setUiTTYMode(int uiTtyMode, Message onComplete) { 702b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh mCT.setUiTTYMode(uiTtyMode, onComplete); 703b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh } 704b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh 705b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh @Override 706a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean getMute() { 707a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mCT.getMute(); 708a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 709a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 710a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 711a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public PhoneConstants.State getState() { 7129f5345c094210aa5d6606b7705a85a7bc17e831dAmit Mahajan return mCT.getState(); 713a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 714a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 715a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) { 716a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (commandInterfaceCFReason) { 717a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_UNCONDITIONAL: 718a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_BUSY: 719a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_NO_REPLY: 720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_NOT_REACHABLE: 721a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_ALL: 722a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_ALL_CONDITIONAL: 723a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 724a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 725a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 726a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 727a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 728a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 729a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) { 730a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (commandInterfaceCFAction) { 731a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_DISABLE: 732a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_ENABLE: 733a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_REGISTRATION: 734a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_ERASURE: 735a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 736a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 737a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 738a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 739a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 740a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 741a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean isCfEnable(int action) { 742a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION); 743a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 744a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 745a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int getConditionFromCFReason(int reason) { 746a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch(reason) { 747a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_UNCONDITIONAL: return ImsUtInterface.CDIV_CF_UNCONDITIONAL; 748a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_BUSY: return ImsUtInterface.CDIV_CF_BUSY; 749a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_NO_REPLY: return ImsUtInterface.CDIV_CF_NO_REPLY; 750a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_REASON_NOT_REACHABLE: return ImsUtInterface.CDIV_CF_NOT_REACHABLE; 7513f1fa0373259a7c65b9471c862a6b5402ea07fe0Omkar Kolangade case CF_REASON_ALL: return ImsUtInterface.CDIV_CF_ALL; 7523f1fa0373259a7c65b9471c862a6b5402ea07fe0Omkar Kolangade case CF_REASON_ALL_CONDITIONAL: return ImsUtInterface.CDIV_CF_ALL_CONDITIONAL; 753a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 754a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 755a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 756a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 757a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.INVALID; 758a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 759a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 760a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int getCFReasonFromCondition(int condition) { 761a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch(condition) { 762a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsUtInterface.CDIV_CF_UNCONDITIONAL: return CF_REASON_UNCONDITIONAL; 763a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsUtInterface.CDIV_CF_BUSY: return CF_REASON_BUSY; 764a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsUtInterface.CDIV_CF_NO_REPLY: return CF_REASON_NO_REPLY; 765a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsUtInterface.CDIV_CF_NOT_REACHABLE: return CF_REASON_NOT_REACHABLE; 7663f1fa0373259a7c65b9471c862a6b5402ea07fe0Omkar Kolangade case ImsUtInterface.CDIV_CF_ALL: return CF_REASON_ALL; 7673f1fa0373259a7c65b9471c862a6b5402ea07fe0Omkar Kolangade case ImsUtInterface.CDIV_CF_ALL_CONDITIONAL: return CF_REASON_ALL_CONDITIONAL; 768a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 769a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 770a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 771a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 772a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return CF_REASON_NOT_REACHABLE; 773a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 774a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 775a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int getActionFromCFAction(int action) { 776a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch(action) { 777a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_DISABLE: return ImsUtInterface.ACTION_DEACTIVATION; 778a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_ENABLE: return ImsUtInterface.ACTION_ACTIVATION; 779a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_ERASURE: return ImsUtInterface.ACTION_ERASURE; 780a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case CF_ACTION_REGISTRATION: return ImsUtInterface.ACTION_REGISTRATION; 781a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 782a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 783a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 784a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 785a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.INVALID; 786a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 787a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 788a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 78908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh public void getOutgoingCallerIdDisplay(Message onComplete) { 79008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh if (DBG) Rlog.d(LOG_TAG, "getCLIR"); 79108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh Message resp; 79208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh resp = obtainMessage(EVENT_GET_CLIR_DONE, onComplete); 79308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 79408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh try { 79508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ImsUtInterface ut = mCT.getUtInterface(); 79608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ut.queryCLIR(resp); 79708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } catch (ImsException e) { 79808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh sendErrorResponse(onComplete, e); 79908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 80008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 80108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 80208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh @Override 80308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh public void setOutgoingCallerIdDisplay(int clirMode, Message onComplete) { 80408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh if (DBG) Rlog.d(LOG_TAG, "setCLIR action= " + clirMode); 80508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh Message resp; 80699faf716a99c5eda3dc6693c5afbb94897c8cd4bShriram Ganesh // Packing CLIR value in the message. This will be required for 80799faf716a99c5eda3dc6693c5afbb94897c8cd4bShriram Ganesh // SharedPreference caching, if the message comes back as part of 80899faf716a99c5eda3dc6693c5afbb94897c8cd4bShriram Ganesh // a success response. 80999faf716a99c5eda3dc6693c5afbb94897c8cd4bShriram Ganesh resp = obtainMessage(EVENT_SET_CLIR_DONE, clirMode, 0, onComplete); 81008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh try { 81108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ImsUtInterface ut = mCT.getUtInterface(); 81208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ut.updateCLIR(clirMode, resp); 81308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } catch (ImsException e) { 81408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh sendErrorResponse(onComplete, e); 81508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 81608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 81708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 81808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh @Override 819a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void getCallForwardingOption(int commandInterfaceCFReason, 820a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message onComplete) { 821a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "getCallForwardingOption reason=" + commandInterfaceCFReason); 822a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) { 823a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "requesting call forwarding query."); 824a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 825a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete); 826a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 827a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 828a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 829c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan ut.queryCallForward(getConditionFromCFReason(commandInterfaceCFReason), null, resp); 830a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 831a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 832a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 833a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (onComplete != null) { 834a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete); 835a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 836a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 837a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 838a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 839a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setCallForwardingOption(int commandInterfaceCFAction, 840a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int commandInterfaceCFReason, 841a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String dialingNumber, 842a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int timerSeconds, 843a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message onComplete) { 8441d60bf2949d68b587886411543752a7922529804Omkar Kolangade setCallForwardingOption(commandInterfaceCFAction, commandInterfaceCFReason, dialingNumber, 8451d60bf2949d68b587886411543752a7922529804Omkar Kolangade CommandsInterface.SERVICE_CLASS_VOICE, timerSeconds, onComplete); 8461d60bf2949d68b587886411543752a7922529804Omkar Kolangade } 8471d60bf2949d68b587886411543752a7922529804Omkar Kolangade 8481d60bf2949d68b587886411543752a7922529804Omkar Kolangade public void setCallForwardingOption(int commandInterfaceCFAction, 8491d60bf2949d68b587886411543752a7922529804Omkar Kolangade int commandInterfaceCFReason, 8501d60bf2949d68b587886411543752a7922529804Omkar Kolangade String dialingNumber, 8511d60bf2949d68b587886411543752a7922529804Omkar Kolangade int serviceClass, 8521d60bf2949d68b587886411543752a7922529804Omkar Kolangade int timerSeconds, 8531d60bf2949d68b587886411543752a7922529804Omkar Kolangade Message onComplete) { 854a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "setCallForwardingOption action=" + commandInterfaceCFAction 8551d60bf2949d68b587886411543752a7922529804Omkar Kolangade + ", reason=" + commandInterfaceCFReason + " serviceClass=" + serviceClass); 856a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((isValidCommandInterfaceCFAction(commandInterfaceCFAction)) && 857a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) { 858a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 859a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Cf cf = new Cf(dialingNumber, 860a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL ? true : false), 861a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onComplete); 862a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE, 863a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, cf); 864a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 865a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 866a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 867a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ut.updateCallForward(getActionFromCFAction(commandInterfaceCFAction), 868a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getConditionFromCFReason(commandInterfaceCFReason), 869a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville dialingNumber, 8701d60bf2949d68b587886411543752a7922529804Omkar Kolangade serviceClass, 871a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville timerSeconds, 872b2f4c9d1564e9f49ecf2b11097730d3a8889da96Hall Liu resp); 87393c62c8a71821f46194e16ca3e84f95e101edb90Amit Mahajan } catch (ImsException e) { 874a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 87593c62c8a71821f46194e16ca3e84f95e101edb90Amit Mahajan } 876a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (onComplete != null) { 877a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete); 878a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 879a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 880a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 881a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 882a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void getCallWaiting(Message onComplete) { 883a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "getCallWaiting"); 884a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 885a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_GET_CALL_WAITING_DONE, onComplete); 886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 887a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 888a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 889a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ut.queryCallWaiting(resp); 890a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 891a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 893a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 894a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 895a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 896a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setCallWaiting(boolean enable, Message onComplete) { 8971d60bf2949d68b587886411543752a7922529804Omkar Kolangade setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete); 8981d60bf2949d68b587886411543752a7922529804Omkar Kolangade } 8991d60bf2949d68b587886411543752a7922529804Omkar Kolangade 9001d60bf2949d68b587886411543752a7922529804Omkar Kolangade public void setCallWaiting(boolean enable, int serviceClass, Message onComplete) { 901a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "setCallWaiting enable=" + enable); 902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 903a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_SET_CALL_WAITING_DONE, onComplete); 904a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 905a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 906a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 9071d60bf2949d68b587886411543752a7922529804Omkar Kolangade ut.updateCallWaiting(enable, serviceClass, resp); 908a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 909a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 913a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int getCBTypeFromFacility(String facility) { 914a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (CB_FACILITY_BAOC.equals(facility)) { 915a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.CB_BAOC; 916a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BAOIC.equals(facility)) { 917a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.CB_BOIC; 918a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BAOICxH.equals(facility)) { 919a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.CB_BOIC_EXHC; 920a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BAIC.equals(facility)) { 921a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.CB_BAIC; 922a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BAICr.equals(facility)) { 923a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ImsUtInterface.CB_BIC_WR; 924a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BA_ALL.equals(facility)) { 92501b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh return ImsUtInterface.CB_BA_ALL; 926a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BA_MO.equals(facility)) { 92701b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh return ImsUtInterface.CB_BA_MO; 928a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (CB_FACILITY_BA_MT.equals(facility)) { 92901b334cc4f2538287f5c64b3ea8d2d9c6ee77772Shriram Ganesh return ImsUtInterface.CB_BA_MT; 930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 931a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 932a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return 0; 933a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 934a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 935cc8ea4abbe4f1f755dc5cf1b576d51ceb24fe79dAmit Mahajan public void getCallBarring(String facility, Message onComplete) { 936a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "getCallBarring facility=" + facility); 937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 938a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_GET_CALL_BARRING_DONE, onComplete); 939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 942a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ut.queryCallBarring(getCBTypeFromFacility(facility), resp); 943a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 944a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 945a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 946a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 947a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 948cc8ea4abbe4f1f755dc5cf1b576d51ceb24fe79dAmit Mahajan public void setCallBarring(String facility, boolean lockState, String password, Message 949cc8ea4abbe4f1f755dc5cf1b576d51ceb24fe79dAmit Mahajan onComplete) { 950a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "setCallBarring facility=" + facility 951a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + ", lockState=" + lockState); 952a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message resp; 953a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resp = obtainMessage(EVENT_SET_CALL_BARRING_DONE, onComplete); 954a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 95508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh int action; 95608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh if (lockState) { 95708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh action = CommandsInterface.CF_ACTION_ENABLE; 95808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 95908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh else { 96008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh action = CommandsInterface.CF_ACTION_DISABLE; 96108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 96208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 963a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 964a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsUtInterface ut = mCT.getUtInterface(); 965a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // password is not required with Ut interface 96608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ut.updateCallBarring(getCBTypeFromFacility(facility), action, resp, null); 967a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 968a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendErrorResponse(onComplete, e); 969a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 970a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 971a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 972a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 973a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void sendUssdResponse(String ussdMessge) { 974a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "sendUssdResponse"); 975a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode mmi = ImsPhoneMmiCode.newFromUssdUserInput(ussdMessge, this); 976a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPendingMMIs.add(mmi); 977a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 978a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mmi.sendUssd(ussdMessge); 979a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 980a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 981cc8ea4abbe4f1f755dc5cf1b576d51ceb24fe79dAmit Mahajan public void sendUSSD(String ussdString, Message response) { 982a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.sendUSSD(ussdString, response); 983a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 984a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 985c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 986c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public void cancelUSSD() { 987a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.cancelUSSD(); 988a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 990ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private void sendErrorResponse(Message onComplete) { 991a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "sendErrorResponse"); 992a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (onComplete != null) { 993a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult.forMessage(onComplete, null, 994a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville new CommandException(CommandException.Error.GENERIC_FAILURE)); 995a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onComplete.sendToTarget(); 996a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 997a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 998a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 999ec581c0b21b5da662b9fe60a8212a66196a9f05cBrad Ebinger @VisibleForTesting 1000ec581c0b21b5da662b9fe60a8212a66196a9f05cBrad Ebinger public void sendErrorResponse(Message onComplete, Throwable e) { 1001a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "sendErrorResponse"); 1002a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (onComplete != null) { 1003a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult.forMessage(onComplete, null, getCommandException(e)); 1004a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onComplete.sendToTarget(); 1005a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1006a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1007a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1008ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private CommandException getCommandException(int code, String errorString) { 100908e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh Rlog.d(LOG_TAG, "getCommandException code= " + code 101008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh + ", errorString= " + errorString); 1011a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CommandException.Error error = CommandException.Error.GENERIC_FAILURE; 1012a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1013a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch(code) { 1014a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsReasonInfo.CODE_UT_NOT_SUPPORTED: 1015a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville error = CommandException.Error.REQUEST_NOT_SUPPORTED; 1016a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1017a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case ImsReasonInfo.CODE_UT_CB_PASSWORD_MISMATCH: 1018a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville error = CommandException.Error.PASSWORD_INCORRECT; 1019a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 10207ada7424c83980c3d6ea2aeb46ab9641f592448dPavel Zhamaitsiak case ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE: 10217ada7424c83980c3d6ea2aeb46ab9641f592448dPavel Zhamaitsiak error = CommandException.Error.RADIO_NOT_AVAILABLE; 1022a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville default: 1023a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1024a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1025a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 102608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh return new CommandException(error, errorString); 1027a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1028a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1029ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private CommandException getCommandException(Throwable e) { 1030a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CommandException ex = null; 1031a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1032a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (e instanceof ImsException) { 103308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh ex = getCommandException(((ImsException)e).getCode(), e.getMessage()); 1034a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1035a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "getCommandException generic failure"); 1036a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ex = new CommandException(CommandException.Error.GENERIC_FAILURE); 1037a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1038a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ex; 1039a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1040a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1041a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 1042a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onNetworkInitiatedUssd(ImsPhoneMmiCode mmi) { 1043a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "onNetworkInitiatedUssd"); 1044a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mMmiCompleteRegistrants.notifyRegistrants( 1045a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville new AsyncResult(null, mmi, null)); 1046a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1047a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1048a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ 1049ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan void onIncomingUSSD(int ussdMode, String ussdMessage) { 1050a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "onIncomingUSSD ussdMode=" + ussdMode); 1051a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1052a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isUssdError; 1053a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean isUssdRequest; 1054a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1055a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isUssdRequest 1056a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville = (ussdMode == CommandsInterface.USSD_MODE_REQUEST); 1057a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1058a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isUssdError 1059a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY 1060a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && ussdMode != CommandsInterface.USSD_MODE_REQUEST); 1061a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1062a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode found = null; 1063a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) { 1064a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if(mPendingMMIs.get(i).isPendingUSSD()) { 1065a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville found = mPendingMMIs.get(i); 1066a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1067a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1068a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1069a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1070a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (found != null) { 1071a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Complete pending USSD 1072a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isUssdError) { 1073a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville found.onUssdFinishedError(); 1074a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1075a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville found.onUssdFinished(ussdMessage, isUssdRequest); 1076a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 107731399e10cf6d07509c4fbc294e24a9323214767fpkanwar } else if (!isUssdError && ussdMessage != null) { 107831399e10cf6d07509c4fbc294e24a9323214767fpkanwar // pending USSD not found 107931399e10cf6d07509c4fbc294e24a9323214767fpkanwar // The network may initiate its own USSD request 1080a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 108131399e10cf6d07509c4fbc294e24a9323214767fpkanwar // ignore everything that isnt a Notify or a Request 108231399e10cf6d07509c4fbc294e24a9323214767fpkanwar // also, discard if there is no message to present 1083a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneMmiCode mmi; 1084a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mmi = ImsPhoneMmiCode.newNetworkInitiatedUssd(ussdMessage, 1085a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isUssdRequest, 1086c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan this); 1087a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onNetworkInitiatedUssd(mmi); 1088a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1089a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1090a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1091a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 1092a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Removes the given MMI from the pending list and notifies 1093a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * registrants that it is complete. 1094a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @param mmi MMI that is done 1095a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1096c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public void onMMIDone(ImsPhoneMmiCode mmi) { 1097a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* Only notify complete if it's on the pending list. 1098a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Otherwise, it's already been handled (eg, previously canceled). 1099a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * The exception is cancellation of an incoming USSD-REQUEST, which is 1100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * not on the list. 1101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 11025b58978562c11e704b42a745bda55d6319a9b0c8Tyler Gunn Rlog.d(LOG_TAG, "onMMIDone: mmi=" + mmi); 1103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest()) { 110416b58d13bde6487c6993831ca63385915be8956epkanwar ResultReceiver receiverCallback = mmi.getUssdCallbackReceiver(); 110516b58d13bde6487c6993831ca63385915be8956epkanwar if (receiverCallback != null) { 110616b58d13bde6487c6993831ca63385915be8956epkanwar int returnCode = (mmi.getState() == MmiCode.State.COMPLETE) ? 110716b58d13bde6487c6993831ca63385915be8956epkanwar TelephonyManager.USSD_RETURN_SUCCESS : TelephonyManager.USSD_RETURN_FAILURE; 110831399e10cf6d07509c4fbc294e24a9323214767fpkanwar sendUssdResponse(mmi.getDialString(), mmi.getMessage(), returnCode, 110931399e10cf6d07509c4fbc294e24a9323214767fpkanwar receiverCallback ); 111016b58d13bde6487c6993831ca63385915be8956epkanwar } else { 11115b58978562c11e704b42a745bda55d6319a9b0c8Tyler Gunn Rlog.v(LOG_TAG, "onMMIDone: notifyRegistrants"); 111216b58d13bde6487c6993831ca63385915be8956epkanwar mMmiCompleteRegistrants.notifyRegistrants( 1113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville new AsyncResult(null, mmi, null)); 111416b58d13bde6487c6993831ca63385915be8956epkanwar } 1115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1118c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 11194be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam public ArrayList<Connection> getHandoverConnection() { 11204be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam ArrayList<Connection> connList = new ArrayList<Connection>(); 11214be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam // Add all foreground call connections 11224be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam connList.addAll(getForegroundCall().mConnections); 11234be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam // Add all background call connections 11244be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam connList.addAll(getBackgroundCall().mConnections); 11254be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam // Add all background call connections 11264be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam connList.addAll(getRingingCall().mConnections); 11274be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam if (connList.size() > 0) { 11284be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam return connList; 11294be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam } else { 11304be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam return null; 1131befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh } 1132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1134c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void notifySrvccState(Call.SrvccState state) { 1136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT.notifySrvccState(state); 1137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void 1140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville initiateSilentRedial() { 1141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String result = mLastDialString; 1142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = new AsyncResult(null, result, null); 1143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar != null) { 1144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSilentRedialRegistrants.notifyRegistrants(ar); 1145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1148c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void registerForSilentRedial(Handler h, int what, Object obj) { 1150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSilentRedialRegistrants.addUnique(h, what, obj); 1151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1153c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void unregisterForSilentRedial(Handler h) { 1155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSilentRedialRegistrants.remove(h); 1156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 11598762e33ba987774e43aa9f4e216ebdb084d3a03eTyler Gunn public void registerForSuppServiceNotification(Handler h, int what, Object obj) { 116008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mSsnRegistrants.addUnique(h, what, obj); 116108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 116208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 116308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh @Override 116408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh public void unregisterForSuppServiceNotification(Handler h) { 116508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh mSsnRegistrants.remove(h); 116608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 116708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 116808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh @Override 1169b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public int getSubId() { 1170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDefaultPhone.getSubId(); 1171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public int getPhoneId() { 1175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mDefaultPhone.getPhoneId(); 1176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CallForwardInfo getCallForwardInfo(ImsCallForwardInfo info) { 1179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CallForwardInfo cfInfo = new CallForwardInfo(); 1180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.status = info.mStatus; 1181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.reason = getCFReasonFromCondition(info.mCondition); 1182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.serviceClass = SERVICE_CLASS_VOICE; 1183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.toa = info.mToA; 1184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.number = info.mNumber; 1185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfo.timeSeconds = info.mTimeSeconds; 1186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return cfInfo; 1187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private CallForwardInfo[] handleCfQueryResult(ImsCallForwardInfo[] infos) { 1190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CallForwardInfo[] cfInfos = null; 1191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos != null && infos.length != 0) { 1193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfos = new CallForwardInfo[infos.length]; 1194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1196ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu IccRecords r = mDefaultPhone.getIccRecords(); 1197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos == null || infos.length == 0) { 1198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (r != null) { 1199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Assume the default is not active 1200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Set unconditional CFF in SIM to false 1201eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan setVoiceCallForwardingFlag(r, 1, false, null); 1202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = infos.length; i < s; i++) { 1205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos[i].mCondition == ImsUtInterface.CDIV_CF_UNCONDITIONAL) { 1206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (r != null) { 1207eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan setVoiceCallForwardingFlag(r, 1, (infos[i].mStatus == 1), 1208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville infos[i].mNumber); 1209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfos[i] = getCallForwardInfo(infos[i]); 1212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return cfInfos; 1216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int[] handleCbQueryResult(ImsSsInfo[] infos) { 1219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int[] cbInfos = new int[1]; 1220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cbInfos[0] = SERVICE_CLASS_NONE; 1221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos[0].mStatus == 1) { 1223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cbInfos[0] = SERVICE_CLASS_VOICE; 1224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return cbInfos; 1227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private int[] handleCwQueryResult(ImsSsInfo[] infos) { 1230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int[] cwInfos = new int[2]; 1231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cwInfos[0] = 0; 1232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (infos[0].mStatus == 1) { 1234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cwInfos[0] = 1; 1235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cwInfos[1] = SERVICE_CLASS_VOICE; 1236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return cwInfos; 1239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void 1242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendResponse(Message onComplete, Object result, Throwable e) { 1243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (onComplete != null) { 1244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CommandException ex = null; 1245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (e != null) { 12467ada7424c83980c3d6ea2aeb46ab9641f592448dPavel Zhamaitsiak ex = getCommandException(e); 1247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 12487ada7424c83980c3d6ea2aeb46ab9641f592448dPavel Zhamaitsiak AsyncResult.forMessage(onComplete, result, ex); 1249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onComplete.sendToTarget(); 1250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 125359d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh private void updateDataServiceState() { 125459d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh if (mSS != null && mDefaultPhone.getServiceStateTracker() != null 125559d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh && mDefaultPhone.getServiceStateTracker().mSS != null) { 125659d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh ServiceState ss = mDefaultPhone.getServiceStateTracker().mSS; 125759d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh mSS.setDataRegState(ss.getDataRegState()); 125859d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh mSS.setRilDataRadioTechnology(ss.getRilDataRadioTechnology()); 125959d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh Rlog.d(LOG_TAG, "updateDataServiceState: defSs = " + ss + " imsSs = " + mSS); 126059d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh } 126159d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh } 126259d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh 1263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1264ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan public void handleMessage(Message msg) { 1265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) Rlog.d(LOG_TAG, "handleMessage what=" + msg.what); 1268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville switch (msg.what) { 1269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_SET_CALL_FORWARD_DONE: 1270ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu IccRecords r = mDefaultPhone.getIccRecords(); 1271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Cf cf = (Cf) ar.userObj; 1272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (cf.mIsCfu && ar.exception == null && r != null) { 1273eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan setVoiceCallForwardingFlag(r, 1, msg.arg1 == 1, cf.mSetCfNumber); 1274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendResponse(cf.mOnComplete, null, ar.exception); 1276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_GET_CALL_FORWARD_DONE: 1279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CallForwardInfo[] cfInfos = null; 1280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception == null) { 1281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cfInfos = handleCfQueryResult((ImsCallForwardInfo[])ar.result); 1282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendResponse((Message) ar.userObj, cfInfos, ar.exception); 1284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1286ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_GET_CALL_BARRING_DONE: 1287ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_GET_CALL_WAITING_DONE: 1288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int[] ssInfos = null; 1289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception == null) { 1290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (msg.what == EVENT_GET_CALL_BARRING_DONE) { 1291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ssInfos = handleCbQueryResult((ImsSsInfo[])ar.result); 1292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (msg.what == EVENT_GET_CALL_WAITING_DONE) { 1293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ssInfos = handleCwQueryResult((ImsSsInfo[])ar.result); 1294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendResponse((Message) ar.userObj, ssInfos, ar.exception); 1297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1299ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_GET_CLIR_DONE: 130008e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh Bundle ssInfo = (Bundle) ar.result; 130108e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh int[] clirInfo = null; 130208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh if (ssInfo != null) { 130308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh clirInfo = ssInfo.getIntArray(ImsPhoneMmiCode.UT_BUNDLE_KEY_CLIR); 130408e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh } 130508e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh sendResponse((Message) ar.userObj, clirInfo, ar.exception); 130608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh break; 130708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh 1308ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_SET_CLIR_DONE: 1309ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan if (ar.exception == null) { 1310ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan saveClirSetting(msg.arg1); 1311ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan } 131299faf716a99c5eda3dc6693c5afbb94897c8cd4bShriram Ganesh // (Intentional fallthrough) 1313ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_SET_CALL_BARRING_DONE: 1314ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_SET_CALL_WAITING_DONE: 1315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendResponse((Message) ar.userObj, null, ar.exception); 1316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 1317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1318ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan case EVENT_DEFAULT_PHONE_DATA_STATE_CHANGED: 1319ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan if (DBG) Rlog.d(LOG_TAG, "EVENT_DEFAULT_PHONE_DATA_STATE_CHANGED"); 1320ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan updateDataServiceState(); 1321ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan break; 132259d7c92cdd71cdc7cbaf460a77243cea3da6bbf4Shriram Ganesh 1323322793ca2dfe1be9c088f88336a68921d4718addMeng Wang case EVENT_SERVICE_STATE_CHANGED: 1324322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (VDBG) Rlog.d(LOG_TAG, "EVENT_SERVICE_STATE_CHANGED"); 1325322793ca2dfe1be9c088f88336a68921d4718addMeng Wang ar = (AsyncResult) msg.obj; 1326322793ca2dfe1be9c088f88336a68921d4718addMeng Wang ServiceState newServiceState = (ServiceState) ar.result; 1327322793ca2dfe1be9c088f88336a68921d4718addMeng Wang // only update if roaming status changed 1328322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (mRoaming != newServiceState.getRoaming()) { 1329322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (DBG) Rlog.d(LOG_TAG, "Roaming state changed"); 1330322793ca2dfe1be9c088f88336a68921d4718addMeng Wang updateRoamingState(newServiceState.getRoaming()); 1331322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } 1332322793ca2dfe1be9c088f88336a68921d4718addMeng Wang break; 1333322793ca2dfe1be9c088f88336a68921d4718addMeng Wang case EVENT_VOICE_CALL_ENDED: 1334322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (DBG) Rlog.d(LOG_TAG, "Voice call ended. Handle pending updateRoamingState."); 1335322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mCT.unregisterForVoiceCallEnded(this); 1336322793ca2dfe1be9c088f88336a68921d4718addMeng Wang // only update if roaming status changed 1337322793ca2dfe1be9c088f88336a68921d4718addMeng Wang boolean newRoaming = getCurrentRoaming(); 1338322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (mRoaming != newRoaming) { 1339322793ca2dfe1be9c088f88336a68921d4718addMeng Wang updateRoamingState(newRoaming); 1340322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } 1341322793ca2dfe1be9c088f88336a68921d4718addMeng Wang break; 1342322793ca2dfe1be9c088f88336a68921d4718addMeng Wang 1343ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan default: 1344ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan super.handleMessage(msg); 1345ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan break; 1346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 134804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 134904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam /** 135004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * Listen to the IMS ECBM state change 135104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam */ 1352ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan private ImsEcbmStateListener mImsEcbmStateListener = 135304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam new ImsEcbmStateListener() { 135404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam @Override 135504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void onECBMEntered() { 135604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) Rlog.d(LOG_TAG, "onECBMEntered"); 135704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam handleEnterEmergencyCallbackMode(); 135804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 135904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 136004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam @Override 136104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void onECBMExited() { 136204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) Rlog.d(LOG_TAG, "onECBMExited"); 136304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam handleExitEmergencyCallbackMode(); 136404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 136504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam }; 136604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1367ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan @VisibleForTesting 1368ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan public ImsEcbmStateListener getImsEcbmStateListener() { 1369ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan return mImsEcbmStateListener; 1370ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan } 1371ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan 1372ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 137304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public boolean isInEmergencyCall() { 137404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam return mCT.isInEmergencyCall(); 137504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 137604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1377ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan private void sendEmergencyCallbackModeChange() { 137804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // Send an Intent 137904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); 1380468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian intent.putExtra(PhoneConstants.PHONE_IN_ECM_STATE, isInEcm()); 138104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam SubscriptionManager.putPhoneIdAndSubIdExtra(intent, getPhoneId()); 1382800a988b95a4b9bc2bca2562108e54cd8bd21ee1Sudheer Shanka ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL); 138304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) Rlog.d(LOG_TAG, "sendEmergencyCallbackModeChange"); 138404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 138504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 138604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam @Override 138704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void exitEmergencyCallbackMode() { 138804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (mWakeLock.isHeld()) { 138904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mWakeLock.release(); 139004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 139104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) Rlog.d(LOG_TAG, "exitEmergencyCallbackMode()"); 139204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 139304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // Send a message which will invoke handleExitEmergencyCallbackMode 139404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam ImsEcbm ecbm; 139504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam try { 139604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam ecbm = mCT.getEcbmInterface(); 139704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam ecbm.exitEmergencyCallbackMode(); 139804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } catch (ImsException e) { 139904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam e.printStackTrace(); 140004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 140104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 140204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 140304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private void handleEnterEmergencyCallbackMode() { 140404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) { 140504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= " 1406468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian + isInEcm()); 140704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 140804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // if phone is not in Ecm mode, and it's changed to Ecm mode 1409468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian if (!isInEcm()) { 1410468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian setIsInEcm(true); 141104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // notify change 141204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam sendEmergencyCallbackModeChange(); 141304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 141404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // Post this runnable so we will automatically exit 141504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // if no one invokes exitEmergencyCallbackMode() directly. 141604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam long delayInMillis = SystemProperties.getLong( 141704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE); 141804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam postDelayed(mExitEcmRunnable, delayInMillis); 141904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // We don't want to go to sleep while in Ecm 142004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mWakeLock.acquire(); 142104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 142204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 142304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 142404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private void handleExitEmergencyCallbackMode() { 142504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (DBG) { 142604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "handleExitEmergencyCallbackMode: mIsPhoneInEcmState = " 1427468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian + isInEcm()); 142804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 1429ec15d7bd04fc3e6cba2cc6645184c5f47c55aea8Amit Mahajan 1430468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian if (isInEcm()) { 1431468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian setIsInEcm(false); 1432ec15d7bd04fc3e6cba2cc6645184c5f47c55aea8Amit Mahajan } 1433ec15d7bd04fc3e6cba2cc6645184c5f47c55aea8Amit Mahajan 143404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // Remove pending exit Ecm runnable, if any 143504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam removeCallbacks(mExitEcmRunnable); 143604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 143704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (mEcmExitRespRegistrant != null) { 143804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmExitRespRegistrant.notifyResult(Boolean.TRUE); 143904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 1440ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan 1441ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan // release wakeLock 1442ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan if (mWakeLock.isHeld()) { 1443ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan mWakeLock.release(); 1444ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan } 1445ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan 1446ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan // send an Intent 1447ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan sendEmergencyCallbackModeChange(); 144804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 144904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 145004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam /** 145104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * Handle to cancel or restart Ecm timer in emergency call back mode if action is 145204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled; otherwise, restart 145304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * Ecm timer and notify apps the timer is restarted. 145404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam */ 145504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam void handleTimerInEmergencyCallbackMode(int action) { 145604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam switch (action) { 145704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam case CANCEL_ECM_TIMER: 145804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam removeCallbacks(mExitEcmRunnable); 14591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((GsmCdmaPhone) mDefaultPhone).notifyEcbmTimerReset(Boolean.TRUE); 146004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam break; 146104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam case RESTART_ECM_TIMER: 146204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam long delayInMillis = SystemProperties.getLong( 146304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE); 146404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam postDelayed(mExitEcmRunnable, delayInMillis); 14651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((GsmCdmaPhone) mDefaultPhone).notifyEcbmTimerReset(Boolean.FALSE); 146604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam break; 146704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam default: 146804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam Rlog.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action); 146904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 147004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 147104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1472ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 147304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void setOnEcbModeExitResponse(Handler h, int what, Object obj) { 147404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmExitRespRegistrant = new Registrant(h, what, obj); 147504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 147604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1477ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 147804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void unsetOnEcbModeExitResponse(Handler h) { 147904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmExitRespRegistrant.clear(); 148004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 1481cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com 1482e51d918511afab905399d9fda7f51442f15bd8a7Pavel Zhamaitsiak public void onFeatureCapabilityChanged() { 1483e51d918511afab905399d9fda7f51442f15bd8a7Pavel Zhamaitsiak mDefaultPhone.getServiceStateTracker().onImsCapabilityChanged(); 1484e51d918511afab905399d9fda7f51442f15bd8a7Pavel Zhamaitsiak } 1485e51d918511afab905399d9fda7f51442f15bd8a7Pavel Zhamaitsiak 1486ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 1487cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com public boolean isVolteEnabled() { 1488cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com return mCT.isVolteEnabled(); 1489cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com } 1490cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com 1491c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1492c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public boolean isWifiCallingEnabled() { 149362a2b2f341be6130e4022b487648ff2fee06db8cLibin.Tang@motorola.com return mCT.isVowifiEnabled(); 149462a2b2f341be6130e4022b487648ff2fee06db8cLibin.Tang@motorola.com } 149562a2b2f341be6130e4022b487648ff2fee06db8cLibin.Tang@motorola.com 1496c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1497c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public boolean isVideoEnabled() { 1498288268d5528e0df03f348e303954813cb188c55bRekha Kumar return mCT.isVideoCallEnabled(); 1499cf91ae7acc62eba22d9e652e5de5fb90a89e2ac8Libin.Tang@motorola.com } 1500f8a5a95e21d2844193b9f9ce91fbee379df84504Libin.Tang@motorola.com 1501c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 1502f8a5a95e21d2844193b9f9ce91fbee379df84504Libin.Tang@motorola.com public Phone getDefaultPhone() { 1503f8a5a95e21d2844193b9f9ce91fbee379df84504Libin.Tang@motorola.com return mDefaultPhone; 1504f8a5a95e21d2844193b9f9ce91fbee379df84504Libin.Tang@motorola.com } 1505bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com 1506ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 1507bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com public boolean isImsRegistered() { 1508bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com return mImsRegistered; 1509bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com } 151069e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com 1511bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com public void setImsRegistered(boolean value) { 1512bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com mImsRegistered = value; 1513bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com } 151469e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com 1515c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 151669e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com public void callEndCleanupHandOverCallIfAny() { 151769e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com mCT.callEndCleanupHandOverCallIfAny(); 151869e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com } 151953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 152053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak private BroadcastReceiver mResultReceiver = new BroadcastReceiver() { 152153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak @Override 152253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak public void onReceive(Context context, Intent intent) { 152353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // Add notification only if alert was not shown by WfcSettings 152453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (getResultCode() == Activity.RESULT_OK) { 152553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // Default result code (as passed to sendOrderedBroadcast) 152653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // means that intent was not received by WfcSettings. 152753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 152853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak CharSequence title = intent.getCharSequenceExtra(EXTRA_KEY_ALERT_TITLE); 1529029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak CharSequence messageAlert = intent.getCharSequenceExtra(EXTRA_KEY_ALERT_MESSAGE); 1530029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak CharSequence messageNotification = intent.getCharSequenceExtra(EXTRA_KEY_NOTIFICATION_MESSAGE); 153153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 153253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak Intent resultIntent = new Intent(Intent.ACTION_MAIN); 153353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak resultIntent.setClassName("com.android.settings", 153453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak "com.android.settings.Settings$WifiCallingSettingsActivity"); 153553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak resultIntent.putExtra(EXTRA_KEY_ALERT_SHOW, true); 153653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak resultIntent.putExtra(EXTRA_KEY_ALERT_TITLE, title); 1537029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak resultIntent.putExtra(EXTRA_KEY_ALERT_MESSAGE, messageAlert); 153853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak PendingIntent resultPendingIntent = 153953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak PendingIntent.getActivity( 154053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak mContext, 154153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 0, 154253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak resultIntent, 154353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak PendingIntent.FLAG_UPDATE_CURRENT 154453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak ); 154553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 15467c29cabeb38ae8cb4f5764c2dc0a768de22d2f92fionaxu final Notification notification = new Notification.Builder(mContext) 154753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak .setSmallIcon(android.R.drawable.stat_sys_warning) 154853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak .setContentTitle(title) 1549029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak .setContentText(messageNotification) 155053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak .setAutoCancel(true) 155153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak .setContentIntent(resultPendingIntent) 155213ff522d752715d856bd4068d39a769cd0d54a24fionaxu .setStyle(new Notification.BigTextStyle() 155313ff522d752715d856bd4068d39a769cd0d54a24fionaxu .bigText(messageNotification)) 15547c29cabeb38ae8cb4f5764c2dc0a768de22d2f92fionaxu .setChannelId(NotificationChannelController.CHANNEL_ID_WFC) 155553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak .build(); 155653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak final String notificationTag = "wifi_calling"; 155753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak final int notificationId = 1; 155853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 155953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak NotificationManager notificationManager = 156053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak (NotificationManager) mContext.getSystemService( 156153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak Context.NOTIFICATION_SERVICE); 156253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak notificationManager.notify(notificationTag, notificationId, 156353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak notification); 156453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 156553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 156653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak }; 156753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 156853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak /** 156953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak * Show notification in case of some error codes. 157053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak */ 157153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak public void processDisconnectReason(ImsReasonInfo imsReasonInfo) { 157253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (imsReasonInfo.mCode == imsReasonInfo.CODE_REGISTRATION_ERROR 157353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak && imsReasonInfo.mExtraMessage != null) { 157453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 1575af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak CarrierConfigManager configManager = 1576af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak (CarrierConfigManager)mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); 1577af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (configManager == null) { 1578af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak Rlog.e(LOG_TAG, "processDisconnectReason: CarrierConfigManager is not ready"); 1579af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak return; 1580af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak } 1581f6d865fd88a8326126e2b3f836b94cfebba3a5a7Derek Tan PersistableBundle pb = configManager.getConfigForSubId(getSubId()); 1582af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (pb == null) { 1583af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak Rlog.e(LOG_TAG, "processDisconnectReason: no config for subId " + getSubId()); 1584af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak return; 1585af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak } 158653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak final String[] wfcOperatorErrorCodes = 1587af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak pb.getStringArray( 1588af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak CarrierConfigManager.KEY_WFC_OPERATOR_ERROR_CODES_STRING_ARRAY); 1589af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (wfcOperatorErrorCodes == null) { 1590af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak // no operator-specific error codes 1591af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak return; 1592af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak } 1593af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak 1594029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak final String[] wfcOperatorErrorAlertMessages = 159553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak mContext.getResources().getStringArray( 1596029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak com.android.internal.R.array.wfcOperatorErrorAlertMessages); 1597029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak final String[] wfcOperatorErrorNotificationMessages = 1598029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak mContext.getResources().getStringArray( 1599029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak com.android.internal.R.array.wfcOperatorErrorNotificationMessages); 160053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 160153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak for (int i = 0; i < wfcOperatorErrorCodes.length; i++) { 1602e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String[] codes = wfcOperatorErrorCodes[i].split("\\|"); 1603af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (codes.length != 2) { 1604af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak Rlog.e(LOG_TAG, "Invalid carrier config: " + wfcOperatorErrorCodes[i]); 1605af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak continue; 1606af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak } 1607af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak 160853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // Match error code. 160953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (!imsReasonInfo.mExtraMessage.startsWith( 1610af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak codes[0])) { 161153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak continue; 161253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 161353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // If there is no delimiter at the end of error code string 161453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // then we need to verify that we are not matching partial code. 161553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // EXAMPLE: "REG9" must not match "REG99". 161653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // NOTE: Error code must not be empty. 1617af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak int codeStringLength = codes[0].length(); 1618af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak char lastChar = codes[0].charAt(codeStringLength - 1); 161953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (Character.isLetterOrDigit(lastChar)) { 162053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (imsReasonInfo.mExtraMessage.length() > codeStringLength) { 162153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak char nextChar = imsReasonInfo.mExtraMessage.charAt(codeStringLength); 162253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak if (Character.isLetterOrDigit(nextChar)) { 162353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak continue; 162453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 162553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 162653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 162753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 162853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak final CharSequence title = mContext.getText( 162953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak com.android.internal.R.string.wfcRegErrorTitle); 163053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 1631af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak int idx = Integer.parseInt(codes[1]); 1632af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (idx < 0 || 1633af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak idx >= wfcOperatorErrorAlertMessages.length || 1634af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak idx >= wfcOperatorErrorNotificationMessages.length) { 1635af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak Rlog.e(LOG_TAG, "Invalid index: " + wfcOperatorErrorCodes[i]); 1636af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak continue; 1637af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak } 1638029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak CharSequence messageAlert = imsReasonInfo.mExtraMessage; 1639029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak CharSequence messageNotification = imsReasonInfo.mExtraMessage; 1640af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (!wfcOperatorErrorAlertMessages[idx].isEmpty()) { 1641af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak messageAlert = wfcOperatorErrorAlertMessages[idx]; 1642029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak } 1643af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak if (!wfcOperatorErrorNotificationMessages[idx].isEmpty()) { 1644af060eee085e90a2979a392384ccad368e92fc7aPavel Zhamaitsiak messageNotification = wfcOperatorErrorNotificationMessages[idx]; 164553f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 164653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 16476e501e7dd96ad52ce80479ed1f85dfd71e8d060bPavel Zhamaitsiak // UX requirement is to disable WFC in case of "permanent" registration failures. 16486e501e7dd96ad52ce80479ed1f85dfd71e8d060bPavel Zhamaitsiak ImsManager.setWfcSetting(mContext, false); 16496e501e7dd96ad52ce80479ed1f85dfd71e8d060bPavel Zhamaitsiak 165053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // If WfcSettings are active then alert will be shown 165153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // otherwise notification will be added. 16526e501e7dd96ad52ce80479ed1f85dfd71e8d060bPavel Zhamaitsiak Intent intent = new Intent(ImsManager.ACTION_IMS_REGISTRATION_ERROR); 165353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak intent.putExtra(EXTRA_KEY_ALERT_TITLE, title); 1654029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak intent.putExtra(EXTRA_KEY_ALERT_MESSAGE, messageAlert); 1655029d855056bb03191cd747da84172f9881903e6fPavel Zhamaitsiak intent.putExtra(EXTRA_KEY_NOTIFICATION_MESSAGE, messageNotification); 165653f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak mContext.sendOrderedBroadcast(intent, null, mResultReceiver, 165753f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak null, Activity.RESULT_OK, null, null); 165853f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak 165953f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // We can only match a single error code 166053f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak // so should break the loop after a successful match. 166153f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak break; 166253f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 166353f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 166453f2bb9ba3118ff4c22e20ab3ad46ec97a72ac24Pavel Zhamaitsiak } 1665164cea0175c29fa2da4652253b1f3b3c03707c3eAnju Mathapati 1666ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan @Override 1667164cea0175c29fa2da4652253b1f3b3c03707c3eAnju Mathapati public boolean isUtEnabled() { 1668164cea0175c29fa2da4652253b1f3b3c03707c3eAnju Mathapati return mCT.isUtEnabled(); 1669164cea0175c29fa2da4652253b1f3b3c03707c3eAnju Mathapati } 1670dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu 1671dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu @Override 1672a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan public void sendEmergencyCallStateChange(boolean callActive) { 1673a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan mDefaultPhone.sendEmergencyCallStateChange(callActive); 1674a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 1675a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 1676a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan @Override 1677a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan public void setBroadcastEmergencyCallStateChanges(boolean broadcast) { 1678a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan mDefaultPhone.setBroadcastEmergencyCallStateChanges(broadcast); 1679a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 1680a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 1681ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan @VisibleForTesting 1682ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan public PowerManager.WakeLock getWakeLock() { 1683ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan return mWakeLock; 1684ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan } 1685ffb90b77322fa64adbe79b976f1c16f3c9441753Amit Mahajan 1686a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan @Override 168748921d863bf4d93c89071dfde4d44cd27fec6314Jack Yu public long getVtDataUsage() { 168848921d863bf4d93c89071dfde4d44cd27fec6314Jack Yu return mCT.getVtDataUsage(); 168948921d863bf4d93c89071dfde4d44cd27fec6314Jack Yu } 169048921d863bf4d93c89071dfde4d44cd27fec6314Jack Yu 1691322793ca2dfe1be9c088f88336a68921d4718addMeng Wang private void updateRoamingState(boolean newRoaming) { 1692322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (mCT.getState() == PhoneConstants.State.IDLE) { 1693322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (DBG) Rlog.d(LOG_TAG, "updateRoamingState now: " + newRoaming); 1694322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mRoaming = newRoaming; 1695322793ca2dfe1be9c088f88336a68921d4718addMeng Wang ImsManager.setWfcMode(mContext, 1696322793ca2dfe1be9c088f88336a68921d4718addMeng Wang ImsManager.getWfcMode(mContext, newRoaming), newRoaming); 1697322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } else { 1698322793ca2dfe1be9c088f88336a68921d4718addMeng Wang if (DBG) Rlog.d(LOG_TAG, "updateRoamingState postponed: " + newRoaming); 1699322793ca2dfe1be9c088f88336a68921d4718addMeng Wang mCT.registerForVoiceCallEnded(this, 1700322793ca2dfe1be9c088f88336a68921d4718addMeng Wang EVENT_VOICE_CALL_ENDED, null); 1701322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } 1702322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } 1703322793ca2dfe1be9c088f88336a68921d4718addMeng Wang 1704322793ca2dfe1be9c088f88336a68921d4718addMeng Wang private boolean getCurrentRoaming() { 1705322793ca2dfe1be9c088f88336a68921d4718addMeng Wang TelephonyManager tm = (TelephonyManager) mContext 1706322793ca2dfe1be9c088f88336a68921d4718addMeng Wang .getSystemService(Context.TELEPHONY_SERVICE); 1707322793ca2dfe1be9c088f88336a68921d4718addMeng Wang return tm.isNetworkRoaming(); 1708322793ca2dfe1be9c088f88336a68921d4718addMeng Wang } 1709322793ca2dfe1be9c088f88336a68921d4718addMeng Wang 171048921d863bf4d93c89071dfde4d44cd27fec6314Jack Yu @Override 1711dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1712dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println("ImsPhone extends:"); 1713dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu super.dump(fd, pw, args); 1714dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.flush(); 1715dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu 1716dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println("ImsPhone:"); 1717dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mDefaultPhone = " + mDefaultPhone); 1718dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mPendingMMIs = " + mPendingMMIs); 1719dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mPostDialHandler = " + mPostDialHandler); 1720dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mSS = " + mSS); 1721dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mWakeLock = " + mWakeLock); 1722468e5725d5fcc44672c074e166e8ce05e8e9a151Shuo Qian pw.println(" mIsPhoneInEcmState = " + isInEcm()); 1723dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mEcmExitRespRegistrant = " + mEcmExitRespRegistrant); 1724dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mSilentRedialRegistrants = " + mSilentRedialRegistrants); 1725dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mImsRegistered = " + mImsRegistered); 1726322793ca2dfe1be9c088f88336a68921d4718addMeng Wang pw.println(" mRoaming = " + mRoaming); 1727dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.println(" mSsnRegistrants = " + mSsnRegistrants); 1728dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu pw.flush(); 1729dc3b93d59312b84dcfa776f7691f6a87462b45a2Jack Yu } 1730a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 1731