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