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