summaryrefslogtreecommitdiffstats
path: root/telecomm/java/android/telecom/RemoteConference.java
diff options
context:
space:
mode:
Diffstat (limited to 'telecomm/java/android/telecom/RemoteConference.java')
-rw-r--r--telecomm/java/android/telecom/RemoteConference.java112
1 files changed, 89 insertions, 23 deletions
diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java
index fba3ee3..a76bf59 100644
--- a/telecomm/java/android/telecom/RemoteConference.java
+++ b/telecomm/java/android/telecom/RemoteConference.java
@@ -18,6 +18,7 @@ package android.telecom;
import com.android.internal.telecom.IConnectionService;
+import android.os.Handler;
import android.os.RemoteException;
import java.util.ArrayList;
@@ -49,7 +50,7 @@ public final class RemoteConference {
private final String mId;
private final IConnectionService mConnectionService;
- private final Set<Callback> mCallbacks = new CopyOnWriteArraySet<>();
+ private final Set<CallbackRecord<Callback>> mCallbackRecords = new CopyOnWriteArraySet<>();
private final List<RemoteConnection> mChildConnections = new CopyOnWriteArrayList<>();
private final List<RemoteConnection> mUnmodifiableChildConnections =
Collections.unmodifiableList(mChildConnections);
@@ -77,13 +78,20 @@ public final class RemoteConference {
for (RemoteConnection connection : mChildConnections) {
connection.setConference(null);
}
- for (Callback c : mCallbacks) {
- c.onDestroyed(this);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onDestroyed(conference);
+ }
+ });
}
}
/** {@hide} */
- void setState(int newState) {
+ void setState(final int newState) {
if (newState != Connection.STATE_ACTIVE &&
newState != Connection.STATE_HOLDING &&
newState != Connection.STATE_DISCONNECTED) {
@@ -93,42 +101,71 @@ public final class RemoteConference {
}
if (mState != newState) {
- int oldState = mState;
+ final int oldState = mState;
mState = newState;
- for (Callback c : mCallbacks) {
- c.onStateChanged(this, oldState, newState);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onStateChanged(conference, oldState, newState);
+ }
+ });
}
}
}
/** {@hide} */
- void addConnection(RemoteConnection connection) {
+ void addConnection(final RemoteConnection connection) {
if (!mChildConnections.contains(connection)) {
mChildConnections.add(connection);
connection.setConference(this);
- for (Callback c : mCallbacks) {
- c.onConnectionAdded(this, connection);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onConnectionAdded(conference, connection);
+ }
+ });
}
}
}
/** {@hide} */
- void removeConnection(RemoteConnection connection) {
+ void removeConnection(final RemoteConnection connection) {
if (mChildConnections.contains(connection)) {
mChildConnections.remove(connection);
connection.setConference(null);
- for (Callback c : mCallbacks) {
- c.onConnectionRemoved(this, connection);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onConnectionRemoved(conference, connection);
+ }
+ });
}
}
}
/** {@hide} */
- void setConnectionCapabilities(int connectionCapabilities) {
+ void setConnectionCapabilities(final int connectionCapabilities) {
if (mConnectionCapabilities != connectionCapabilities) {
mConnectionCapabilities = connectionCapabilities;
- for (Callback c : mCallbacks) {
- c.onConnectionCapabilitiesChanged(this, mConnectionCapabilities);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onConnectionCapabilitiesChanged(
+ conference, mConnectionCapabilities);
+ }
+ });
}
}
}
@@ -137,18 +174,33 @@ public final class RemoteConference {
void setConferenceableConnections(List<RemoteConnection> conferenceableConnections) {
mConferenceableConnections.clear();
mConferenceableConnections.addAll(conferenceableConnections);
- for (Callback c : mCallbacks) {
- c.onConferenceableConnectionsChanged(this, mUnmodifiableConferenceableConnections);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onConferenceableConnectionsChanged(
+ conference, mUnmodifiableConferenceableConnections);
+ }
+ });
}
}
/** {@hide} */
- void setDisconnected(DisconnectCause disconnectCause) {
+ void setDisconnected(final DisconnectCause disconnectCause) {
if (mState != Connection.STATE_DISCONNECTED) {
mDisconnectCause = disconnectCause;
setState(Connection.STATE_DISCONNECTED);
- for (Callback c : mCallbacks) {
- c.onDisconnected(this, disconnectCause);
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ final RemoteConference conference = this;
+ final Callback callback = record.getCallback();
+ record.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onDisconnected(conference, disconnectCause);
+ }
+ });
}
}
}
@@ -239,10 +291,24 @@ public final class RemoteConference {
}
public final void registerCallback(Callback callback) {
- mCallbacks.add(callback);
+ registerCallback(callback, new Handler());
+ }
+
+ public final void registerCallback(Callback callback, Handler handler) {
+ unregisterCallback(callback);
+ if (callback != null && handler != null) {
+ mCallbackRecords.add(new CallbackRecord(callback, handler));
+ }
}
public final void unregisterCallback(Callback callback) {
- mCallbacks.remove(callback);
+ if (callback != null) {
+ for (CallbackRecord<Callback> record : mCallbackRecords) {
+ if (record.getCallback() == callback) {
+ mCallbackRecords.remove(record);
+ break;
+ }
+ }
+ }
}
}