Refine implementation of GSM conferences (1/3)

Bug: 17684223
Change-Id: I05d05b594803ea2c1da4247111b70ad5f870ac46
This commit is contained in:
Ihab Awad
2014-09-30 09:17:03 -07:00
parent 9cf01b63cb
commit 50e3506533
5 changed files with 114 additions and 11 deletions

View File

@@ -18,6 +18,7 @@ package android.telecom;
import android.annotation.SystemApi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -37,6 +38,8 @@ public abstract class Conference {
public void onDisconnected(Conference conference, DisconnectCause disconnectCause) {}
public void onConnectionAdded(Conference conference, Connection connection) {}
public void onConnectionRemoved(Conference conference, Connection connection) {}
public void onConferenceableConnectionsChanged(
Conference conference, List<Connection> conferenceableConnections) {}
public void onDestroyed(Conference conference) {}
public void onCapabilitiesChanged(Conference conference, int capabilities) {}
}
@@ -45,6 +48,9 @@ public abstract class Conference {
private final List<Connection> mChildConnections = new CopyOnWriteArrayList<>();
private final List<Connection> mUnmodifiableChildConnections =
Collections.unmodifiableList(mChildConnections);
private final List<Connection> mConferenceableConnections = new ArrayList<>();
private final List<Connection> mUnmodifiableConferenceableConnections =
Collections.unmodifiableList(mConferenceableConnections);
private PhoneAccountHandle mPhoneAccount;
private AudioState mAudioState;
@@ -53,6 +59,15 @@ public abstract class Conference {
private int mCapabilities;
private String mDisconnectMessage;
private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
@Override
public void onDestroyed(Connection c) {
if (mConferenceableConnections.remove(c)) {
fireOnConferenceableConnectionsChanged();
}
}
};
/**
* Constructs a new Conference with a mandatory {@link PhoneAccountHandle}
*
@@ -119,6 +134,13 @@ public abstract class Conference {
*/
public void onSeparate(Connection connection) {}
/**
* Invoked when the specified {@link Connection} should merged with the conference call.
*
* @param connection The {@code Connection} to merge.
*/
public void onMerge(Connection connection) {}
/**
* Invoked when the conference should be put on hold.
*/
@@ -237,6 +259,37 @@ public abstract class Conference {
}
}
/**
* Sets the connections with which this connection can be conferenced.
*
* @param conferenceableConnections The set of connections this connection can conference with.
*/
public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
clearConferenceableList();
for (Connection c : conferenceableConnections) {
// If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
// small amount of items here.
if (!mConferenceableConnections.contains(c)) {
c.addConnectionListener(mConnectionDeathListener);
mConferenceableConnections.add(c);
}
}
fireOnConferenceableConnectionsChanged();
}
private final void fireOnConferenceableConnectionsChanged() {
for (Listener l : mListeners) {
l.onConferenceableConnectionsChanged(this, getConferenceableConnections());
}
}
/**
* Returns the connections with which this connection can be conferenced.
*/
public final List<Connection> getConferenceableConnections() {
return mUnmodifiableConferenceableConnections;
}
/**
* Tears down the conference object and any of its current connections.
*/
@@ -313,4 +366,11 @@ public abstract class Conference {
}
}
}
private final void clearConferenceableList() {
for (Connection c : mConferenceableConnections) {
c.removeConnectionListener(mConnectionDeathListener);
}
mConferenceableConnections.clear();
}
}