SipConnection.java revision 0d5710d9bfdb36d5d0a7be4eaf3f39ae3fb30bc5
1788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal/*
2788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * Copyright (C) 2014 The Android Open Source Project
3788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal *
4788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * Licensed under the Apache License, Version 2.0 (the "License");
5788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * you may not use this file except in compliance with the License.
6788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * You may obtain a copy of the License at
7788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal *
8788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal *      http://www.apache.org/licenses/LICENSE-2.0
9788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal *
10788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * Unless required by applicable law or agreed to in writing, software
11788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * distributed under the License is distributed on an "AS IS" BASIS,
12788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * See the License for the specific language governing permissions and
14788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal * limitations under the License.
15788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal */
16788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
17788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalpackage com.android.services.telephony.sip;
18788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport android.os.Handler;
201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport android.os.Message;
21788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.telecomm.CallAudioState;
221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport android.telecomm.CallCapabilities;
23788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.telecomm.Connection;
24788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.util.Log;
25788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
261344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.Call;
271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.CallStateException;
281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.sip.SipPhone;
291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
30788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport java.util.List;
31788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalfinal class SipConnection extends Connection {
33788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final String PREFIX = "[SipConnection] ";
34788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final boolean VERBOSE = true; /* STOP SHIP if true */
35788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private static final int MSG_PRECISE_CALL_STATE_CHANGED = 1;
371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private final Handler mHandler = new Handler() {
391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        @Override
401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        public void handleMessage(Message msg) {
411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (msg.what) {
421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case MSG_PRECISE_CALL_STATE_CHANGED:
4322d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal                    updateState(false);
441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    };
481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private com.android.internal.telephony.Connection mOriginalConnection;
501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call.State mOriginalConnectionState = Call.State.IDLE;
51788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    SipConnection(com.android.internal.telephony.Connection connection) {
53788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("new SipConnection, connection: " + connection);
541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = connection;
551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
561344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED,
571344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    null);
581344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
59788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
60788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
61788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
62788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onSetAudioState(CallAudioState state) {
63788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetAudioState: " + state);
641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().setEchoSuppressionEnabled();
661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
67788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
68788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
69788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
70788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onSetState(int state) {
71788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetState, state: " + Connection.stateToString(state));
72788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
73788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
74788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
75788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onPlayDtmfTone(char c) {
76788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPlayDtmfTone");
771344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
781344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().startDtmf(c);
791344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
80788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
81788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
82788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
83788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onStopDtmfTone() {
84788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onStopDtmfTone");
851344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
861344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().stopDtmf();
871344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
88788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
89788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
90788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
91788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onDisconnect() {
92788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onDisconnect");
931344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
941344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getCall() != null && !getCall().isMultiparty()) {
951344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getCall().hangup();
961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            } else if (mOriginalConnection != null) {
971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.hangup();
981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onDisconnect, exception: " + e);
1011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
102788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
103788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
104788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
105788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onSeparate() {
106788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSeparate");
1071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (mOriginalConnection != null) {
1091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.separate();
1101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onSeparate, exception: " + e);
1131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
114788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
115788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
116788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
117788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onAbort() {
118788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAbort");
1191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        onDisconnect();
120788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
121788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
122788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
123788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onHold() {
124788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onHold");
1251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1261344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getPhone() != null && getState() == State.ACTIVE) {
1271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onHold, exception: " + e);
1311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
132788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
133788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
134788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
135788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onUnhold() {
136788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onUnhold");
1371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getPhone() != null && getState() == State.HOLDING) {
1391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onUnhold, exception: " + e);
1431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
144788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
145788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
146788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
1470bbcc4f2f0218f451a680b98a62c374bba877c3bAndrew Lee    protected void onAnswer(int videoState) {
148788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAnswer");
1491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1510bbcc4f2f0218f451a680b98a62c374bba877c3bAndrew Lee                getPhone().acceptCall(videoState);
1521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onAnswer, exception: " + e);
1551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
156788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
157788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
158788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
159788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onReject() {
160788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onReject");
1611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().rejectCall();
1641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onReject, exception: " + e);
1671344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
168788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
169788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
170788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
171788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onPostDialContinue(boolean proceed) {
172788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPostDialContinue, proceed: " + proceed);
1731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        // SIP doesn't have post dial support.
174788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
175788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
176788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
1772093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal    protected void onSwapWithBackgroundCall() {
1782093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (VERBOSE) log("onSwapWithBackgroundCall");
1792093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        // TODO(sail): Implement swap.
1802093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal    }
1812093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal
1822093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal    @Override
183788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onChildrenChanged(List<Connection> children) {
184788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onChildrenChanged, children: " + children);
185788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
186788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
187788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
188788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    protected void onPhoneAccountClicked() {
189788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPhoneAccountClicked");
190788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
191788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
1921344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call getCall() {
1931344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection != null) {
1941344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return mOriginalConnection.getCall();
1951344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
1961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
1971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
1981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
1991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    SipPhone getPhone() {
2001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (call != null) {
2021344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return (SipPhone) call.getPhone();
2031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
2051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private boolean isValidRingingCall() {
2081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return call != null && call.getState().isRinging() &&
2101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                call.getEarliestConnection() == mOriginalConnection;
2111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
21322d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    private void updateState(boolean force) {
2141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection == null) {
2151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return;
2161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call.State newState = mOriginalConnection.getState();
2191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("updateState, " + mOriginalConnectionState + " -> " + newState);
22022d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || mOriginalConnectionState != newState) {
2211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            mOriginalConnectionState = newState;
2221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (newState) {
2231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case IDLE:
2241344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ACTIVE:
2261344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setActive();
2271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case HOLDING:
2291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setOnHold();
2301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DIALING:
2321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ALERTING:
2331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDialing();
2341344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case INCOMING:
2361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case WAITING:
2371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setRinging();
2381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTED:
2401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDisconnected(mOriginalConnection.getDisconnectCause(), null);
2411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    close();
2421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTING:
2441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
24622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal            updateCallCapabilities(force);
2471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private int buildCallCapabilities() {
2511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int capabilities = CallCapabilities.MUTE | CallCapabilities.SUPPORT_HOLD;
2521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getState() == State.ACTIVE || getState() == State.HOLDING) {
2531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            capabilities |= CallCapabilities.HOLD;
2541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return capabilities;
2561344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2571344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
25822d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    void updateCallCapabilities(boolean force) {
2591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int newCallCapabilities = buildCallCapabilities();
26022d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || getCallCapabilities() != newCallCapabilities) {
2611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            setCallCapabilities(newCallCapabilities);
2621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    void onAddedToCallService() {
2661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("onAddedToCallService");
26722d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateState(true);
26822d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateCallCapabilities(true);
2691344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        setAudioModeIsVoip(true);
2702093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (mOriginalConnection != null) {
2712093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal            setCallerDisplayName(mOriginalConnection.getCnapName(),
2722093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal                    mOriginalConnection.getCnapNamePresentation());
2732093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        }
2741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private void close() {
2771344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
2781344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().unregisterForPreciseCallStateChanged(mHandler);
2791344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2801344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = null;
2810d5710d9bfdb36d5d0a7be4eaf3f39ae3fb30bc5Evan Charlton        destroy();
2821344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2831344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
284788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
285788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
286788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
287788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal}
288