Add new @hide API to pass call direction changes through Telecom

Bug: 153277327
Test: atest TelecomUnitTests
Change-Id: Icad12c4144bf185c24ee80bcbdd1aec29550bf4e
This commit is contained in:
Brad Ebinger
2020-04-08 16:25:12 -07:00
parent a18e52f648
commit 31774ae752
6 changed files with 84 additions and 1 deletions

View File

@@ -74,6 +74,7 @@ public abstract class Conference extends Conferenceable {
public void onConnectionEvent(Conference c, String event, Bundle extras) {}
public void onCallerDisplayNameChanged(
Conference c, String callerDisplayName, int presentation) {}
public void onCallDirectionChanged(Conference c, int callDirection) {}
public void onRingbackRequested(Conference c, boolean ringback) {}
}
@@ -103,6 +104,7 @@ public abstract class Conference extends Conferenceable {
private int mAddressPresentation;
private String mCallerDisplayName;
private int mCallerDisplayNamePresentation;
private int mCallDirection;
private boolean mRingbackRequested = false;
private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
@@ -1023,6 +1025,25 @@ public abstract class Conference extends Conferenceable {
}
}
/**
* Sets the call direction of this {@link Conference}. By default, all {@link Conference}s have
* a direction of {@link android.telecom.Call.Details.CallDirection#DIRECTION_UNKNOWN}. The
* direction of a {@link Conference} is only applicable to the case where
* {@link #setConferenceState(boolean)} has been set to {@code false}, otherwise the direction
* will be ignored.
* @param callDirection The direction of the conference.
* @hide
*/
@RequiresPermission(MODIFY_PHONE_STATE)
public final void setCallDirection(@Call.Details.CallDirection int callDirection) {
Log.d(this, "setDirection %d", callDirection);
mCallDirection = callDirection;
for (Listener l : mListeners) {
l.onCallDirectionChanged(this, callDirection);
}
}
/**
* Sets the address of this {@link Conference}. Used when {@link #setConferenceState(boolean)}
* is called to mark a conference temporarily as NOT a conference.
@@ -1101,6 +1122,15 @@ public abstract class Conference extends Conferenceable {
return mCallerDisplayNamePresentation;
}
/**
* @return The call direction of this conference. Only applicable when
* {@link #setConferenceState(boolean)} is set to false.
* @hide
*/
public final @Call.Details.CallDirection int getCallDirection() {
return mCallDirection;
}
/**
* 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

View File

@@ -1553,6 +1553,14 @@ public abstract class ConnectionService extends Service {
}
}
@Override
public void onCallDirectionChanged(Conference c, int direction) {
String id = mIdByConference.get(c);
if (id != null) {
mAdapter.setCallDirection(id, direction);
}
}
@Override
public void onAddressChanged(Conference c, Uri newAddress, int presentation) {
String id = mIdByConference.get(c);

View File

@@ -693,4 +693,20 @@ final class ConnectionServiceAdapter implements DeathRecipient {
}
}
}
/**
* Sets the direction of a call. Setting a new direction of an existing call is usually only
* applicable during single caller emulation during conferencing, see
* {@link Conference#setConferenceState(boolean)} for more information.
* @param callId The identifier of the call.
* @param direction The new direction of the call.
*/
void setCallDirection(String callId, @Call.Details.CallDirection int direction) {
for (IConnectionServiceAdapter a : mAdapters) {
try {
a.setCallDirection(callId, direction, Log.getExternalSession());
} catch (RemoteException e) {
}
}
}
}

View File

@@ -76,6 +76,7 @@ final class ConnectionServiceAdapterServant {
private static final int MSG_CONNECTION_SERVICE_FOCUS_RELEASED = 35;
private static final int MSG_SET_CONFERENCE_STATE = 36;
private static final int MSG_HANDLE_CREATE_CONFERENCE_COMPLETE = 37;
private static final int MSG_SET_CALL_DIRECTION = 38;
private final IConnectionServiceAdapter mDelegate;
@@ -353,7 +354,7 @@ final class ConnectionServiceAdapterServant {
case MSG_CONNECTION_SERVICE_FOCUS_RELEASED:
mDelegate.onConnectionServiceFocusReleased(null /*Session.Info*/);
break;
case MSG_SET_CONFERENCE_STATE:
case MSG_SET_CONFERENCE_STATE: {
SomeArgs args = (SomeArgs) msg.obj;
try {
mDelegate.setConferenceState((String) args.arg1, (Boolean) args.arg2,
@@ -361,6 +362,17 @@ final class ConnectionServiceAdapterServant {
} finally {
args.recycle();
}
break;
}
case MSG_SET_CALL_DIRECTION: {
SomeArgs args = (SomeArgs) msg.obj;
try {
mDelegate.setCallDirection((String) args.arg1, args.argi1,
(Session.Info) args.arg2);
} finally {
args.recycle();
}
}
}
}
};
@@ -670,6 +682,16 @@ final class ConnectionServiceAdapterServant {
args.arg3 = sessionInfo;
mHandler.obtainMessage(MSG_SET_CONFERENCE_STATE, args).sendToTarget();
}
@Override
public void setCallDirection(String callId, int direction,
Session.Info sessionInfo) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = callId;
args.argi1 = direction;
args.arg2 = sessionInfo;
mHandler.obtainMessage(MSG_SET_CALL_DIRECTION, args).sendToTarget();
}
};
public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {

View File

@@ -485,6 +485,11 @@ final class RemoteConnectionService {
Session.Info sessionInfo) {
// Do nothing
}
@Override
public void setCallDirection(String callId, int direction, Session.Info sessionInfo) {
// Do nothing
}
};
private final ConnectionServiceAdapterServant mServant =

View File

@@ -132,4 +132,6 @@ oneway interface IConnectionServiceAdapter {
void resetConnectionTime(String callIdi, in Session.Info sessionInfo);
void setConferenceState(String callId, boolean isConference, in Session.Info sessionInfo);
void setCallDirection(String callId, int direction, in Session.Info sessionInfo);
}