SipConnection.java revision 4ddd0efe67e93798d98c86b073d6cd0b1343f840
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
194ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunnimport android.net.Uri;
201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport android.os.Handler;
211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport android.os.Message;
2276f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awadimport android.telecomm.AudioState;
23788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.telecomm.Connection;
2476f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awadimport android.telecomm.PhoneCapabilities;
25788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.util.Log;
26788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.Call;
281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.CallStateException;
291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.sip.SipPhone;
304ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunnimport com.android.phone.Constants;
311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
32788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport java.util.List;
334ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunnimport java.util.Objects;
34788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalfinal class SipConnection extends Connection {
36788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final String PREFIX = "[SipConnection] ";
376556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon    private static final boolean VERBOSE = false; /* STOP SHIP if true */
38788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private static final int MSG_PRECISE_CALL_STATE_CHANGED = 1;
401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private final Handler mHandler = new Handler() {
421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        @Override
431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        public void handleMessage(Message msg) {
441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (msg.what) {
451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case MSG_PRECISE_CALL_STATE_CHANGED:
4622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal                    updateState(false);
471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    };
511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private com.android.internal.telephony.Connection mOriginalConnection;
531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call.State mOriginalConnectionState = Call.State.IDLE;
54788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
55aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    SipConnection() {
56aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("new SipConnection");
57aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitializing();
58aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    }
59aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton
60aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    void initialize(com.android.internal.telephony.Connection connection) {
61aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("init SipConnection, connection: " + connection);
621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = connection;
631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED,
651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    null);
661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
674ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        updateHandle();
68aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitialized();
69788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
70788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
71788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
7276f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad    public void onSetAudioState(AudioState state) {
73788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetAudioState: " + state);
741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().setEchoSuppressionEnabled();
761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
77788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
78788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
79788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
80ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSetState(int state) {
81788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSetState, state: " + Connection.stateToString(state));
82788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
83788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
84788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
85ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPlayDtmfTone(char c) {
86788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPlayDtmfTone");
871344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
881344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().startDtmf(c);
891344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
90788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
91788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
92788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
93ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onStopDtmfTone() {
94788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onStopDtmfTone");
951344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().stopDtmf();
971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
98788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
99788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
100788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
101ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onDisconnect() {
102788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onDisconnect");
1031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getCall() != null && !getCall().isMultiparty()) {
1051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getCall().hangup();
1061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            } else if (mOriginalConnection != null) {
1071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.hangup();
1081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onDisconnect, exception: " + e);
1111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
112788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
113788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
114788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
115ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSeparate() {
116788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSeparate");
1171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (mOriginalConnection != null) {
1191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.separate();
1201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onSeparate, exception: " + e);
1231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
124788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
125788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
126788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
127ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAbort() {
128788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAbort");
1291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        onDisconnect();
130788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
131788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
132788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
133ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onHold() {
134788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onHold");
1351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
13676f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            if (getPhone() != null && getState() == STATE_ACTIVE) {
1371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onHold, exception: " + e);
1411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
142788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
143788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
144788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
145ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onUnhold() {
146788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onUnhold");
1471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
14876f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            if (getPhone() != null && getState() == STATE_HOLDING) {
1491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onUnhold, exception: " + e);
1531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
154788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
155788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
156788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
157ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAnswer(int videoState) {
158788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAnswer");
1591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1610bbcc4f2f0218f451a680b98a62c374bba877c3bAndrew Lee                getPhone().acceptCall(videoState);
1621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onAnswer, exception: " + e);
1651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
166788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
167788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
168788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
169ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onReject() {
170788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onReject");
1711344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().rejectCall();
1741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onReject, exception: " + e);
1771344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
178788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
179788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
180788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
181ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPostDialContinue(boolean proceed) {
182788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPostDialContinue, proceed: " + proceed);
1831344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        // SIP doesn't have post dial support.
184788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
185788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
186788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
187ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPhoneAccountClicked() {
188788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPhoneAccountClicked");
189788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
190788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
1911344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call getCall() {
1921344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection != null) {
1931344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return mOriginalConnection.getCall();
1941344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
1951344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
1961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
1971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
1981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    SipPhone getPhone() {
1991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (call != null) {
2011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return (SipPhone) call.getPhone();
2021344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
2041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private boolean isValidRingingCall() {
2071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return call != null && call.getState().isRinging() &&
2091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                call.getEarliestConnection() == mOriginalConnection;
2101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
21222d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    private void updateState(boolean force) {
2131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection == null) {
2141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return;
2151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call.State newState = mOriginalConnection.getState();
2181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("updateState, " + mOriginalConnectionState + " -> " + newState);
21922d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || mOriginalConnectionState != newState) {
2201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            mOriginalConnectionState = newState;
2211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (newState) {
2221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case IDLE:
2231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2241344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ACTIVE:
2251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setActive();
2261344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case HOLDING:
2281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setOnHold();
2291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DIALING:
2311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ALERTING:
2321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDialing();
2331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2341344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case INCOMING:
2351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case WAITING:
2361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setRinging();
2371344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTED:
2391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDisconnected(mOriginalConnection.getDisconnectCause(), null);
2401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    close();
2411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTING:
2431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
24522d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal            updateCallCapabilities(force);
2461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private int buildCallCapabilities() {
25076f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad        int capabilities = PhoneCapabilities.MUTE | PhoneCapabilities.SUPPORT_HOLD;
25176f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad        if (getState() == STATE_ACTIVE || getState() == STATE_HOLDING) {
25276f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            capabilities |= PhoneCapabilities.HOLD;
2531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return capabilities;
2551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2561344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
25722d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    void updateCallCapabilities(boolean force) {
2581344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int newCallCapabilities = buildCallCapabilities();
25922d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || getCallCapabilities() != newCallCapabilities) {
2601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            setCallCapabilities(newCallCapabilities);
2611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    void onAddedToCallService() {
2651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("onAddedToCallService");
26622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateState(true);
26722d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateCallCapabilities(true);
2681344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        setAudioModeIsVoip(true);
2692093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (mOriginalConnection != null) {
2702093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal            setCallerDisplayName(mOriginalConnection.getCnapName(),
2712093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal                    mOriginalConnection.getCnapNamePresentation());
2722093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        }
2731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2754ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    /**
2764ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * Updates the handle on this connection based on the original connection.
2774ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     */
2784ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    private void updateHandle() {
2794ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        if (mOriginalConnection != null) {
2804ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            Uri handle = getHandleFromAddress(mOriginalConnection.getAddress());
2814ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            int presentation = mOriginalConnection.getNumberPresentation();
2824ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            if (!Objects.equals(handle, getHandle()) ||
2834ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                    presentation != getHandlePresentation()) {
2844ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                com.android.services.telephony.Log.v(this, "updateHandle, handle changed");
2854ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                setHandle(handle, presentation);
2864ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            }
2874ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
2884ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            String name = mOriginalConnection.getCnapName();
2894ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            int namePresentation = mOriginalConnection.getCnapNamePresentation();
2904ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            if (!Objects.equals(name, getCallerDisplayName()) ||
2914ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                    namePresentation != getCallerDisplayNamePresentation()) {
2924ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                com.android.services.telephony.Log
2934ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                        .v(this, "updateHandle, caller display name changed");
2944ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                setCallerDisplayName(name, namePresentation);
2954ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            }
2964ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        }
2974ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    }
2984ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
2994ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    /**
3004ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * Determines the handle for an incoming number.
3014ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     *
3024ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * @param address The incoming number.
3034ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * @return The Uri representing the number.
3044ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     */
3054ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    private static Uri getHandleFromAddress(String address) {
3064ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        // Address can be null for blocked calls.
3074ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        if (address == null) {
3084ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            address = "";
3094ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        }
3104ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        return Uri.fromParts(Constants.SCHEME_SIP, address, null);
3114ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    }
3124ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
3131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private void close() {
3141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
3151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().unregisterForPreciseCallStateChanged(mHandler);
3161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
3171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = null;
3180d5710d9bfdb36d5d0a7be4eaf3f39ae3fb30bc5Evan Charlton        destroy();
3191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
3201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
321788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
322788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
323788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
324788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal}
325