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