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