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