10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.sip.SipPhone; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant; 27dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunnimport android.telecom.VideoProfile; 281997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubertimport android.telephony.PhoneNumberUtils; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneStateListener; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState; 32ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Collections; 365a514e8e8193bbd09687cc1fb286122b79eca612Anthony Leeimport java.util.HashMap; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @hide 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * CallManager class provides an abstract layer for PhoneApp to access 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and control calls. It implements Phone interface. 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * CallManager provides call and connection control as well as 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * channel capability. 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * There are three categories of APIs CallManager provided 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. Call control and operation, such as dial() and hangup() 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. Channel capabilities, such as CanConference() 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. Register notification 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 58e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajanpublic class CallManager { 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String LOG_TAG ="CallManager"; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final boolean DBG = true; 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final boolean VDBG = false; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_DISCONNECT = 100; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_PRECISE_CALL_STATE_CHANGED = 101; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_NEW_RINGING_CONNECTION = 102; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_UNKNOWN_CONNECTION = 103; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_INCOMING_RING = 104; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_RINGBACK_TONE = 105; 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_IN_CALL_VOICE_PRIVACY_ON = 106; 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_IN_CALL_VOICE_PRIVACY_OFF = 107; 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_CALL_WAITING = 108; 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_DISPLAY_INFO = 109; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_SIGNAL_INFO = 110; 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_CDMA_OTA_STATUS_CHANGE = 111; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_RESEND_INCALL_MUTE = 112; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_MMI_INITIATE = 113; 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_MMI_COMPLETE = 114; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_ECM_TIMER_RESET = 115; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_SUBSCRIPTION_INFO_READY = 116; 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_SUPP_SERVICE_FAILED = 117; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_SERVICE_STATE_CHANGED = 118; 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int EVENT_POST_DIAL_CHARACTER = 119; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_ONHOLD_TONE = 120; 856bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 866bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville //private static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 121; 876d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak private static final int EVENT_TTY_MODE_RECEIVED = 122; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Singleton instance 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final CallManager INSTANCE = new CallManager(); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 926c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajan // list of registered phones, which are Phone objs 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final ArrayList<Phone> mPhones; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // list of supported ringing calls 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final ArrayList<Call> mRingingCalls; 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // list of supported background calls 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final ArrayList<Call> mBackgroundCalls; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // list of supported foreground calls 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final ArrayList<Call> mForegroundCalls; 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // empty connection list 10522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private final ArrayList<Connection> mEmptyConnections = new ArrayList<Connection>(); 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1075a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // mapping of phones to registered handler instances used for callbacks from RIL 1085a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee private final HashMap<Phone, CallManagerHandler> mHandlerMap = new HashMap<>(); 1095a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee 1106c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajan // default phone as the first phone registered, which is Phone obj 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Phone mDefaultPhone; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 113a5d65ff9d36808aec38d60ebe30f2109fcfcb8bcAlex Yakavenka private boolean mSpeedUpAudioForMtCall = false; 1146bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 1156bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville //private boolean mIsEccDialing = false; 116a5d65ff9d36808aec38d60ebe30f2109fcfcb8bcAlex Yakavenka 117ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh private Object mRegistrantidentifier = new Object(); 118ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // state registrants 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mPreciseCallStateRegistrants 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mNewRingingConnectionRegistrants 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mIncomingRingRegistrants 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mDisconnectRegistrants 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mMmiRegistrants 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mUnknownConnectionRegistrants 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mRingbackToneRegistrants 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected final RegistrantList mOnHoldToneRegistrants 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville = new RegistrantList(); 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mInCallVoicePrivacyOnRegistrants 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mInCallVoicePrivacyOffRegistrants 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mCallWaitingRegistrants 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mDisplayInfoRegistrants 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mSignalInfoRegistrants 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mCdmaOtaStatusChangeRegistrants 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mResendIncallMuteRegistrants 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mMmiInitiateRegistrants 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mMmiCompleteRegistrants 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mEcmTimerResetRegistrants 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mSubscriptionInfoReadyRegistrants 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mSuppServiceFailedRegistrants 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mServiceStateChangedRegistrants 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected final RegistrantList mPostDialCharacterRegistrants 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = new RegistrantList(); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1866d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak protected final RegistrantList mTtyModeReceivedRegistrants 1876d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak = new RegistrantList(); 1886d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CallManager() { 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPhones = new ArrayList<Phone>(); 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRingingCalls = new ArrayList<Call>(); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mBackgroundCalls = new ArrayList<Call>(); 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mForegroundCalls = new ArrayList<Call>(); 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDefaultPhone = null; 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * get singleton instance of CallManager 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return CallManager 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static CallManager getInstance() { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return INSTANCE; 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns all the registered phone objects. 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return all the registered phone objects. 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Phone> getAllPhones() { 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Collections.unmodifiableList(mPhones); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * get Phone object corresponds to subId 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return Phone 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 217b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville private Phone getPhone(int subId) { 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone p = null; 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Phone phone : mPhones) { 220772b718fd55ac6a13ab2f7a8b5997ab469bb7f65Amit Mahajan if (phone.getSubId() == subId && 221772b718fd55ac6a13ab2f7a8b5997ab469bb7f65Amit Mahajan phone.getPhoneType() != PhoneConstants.PHONE_TYPE_IMS) { 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville p = phone; 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return p; 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Get current coarse-grained voice call state. 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If the Call Manager has an active call and call waiting occurs, 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * then the phone state is RINGING not OFFHOOK 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public PhoneConstants.State getState() { 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PhoneConstants.State s = PhoneConstants.State.IDLE; 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Phone phone : mPhones) { 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (phone.getState() == PhoneConstants.State.RINGING) { 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s = PhoneConstants.State.RINGING; 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (phone.getState() == PhoneConstants.State.OFFHOOK) { 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (s == PhoneConstants.State.IDLE) s = PhoneConstants.State.OFFHOOK; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return s; 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Get current coarse-grained voice call state on a subId. 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * If the Call Manager has an active call and call waiting occurs, 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * then the phone state is RINGING not OFFHOOK 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 254b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public PhoneConstants.State getState(int subId) { 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PhoneConstants.State s = PhoneConstants.State.IDLE; 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Phone phone : mPhones) { 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (phone.getSubId() == subId) { 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (phone.getState() == PhoneConstants.State.RINGING) { 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville s = PhoneConstants.State.RINGING; 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (phone.getState() == PhoneConstants.State.OFFHOOK) { 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (s == PhoneConstants.State.IDLE) s = PhoneConstants.State.OFFHOOK; 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return s; 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the service state of CallManager, which represents the 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * highest priority state of all the service states of phones 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The priority is defined as 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * STATE_IN_SERIVCE > STATE_OUT_OF_SERIVCE > STATE_EMERGENCY > STATE_POWER_OFF 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getServiceState() { 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int resultState = ServiceState.STATE_OUT_OF_SERVICE; 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Phone phone : mPhones) { 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int serviceState = phone.getServiceState().getState(); 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (serviceState == ServiceState.STATE_IN_SERVICE) { 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // IN_SERVICE has the highest priority 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resultState = serviceState; 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE) { 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // OUT_OF_SERVICE replaces EMERGENCY_ONLY and POWER_OFF 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Note: EMERGENCY_ONLY is not in use at this moment 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( resultState == ServiceState.STATE_EMERGENCY_ONLY || 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resultState == ServiceState.STATE_POWER_OFF) { 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resultState = serviceState; 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (serviceState == ServiceState.STATE_EMERGENCY_ONLY) { 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (resultState == ServiceState.STATE_POWER_OFF) { 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resultState = serviceState; 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return resultState; 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the Phone service state corresponds to subId 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 307b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public int getServiceState(int subId) { 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int resultState = ServiceState.STATE_OUT_OF_SERVICE; 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Phone phone : mPhones) { 311a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (phone.getSubId() == subId) { 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int serviceState = phone.getServiceState().getState(); 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (serviceState == ServiceState.STATE_IN_SERVICE) { 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // IN_SERVICE has the highest priority 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resultState = serviceState; 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE) { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // OUT_OF_SERVICE replaces EMERGENCY_ONLY and POWER_OFF 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Note: EMERGENCY_ONLY is not in use at this moment 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( resultState == ServiceState.STATE_EMERGENCY_ONLY || 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resultState == ServiceState.STATE_POWER_OFF) { 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resultState = serviceState; 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (serviceState == ServiceState.STATE_EMERGENCY_ONLY) { 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (resultState == ServiceState.STATE_POWER_OFF) { 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resultState = serviceState; 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 331a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return resultState; 332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 334a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 335a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the phone associated with any call 336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Phone getPhoneInCall() { 338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone phone = null; 339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!getFirstActiveRingingCall().isIdle()) { 340a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getFirstActiveRingingCall().getPhone(); 341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (!getActiveFgCall().isIdle()) { 342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getActiveFgCall().getPhone(); 343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If BG call is idle, we return default phone 345a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getFirstActiveBgCall().getPhone(); 346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return phone; 348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 350b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Phone getPhoneInCall(int subId) { 351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone phone = null; 352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!getFirstActiveRingingCall(subId).isIdle()) { 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getFirstActiveRingingCall(subId).getPhone(); 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (!getActiveFgCall(subId).isIdle()) { 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getActiveFgCall(subId).getPhone(); 356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // If BG call is idle, we return default phone 358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone = getFirstActiveBgCall(subId).getPhone(); 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return phone; 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register phone to CallManager 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param phone to be registered 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if register successfully 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean registerPhone(Phone phone) { 369e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (phone != null && !mPhones.contains(phone)) { 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 372ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "registerPhone(" + 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.getPhoneName() + " " + phone + ")"); 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mPhones.isEmpty()) { 377e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mDefaultPhone = phone; 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 379e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mPhones.add(phone); 380e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mRingingCalls.add(phone.getRingingCall()); 381e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mBackgroundCalls.add(phone.getBackgroundCall()); 382e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mForegroundCalls.add(phone.getForegroundCall()); 383e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan registerForPhoneStates(phone); 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * unregister phone from CallManager 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param phone to be unregistered 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterPhone(Phone phone) { 394e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (phone != null && mPhones.contains(phone)) { 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 397ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "unregisterPhone(" + 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.getPhoneName() + " " + phone + ")"); 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 401e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan Phone imsPhone = phone.getImsPhone(); 402e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (imsPhone != null) { 4034726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan unregisterPhone(imsPhone); 404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 406e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mPhones.remove(phone); 407e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mRingingCalls.remove(phone.getRingingCall()); 408e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mBackgroundCalls.remove(phone.getBackgroundCall()); 409e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan mForegroundCalls.remove(phone.getForegroundCall()); 410e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan unregisterForPhoneStates(phone); 411e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (phone == mDefaultPhone) { 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mPhones.isEmpty()) { 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDefaultPhone = null; 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDefaultPhone = mPhones.get(0); 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return the default phone or null if no phone available 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone getDefaultPhone() { 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mDefaultPhone; 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the phone associated with the foreground call 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone getFgPhone() { 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return getActiveFgCall().getPhone(); 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the phone associated with the foreground call 437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * of a particular subId 438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 439b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Phone getFgPhone(int subId) { 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return getActiveFgCall(subId).getPhone(); 441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the phone associated with the background call 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone getBgPhone() { 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return getFirstActiveBgCall().getPhone(); 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the phone associated with the background call 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * of a particular subId 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 454b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Phone getBgPhone(int subId) { 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return getFirstActiveBgCall(subId).getPhone(); 456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 458a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the phone associated with the ringing call 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone getRingingPhone() { 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return getFirstActiveRingingCall().getPhone(); 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the phone associated with the ringing call 467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * of a particular subId 468a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 469b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Phone getRingingPhone(int subId) { 470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return getFirstActiveRingingCall(subId).getPhone(); 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4736bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville /* FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 4746bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville public void setAudioMode() { 4756bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Context context = getContext(); 4766bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (context == null) return; 4776bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville AudioManager audioManager = (AudioManager) 4786bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville context.getSystemService(Context.AUDIO_SERVICE); 4796bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 4806bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (!isServiceStateInService() && !mIsEccDialing) { 4816bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (audioManager.getMode() != AudioManager.MODE_NORMAL) { 4826bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, "abandonAudioFocus"); 4836bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // abandon audio focus after the mode has been set back to normal 4846bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.abandonAudioFocusForCall(); 4856bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.setMode(AudioManager.MODE_NORMAL); 4866bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 4876bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville return; 4886bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 4896bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 4906bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // change the audio mode and request/abandon audio focus according to phone state, 4916bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // but only on audio mode transitions 4926bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville switch (getState()) { 4936bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville case RINGING: 4946bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville int curAudioMode = audioManager.getMode(); 4956bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (curAudioMode != AudioManager.MODE_RINGTONE) { 4966bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, "requestAudioFocus on STREAM_RING"); 4976bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.requestAudioFocusForCall(AudioManager.STREAM_RING, 4986bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 4996bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if(!mSpeedUpAudioForMtCall) { 5006bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.setMode(AudioManager.MODE_RINGTONE); 5016bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5026bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5036bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 5046bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (mSpeedUpAudioForMtCall && (curAudioMode != AudioManager.MODE_IN_CALL)) { 5056bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.setMode(AudioManager.MODE_IN_CALL); 5066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville break; 5086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville case OFFHOOK: 5096bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Phone offhookPhone = getFgPhone(); 5106bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (getActiveFgCallState() == Call.State.IDLE) { 5116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // There is no active Fg calls, the OFFHOOK state 5126bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // is set by the Bg call. So set the phone to bgPhone. 5136bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville offhookPhone = getBgPhone(); 5146bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5156bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 5166bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville int newAudioMode = AudioManager.MODE_IN_CALL; 5176bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (offhookPhone instanceof SipPhone) { 5186bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Rlog.d(LOG_TAG, "setAudioMode Set audio mode for SIP call!"); 5196bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // enable IN_COMMUNICATION audio mode instead for sipPhone 5206bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville newAudioMode = AudioManager.MODE_IN_COMMUNICATION; 5216bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5226bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville int currMode = audioManager.getMode(); 5236bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (currMode != newAudioMode || mSpeedUpAudioForMtCall) { 5246bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // request audio focus before setting the new mode 5256bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, "requestAudioFocus on STREAM_VOICE_CALL"); 5266bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, 5276bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 5286bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Rlog.d(LOG_TAG, "setAudioMode Setting audio mode from " 5296bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville + currMode + " to " + newAudioMode); 5306bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.setMode(newAudioMode); 5316bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5326bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mSpeedUpAudioForMtCall = false; 5336bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville break; 5346bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville case IDLE: 5356bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (audioManager.getMode() != AudioManager.MODE_NORMAL) { 5366bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.setMode(AudioManager.MODE_NORMAL); 5376bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, "abandonAudioFocus"); 5386bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // abandon audio focus after the mode has been set back to normal 5396bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville audioManager.abandonAudioFocusForCall(); 5406bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5416bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mSpeedUpAudioForMtCall = false; 5426bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville break; 5436bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5446bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Rlog.d(LOG_TAG, "setAudioMode state = " + getState()); 5456bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 5466bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville */ 5476bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Context getContext() { 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone defaultPhone = getDefaultPhone(); 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ((defaultPhone == null) ? null : defaultPhone.getContext()); 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 553ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh public Object getRegistrantIdentifier() { 554ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh return mRegistrantidentifier; 555ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh } 556ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void registerForPhoneStates(Phone phone) { 5585a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // We need to keep a mapping of handler to Phone for proper unregistration. 5595a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // TODO: Clean up this solution as it is just a work around for each Phone instance 5605a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // using the same Handler to register with the RIL. When time permits, we should consider 5615a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // moving the handler (or the reference ot the handler) into the Phone object. 5625a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // See b/17414427. 5635a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee CallManagerHandler handler = mHandlerMap.get(phone); 5645a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee if (handler != null) { 5655a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee Rlog.d(LOG_TAG, "This phone has already been registered."); 5665a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee return; 5675a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee } 5685a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee 5695a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // New registration, create a new handler instance and register the phone. 5705a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee handler = new CallManagerHandler(); 5715a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee mHandlerMap.put(phone, handler); 5725a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for common events supported by all phones 5746c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajan // The mRegistrantIdentifier passed here, is to identify in the Phone 575ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh // that the registrants are coming from the CallManager. 576ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForPreciseCallStateChanged(handler, EVENT_PRECISE_CALL_STATE_CHANGED, 577ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 578ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForDisconnect(handler, EVENT_DISCONNECT, 579ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 580ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForNewRingingConnection(handler, EVENT_NEW_RINGING_CONNECTION, 581ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 582ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForUnknownConnection(handler, EVENT_UNKNOWN_CONNECTION, 583ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 584ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForIncomingRing(handler, EVENT_INCOMING_RING, 585ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 586ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForRingbackTone(handler, EVENT_RINGBACK_TONE, 587ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 588ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForInCallVoicePrivacyOn(handler, EVENT_IN_CALL_VOICE_PRIVACY_ON, 589ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 590ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForInCallVoicePrivacyOff(handler, EVENT_IN_CALL_VOICE_PRIVACY_OFF, 591ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 592ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForDisplayInfo(handler, EVENT_DISPLAY_INFO, 593ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 594ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForSignalInfo(handler, EVENT_SIGNAL_INFO, 595ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 596ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForResendIncallMute(handler, EVENT_RESEND_INCALL_MUTE, 597ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 598ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForMmiInitiate(handler, EVENT_MMI_INITIATE, 599ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 600ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForMmiComplete(handler, EVENT_MMI_COMPLETE, 601ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 602ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForSuppServiceFailed(handler, EVENT_SUPP_SERVICE_FAILED, 603ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 604ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh phone.registerForServiceStateChanged(handler, EVENT_SERVICE_STATE_CHANGED, 605ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh mRegistrantidentifier); 606ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh 6076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 608573ba864406ec81dd3ff878760fa3317daddaa07Anthony Lee //phone.registerForRadioOffOrNotAvailable(handler, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // for events supported only by GSM, CDMA and IMS phone 6114726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.setOnPostDialCharacter(handler, EVENT_POST_DIAL_CHARACTER, null); 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for events supported only by CDMA phone 6144726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForCdmaOtaStatusChange(handler, EVENT_CDMA_OTA_STATUS_CHANGE, null); 6154726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForSubscriptionInfoReady(handler, EVENT_SUBSCRIPTION_INFO_READY, null); 6164726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForCallWaiting(handler, EVENT_CALL_WAITING, null); 6174726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForEcmTimerReset(handler, EVENT_ECM_TIMER_RESET, null); 618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // for events supported only by IMS phone 6204726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForOnHoldTone(handler, EVENT_ONHOLD_TONE, null); 6214726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForSuppServiceFailed(handler, EVENT_SUPP_SERVICE_FAILED, null); 6224726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.registerForTtyModeReceived(handler, EVENT_TTY_MODE_RECEIVED, null); 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void unregisterForPhoneStates(Phone phone) { 6265a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee // Make sure that we clean up our map of handlers to Phones. 6275a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee CallManagerHandler handler = mHandlerMap.get(phone); 628eae666ec25a681683b572b2a16ff8b55c511c761chao.bi if (handler == null) { 6295a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee Rlog.e(LOG_TAG, "Could not find Phone handler for unregistration"); 6305a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee return; 6315a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee } 6325a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee mHandlerMap.remove(phone); 6335a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for common events supported by all phones 6355a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForPreciseCallStateChanged(handler); 6365a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForDisconnect(handler); 6375a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForNewRingingConnection(handler); 6385a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForUnknownConnection(handler); 6395a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForIncomingRing(handler); 6405a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForRingbackTone(handler); 6415a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForInCallVoicePrivacyOn(handler); 6425a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForInCallVoicePrivacyOff(handler); 6435a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForDisplayInfo(handler); 6445a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForSignalInfo(handler); 6455a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForResendIncallMute(handler); 6465a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForMmiInitiate(handler); 6475a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForMmiComplete(handler); 6485a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForSuppServiceFailed(handler); 6495a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee phone.unregisterForServiceStateChanged(handler); 6506d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak phone.unregisterForTtyModeReceived(handler); 6516bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 652573ba864406ec81dd3ff878760fa3317daddaa07Anthony Lee //phone.unregisterForRadioOffOrNotAvailable(handler); 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // for events supported only by GSM, CDMA and IMS phone 6554726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.setOnPostDialCharacter(null, EVENT_POST_DIAL_CHARACTER, null); 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for events supported only by CDMA phone 6584726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForCdmaOtaStatusChange(handler); 6594726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForSubscriptionInfoReady(handler); 6604726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForCallWaiting(handler); 6614726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForEcmTimerReset(handler); 662a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // for events supported only by IMS phone 6644726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForOnHoldTone(handler); 6654726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan phone.unregisterForSuppServiceFailed(handler); 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Answers a ringing or waiting call. 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Active call, if any, go on hold. 6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If active call can't be held, i.e., a background call of the same channel exists, 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the active call will be hang up. 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Answering occurs asynchronously, and final notification occurs via 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()}. 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException when call is not ringing or waiting 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void acceptCall(Call ringingCall) throws CallStateException { 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone ringingPhone = ringingCall.getPhone(); 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 685ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "acceptCall(" +ringingCall + " from " + ringingCall.getPhone() + ")"); 68622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( hasActiveFgCall() ) { 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone activePhone = getActiveFgCall().getPhone(); 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasBgCall = ! (activePhone.getBackgroundCall().isIdle()); 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean sameChannel = (activePhone == ringingPhone); 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 695ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "hasBgCall: "+ hasBgCall + "sameChannel:" + sameChannel); 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sameChannel && hasBgCall) { 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().hangup(); 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (!sameChannel && !hasBgCall) { 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone.switchHoldingAndActive(); 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (!sameChannel && hasBgCall) { 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().hangup(); 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7076d05f561549a66b597a5119665ccc3bf8a962d16Andrew Lee // We only support the AUDIO_ONLY video state in this scenario. 708631ce4b47921fef7e38bb9736899e9ecf0ee0403Tyler Gunn ringingPhone.acceptCall(VideoProfile.STATE_AUDIO_ONLY); 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 711ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End acceptCall(" +ringingCall + ")"); 71222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Reject (ignore) a ringing call. In GSM, this means UDUB 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (User Determined User Busy). Reject occurs asynchronously, 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and final notification occurs via 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()}. 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException when no call is ringing or waiting 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void rejectCall(Call ringingCall) throws CallStateException { 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 727ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "rejectCall(" +ringingCall + ")"); 72822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone ringingPhone = ringingCall.getPhone(); 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ringingPhone.rejectCall(); 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 736ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End rejectCall(" +ringingCall + ")"); 73722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Places active call on hold, and makes held call active. 7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Switch occurs asynchronously and may fail. 7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * There are 4 scenarios 7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. only active call but no held call, aka, hold 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. no active call but only held call, aka, unhold 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. both active and held calls from same phone, aka, swap 7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4. active and held calls from different phones, aka, phone swap 7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Final notification occurs via 7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()}. 7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException if active call is ringing, waiting, or 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * dialing/alerting, or heldCall can't be active. 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * In these cases, this operation may not be performed. 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void switchHoldingAndActive(Call heldCall) throws CallStateException { 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone activePhone = null; 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone heldPhone = null; 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 764ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "switchHoldingAndActive(" +heldCall + ")"); 76522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone = getActiveFgCall().getPhone(); 7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (heldCall != null) { 7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville heldPhone = heldCall.getPhone(); 7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (activePhone != null) { 7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone.switchHoldingAndActive(); 7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (heldPhone != null && heldPhone != activePhone) { 7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville heldPhone.switchHoldingAndActive(); 7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 785ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End switchHoldingAndActive(" +heldCall + ")"); 78622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Hangup foreground call and resume the specific background call 7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note: this is noop if there is no foreground call or the heldCall is null 7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param heldCall to become foreground 7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws CallStateException 7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void hangupForegroundResumeBackground(Call heldCall) throws CallStateException { 7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone foregroundPhone = null; 8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone backgroundPhone = null; 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 803ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "hangupForegroundResumeBackground(" +heldCall + ")"); 80422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville foregroundPhone = getFgPhone(); 8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (heldCall != null) { 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville backgroundPhone = heldCall.getPhone(); 8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (foregroundPhone == backgroundPhone) { 8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().hangup(); 8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the call to be hangup and resumed belongs to different phones 8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().hangup(); 8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switchHoldingAndActive(heldCall); 8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 822ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End hangupForegroundResumeBackground(" +heldCall + ")"); 82322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Whether or not the phone can conference in the current phone 8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * state--that is, one call holding and one call active. 8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the phone can conference; false otherwise. 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canConference(Call heldCall) { 8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone activePhone = null; 8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone heldPhone = null; 8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone = getActiveFgCall().getPhone(); 8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (heldCall != null) { 8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville heldPhone = heldCall.getPhone(); 8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return heldPhone.getClass().equals(activePhone.getClass()); 8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 848a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Whether or not the phone can conference in the current phone 849a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * state--that is, one call holding and one call active. 850a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * This method consider the phone object which is specific 851a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * to the provided subId. 852a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if the phone can conference; false otherwise. 853a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 854b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean canConference(Call heldCall, int subId) { 855a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone activePhone = null; 856a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone heldPhone = null; 857a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 858a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hasActiveFgCall(subId)) { 859a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville activePhone = getActiveFgCall(subId).getPhone(); 860a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 861a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 862a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (heldCall != null) { 863a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville heldPhone = heldCall.getPhone(); 864a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 865a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 866a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return heldPhone.getClass().equals(activePhone.getClass()); 867a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 868a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 869a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Conferences holding and active. Conference occurs asynchronously 8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and may fail. Final notification occurs via 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()}. 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException if canConference() would return false. 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * In these cases, this operation may not be performed. 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void conference(Call heldCall) throws CallStateException { 879b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville int subId = heldCall.getPhone().getSubId(); 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 882ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "conference(" +heldCall + ")"); 88322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone fgPhone = getFgPhone(subId); 887a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (fgPhone != null) { 888a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (fgPhone instanceof SipPhone) { 889a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((SipPhone) fgPhone).conference(heldCall); 890a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (canConference(heldCall)) { 891a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville fgPhone.conference(); 892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 893a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw(new CallStateException("Can't conference foreground and selected background call")); 894a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 896a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "conference: fgPhone=null"); 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 900ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End conference(" +heldCall + ")"); 90122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initiate a new voice connection. This happens asynchronously, so you 9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * cannot assume the audio path is connected (or a call index has been 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * assigned) until PhoneStateChanged notification has occurred. 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException if a new outgoing call is not currently 9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * possible because no more call slots exist or a call exists that is 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * dialing, alerting, ringing, or waiting. Other errors are 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * handled asynchronously. 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9166bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn public Connection dial(Phone phone, String dialString, int videoState) 9176bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn throws CallStateException { 918b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville int subId = phone.getSubId(); 9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Connection result; 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 922e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan Rlog.d(LOG_TAG, " dial(" + phone + ", "+ dialString + ")" + 923a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville " subId = " + subId); 92422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!canDial(phone)) { 9281997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert /* 9291997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert * canDial function only checks whether the phone can make a new call. 9301997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert * InCall MMI commmands are basically supplementary services 9311997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert * within a call eg: call hold, call deflection, explicit call transfer etc. 9321997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert */ 9331997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert String newDialString = PhoneNumberUtils.stripSeparators(dialString); 934e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (phone.handleInCallMmiCommands(newDialString)) { 9351997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert return null; 9361997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert } else { 9371997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert throw new CallStateException("cannot dial in current state"); 9381997a5ea7fc70748366e20cf8d5f27dd7600c4d2Fabien Hubert } 9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( hasActiveFgCall(subId) ) { 942a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone activePhone = getActiveFgCall(subId).getPhone(); 9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasBgCall = !(activePhone.getBackgroundCall().isIdle()); 9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 946e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan Rlog.d(LOG_TAG, "hasBgCall: "+ hasBgCall + " sameChannel:" + (activePhone == phone)); 9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 949a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Manipulation between IMS phone and its owner 950a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // will be treated in GSM/CDMA phone. 951e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan Phone imsPhone = phone.getImsPhone(); 952e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan if (activePhone != phone 953e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan && (imsPhone == null || imsPhone != activePhone)) { 9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasBgCall) { 955ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "Hangup"); 956a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getActiveFgCall(subId).hangup(); 9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 958ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "Switch"); 9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone.switchHoldingAndActive(); 9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9646bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 9656bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville //mIsEccDialing = PhoneNumberUtils.isEmergencyNumber(dialString); 9666bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 967e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan result = phone.dial(dialString, videoState); 9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 970e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan Rlog.d(LOG_TAG, "End dial(" + phone + ", "+ dialString + ")"); 97122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Initiate a new voice connection. This happens asynchronously, so you 9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * cannot assume the audio path is connected (or a call index has been 9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * assigned) until PhoneStateChanged notification has occurred. 9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException if a new outgoing call is not currently 9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * possible because no more call slots exist or a call exists that is 9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * dialing, alerting, ringing, or waiting. Other errors are 9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * handled asynchronously. 9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9876bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn public Connection dial(Phone phone, String dialString, UUSInfo uusInfo, int videoState) 9886bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn throws CallStateException { 989df0280231c51a24a0b66c24034827d7f73d6e1acSantos Cordon return phone.dial(dialString, uusInfo, videoState, null); 9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * clear disconnect connection for each phone 9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void clearDisconnected() { 9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for(Phone phone : mPhones) { 9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.clearDisconnected(); 9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1002a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * clear disconnect connection for a phone specific 1003a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * to the provided subId 1004a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1005b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public void clearDisconnected(int subId) { 1006a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for(Phone phone : mPhones) { 1007a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (phone.getSubId() == subId) { 1008a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville phone.clearDisconnected(); 1009a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1010a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1011a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1012a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1013a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Phone can make a call only if ALL of the following are true: 10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * - Phone is not powered off 10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * - There's no incoming or waiting call 10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * - The foreground call is ACTIVE or IDLE or DISCONNECTED. 10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (We mainly need to make sure it *isn't* DIALING or ALERTING.) 10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param phone 10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the phone can make a new call 10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean canDial(Phone phone) { 10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int serviceState = phone.getServiceState().getState(); 1024b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville int subId = phone.getSubId(); 10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasRingingCall = hasActiveRingingCall(); 1026a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call.State fgCallState = getActiveFgCallState(subId); 10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean result = (serviceState != ServiceState.STATE_POWER_OFF 10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && !hasRingingCall 10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && ((fgCallState == Call.State.ACTIVE) 10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville || (fgCallState == Call.State.IDLE) 1032a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (fgCallState == Call.State.DISCONNECTED) 1033a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*As per 3GPP TS 51.010-1 section 31.13.1.4 1034a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call should be alowed when the foreground 1035a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call is in ALERTING state*/ 1036a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (fgCallState == Call.State.ALERTING))); 10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (result == false) { 1039ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "canDial serviceState=" + serviceState 10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRingingCall=" + hasRingingCall 10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " fgCallState=" + fgCallState); 10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Whether or not the phone can do explicit call transfer in the current 10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * phone state--that is, one call holding and one call active. 10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the phone can do explicit call transfer; false otherwise. 10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canTransfer(Call heldCall) { 10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone activePhone = null; 10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Phone heldPhone = null; 10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville activePhone = getActiveFgCall().getPhone(); 10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (heldCall != null) { 10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville heldPhone = heldCall.getPhone(); 10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (heldPhone == activePhone && activePhone.canTransfer()); 10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1067a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Whether or not the phone specific to subId can do explicit call transfer 1068a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * in the current phone state--that is, one call holding and one call active. 1069a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if the phone can do explicit call transfer; false otherwise. 1070a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1071b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean canTransfer(Call heldCall, int subId) { 1072a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone activePhone = null; 1073a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone heldPhone = null; 1074a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1075a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hasActiveFgCall(subId)) { 1076a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville activePhone = getActiveFgCall(subId).getPhone(); 1077a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1078a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1079a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (heldCall != null) { 1080a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville heldPhone = heldCall.getPhone(); 1081a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1082a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1083a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (heldPhone == activePhone && activePhone.canTransfer()); 1084a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1085a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1086a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connects the held call and active call 10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Disconnects the subscriber from both calls 10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Explicit Call Transfer occurs asynchronously 10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and may fail. Final notification occurs via 10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()}. 10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @exception CallStateException if canTransfer() would return false. 10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * In these cases, this operation may not be performed. 10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void explicitCallTransfer(Call heldCall) throws CallStateException { 10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1100ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, " explicitCallTransfer(" + heldCall + ")"); 110122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (canTransfer(heldCall)) { 11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville heldCall.getPhone().explicitCallTransfer(); 11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1109ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End explicitCallTransfer(" + heldCall + ")"); 111022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns a list of MMI codes that are pending for a phone. (They have initiated 11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but have not yet completed). 11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Presently there is only ever one. 11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Use <code>registerForMmiInitiate</code> 11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and <code>registerForMmiComplete</code> for change notification. 11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return null if phone doesn't have or support mmi code 11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<? extends MmiCode> getPendingMmiCodes(Phone phone) { 1125ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "getPendingMmiCodes not implemented"); 11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Sends user response to a USSD REQUEST message. An MmiCode instance 11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * representing this response is sent to handlers registered with 11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * registerForMmiInitiate. 11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ussdMessge Message to send in the response. 11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return false if phone doesn't support ussd service 11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean sendUssdResponse(Phone phone, String ussdMessge) { 1138ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "sendUssdResponse not implemented"); 11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Mutes or unmutes the microphone for the active call. The microphone 11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * is automatically unmuted if a call is answered, dialed, or resumed 11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * from a holding state. 11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param muted true to mute the microphone, 11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * false to activate the microphone. 11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setMute(boolean muted) { 11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1153ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, " setMute(" + muted + ")"); 115422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().getPhone().setMute(muted); 11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1162ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End setMute(" + muted + ")"); 116322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Gets current mute status. Use 11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, 11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * java.lang.Object) registerForPreciseCallStateChanged()} 11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * as a change notifcation, although presently phone state changed is not 11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * fired when setMute() is called. 11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true is muting, false is unmuting 11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean getMute() { 11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return getActiveFgCall().getPhone().getMute(); 11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (hasActiveBgCall()) { 11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return getFirstActiveBgCall().getPhone().getMute(); 11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Enables or disables echo suppression. 11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1188184ffb58812108624ea0be2732cdae511b99d09dVidyakumar Athota public void setEchoSuppressionEnabled() { 11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1190184ffb58812108624ea0be2732cdae511b99d09dVidyakumar Athota Rlog.d(LOG_TAG, " setEchoSuppression()"); 119122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 1195184ffb58812108624ea0be2732cdae511b99d09dVidyakumar Athota getActiveFgCall().getPhone().setEchoSuppressionEnabled(); 11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1199184ffb58812108624ea0be2732cdae511b99d09dVidyakumar Athota Rlog.d(LOG_TAG, "End setEchoSuppression()"); 120022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Play a DTMF tone on the active call. 12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param c should be one of 0-9, '*' or '#'. Other values will be 12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * silently ignored. 12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return false if no active call or the active call doesn't support 12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * dtmf tone 12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean sendDtmf(char c) { 12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean result = false; 12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1216ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, " sendDtmf(" + c + ")"); 121722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().getPhone().sendDtmf(c); 12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = true; 12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1226ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End sendDtmf(" + c + ")"); 122722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Start to paly a DTMF tone on the active call. 12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or there is a playing DTMF tone. 12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param c should be one of 0-9, '*' or '#'. Other values will be 12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * silently ignored. 12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return false if no active call or the active call doesn't support 12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * dtmf tone 12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean startDtmf(char c) { 12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean result = false; 12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1245ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, " startDtmf(" + c + ")"); 124622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().getPhone().startDtmf(c); 12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = true; 12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1255ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End startDtmf(" + c + ")"); 125622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Stop the playing DTMF tone. Ignored if there is no playing DTMF 12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * tone or no active call. 12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void stopDtmf() { 12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1268ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, " stopDtmf()" ); 126922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) getFgPhone().stopDtmf(); 12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) { 1275ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "End stopDtmf()"); 127622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Rlog.d(LOG_TAG, toString()); 12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * send burst DTMF tone, it can send the string as single character or multiple character 12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * ignore if there is no active call or not valid digits string. 12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Valid digit means only includes characters ISO-LATIN characters 0-9, *, # 12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The difference between sendDtmf and sendBurstDtmf is sendDtmf only sends one character, 12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * this api can send single character and multiple character, also, this api has response 12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * back to caller. 12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param dtmfString is string representing the dialing digit(s) in the active call 12890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param on the DTMF ON length in milliseconds, or 0 for default 12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param off the DTMF OFF length in milliseconds, or 0 for default 12910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param onComplete is the callback message when the action is processed by BP 12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 12930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 12940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) { 12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasActiveFgCall()) { 12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getActiveFgCall().getPhone().sendBurstDtmf(dtmfString, on, off, onComplete); 12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Notifies when a voice connection has disconnected, either due to local 13040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or remote hangup or error. 13050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 13060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Messages received from this will have the following members:<p> 13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <ul><li>Message.obj will be an AsyncResult</li> 13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>AsyncResult.userObj = obj</li> 13090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <li>AsyncResult.result = a Connection object that is 13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * no longer connected.</li></ul> 13110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForDisconnect(Handler h, int what, Object obj) { 13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectRegistrants.addUnique(h, what, obj); 13140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for voice disconnection notification. 13180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForDisconnect(Handler h){ 13210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectRegistrants.remove(h); 13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for getting notifications for change in the Call State {@link Call.State} 1326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * This is called PreciseCallState because the call state is more precise than what 1327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * can be obtained using the {@link PhoneStateListener} 13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Resulting events will have an AsyncResult in <code>Message.obj</code>. 13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.userData will be set to the obj argument here. 13310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The <em>h</em> parameter is held only by a weak reference. 13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForPreciseCallStateChanged(Handler h, int what, Object obj){ 13340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPreciseCallStateRegistrants.addUnique(h, what, obj); 13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for voice call state change notifications. 13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently. 13400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForPreciseCallStateChanged(Handler h){ 13420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPreciseCallStateRegistrants.remove(h); 13430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Notifies when a previously untracked non-ringing/waiting connection has appeared. 13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is likely due to some other entity (eg, SIM card application) initiating a call. 13480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForUnknownConnection(Handler h, int what, Object obj){ 13500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mUnknownConnectionRegistrants.addUnique(h, what, obj); 13510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for unknown connection notifications. 13550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForUnknownConnection(Handler h){ 13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mUnknownConnectionRegistrants.remove(h); 13580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Notifies when a new ringing or waiting connection has appeared.<p> 13630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Messages received from this: 13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will be an AsyncResult 13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.userObj = obj 13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result = a Connection. <p> 13680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Please check Connection.isRinging() to make sure the Connection 13690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * has not dropped since this message was posted. 13700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If Connection.isRinging() is true, then 13710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connection.getCall() == Phone.getRingingCall() 13720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForNewRingingConnection(Handler h, int what, Object obj){ 13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRingingConnectionRegistrants.addUnique(h, what, obj); 13750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for new ringing connection notification. 13790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForNewRingingConnection(Handler h){ 13830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRingingConnectionRegistrants.remove(h); 13840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Notifies when an incoming call rings.<p> 13880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Messages received from this: 13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will be an AsyncResult 13910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.userObj = obj 13920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result = a Connection. <p> 13930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForIncomingRing(Handler h, int what, Object obj){ 13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIncomingRingRegistrants.addUnique(h, what, obj); 13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for ring notification. 14000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForIncomingRing(Handler h){ 14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIncomingRingRegistrants.remove(h); 14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Notifies when out-band ringback tone is needed.<p> 14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Messages received from this: 14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will be an AsyncResult 14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.userObj = obj 14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result = boolean, true to start play ringback tone 14140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and false to stop. <p> 14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForRingbackTone(Handler h, int what, Object obj){ 14170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRingbackToneRegistrants.addUnique(h, what, obj); 14180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for ringback tone notification. 14220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForRingbackTone(Handler h){ 14250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRingbackToneRegistrants.remove(h); 14260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Notifies when out-band on-hold tone is needed.<p> 1430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 1431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Messages received from this: 1432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Message.obj will be an AsyncResult 1433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * AsyncResult.userObj = obj 1434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * AsyncResult.result = boolean, true to start play on-hold tone 1435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * and false to stop. <p> 1436a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void registerForOnHoldTone(Handler h, int what, Object obj){ 1438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOnHoldToneRegistrants.addUnique(h, what, obj); 1439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 1442a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unregisters for on-hold tone notification. 1443a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void unregisterForOnHoldTone(Handler h){ 1446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOnHoldToneRegistrants.remove(h); 1447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1449a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Registers the handler to reset the uplink mute state to get 14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * uplink audio. 14520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForResendIncallMute(Handler h, int what, Object obj){ 14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mResendIncallMuteRegistrants.addUnique(h, what, obj); 14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for resend incall mute notifications. 14590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForResendIncallMute(Handler h){ 14610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mResendIncallMuteRegistrants.remove(h); 14620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications of initiation of a new MMI code request. 14660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * MMI codes for GSM are discussed in 3GPP TS 22.030.<p> 14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 14680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Example: If Phone.dial is called with "*#31#", then the app will 14690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * be notified here.<p> 14700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 14710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The returned <code>Message.obj</code> will contain an AsyncResult. 14720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 14730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>obj.result</code> will be an "MmiCode" object. 14740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForMmiInitiate(Handler h, int what, Object obj){ 14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiInitiateRegistrants.addUnique(h, what, obj); 14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for new MMI initiate notification. 14810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 14820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForMmiInitiate(Handler h){ 14840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiInitiateRegistrants.remove(h); 14850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications that an MMI request has completed 14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * its network activity and is in its final state. This may mean a state 14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * of COMPLETE, FAILED, or CANCELLED. 14910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>Message.obj</code> will contain an AsyncResult. 14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>obj.result</code> will be an "MmiCode" object 14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForMmiComplete(Handler h, int what, Object obj){ 14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiCompleteRegistrants.addUnique(h, what, obj); 14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for MMI complete notification. 15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 15020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForMmiComplete(Handler h){ 15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiCompleteRegistrants.remove(h); 15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Registration point for Ecm timer reset 15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h handler to notify 15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what user-defined message code 15110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj placed in Message.obj 15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForEcmTimerReset(Handler h, int what, Object obj){ 15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mEcmTimerResetRegistrants.addUnique(h, what, obj); 15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notification for Ecm timer reset 15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForEcmTimerReset(Handler h){ 15220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mEcmTimerResetRegistrants.remove(h); 15230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for ServiceState changed. 15270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will contain an AsyncResult. 15280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result will be a ServiceState instance 15290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForServiceStateChanged(Handler h, int what, Object obj){ 15310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mServiceStateChangedRegistrants.addUnique(h, what, obj); 15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for ServiceStateChange notification. 15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForServiceStateChanged(Handler h){ 15390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mServiceStateChangedRegistrants.remove(h); 15400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications when a supplementary service attempt fails. 15440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will contain an AsyncResult. 15450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 15480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForSuppServiceFailed(Handler h, int what, Object obj){ 15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSuppServiceFailedRegistrants.addUnique(h, what, obj); 15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications when a supplementary service attempt fails. 15560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForSuppServiceFailed(Handler h){ 15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSuppServiceFailedRegistrants.remove(h); 15620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications when a sInCall VoicePrivacy is enabled 15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 15700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){ 15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOnRegistrants.addUnique(h, what, obj); 15730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications when a sInCall VoicePrivacy is enabled 15770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 15790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForInCallVoicePrivacyOn(Handler h){ 15810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOnRegistrants.remove(h); 15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications when a sInCall VoicePrivacy is disabled 15860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){ 15920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOffRegistrants.addUnique(h, what, obj); 15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications when a sInCall VoicePrivacy is disabled 15970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 15980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForInCallVoicePrivacyOff(Handler h){ 16010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOffRegistrants.remove(h); 16020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications when CDMA call waiting comes 16060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 16080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 16090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 16100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForCallWaiting(Handler h, int what, Object obj){ 16120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCallWaitingRegistrants.addUnique(h, what, obj); 16130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications when CDMA Call waiting comes 16170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 16180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForCallWaiting(Handler h){ 16200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCallWaitingRegistrants.remove(h); 16210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for signal information notifications from the network. 16260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will contain an AsyncResult. 16270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result will be a SuppServiceNotification instance. 16280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 16300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 16310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 16320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForSignalInfo(Handler h, int what, Object obj){ 16350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSignalInfoRegistrants.addUnique(h, what, obj); 16360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for signal information notifications. 16400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 16410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 16430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForSignalInfo(Handler h){ 16450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSignalInfoRegistrants.remove(h); 16460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for display information notifications from the network. 16500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.obj will contain an AsyncResult. 16510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AsyncResult.result will be a SuppServiceNotification instance. 16520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 16540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 16550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 16560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForDisplayInfo(Handler h, int what, Object obj){ 16580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisplayInfoRegistrants.addUnique(h, what, obj); 16590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregisters for display information notifications. 16630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Extraneous calls are tolerated silently 16640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 16660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForDisplayInfo(Handler h) { 16680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisplayInfoRegistrants.remove(h); 16690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Register for notifications when CDMA OTA Provision status change 16730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler that receives the notification message. 16750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what User-defined message code. 16760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj User object. 16770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj){ 16790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCdmaOtaStatusChangeRegistrants.addUnique(h, what, obj); 16800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications when CDMA OTA Provision status change 16840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 16850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForCdmaOtaStatusChange(Handler h){ 16870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCdmaOtaStatusChangeRegistrants.remove(h); 16880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16916bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville * Registration point for subscription info ready 16920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h handler to notify 16930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param what what code of message when delivered 16940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param obj placed in Message.obj 16950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForSubscriptionInfoReady(Handler h, int what, Object obj){ 16970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubscriptionInfoReadyRegistrants.addUnique(h, what, obj); 16980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unregister for notifications for subscription info 17020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param h Handler to be removed from the registrant list. 17030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForSubscriptionInfoReady(Handler h){ 17050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubscriptionInfoReadyRegistrants.remove(h); 17060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Sets an event to be fired when the telephony system processes 17100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * a post-dial character on an outgoing call.<p> 17110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Messages of type <code>what</code> will be sent to <code>h</code>. 17130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The <code>obj</code> field of these Message's will be instances of 17140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>AsyncResult</code>. <code>Message.obj.result</code> will be 17150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * a Connection object.<p> 17160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Message.arg1 will be the post dial character being processed, 17180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or 0 ('\0') if end of string.<p> 17190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If Connection.getPostDialState() == WAIT, 17210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the application must call 17220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link com.android.internal.telephony.Connection#proceedAfterWaitChar() 17230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connection.proceedAfterWaitChar()} or 17240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link com.android.internal.telephony.Connection#cancelPostDial() 17250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connection.cancelPostDial()} 17260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * for the telephony system to continue playing the post-dial 17270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * DTMF sequence.<p> 17280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If Connection.getPostDialState() == WILD, 17300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the application must call 17310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link com.android.internal.telephony.Connection#proceedAfterWildChar 17320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connection.proceedAfterWildChar()} 17330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or 17340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link com.android.internal.telephony.Connection#cancelPostDial() 17350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Connection.cancelPostDial()} 17360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * for the telephony system to continue playing the 17370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * post-dial DTMF sequence.<p> 17380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForPostDialCharacter(Handler h, int what, Object obj){ 17410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPostDialCharacterRegistrants.addUnique(h, what, obj); 17420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForPostDialCharacter(Handler h){ 17450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPostDialCharacterRegistrants.remove(h); 17460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17486d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak /** 17496d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * Register for TTY mode change notifications from the network. 17506d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * Message.obj will contain an AsyncResult. 17516d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * AsyncResult.result will be an Integer containing new mode. 17526d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * 17536d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * @param h Handler that receives the notification message. 17546d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * @param what User-defined message code. 17556d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * @param obj User object. 17566d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak */ 17576d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak public void registerForTtyModeReceived(Handler h, int what, Object obj){ 17586d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak mTtyModeReceivedRegistrants.addUnique(h, what, obj); 17596d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak } 17606d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak 17616d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak /** 17626d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * Unregisters for TTY mode change notifications. 17636d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * Extraneous calls are tolerated silently 17646d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * 17656d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak * @param h Handler to be removed from the registrant list. 17666d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak */ 17676d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak public void unregisterForTtyModeReceived(Handler h) { 17686d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak mTtyModeReceivedRegistrants.remove(h); 17696d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak } 17706d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak 17710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* APIs to access foregroudCalls, backgroudCalls, and ringingCalls 17720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. APIs to access list of calls 17730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. APIs to check if any active call, which has connection other than 17740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * disconnected ones, pleaser refer to Call.isIdle() 17750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. APIs to return first active call 17760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4. APIs to return the connections of first active call 17770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5. APIs to return other property of first active call 17780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return list of all ringing calls 17820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Call> getRingingCalls() { 17840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Collections.unmodifiableList(mRingingCalls); 17850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return list of all foreground calls 17890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Call> getForegroundCalls() { 17910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Collections.unmodifiableList(mForegroundCalls); 17920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return list of all background calls 17960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Call> getBackgroundCalls() { 17980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Collections.unmodifiableList(mBackgroundCalls); 17990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 18020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if there is at least one active foreground call 18030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 18040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasActiveFgCall() { 18050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (getFirstActiveCall(mForegroundCalls) != null); 18060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1809a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Return true if there is at least one active foreground call 1810a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * on a particular subId or an active sip call 1811a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1812b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean hasActiveFgCall(int subId) { 1813a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstActiveCall(mForegroundCalls, subId) != null); 1814a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1815a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1816a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 18170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if there is at least one active background call 18180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 18190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasActiveBgCall() { 18200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // TODO since hasActiveBgCall may get called often 18210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // better to cache it to improve performance 18220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (getFirstActiveCall(mBackgroundCalls) != null); 18230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1826a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Return true if there is at least one active background call 1827a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * on a particular subId or an active sip call 1828a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1829b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean hasActiveBgCall(int subId) { 1830a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // TODO since hasActiveBgCall may get called often 1831a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // better to cache it to improve performance 1832a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstActiveCall(mBackgroundCalls, subId) != null); 1833a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1834a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1835a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 18360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if there is at least one active ringing call 18370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 18380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 18390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasActiveRingingCall() { 18400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (getFirstActiveCall(mRingingCalls) != null); 18410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1844a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Return true if there is at least one active ringing call 1845a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1846b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean hasActiveRingingCall(int subId) { 1847a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstActiveCall(mRingingCalls, subId) != null); 1848a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1849a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1850a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 18510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return the active foreground call from foreground calls 18520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 18530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Active call means the call is NOT in Call.State.IDLE 18540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 18550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. If there is active foreground call, return it 18560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. If there is no active foreground call, return the 18570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * foreground call associated with default phone, which state is IDLE. 18580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. If there is no phone registered at all, return null. 18590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 18600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 18610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Call getActiveFgCall() { 18620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call call = getFirstNonIdleCall(mForegroundCalls); 18630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call == null) { 18640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = (mDefaultPhone == null) 18650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? null 18660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : mDefaultPhone.getForegroundCall(); 18670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 18690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1871b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Call getActiveFgCall(int subId) { 1872a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call call = getFirstNonIdleCall(mForegroundCalls, subId); 1873a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (call == null) { 1874a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone phone = getPhone(subId); 1875a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = (phone == null) 1876a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ? null 1877a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville : phone.getForegroundCall(); 1878a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1879a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 1880a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1881a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 18820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Returns the first call that is not in IDLE state. If both active calls 18830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // and disconnecting/disconnected calls exist, return the first active call. 18840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Call getFirstNonIdleCall(List<Call> calls) { 18850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call result = null; 18860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Call call : calls) { 18870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!call.isIdle()) { 18880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 18890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (call.getState() != Call.State.IDLE) { 18900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (result == null) result = call; 18910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 18940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1896a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Returns the first call that is not in IDLE state. If both active calls 1897a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // and disconnecting/disconnected calls exist, return the first active call. 1898b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville private Call getFirstNonIdleCall(List<Call> calls, int subId) { 1899a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call result = null; 1900a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Call call : calls) { 1901a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((call.getPhone().getSubId() == subId) || 1902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (call.getPhone() instanceof SipPhone)) { 1903a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!call.isIdle()) { 1904a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 1905a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (call.getState() != Call.State.IDLE) { 1906a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (result == null) result = call; 1907a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1908a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1909a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return result; 1911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 19130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 19140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return one active background call from background calls 19150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Active call means the call is NOT idle defined by Call.isIdle() 19170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. If there is only one active background call, return it 19190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. If there is more than one active background call, return the first one 19200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. If there is no active background call, return the background call 19210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * associated with default phone, which state is IDLE. 19220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4. If there is no background call at all, return null. 19230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Complete background calls list can be get by getBackgroundCalls() 19250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 19260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Call getFirstActiveBgCall() { 19270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call call = getFirstNonIdleCall(mBackgroundCalls); 19280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call == null) { 19290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = (mDefaultPhone == null) 19300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? null 19310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : mDefaultPhone.getBackgroundCall(); 19320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 19340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 19360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * return one active background call from background calls of the 1938a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * requested subId. 1939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 1940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Active call means the call is NOT idle defined by Call.isIdle() 1941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 1942a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 1. If there is only one active background call on given sub or 1943a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * on SIP Phone, return it 1944a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 2. If there is more than one active background call, return the background call 1945a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * associated with the active sub. 1946a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 3. If there is no background call at all, return null. 1947a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 1948a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Complete background calls list can be get by getBackgroundCalls() 1949a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1950b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Call getFirstActiveBgCall(int subId) { 1951a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone phone = getPhone(subId); 1952a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hasMoreThanOneHoldingCall(subId)) { 1953a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return phone.getBackgroundCall(); 1954a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1955a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call call = getFirstNonIdleCall(mBackgroundCalls, subId); 1956a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (call == null) { 1957a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = (phone == null) 1958a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ? null 1959a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville : phone.getBackgroundCall(); 1960a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1961a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 1962a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1963a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1964a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1965a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 19660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return one active ringing call from ringing calls 19670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Active call means the call is NOT idle defined by Call.isIdle() 19690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1. If there is only one active ringing call, return it 19710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2. If there is more than one active ringing call, return the first one 19720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3. If there is no active ringing call, return the ringing call 19730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * associated with default phone, which state is IDLE. 19740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4. If there is no ringing call at all, return null. 19750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 19760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Complete ringing calls list can be get by getRingingCalls() 19770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 19780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Call getFirstActiveRingingCall() { 19790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call call = getFirstNonIdleCall(mRingingCalls); 19800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call == null) { 19810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = (mDefaultPhone == null) 19820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? null 19830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : mDefaultPhone.getRingingCall(); 19840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 19860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1988b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Call getFirstActiveRingingCall(int subId) { 1989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Phone phone = getPhone(subId); 1990a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call call = getFirstNonIdleCall(mRingingCalls, subId); 1991a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (call == null) { 1992a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = (phone == null) 1993a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ? null 1994a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville : phone.getRingingCall(); 1995a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1996a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 1997a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1998a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 19990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 20000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the state of active foreground call 20010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return IDLE if there is no active foreground call 20020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 20030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Call.State getActiveFgCallState() { 20040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call fgCall = getActiveFgCall(); 20050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (fgCall != null) { 20070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return fgCall.getState(); 20080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Call.State.IDLE; 20110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2013b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Call.State getActiveFgCallState(int subId) { 2014a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call fgCall = getActiveFgCall(subId); 2015a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2016a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (fgCall != null) { 2017a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return fgCall.getState(); 2018a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2019a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2020a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return Call.State.IDLE; 2021a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2022a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 20230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 20240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the connections of active foreground call 20250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return empty list if there is no active foreground call 20260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 20270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> getFgCallConnections() { 20280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call fgCall = getActiveFgCall(); 20290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( fgCall != null) { 20300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return fgCall.getConnections(); 20310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 203222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mEmptyConnections; 20330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2036a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the connections of active foreground call 2037a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * return empty list if there is no active foreground call 2038a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2039b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public List<Connection> getFgCallConnections(int subId) { 2040a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call fgCall = getActiveFgCall(subId); 2041a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( fgCall != null) { 2042a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return fgCall.getConnections(); 2043a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2044a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mEmptyConnections; 2045a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2046a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2047a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 20480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the connections of active background call 20490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return empty list if there is no active background call 20500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 20510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> getBgCallConnections() { 20520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call bgCall = getFirstActiveBgCall(); 20530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( bgCall != null) { 20540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return bgCall.getConnections(); 20550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 205622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mEmptyConnections; 20570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2060a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the connections of active background call 2061a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * return empty list if there is no active background call 2062a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2063b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public List<Connection> getBgCallConnections(int subId) { 2064a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call bgCall = getFirstActiveBgCall(subId); 2065a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( bgCall != null) { 2066a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return bgCall.getConnections(); 2067a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2068a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mEmptyConnections; 2069a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2070a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2071a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 20720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the latest connection of active foreground call 20730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * return null if there is no active foreground call 20740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 20750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Connection getFgCallLatestConnection() { 20760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call fgCall = getActiveFgCall(); 20770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( fgCall != null) { 20780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return fgCall.getLatestConnection(); 20790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 20810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 20820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2084a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the latest connection of active foreground call 2085a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * return null if there is no active foreground call 2086a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2087b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public Connection getFgCallLatestConnection(int subId) { 2088a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Call fgCall = getActiveFgCall(subId); 2089a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( fgCall != null) { 2090a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return fgCall.getLatestConnection(); 2091a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2092a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 2093a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2094a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2095a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 20960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there is at least one Foreground call in disconnected state 20970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 20980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasDisconnectedFgCall() { 20990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (getFirstCallOfState(mForegroundCalls, Call.State.DISCONNECTED) != null); 21000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 21020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if there is at least one Foreground call in disconnected state 2104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2105b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean hasDisconnectedFgCall(int subId) { 2106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstCallOfState(mForegroundCalls, Call.State.DISCONNECTED, 2107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville subId) != null); 2108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 21110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there is at least one background call in disconnected state 21120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 21130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean hasDisconnectedBgCall() { 21140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (getFirstCallOfState(mBackgroundCalls, Call.State.DISCONNECTED) != null); 21150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 21170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if there is at least one background call in disconnected state 2119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2120b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville public boolean hasDisconnectedBgCall(int subId) { 2121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstCallOfState(mBackgroundCalls, Call.State.DISCONNECTED, 2122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville subId) != null); 2123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 21270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the first active call from a call list 21280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 21290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Call getFirstActiveCall(ArrayList<Call> calls) { 21300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Call call : calls) { 21310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!call.isIdle()) { 21320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 21330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 21360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 21380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the first active call from a call list 2140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2141b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville private Call getFirstActiveCall(ArrayList<Call> calls, int subId) { 2142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Call call : calls) { 2143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((!call.isIdle()) && ((call.getPhone().getSubId() == subId) || 2144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (call.getPhone() instanceof SipPhone))) { 2145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 2146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 2149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 21520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return the first call in a the Call.state from a call list 21530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 21540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Call getFirstCallOfState(ArrayList<Call> calls, Call.State state) { 21550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Call call : calls) { 21560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call.getState() == state) { 21570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return call; 21580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 21610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 2164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return the first call in a the Call.state from a call list 2165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private Call getFirstCallOfState(ArrayList<Call> calls, Call.State state, 2167b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville int subId) { 2168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Call call : calls) { 2169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((call.getState() == state) || 2170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((call.getPhone().getSubId() == subId) || 2171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (call.getPhone() instanceof SipPhone))) { 2172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return call; 2173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 2176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 21770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 21780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean hasMoreThanOneRingingCall() { 21790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int count = 0; 21800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Call call : mRingingCalls) { 21810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call.getState().isRinging()) { 21820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (++count > 1) return true; 21830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 21860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 21870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 2189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if more than one active ringing call exists on 2190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * the active subId. 2191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * This checks for the active calls on provided 2192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * subId and also active calls on SIP Phone. 2193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 2194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2195b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville private boolean hasMoreThanOneRingingCall(int subId) { 2196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = 0; 2197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Call call : mRingingCalls) { 2198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((call.getState().isRinging()) && 2199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((call.getPhone().getSubId() == subId) || 2200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (call.getPhone() instanceof SipPhone))) { 2201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (++count > 1) return true; 2202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 2205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 2208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if more than one active background call exists on 2209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * the provided subId. 2210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * This checks for the background calls on provided 2211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * subId and also background calls on SIP Phone. 2212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 2213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2214b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville private boolean hasMoreThanOneHoldingCall(int subId) { 2215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int count = 0; 2216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Call call : mBackgroundCalls) { 2217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((call.getState() == Call.State.HOLDING) && 2218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((call.getPhone().getSubId() == subId) || 2219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville (call.getPhone() instanceof SipPhone))) { 2220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (++count > 1) return true; 2221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 2224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 22266bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville /* FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 22276bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville private boolean isServiceStateInService() { 22286bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville boolean bInService = false; 22296bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 22306bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville for (Phone phone : mPhones) { 22316bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville bInService = (phone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE); 22326bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (bInService) { 22336bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville break; 22346bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 22356bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 22366bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 22376bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, "[isServiceStateInService] bInService = " + bInService); 22386bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville return bInService; 22396bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 22406bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville */ 22416bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 22425a514e8e8193bbd09687cc1fb286122b79eca612Anthony Lee private class CallManagerHandler extends Handler { 22430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 22440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 22450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 22460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 22470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISCONNECT: 2248ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_DISCONNECT)"); 22490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22506bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 22516bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville //mIsEccDialing = false; 22520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_PRECISE_CALL_STATE_CHANGED: 2254ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_PRECISE_CALL_STATE_CHANGED)"); 22550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPreciseCallStateRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_NEW_RINGING_CONNECTION: 2258ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_NEW_RINGING_CONNECTION)"); 2259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Connection c = (Connection) ((AsyncResult) msg.obj).result; 2260b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville int subId = c.getCall().getPhone().getSubId(); 2261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (getActiveFgCallState(subId).isDialing() || hasMoreThanOneRingingCall()) { 22620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 2263ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "silently drop incoming call: " + c.getCall()); 22640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville c.getCall().hangup(); 22650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (CallStateException e) { 2266ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "new ringing connection", e); 22670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 22680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 22690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRingingConnectionRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 22710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_UNKNOWN_CONNECTION: 2273ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_UNKNOWN_CONNECTION)"); 22740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mUnknownConnectionRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_INCOMING_RING: 2277ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_INCOMING_RING)"); 22780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The event may come from RIL who's not aware of an ongoing fg call 22790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!hasActiveFgCall()) { 22800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIncomingRingRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 22820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RINGBACK_TONE: 2284ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_RINGBACK_TONE)"); 22850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRingbackToneRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_IN_CALL_VOICE_PRIVACY_ON: 2288ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_IN_CALL_VOICE_PRIVACY_ON)"); 22890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOnRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_IN_CALL_VOICE_PRIVACY_OFF: 2292ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_IN_CALL_VOICE_PRIVACY_OFF)"); 22930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInCallVoicePrivacyOffRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CALL_WAITING: 2296ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_CALL_WAITING)"); 22970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCallWaitingRegistrants.notifyRegistrants((AsyncResult) msg.obj); 22980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 22990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_DISPLAY_INFO: 2300ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_DISPLAY_INFO)"); 23010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisplayInfoRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SIGNAL_INFO: 2304ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_SIGNAL_INFO)"); 23050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSignalInfoRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_CDMA_OTA_STATUS_CHANGE: 2308ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_CDMA_OTA_STATUS_CHANGE)"); 23090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCdmaOtaStatusChangeRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RESEND_INCALL_MUTE: 2312ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_RESEND_INCALL_MUTE)"); 23130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mResendIncallMuteRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_MMI_INITIATE: 2316ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_MMI_INITIATE)"); 23170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiInitiateRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_MMI_COMPLETE: 2320ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_MMI_COMPLETE)"); 23210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiCompleteRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_ECM_TIMER_RESET: 2324ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_ECM_TIMER_RESET)"); 23250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mEcmTimerResetRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SUBSCRIPTION_INFO_READY: 2328ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_SUBSCRIPTION_INFO_READY)"); 23290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubscriptionInfoReadyRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SUPP_SERVICE_FAILED: 2332ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_SUPP_SERVICE_FAILED)"); 23330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSuppServiceFailedRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SERVICE_STATE_CHANGED: 2336ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_SERVICE_STATE_CHANGED)"); 23370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mServiceStateChangedRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23386bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 23396bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville //setAudioMode(); 23400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 23410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_POST_DIAL_CHARACTER: 23420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // we need send the character that is being processed in msg.arg1 23430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // so can't use notifyRegistrants() 2344ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_POST_DIAL_CHARACTER)"); 23450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for(int i=0; i < mPostDialCharacterRegistrants.size(); i++) { 23460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message notifyMsg; 23470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyMsg = ((Registrant)mPostDialCharacterRegistrants.get(i)).messageForRegistrant(); 23480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyMsg.obj = msg.obj; 23490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyMsg.arg1 = msg.arg1; 23500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyMsg.sendToTarget(); 23510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 23520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_ONHOLD_TONE: 2354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_ONHOLD_TONE)"); 2355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOnHoldToneRegistrants.notifyRegistrants((AsyncResult) msg.obj); 2356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 23576d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak case EVENT_TTY_MODE_RECEIVED: 23586d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_TTY_MODE_RECEIVED)"); 23596d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak mTtyModeReceivedRegistrants.notifyRegistrants((AsyncResult) msg.obj); 23606d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak break; 23616bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville /* FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. 23626bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville case EVENT_RADIO_OFF_OR_NOT_AVAILABLE: 23636bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_RADIO_OFF_OR_NOT_AVAILABLE)"); 23646bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville setAudioMode(); 23656bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville break; 23666bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville */ 23670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 23680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 23690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 23700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 23710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 23720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String toString() { 23730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Call call; 23740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville StringBuilder b = new StringBuilder(); 2375a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 2376a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville b.append("CallManager {"); 2377a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville b.append("\nstate = " + getState(i)); 2378a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = getActiveFgCall(i); 23796bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 23806bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n- Foreground: " + getActiveFgCallState(i)); 23816bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append(" from " + call.getPhone()); 23826bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n Conn: ").append(getFgCallConnections(i)); 23836bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 2384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = getFirstActiveBgCall(i); 23856bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 23866bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n- Background: " + call.getState()); 23876bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append(" from " + call.getPhone()); 23886bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n Conn: ").append(getBgCallConnections(i)); 23896bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 2390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville call = getFirstActiveRingingCall(i); 23916bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 23926bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n- Ringing: " +call.getState()); 23936bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append(" from " + call.getPhone()); 23946bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 2395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 23960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 23970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Phone phone : getAllPhones()) { 23980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (phone != null) { 23990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville b.append("\nPhone: " + phone + ", name = " + phone.getPhoneName() 24000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + ", state = " + phone.getState()); 24010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = phone.getForegroundCall(); 24026bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 24036bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append("\n- Foreground: ").append(call); 24046bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 24050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = phone.getBackgroundCall(); 24066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 24076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append(" Background: ").append(call); 24086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 24090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville call = phone.getRingingCall(); 24106bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (call != null) { 24116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville b.append(" Ringing: ").append(call); 24126bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 24130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 24140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 24150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville b.append("\n}"); 24160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return b.toString(); 24170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 24180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2419