Conference.java revision ef9f6f957d897ea0ed82114185b8fa3fefd4917b
1823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon/*
2823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Copyright (C) 2014 The Android Open Source Project
3823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon *
4823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
5823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * you may not use this file except in compliance with the License.
6823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * You may obtain a copy of the License at
7823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon *
8823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
9823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon *
10823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Unless required by applicable law or agreed to in writing, software
11823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
12823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * See the License for the specific language governing permissions and
14823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * limitations under the License.
15823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */
16823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom;
18823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
19823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport android.telephony.DisconnectCause;
20823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
21823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport java.util.Collections;
22823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport java.util.List;
23823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport java.util.Set;
24823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport java.util.concurrent.CopyOnWriteArrayList;
25823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonimport java.util.concurrent.CopyOnWriteArraySet;
26823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
27823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon/**
28823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Represents a conference call which can contain any number of {@link Connection} objects.
29823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */
30823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordonpublic abstract class Conference {
31823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
32823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /** @hide */
33823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public abstract static class Listener {
34823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onStateChanged(Conference conference, int oldState, int newState) {}
35823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onDisconnected(Conference conference, int cause, String message) {}
36823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConnectionAdded(Conference conference, Connection connection) {}
37823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConnectionRemoved(Conference conference, Connection connection) {}
38823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onDestroyed(Conference conference) {}
39823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onCapabilitiesChanged(Conference conference, int capabilities) {}
40823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
41823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
42823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final Set<Listener> mListeners = new CopyOnWriteArraySet<>();
43823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final List<Connection> mChildConnections = new CopyOnWriteArrayList<>();
44b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private final List<Connection> mUnmodifiableChildConnections =
45823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Collections.unmodifiableList(mChildConnections);
46823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
47823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private PhoneAccountHandle mPhoneAccount;
48823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private int mState = Connection.STATE_NEW;
49823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private int mDisconnectCause = DisconnectCause.NOT_VALID;
50823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private int mCapabilities;
51823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private String mDisconnectMessage;
52823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
5356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen    /**
5456fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Constructs a new Conference with a mandatory {@link PhoneAccountHandle}
5556fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
5656fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @param phoneAccount The {@code PhoneAccountHandle} associated with the conference.
5756fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     */
58823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public Conference(PhoneAccountHandle phoneAccount) {
59823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        mPhoneAccount = phoneAccount;
60823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
61823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
6256fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen    /**
6356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Returns the {@link PhoneAccountHandle} the conference call is being placed through.
6456fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
6556fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @return A {@code PhoneAccountHandle} object representing the PhoneAccount of the conference.
6656fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     */
67ea38cca14964a5ee658899b0bafbc48017d556cdNancy Chen    public final PhoneAccountHandle getPhoneAccountHandle() {
68823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mPhoneAccount;
69823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
70823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
7156fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen    /**
7256fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Returns the list of connections currently associated with the conference call.
7356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
7456fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @return A list of {@code Connection} objects which represent the children of the conference.
7556fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     */
76823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final List<Connection> getConnections() {
77b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mUnmodifiableChildConnections;
78823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
79823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
8056fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen    /**
8156fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Gets the state of the conference call. See {@link Connection} for valid values.
8256fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
8356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @return A constant representing the state the conference call is currently in.
8456fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     */
85823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final int getState() {
86823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mState;
87823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
88823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
8956fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen    /**
9056fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Returns the capabilities of a conference. See {@link PhoneCapabilities} for valid values.
9156fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
9256fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @return A bitmask of the {@code PhoneCapabilities} of the conference call.
9356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     */
94823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final int getCapabilities() {
95823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mCapabilities;
96823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
97823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
98823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
99823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Invoked when the Conference and all it's {@link Connection}s should be disconnected.
100823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
101823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public void onDisconnect() {}
102823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
103823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
104823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Invoked when the specified {@link Connection} should be separated from the conference call.
105823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
106823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param connection The connection to separate.
107823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
108823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public void onSeparate(Connection connection) {}
109823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
110823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
111823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Invoked when the conference should be put on hold.
112823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
113823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public void onHold() {}
114823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
115823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
116823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Invoked when the conference should be moved from hold to active.
117823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
118823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public void onUnhold() {}
119823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
120823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
121a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     * Invoked when the child calls should be merged. Only invoked if the conference contains the
122a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     * capability {@link PhoneCapabilities#MERGE_CONFERENCE}.
123a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     */
124a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    public void onMerge() {}
125a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon
126a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    /**
127a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     * Invoked when the child calls should be swapped. Only invoked if the conference contains the
128a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     * capability {@link PhoneCapabilities#SWAP_CONFERENCE}.
129a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon     */
130a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    public void onSwap() {}
131a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon
132a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    /**
133823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets state to be on hold.
134823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
135823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setOnHold() {
136823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        setState(Connection.STATE_HOLDING);
137823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
138823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
139823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
140823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets state to be active.
141823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
142823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setActive() {
143823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        setState(Connection.STATE_ACTIVE);
144823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
145823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
146823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
147823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets state to disconnected.
148823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
149823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param cause The reason for the disconnection, any of
150823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *         {@link android.telephony.DisconnectCause}.
151823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param message Optional call-service-provided message about the disconnect.
152823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
153823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setDisconnected(int cause, String message) {
154823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        mDisconnectCause = cause;
155823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        mDisconnectMessage = message;
156823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        setState(Connection.STATE_DISCONNECTED);
157823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
158823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onDisconnected(this, mDisconnectCause, mDisconnectMessage);
159823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
160823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
161823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
162823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
16356fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * Sets the capabilities of a conference. See {@link PhoneCapabilities} for valid values.
16456fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     *
16556fc25deec15a32ea5f37d7c8c82f16d1bf9d275Nancy Chen     * @param capabilities A bitmask of the {@code PhoneCapabilities} of the conference call.
166823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
167823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setCapabilities(int capabilities) {
168823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (capabilities != mCapabilities) {
169823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mCapabilities = capabilities;
170823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
171823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            for (Listener l : mListeners) {
172823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                l.onCapabilitiesChanged(this, mCapabilities);
173823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            }
174823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
175823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
176823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
177823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
178823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Adds the specified connection as a child of this conference.
179823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
180823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param connection The connection to add.
181823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return True if the connection was successfully added.
182823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
183a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    public final boolean addConnection(Connection connection) {
184823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (connection != null && !mChildConnections.contains(connection)) {
185823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            if (connection.setConference(this)) {
186823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                mChildConnections.add(connection);
187823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                for (Listener l : mListeners) {
188823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    l.onConnectionAdded(this, connection);
189823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                }
190823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                return true;
191823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            }
192823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
193823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return false;
194823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
195823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
196823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
197823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Removes the specified connection as a child of this conference.
198823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
199823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param connection The connection to remove.
200823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
201a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    public final void removeConnection(Connection connection) {
2020159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        Log.d(this, "removing %s from %s", connection, mChildConnections);
203823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (connection != null && mChildConnections.remove(connection)) {
204823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            connection.resetConference();
205823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            for (Listener l : mListeners) {
206823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                l.onConnectionRemoved(this, connection);
207823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            }
208823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
209823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
210823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
211823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
212ea38cca14964a5ee658899b0bafbc48017d556cdNancy Chen     * Tears down the conference object and any of its current connections.
213823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
214a48680427e022ab6eb73277faac6c57831ee6ff9Santos Cordon    public final void destroy() {
215823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        Log.d(this, "destroying conference : %s", this);
216823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // Tear down the children.
2170159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        for (Connection connection : mChildConnections) {
218823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.d(this, "removing connection %s", connection);
219823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            removeConnection(connection);
220823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
221823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
222823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // If not yet disconnected, set the conference call as disconnected first.
223823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mState != Connection.STATE_DISCONNECTED) {
224823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.d(this, "setting to disconnected");
225823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            setDisconnected(DisconnectCause.LOCAL, null);
226823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
227823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
228823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // ...and notify.
229823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
230823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onDestroyed(this);
231823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
232823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
233823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
234823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
235823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Add a listener to be notified of a state change.
236823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
237823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param listener The new listener.
238823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return This conference.
239823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
240823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
241823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference addListener(Listener listener) {
242823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        mListeners.add(listener);
243823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return this;
244823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
245823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
246823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
247823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Removes the specified listener.
248823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
249823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param listener The listener to remove.
250823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return This conference.
251823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
252823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
253823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference removeListener(Listener listener) {
254823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        mListeners.remove(listener);
255823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return this;
256823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
257823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
258823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private void setState(int newState) {
259823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (newState != Connection.STATE_ACTIVE &&
260823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                newState != Connection.STATE_HOLDING &&
261823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                newState != Connection.STATE_DISCONNECTED) {
262823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.w(this, "Unsupported state transition for Conference call.",
263823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    Connection.stateToString(newState));
264823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            return;
265823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
266823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
267823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mState != newState) {
268823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            int oldState = mState;
269823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mState = newState;
270823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            for (Listener l : mListeners) {
271823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                l.onStateChanged(this, oldState, newState);
272823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            }
273823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
274823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
275823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon}
276