SipConnection.java revision aaf3850172bde1fec1a4558653c0edd31e3fa71f
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
52aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    SipConnection() {
53aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("new SipConnection");
54aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitializing();
55aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    }
56aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton
57aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    void initialize(com.android.internal.telephony.Connection connection) {
58aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("init SipConnection, connection: " + connection);
591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = connection;
601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED,
621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    null);
631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
64aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitialized();
65788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
66788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
67788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
68ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSetAudioState(CallAudioState state) {
69788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetAudioState: " + state);
701344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
711344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().setEchoSuppressionEnabled();
721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
73788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
74788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
75788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
76ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSetState(int state) {
77788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetState, state: " + Connection.stateToString(state));
78788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
79788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
80788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
81ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPlayDtmfTone(char c) {
82788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPlayDtmfTone");
831344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
841344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().startDtmf(c);
851344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
86788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
87788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
88788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
89ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onStopDtmfTone() {
90788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onStopDtmfTone");
911344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
921344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().stopDtmf();
931344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
94788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
95788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
96788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
97ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onDisconnect() {
98788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onDisconnect");
991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getCall() != null && !getCall().isMultiparty()) {
1011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getCall().hangup();
1021344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            } else if (mOriginalConnection != null) {
1031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.hangup();
1041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onDisconnect, exception: " + e);
1071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
108788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
109788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
110788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
111ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSeparate() {
112788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSeparate");
1131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (mOriginalConnection != null) {
1151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.separate();
1161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onSeparate, exception: " + e);
1191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
120788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
121788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
122788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
123ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAbort() {
124788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAbort");
1251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        onDisconnect();
126788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
127788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
128788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
129ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onHold() {
130788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onHold");
1311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getPhone() != null && getState() == State.ACTIVE) {
1331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1341344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onHold, exception: " + e);
1371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
138788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
139788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
140788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
141ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onUnhold() {
142788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onUnhold");
1431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getPhone() != null && getState() == State.HOLDING) {
1451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onUnhold, exception: " + e);
1491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
150788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
151788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
152788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
153ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAnswer(int videoState) {
154788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAnswer");
1551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1561344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1570bbcc4f2f0218f451a680b98a62c374bba877c3bAndrew Lee                getPhone().acceptCall(videoState);
1581344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onAnswer, exception: " + e);
1611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
162788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
163788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
164788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
165ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onReject() {
166788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onReject");
1671344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1681344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1691344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().rejectCall();
1701344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1711344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onReject, exception: " + e);
1731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
174788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
175788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
176788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
177ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPostDialContinue(boolean proceed) {
178788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPostDialContinue, proceed: " + proceed);
1791344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        // SIP doesn't have post dial support.
180788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
181788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
182788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
183ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSwapWithBackgroundCall() {
1842093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (VERBOSE) log("onSwapWithBackgroundCall");
1852093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        // TODO(sail): Implement swap.
1862093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal    }
1872093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal
1882093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal    @Override
189ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onChildrenChanged(List<Connection> children) {
190788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onChildrenChanged, children: " + children);
191788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
192788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
193788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
194ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPhoneAccountClicked() {
195788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPhoneAccountClicked");
196788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
197788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
1981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call getCall() {
1991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection != null) {
2001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return mOriginalConnection.getCall();
2011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2021344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
2031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    SipPhone getPhone() {
2061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (call != null) {
2081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return (SipPhone) call.getPhone();
2091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
2111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private boolean isValidRingingCall() {
2141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return call != null && call.getState().isRinging() &&
2161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                call.getEarliestConnection() == mOriginalConnection;
2171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
21922d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    private void updateState(boolean force) {
2201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection == null) {
2211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return;
2221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2241344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call.State newState = mOriginalConnection.getState();
2251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("updateState, " + mOriginalConnectionState + " -> " + newState);
22622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || mOriginalConnectionState != newState) {
2271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            mOriginalConnectionState = newState;
2281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (newState) {
2291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case IDLE:
2301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ACTIVE:
2321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setActive();
2331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2341344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case HOLDING:
2351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setOnHold();
2361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DIALING:
2381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ALERTING:
2391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDialing();
2401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case INCOMING:
2421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case WAITING:
2431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setRinging();
2441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTED:
2461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDisconnected(mOriginalConnection.getDisconnectCause(), null);
2471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    close();
2481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTING:
2501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
25222d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal            updateCallCapabilities(force);
2531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2561344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private int buildCallCapabilities() {
2571344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int capabilities = CallCapabilities.MUTE | CallCapabilities.SUPPORT_HOLD;
2581344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getState() == State.ACTIVE || getState() == State.HOLDING) {
2591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            capabilities |= CallCapabilities.HOLD;
2601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return capabilities;
2621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
26422d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    void updateCallCapabilities(boolean force) {
2651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int newCallCapabilities = buildCallCapabilities();
26622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || getCallCapabilities() != newCallCapabilities) {
2671344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            setCallCapabilities(newCallCapabilities);
2681344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2691344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2701344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2711344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    void onAddedToCallService() {
2721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("onAddedToCallService");
27322d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateState(true);
27422d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateCallCapabilities(true);
2751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        setAudioModeIsVoip(true);
2762093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (mOriginalConnection != null) {
2772093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal            setCallerDisplayName(mOriginalConnection.getCnapName(),
2782093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal                    mOriginalConnection.getCnapNamePresentation());
2792093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        }
2801344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2811344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2821344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private void close() {
2831344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
2841344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().unregisterForPreciseCallStateChanged(mHandler);
2851344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2861344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = null;
2870d5710d9bfdb36d5d0a7be4eaf3f39ae3fb30bc5Evan Charlton        destroy();
2881344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2891344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
290788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
291788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
292788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
293788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal}
294