summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tyler Gunn <tgunn@google.com> 2019-05-31 07:23:16 -0700
committer Tyler Gunn <tgunn@google.com> 2019-05-31 12:45:19 -0700
commitac60f9554e19d28a2f801a7b991925194545dabe (patch)
tree8180df9ee0acad30f59eca74ed3e6f1c51f3080a
parent731490a14297c11a0adadfbf9df2196d14db5cbf (diff)
Enhancements to conference for non-conference host scenarios.
When a device A creates a conference call containing device B and C, both B and C can receive IMS signaling to indicate that they are in a conference call. This occurs on most domestic carriers; the Telephony framework uses the "multiparty" indicator on the IMS call to switch the call to a conference call. We made some changes to how conference calls are logged in Q which improves the accuracy of the call durations. We used to log calls as they're merged into a conference. In the case of a participant in a remotely hosted conference call, we'd log the call as soon as they are remotely added to the conference. This is unfortunate as the call durations are grossly under-reported. The conference call logging changes now assume we'll log the conference event package children in the conference instead of the participants which merge into the conference itself. On domestic carriers, since the call on B (or C) becomes a conference, we would then no longer log the call. This is FURTHER complicated because on some carriers, B and C will ALSO receive a conference event package from the network showing all the participants in the conference. So if B hangs up on the conference, they will have entries in their call log for A and C, which is really strange because a call to C was never originated on their device. In Telecom we need to ensure we do not log remotely hosted conference participants, and we need to ensure that we DO log a remotely hosted conference as if its just a single party call. To accomplish this we need: 1. the address and name display information associated with the call from A-B / A-C prior to the call turning into a remotely hosted conference. We need this to log to the call log 2. the remotely hosted conference and participants need to be marked in a manner that Telecom can identify them. Test: Manual test. Test: Add unit test to cover this logging scenario. Bug: 132325382 Change-Id: I65e713f68d1695a48d96dacbf7faa4476cd8d815
-rw-r--r--telecomm/java/android/telecom/Conference.java61
-rw-r--r--telecomm/java/android/telecom/Connection.java14
-rw-r--r--telecomm/java/android/telecom/ConnectionService.java6
-rw-r--r--telecomm/java/android/telecom/ParcelableConference.java34
4 files changed, 111 insertions, 4 deletions
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index 6000b56d191e..cd5fd971a065 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -95,6 +95,10 @@ public abstract class Conference extends Conferenceable {
private Bundle mExtras;
private Set<String> mPreviousExtraKeys;
private final Object mExtrasLock = new Object();
+ private Uri mAddress;
+ private int mAddressPresentation;
+ private String mCallerDisplayName;
+ private int mCallerDisplayNamePresentation;
private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
@Override
@@ -987,12 +991,67 @@ public abstract class Conference extends Conferenceable {
*/
public final void setAddress(Uri address, int presentation) {
Log.d(this, "setAddress %s", address);
+ mAddress = address;
+ mAddressPresentation = presentation;
for (Listener l : mListeners) {
l.onAddressChanged(this, address, presentation);
}
}
/**
+ * Returns the "address" associated with the conference. This is applicable in two cases:
+ * <ol>
+ * <li>When {@link #setConferenceState(boolean)} is used to mark a conference as
+ * temporarily "not a conference"; we need to present the correct address in the in-call
+ * UI.</li>
+ * <li>When the conference is not hosted on the current device, we need to know the address
+ * information for the purpose of showing the original address to the user, as well as for
+ * logging to the call log.</li>
+ * </ol>
+ * @return The address of the conference, or {@code null} if not applicable.
+ * @hide
+ */
+ public final Uri getAddress() {
+ return mAddress;
+ }
+
+ /**
+ * Returns the address presentation associated with the conference.
+ * <p>
+ * This is applicable in two cases:
+ * <ol>
+ * <li>When {@link #setConferenceState(boolean)} is used to mark a conference as
+ * temporarily "not a conference"; we need to present the correct address in the in-call
+ * UI.</li>
+ * <li>When the conference is not hosted on the current device, we need to know the address
+ * information for the purpose of showing the original address to the user, as well as for
+ * logging to the call log.</li>
+ * </ol>
+ * @return The address of the conference, or {@code null} if not applicable.
+ * @hide
+ */
+ public final int getAddressPresentation() {
+ return mAddressPresentation;
+ }
+
+ /**
+ * @return The caller display name (CNAP).
+ * @hide
+ */
+ public final String getCallerDisplayName() {
+ return mCallerDisplayName;
+ }
+
+ /**
+ * @return The presentation requirements for the handle.
+ * See {@link TelecomManager} for valid values.
+ * @hide
+ */
+ public final int getCallerDisplayNamePresentation() {
+ return mCallerDisplayNamePresentation;
+ }
+
+ /**
* Sets the caller display name (CNAP) of this {@link Conference}. Used when
* {@link #setConferenceState(boolean)} is called to mark a conference temporarily as NOT a
* conference.
@@ -1004,6 +1063,8 @@ public abstract class Conference extends Conferenceable {
*/
public final void setCallerDisplayName(String callerDisplayName, int presentation) {
Log.d(this, "setCallerDisplayName %s", callerDisplayName);
+ mCallerDisplayName = callerDisplayName;
+ mCallerDisplayNamePresentation = presentation;
for (Listener l : mListeners) {
l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 28e6596ce5bb..47587c5787f4 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -424,8 +424,16 @@ public abstract class Connection extends Conferenceable {
*/
public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 1 << 10;
+ /**
+ * Set by the framework to indicate that a Conference or Connection is hosted by a device other
+ * than the current one. Used in scenarios where the conference originator is the remote device
+ * and the current device is a participant of that conference.
+ * @hide
+ */
+ public static final int PROPERTY_REMOTELY_HOSTED = 1 << 11;
+
//**********************************************************************************************
- // Next PROPERTY value: 1<<10
+ // Next PROPERTY value: 1<<12
//**********************************************************************************************
/**
@@ -850,6 +858,10 @@ public abstract class Connection extends Conferenceable {
builder.append(isLong ? " PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL" : " ecall");
}
+ if (can(properties, PROPERTY_REMOTELY_HOSTED)) {
+ builder.append(isLong ? " PROPERTY_REMOTELY_HOSTED" : " remote_hst");
+ }
+
builder.append("]");
return builder.toString();
}
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index c66e92b5e099..626fcc4ddc1e 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -2056,7 +2056,11 @@ public abstract class ConnectionService extends Service {
conference.getConnectTimeMillis(),
conference.getConnectionStartElapsedRealTime(),
conference.getStatusHints(),
- conference.getExtras());
+ conference.getExtras(),
+ conference.getAddress(),
+ conference.getAddressPresentation(),
+ conference.getCallerDisplayName(),
+ conference.getCallerDisplayNamePresentation());
mAdapter.addConferenceCall(id, parcelableConference);
mAdapter.setVideoProvider(id, conference.getVideoProvider());
diff --git a/telecomm/java/android/telecom/ParcelableConference.java b/telecomm/java/android/telecom/ParcelableConference.java
index 636e4b2ba96e..ede05943772e 100644
--- a/telecomm/java/android/telecom/ParcelableConference.java
+++ b/telecomm/java/android/telecom/ParcelableConference.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -42,6 +43,10 @@ public final class ParcelableConference implements Parcelable {
private StatusHints mStatusHints;
private Bundle mExtras;
private long mConnectElapsedTimeMillis = Conference.CONNECT_TIME_NOT_SPECIFIED;
+ private final Uri mAddress;
+ private final int mAddressPresentation;
+ private final String mCallerDisplayName;
+ private final int mCallerDisplayNamePresentation;
public ParcelableConference(
PhoneAccountHandle phoneAccount,
@@ -54,7 +59,11 @@ public final class ParcelableConference implements Parcelable {
long connectTimeMillis,
long connectElapsedTimeMillis,
StatusHints statusHints,
- Bundle extras) {
+ Bundle extras,
+ Uri address,
+ int addressPresentation,
+ String callerDisplayName,
+ int callerDisplayNamePresentation) {
mPhoneAccount = phoneAccount;
mState = state;
mConnectionCapabilities = connectionCapabilities;
@@ -66,6 +75,10 @@ public final class ParcelableConference implements Parcelable {
mStatusHints = statusHints;
mExtras = extras;
mConnectElapsedTimeMillis = connectElapsedTimeMillis;
+ mAddress = address;
+ mAddressPresentation = addressPresentation;
+ mCallerDisplayName = callerDisplayName;
+ mCallerDisplayNamePresentation = callerDisplayNamePresentation;
}
@Override
@@ -134,6 +147,14 @@ public final class ParcelableConference implements Parcelable {
return mExtras;
}
+ public Uri getHandle() {
+ return mAddress;
+ }
+
+ public int getHandlePresentation() {
+ return mAddressPresentation;
+ }
+
public static final @android.annotation.NonNull Parcelable.Creator<ParcelableConference> CREATOR =
new Parcelable.Creator<ParcelableConference> () {
@Override
@@ -152,10 +173,15 @@ public final class ParcelableConference implements Parcelable {
Bundle extras = source.readBundle(classLoader);
int properties = source.readInt();
long connectElapsedTimeMillis = source.readLong();
+ Uri address = source.readParcelable(classLoader);
+ int addressPresentation = source.readInt();
+ String callerDisplayName = source.readString();
+ int callerDisplayNamePresentation = source.readInt();
return new ParcelableConference(phoneAccount, state, capabilities, properties,
connectionIds, videoCallProvider, videoState, connectTimeMillis,
- connectElapsedTimeMillis, statusHints, extras);
+ connectElapsedTimeMillis, statusHints, extras, address, addressPresentation,
+ callerDisplayName, callerDisplayNamePresentation);
}
@Override
@@ -185,5 +211,9 @@ public final class ParcelableConference implements Parcelable {
destination.writeBundle(mExtras);
destination.writeInt(mConnectionProperties);
destination.writeLong(mConnectElapsedTimeMillis);
+ destination.writeParcelable(mAddress, 0);
+ destination.writeInt(mAddressPresentation);
+ destination.writeString(mCallerDisplayName);
+ destination.writeInt(mCallerDisplayNamePresentation);
}
}