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