Support treating a conference as a single party call.
Support for changing the "is conference" property in a Telecom call
based on what Telephony reports.
Test: Manual
Bug: 75975913
Change-Id: I5023ca3946f210f58244b528d6d656c24bff9cae
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index dfd7b2c..cc80db2 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -132,6 +132,7 @@
void onConnectionManagerPhoneAccountChanged(Call call);
void onPhoneAccountChanged(Call call);
void onConferenceableCallsChanged(Call call);
+ void onConferenceStateChanged(Call call, boolean isConference);
boolean onCanceledViaNewOutgoingCallBroadcast(Call call, long disconnectionTimeout);
void onHoldToneRequested(Call call);
void onConnectionEvent(Call call, String event, Bundle extras);
@@ -201,6 +202,8 @@
@Override
public void onConferenceableCallsChanged(Call call) {}
@Override
+ public void onConferenceStateChanged(Call call, boolean isConference) {}
+ @Override
public boolean onCanceledViaNewOutgoingCallBroadcast(Call call, long disconnectionTimeout) {
return false;
}
@@ -1472,7 +1475,6 @@
"capable when not supported by the phone account.");
connectionCapabilities = removeVideoCapabilities(connectionCapabilities);
}
-
int previousCapabilities = mConnectionCapabilities;
mConnectionCapabilities = connectionCapabilities;
for (Listener l : mListeners) {
@@ -3108,6 +3110,20 @@
}
/**
+ * Sets whether this {@link Call} is a conference or not.
+ * @param isConference
+ */
+ public void setConferenceState(boolean isConference) {
+ mIsConference = isConference;
+ Log.addEvent(this, LogUtils.Events.CONF_STATE_CHANGED, "isConference=" + isConference);
+ // Ultimately CallsManager needs to know so it can update the "add call" state and inform
+ // the UI to update itself.
+ for (Listener l : mListeners) {
+ l.onConferenceStateChanged(this, isConference);
+ }
+ }
+
+ /**
* Sets the video history based on the state and state transitions of the call. Always add the
* current video state to the video state history during a call transition except for the
* transitions DIALING->ACTIVE and RINGING->ANSWERED. In these cases, clear the history. If a
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 882fe52..e4535d9 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -141,6 +141,7 @@
void onExternalCallChanged(Call call, boolean isExternalCall);
void onDisconnectedTonePlaying(boolean isTonePlaying);
void onConnectionTimeChanged(Call call);
+ void onConferenceStateChanged(Call call, boolean isConference);
}
/** Interface used to define the action which is executed delay under some condition. */
@@ -803,6 +804,15 @@
}
@Override
+ public void onConferenceStateChanged(Call call, boolean isConference) {
+ // Conference changed whether it is treated as a conference or not.
+ updateCanAddCall();
+ for (CallsManagerListener listener : mListeners) {
+ listener.onConferenceStateChanged(call, isConference);
+ }
+ }
+
+ @Override
public void onIsVoipAudioModeChanged(Call call) {
for (CallsManagerListener listener : mListeners) {
listener.onIsVoipAudioModeChanged(call);
diff --git a/src/com/android/server/telecom/CallsManagerListenerBase.java b/src/com/android/server/telecom/CallsManagerListenerBase.java
index cdc0209..4fa2ee5 100644
--- a/src/com/android/server/telecom/CallsManagerListenerBase.java
+++ b/src/com/android/server/telecom/CallsManagerListenerBase.java
@@ -96,4 +96,8 @@
@Override
public void onConnectionTimeChanged(Call call) {
}
+
+ @Override
+ public void onConferenceStateChanged(Call call, boolean isConference) {
+ }
}
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index 6c63ecb..90064cd 100644
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -990,6 +990,27 @@
Log.endSession();
}
}
+
+ @Override
+ public void setConferenceState(String callId, boolean isConference,
+ Session.Info sessionInfo) throws RemoteException {
+ Log.startSession(sessionInfo, "CSW.sCS");
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ Call call = mCallIdMapper.getCall(callId);
+ if (call != null) {
+ call.setConferenceState(isConference);
+ }
+ }
+ } catch (Throwable t) {
+ Log.e(ConnectionServiceWrapper.this, t, "");
+ throw t;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ Log.endSession();
+ }
+ }
}
private final Adapter mAdapter = new Adapter();
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index cf5bf89..142cf3a 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -972,6 +972,12 @@
updateCall(call);
}
+ @Override
+ public void onConferenceStateChanged(Call call, boolean isConference) {
+ Log.d(this, "onConferenceStateChanged %s ,isConf=%b", call, isConference);
+ updateCall(call);
+ }
+
void bringToForeground(boolean showDialpad) {
if (!mInCallServices.isEmpty()) {
for (IInCallService inCallService : mInCallServices.values()) {
diff --git a/src/com/android/server/telecom/LogUtils.java b/src/com/android/server/telecom/LogUtils.java
index bf8dba7..71ed67f 100644
--- a/src/com/android/server/telecom/LogUtils.java
+++ b/src/com/android/server/telecom/LogUtils.java
@@ -95,6 +95,7 @@
public static final String ADD_CHILD = "ADD_CHILD";
public static final String REMOVE_CHILD = "REMOVE_CHILD";
public static final String SET_PARENT = "SET_PARENT";
+ public static final String CONF_STATE_CHANGED = "CONF_STATE_CHANGED";
public static final String MUTE = "MUTE";
public static final String UNMUTE = "UNMUTE";
public static final String AUDIO_ROUTE = "AUDIO_ROUTE";