SipConnection.java revision aef7a4bc4f85149de427d7506ebe97753b2ca6c2
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;
224d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.AudioState;
234d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.Connection;
24aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport android.telecom.DisconnectCause;
254d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount;
264d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneCapabilities;
27788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalimport android.util.Log;
28788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
291344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.Call;
301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.CallStateException;
311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalimport com.android.internal.telephony.sip.SipPhone;
32aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Leeimport com.android.services.telephony.DisconnectCauseUtil;
331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
344ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunnimport java.util.Objects;
35788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepalfinal class SipConnection extends Connection {
37788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final String PREFIX = "[SipConnection] ";
386556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon    private static final boolean VERBOSE = false; /* STOP SHIP if true */
39788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private static final int MSG_PRECISE_CALL_STATE_CHANGED = 1;
411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private final Handler mHandler = new Handler() {
431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        @Override
441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        public void handleMessage(Message msg) {
451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (msg.what) {
461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case MSG_PRECISE_CALL_STATE_CHANGED:
4722d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal                    updateState(false);
481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
491344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    };
521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private com.android.internal.telephony.Connection mOriginalConnection;
541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call.State mOriginalConnectionState = Call.State.IDLE;
55788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
56aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    SipConnection() {
57aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("new SipConnection");
58aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitializing();
59aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    }
60aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton
61aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton    void initialize(com.android.internal.telephony.Connection connection) {
62aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        if (VERBOSE) log("init SipConnection, connection: " + connection);
631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = connection;
641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED,
661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    null);
671344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
6814bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee        updateAddress();
69aaf3850172bde1fec1a4558653c0edd31e3fa71fEvan Charlton        setInitialized();
70788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
71788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
72788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
73c927106af6c47ad1f302e13fa8626be83bb46f14Nancy Chen    public void onAudioStateChanged(AudioState state) {
74c927106af6c47ad1f302e13fa8626be83bb46f14Nancy Chen        if (VERBOSE) log("onAudioStateChanged: " + state);
751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().setEchoSuppressionEnabled();
771344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
78788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
79788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
80788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
81c927106af6c47ad1f302e13fa8626be83bb46f14Nancy Chen    public void onStateChanged(int state) {
82c927106af6c47ad1f302e13fa8626be83bb46f14Nancy Chen        if (VERBOSE) log("onStateChanged, state: " + Connection.stateToString(state));
83788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
84788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
85788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
86ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPlayDtmfTone(char c) {
87788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPlayDtmfTone");
881344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
891344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().startDtmf(c);
901344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
91788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
92788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
93788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
94ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onStopDtmfTone() {
95788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onStopDtmfTone");
961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().stopDtmf();
981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
99788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
100788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
101788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
102ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onDisconnect() {
103788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onDisconnect");
1041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (getCall() != null && !getCall().isMultiparty()) {
1061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getCall().hangup();
1071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            } else if (mOriginalConnection != null) {
1081344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.hangup();
1091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onDisconnect, exception: " + e);
1121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
113788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
114788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
115788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
116ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onSeparate() {
117788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onSeparate");
1181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (mOriginalConnection != null) {
1201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                mOriginalConnection.separate();
1211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onSeparate, exception: " + e);
1241344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
125788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
126788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
127788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
128ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAbort() {
129788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAbort");
1301344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        onDisconnect();
131788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
132788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
133788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
134ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onHold() {
135788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onHold");
1361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
13776f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            if (getPhone() != null && getState() == STATE_ACTIVE) {
1381344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onHold, exception: " + e);
1421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
143788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
144788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
145788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
146ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onUnhold() {
147788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onUnhold");
1481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
14976f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            if (getPhone() != null && getState() == STATE_HOLDING) {
1501344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().switchHoldingAndActive();
1511344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onUnhold, exception: " + e);
1541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
155788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
156788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
157788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
158ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onAnswer(int videoState) {
159788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onAnswer");
1601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1620bbcc4f2f0218f451a680b98a62c374bba877c3bAndrew Lee                getPhone().acceptCall(videoState);
1631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1651344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onAnswer, exception: " + e);
1661344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
167788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
168788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
169788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
170ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onReject() {
171788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onReject");
1721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        try {
1731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            if (isValidRingingCall() && getPhone() != null) {
1741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                getPhone().rejectCall();
1751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
1761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        } catch (CallStateException e) {
1771344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            log("onReject, exception: " + e);
1781344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
179788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
180788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
181788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    @Override
182ab777070da7e83983739414f1222177c6aeebe1aSantos Cordon    public void onPostDialContinue(boolean proceed) {
183788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("onPostDialContinue, proceed: " + proceed);
1841344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        // SIP doesn't have post dial support.
185788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
186788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
1871344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private Call getCall() {
1881344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection != null) {
1891344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return mOriginalConnection.getCall();
1901344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
1911344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
1921344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
1931344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
1941344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    SipPhone getPhone() {
1951344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
1961344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (call != null) {
1971344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return (SipPhone) call.getPhone();
1981344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
1991344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return null;
2001344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2011344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2021344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private boolean isValidRingingCall() {
2031344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call call = getCall();
2041344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return call != null && call.getState().isRinging() &&
2051344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                call.getEarliestConnection() == mOriginalConnection;
2061344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2071344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
20822d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    private void updateState(boolean force) {
2091344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (mOriginalConnection == null) {
2101344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            return;
2111344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        Call.State newState = mOriginalConnection.getState();
2141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("updateState, " + mOriginalConnectionState + " -> " + newState);
21522d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || mOriginalConnectionState != newState) {
2161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            mOriginalConnectionState = newState;
2171344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            switch (newState) {
2181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case IDLE:
2191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ACTIVE:
2211344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setActive();
2221344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2231344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case HOLDING:
2241344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setOnHold();
2251344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2261344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DIALING:
2271344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case ALERTING:
2281344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setDialing();
229a314b4f398ec4a0f1540c9e437bf2d7f99502b6aAnthony Lee                    // For SIP calls, we need to ask the framework to play the ringback for us.
23014bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee                    setRingbackRequested(true);
2311344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2321344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case INCOMING:
2331344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case WAITING:
2341344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    setRinging();
2351344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2361344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTED:
237aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                    setDisconnected(DisconnectCauseUtil.toTelecomDisconnectCause(
238aef7a4bc4f85149de427d7506ebe97753b2ca6c2Andrew Lee                            mOriginalConnection.getDisconnectCause()));
2391344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    close();
2401344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2411344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                case DISCONNECTING:
2421344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal                    break;
2431344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            }
24422d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal            updateCallCapabilities(force);
2451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2471344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2481344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private int buildCallCapabilities() {
24976f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad        int capabilities = PhoneCapabilities.MUTE | PhoneCapabilities.SUPPORT_HOLD;
25076f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad        if (getState() == STATE_ACTIVE || getState() == STATE_HOLDING) {
25176f3b4ec8d9bcb8926db1b3e4fb2d1e969b09fbbIhab Awad            capabilities |= PhoneCapabilities.HOLD;
2521344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2531344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        return capabilities;
2541344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2551344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
25622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal    void updateCallCapabilities(boolean force) {
2571344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        int newCallCapabilities = buildCallCapabilities();
25822d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        if (force || getCallCapabilities() != newCallCapabilities) {
2591344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            setCallCapabilities(newCallCapabilities);
2601344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
2611344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2621344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2631344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    void onAddedToCallService() {
2641344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (VERBOSE) log("onAddedToCallService");
26522d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateState(true);
26622d32b2b81bba31b6ebd93753a5c1ec39e911981Sailesh Nepal        updateCallCapabilities(true);
2671344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        setAudioModeIsVoip(true);
2682093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        if (mOriginalConnection != null) {
2692093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal            setCallerDisplayName(mOriginalConnection.getCnapName(),
2702093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal                    mOriginalConnection.getCnapNamePresentation());
2712093a451b17c26f4341e9565b65dcaa0e20bbd7dSailesh Nepal        }
2721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
2731344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
2744ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    /**
2754ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * Updates the handle on this connection based on the original connection.
2764ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     */
27714bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee    private void updateAddress() {
2784ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        if (mOriginalConnection != null) {
27914bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee            Uri address = getAddressFromNumber(mOriginalConnection.getAddress());
2804ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            int presentation = mOriginalConnection.getNumberPresentation();
28114bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee            if (!Objects.equals(address, getAddress()) ||
28214bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee                    presentation != getAddressPresentation()) {
28314bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee                com.android.services.telephony.Log.v(this, "updateAddress, address changed");
28414bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee                setAddress(address, presentation);
2854ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            }
2864ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
2874ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            String name = mOriginalConnection.getCnapName();
2884ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            int namePresentation = mOriginalConnection.getCnapNamePresentation();
2894ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            if (!Objects.equals(name, getCallerDisplayName()) ||
2904ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                    namePresentation != getCallerDisplayNamePresentation()) {
2914ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                com.android.services.telephony.Log
29214bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee                        .v(this, "updateAddress, caller display name changed");
2934ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn                setCallerDisplayName(name, namePresentation);
2944ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn            }
2954ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        }
2964ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    }
2974ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
2984ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    /**
29914bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee     * Determines the address for an incoming number.
3004ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     *
30114bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee     * @param number The incoming number.
3024ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     * @return The Uri representing the number.
3034ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn     */
30414bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee    private static Uri getAddressFromNumber(String number) {
3054ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        // Address can be null for blocked calls.
30614bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee        if (number == null) {
30714bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee            number = "";
3084ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn        }
30914bf354aab420fcd099cd0209238d7b92dad6f1dAndrew Lee        return Uri.fromParts(PhoneAccount.SCHEME_SIP, number, null);
3104ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn    }
3114ddd0efe67e93798d98c86b073d6cd0b1343f840Tyler Gunn
3121344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    private void close() {
3131344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        if (getPhone() != null) {
3141344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal            getPhone().unregisterForPreciseCallStateChanged(mHandler);
3151344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        }
3161344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        mOriginalConnection = null;
3170d5710d9bfdb36d5d0a7be4eaf3f39ae3fb30bc5Evan Charlton        destroy();
3181344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal    }
3191344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal
320788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
321788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
322788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
323788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal}
324