ImsPhoneCall.java revision 2c38178d30afd3f168c6506f0942f93c785d3d7e
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 19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog; 20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.DisconnectCause; 21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Call; 23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallStateException; 24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Connection; 25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone; 26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsCall; 27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsException; 28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsStreamMediaProfile; 29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.List; 31a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/** 33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * {@hide} 34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 355d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohenpublic class ImsPhoneCall extends Call { 36a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*************************** Instance Variables **************************/ 37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final String LOG_TAG = "ImsPhoneCall"; 39a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsPhoneCallTracker mOwner; 41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private boolean mRingbackTonePlayed = false; 43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /****************************** Constructors *****************************/ 45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall() { 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ 50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall(ImsPhoneCallTracker owner) { 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner = owner; 52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void dispose() { 55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException ex) { 58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Rlog.e(LOG_TAG, "dispose: unexpected error on hangup", ex); 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //while disposing, ignore the exception and clean the connections 60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } finally { 61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for(int i = 0, s = mConnections.size(); i < s; i++) { 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection c = (ImsPhoneConnection) mConnections.get(i); 63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c.onDisconnect(DisconnectCause.LOST_SIGNAL); 64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /************************** Overridden from Call *************************/ 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public List<Connection> 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getConnections() { 73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mConnections; 74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 77a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Phone 78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getPhone() { 79a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOwner.mPhone; 80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 81a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 82a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isMultiparty() { 852c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn ImsCall imsCall = getImsCall(); 862c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn if (imsCall == null) { 872c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return false; 882c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn } 892c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn 902c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return imsCall.isMultiparty(); 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** Please note: if this is the foreground call and a 94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * background call exists, the background call will be resumed. 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 97a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hangup() throws CallStateException { 99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.hangup(this); 100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String 104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville toString() { 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mState.toString(); 106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Called from ImsPhoneConnection 109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(Connection conn) { 112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville clearDisconnected(); 113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.add(conn); 114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(Connection conn, State state) { 118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.attach(conn); 119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = state; 120a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attachFake(Connection conn, State state) { 124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville attach(conn, state); 125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called by ImsPhoneConnection when it has disconnected 129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville connectionDisconnected(ImsPhoneConnection conn) { 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mState != State.DISCONNECTED) { 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* If only disconnected connections remain, we are disconnected*/ 134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean hasOnlyDisconnectedConnections = true; 136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = mConnections.size() ; i < s; i ++) { 138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.get(i).getState() != State.DISCONNECTED) { 139a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville hasOnlyDisconnectedConnections = false; 140a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 141a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (hasOnlyDisconnectedConnections) { 145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.DISCONNECTED; 146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 149a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 150a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 151a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 152a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 153a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 154a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville detach(ImsPhoneConnection conn) { 155a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.remove(conn); 156a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 157a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.size() == 0) { 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.IDLE; 159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 162a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 163a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return true if there's no space in this call for additional 164a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * connections to be added via "conference" 165a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 167a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville isFull() { 168a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mConnections.size() == ImsPhoneCallTracker.MAX_CONNECTIONS_PER_CALL; 169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //***** Called from ImsPhoneCallTracker 172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onHangupLocal() { 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0, s = mConnections.size(); i < s; i++) { 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection cn = (ImsPhoneConnection)mConnections.get(i); 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cn.onHangupLocal(); 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.DISCONNECTING; 182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Called when it's time to clean up disconnected Connection objects 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville clearDisconnected() { 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = mConnections.size() - 1 ; i >= 0 ; i--) { 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection cn = (ImsPhoneConnection)mConnections.get(i); 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (cn.getState() == State.DISCONNECTED) { 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections.remove(i); 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.size() == 0) { 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = State.IDLE; 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsPhoneConnection 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getFirstConnection() { 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mConnections.size() == 0) return null; 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (ImsPhoneConnection) mConnections.get(0); 207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ void 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setMute(boolean mute) { 211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsCall imsCall = getFirstConnection() == null ? 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville null : getFirstConnection().getImsCall(); 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (imsCall != null) { 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville imsCall.setMute(mute); 216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (ImsException e) { 217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, "setMute failed : " + e.getMessage()); 218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void 223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville merge(ImsPhoneCall that, State state) { 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneConnection[] cc = that.mConnections.toArray( 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville new ImsPhoneConnection[that.mConnections.size()]); 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (ImsPhoneConnection c : cc) { 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville c.update(null, state); 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ ImsCall 232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getImsCall() { 233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (getFirstConnection() == null) ? null : getFirstConnection().getImsCall(); 234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ static boolean isLocalTone(ImsCall imsCall) { 237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((imsCall == null) || (imsCall.getCallProfile() == null) 238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (imsCall.getCallProfile().mMediaProfile == null)) { 239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsStreamMediaProfile mediaProfile = imsCall.getCallProfile().mMediaProfile; 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return (mediaProfile.mAudioDirection == ImsStreamMediaProfile.DIRECTION_INACTIVE) 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ? true : false; 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /*package*/ boolean 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville update (ImsPhoneConnection conn, ImsCall imsCall, State state) { 250a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville State newState = state; 251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean changed = false; 252a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //ImsCall.Listener.onCallProgressing can be invoked several times 254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //and ringback tone mode can be changed during the call setup procedure 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (state == State.ALERTING) { 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mRingbackTonePlayed && !isLocalTone(imsCall)) { 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.stopRingbackTone(); 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = false; 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (!mRingbackTonePlayed && isLocalTone(imsCall)) { 260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.startRingbackTone(); 261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = true; 262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mRingbackTonePlayed) { 265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOwner.mPhone.stopRingbackTone(); 266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mRingbackTonePlayed = false; 267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((newState != mState) && (state != State.DISCONNECTED)) { 271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = newState; 272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else if (state == State.DISCONNECTED) { 274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return changed; 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ ImsPhoneConnection 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville getHandoverConnection() { 2822c38178d30afd3f168c6506f0942f93c785d3d7eTyler Gunn return (ImsPhoneConnection) getEarliestConnection(); 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void switchWith(ImsPhoneCall that) { 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (ImsPhoneCall.class) { 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ImsPhoneCall tmp = new ImsPhoneCall(); 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville tmp.takeOver(this); 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.takeOver(that); 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville that.takeOver(tmp); 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void takeOver(ImsPhoneCall that) { 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mConnections = that.mConnections; 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mState = that.mState; 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Connection c : mConnections) { 298a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((ImsPhoneConnection) c).changeParent(this); 299a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 301a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville} 302