ImsPhoneCall.java revision 61952e69d543ddc7bffdefb89cb512e22b00bf49
1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/* 2a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Copyright (C) 2013 The Android Open Source Project 3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * you may not use this file except in compliance with the License. 6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * You may obtain a copy of the License at 7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Unless required by applicable law or agreed to in writing, software 11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * See the License for the specific language governing permissions and 14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * limitations under the License. 15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony.imsphone; 18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1961952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingamimport android.telecom.ConferenceParticipant; 20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.DisconnectCause; 22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 230d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.internal.annotations.VisibleForTesting; 24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Call; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException; 26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCall; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsException; 30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsStreamMediaProfile; 31a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.List; 33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide} 36a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 375d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohenpublic class ImsPhoneCall extends Call { 38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*************************** Instance Variables **************************/ 39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String LOG_TAG = "ImsPhoneCall"; 41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsPhoneCallTracker mOwner; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mRingbackTonePlayed = false; 45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /****************************** Constructors *****************************/ 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall() { 49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall(ImsPhoneCallTracker owner) { 53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = owner; 54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void dispose() { 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException ex) { 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Rlog.e(LOG_TAG, "dispose: unexpected error on hangup", ex); 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //while disposing, ignore the exception and clean the connections 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } finally { 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for(int i = 0, s = mConnections.size(); i < s; i++) { 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection c = (ImsPhoneConnection) mConnections.get(i); 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c.onDisconnect(DisconnectCause.LOST_SIGNAL); 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /************************** Overridden from Call *************************/ 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public List<Connection> 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getConnections() { 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mConnections; 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Phone 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getPhone() { 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOwner.mPhone; 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean 86a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isMultiparty() { 872c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn ImsCall imsCall = getImsCall(); 882c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn if (imsCall == null) { 892c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return false; 902c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn } 912c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn 922c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return imsCall.isMultiparty(); 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Please note: if this is the foreground call and a 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * background call exists, the background call will be resumed. 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hangup() throws CallStateException { 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville toString() { 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mState.toString(); 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11061952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam @Override 11161952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam public List<ConferenceParticipant> getConferenceParticipants() { 11261952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam ImsCall call = getImsCall(); 11361952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam if (call == null) { 11461952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam return null; 11561952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam } 11661952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam return call.getConferenceParticipants(); 11761952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam } 11861952e69d543ddc7bffdefb89cb512e22b00bf49Uma Maheswari Ramalingam 119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Called from ImsPhoneConnection 120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(Connection conn) { 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville clearDisconnected(); 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.add(conn); 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(Connection conn, State state) { 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.attach(conn); 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = state; 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attachFake(Connection conn, State state) { 135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(conn, state); 136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called by ImsPhoneConnection when it has disconnected 140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville connectionDisconnected(ImsPhoneConnection conn) { 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mState != State.DISCONNECTED) { 144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* If only disconnected connections remain, we are disconnected*/ 145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean hasOnlyDisconnectedConnections = true; 147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = mConnections.size() ; i < s; i ++) { 149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.get(i).getState() != State.DISCONNECTED) { 150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hasOnlyDisconnectedConnections = false; 151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 153a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hasOnlyDisconnectedConnections) { 156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.DISCONNECTED; 157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville detach(ImsPhoneConnection conn) { 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.remove(conn); 167db3aec65b5c02e3f5b28d32e4c742ba72a4b3867Andrew Lee clearDisconnected(); 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if there's no space in this call for additional 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * connections to be added via "conference" 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isFull() { 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mConnections.size() == ImsPhoneCallTracker.MAX_CONNECTIONS_PER_CALL; 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Called from ImsPhoneCallTracker 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onHangupLocal() { 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = mConnections.size(); i < s; i++) { 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection cn = (ImsPhoneConnection)mConnections.get(i); 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cn.onHangupLocal(); 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.DISCONNECTING; 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when it's time to clean up disconnected Connection objects 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville clearDisconnected() { 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = mConnections.size() - 1 ; i >= 0 ; i--) { 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection cn = (ImsPhoneConnection)mConnections.get(i); 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (cn.getState() == State.DISCONNECTED) { 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.remove(i); 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.size() == 0) { 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.IDLE; 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsPhoneConnection 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getFirstConnection() { 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.size() == 0) return null; 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (ImsPhoneConnection) mConnections.get(0); 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setMute(boolean mute) { 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsCall imsCall = getFirstConnection() == null ? 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville null : getFirstConnection().getImsCall(); 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (imsCall != null) { 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.setMute(mute); 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, "setMute failed : " + e.getMessage()); 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville merge(ImsPhoneCall that, State state) { 23231b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn // This call is the conference host and the "that" call is the one being merged in. 233fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn // Set the connect time for the conference; this will have been determined when the 234fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn // conference was initially created. 235fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn ImsPhoneConnection imsPhoneConnection = getFirstConnection(); 236fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn if (imsPhoneConnection != null) { 237fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn long conferenceConnectTime = imsPhoneConnection.getConferenceConnectTime(); 238fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn if (conferenceConnectTime > 0) { 239fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn imsPhoneConnection.setConnectTime(conferenceConnectTime); 240fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn } 241fd2305639e3761c2bf3213463c4f17cc8310f4d0Tyler Gunn } 24231b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection[] cc = that.mConnections.toArray( 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville new ImsPhoneConnection[that.mConnections.size()]); 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (ImsPhoneConnection c : cc) { 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c.update(null, state); 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2500d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn /** 2510d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * Retrieves the {@link ImsCall} for the current {@link ImsPhoneCall}. 2520d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * <p> 2530d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * Marked as {@code VisibleForTesting} so that the 2540d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * {@link com.android.internal.telephony.TelephonyTester} class can inject a test conference 2550d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * event package into a regular ongoing IMS call. 2560d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * 2570d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * @return The {@link ImsCall}. 2580d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn */ 2590d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn @VisibleForTesting 2600d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn public ImsCall 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getImsCall() { 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstConnection() == null) ? null : getFirstConnection().getImsCall(); 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ static boolean isLocalTone(ImsCall imsCall) { 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((imsCall == null) || (imsCall.getCallProfile() == null) 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (imsCall.getCallProfile().mMediaProfile == null)) { 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsStreamMediaProfile mediaProfile = imsCall.getCallProfile().mMediaProfile; 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (mediaProfile.mAudioDirection == ImsStreamMediaProfile.DIRECTION_INACTIVE) 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ? true : false; 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville update (ImsPhoneConnection conn, ImsCall imsCall, State state) { 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville State newState = state; 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean changed = false; 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //ImsCall.Listener.onCallProgressing can be invoked several times 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //and ringback tone mode can be changed during the call setup procedure 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (state == State.ALERTING) { 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mRingbackTonePlayed && !isLocalTone(imsCall)) { 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.stopRingbackTone(); 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = false; 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (!mRingbackTonePlayed && isLocalTone(imsCall)) { 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.startRingbackTone(); 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = true; 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mRingbackTonePlayed) { 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.stopRingbackTone(); 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = false; 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((newState != mState) && (state != State.DISCONNECTED)) { 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = newState; 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (state == State.DISCONNECTED) { 303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return changed; 307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ ImsPhoneConnection 310a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getHandoverConnection() { 3112c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return (ImsPhoneConnection) getEarliestConnection(); 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void switchWith(ImsPhoneCall that) { 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (ImsPhoneCall.class) { 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall tmp = new ImsPhoneCall(); 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville tmp.takeOver(this); 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.takeOver(that); 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville that.takeOver(tmp); 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void takeOver(ImsPhoneCall that) { 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections = that.mConnections; 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = that.mState; 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Connection c : mConnections) { 327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((ImsPhoneConnection) c).changeParent(this); 328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 329a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 331