Add relative APIs for InCallService that can support self-managed

connections that want to expose itself.

Add PhoneAccount#EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE and
Connection#onInCallServiceTrackingChanged.

Bug: 161144815
Test: CtsTelecomTestCases
Change-Id: I0a42ea79a1cd46aa9df3399c4fa2e9396321778a
Merged-In: I0a42ea79a1cd46aa9df3399c4fa2e9396321778a
This commit is contained in:
Grace Jia
2021-01-19 14:58:01 -08:00
parent 942b71b485
commit 4e8dc10871
5 changed files with 122 additions and 4 deletions

View File

@@ -38482,7 +38482,9 @@ package android.telecom {
method public void onStateChanged(int);
method public void onStopDtmfTone();
method public void onStopRtt();
method public void onTrackedByNonUiService(boolean);
method public void onUnhold();
method public void onUsingAlternativeUi(boolean);
method public static String propertiesToString(int);
method public final void putExtras(@NonNull android.os.Bundle);
method public final void removeExtras(java.util.List<java.lang.String>);
@@ -38820,6 +38822,7 @@ package android.telecom {
field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8
field public static final int CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE = 256; // 0x100
field @NonNull public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR;
field public static final String EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE = "android.telecom.extra.ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE";
field public static final String EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE = "android.telecom.extra.ALWAYS_USE_VOIP_AUDIO_MODE";
field public static final String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING";
field public static final String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH";

View File

@@ -3004,6 +3004,26 @@ public abstract class Connection extends Conferenceable {
*/
public void onCallAudioStateChanged(CallAudioState state) {}
/**
* Inform this Connection when it will or will not be tracked by an {@link InCallService} which
* can provide an InCall UI.
* This is primarily intended for use by Connections reported by self-managed
* {@link ConnectionService} which typically maintain their own UI.
*
* @param isUsingAlternativeUi Indicates whether an InCallService that can provide InCall UI is
* currently tracking the self-managed call.
*/
public void onUsingAlternativeUi(boolean isUsingAlternativeUi) {}
/**
* Inform this Conenection when it will or will not be tracked by an non-UI
* {@link InCallService}.
*
* @param isTracked Indicates whether an non-UI InCallService is currently tracking the
* self-managed call.
*/
public void onTrackedByNonUiService(boolean isTracked) {}
/**
* Notifies this Connection of an internal state change. This method is called after the
* state is changed.

View File

@@ -137,6 +137,8 @@ public abstract class ConnectionService extends Service {
private static final String SESSION_HOLD = "CS.h";
private static final String SESSION_UNHOLD = "CS.u";
private static final String SESSION_CALL_AUDIO_SC = "CS.cASC";
private static final String SESSION_USING_ALTERNATIVE_UI = "CS.uAU";
private static final String SESSION_TRACKED_BY_NON_UI_SERVICE = "CS.tBNUS";
private static final String SESSION_PLAY_DTMF = "CS.pDT";
private static final String SESSION_STOP_DTMF = "CS.sDT";
private static final String SESSION_CONFERENCE = "CS.c";
@@ -200,6 +202,9 @@ public abstract class ConnectionService extends Service {
private static final int MSG_ADD_PARTICIPANT = 39;
private static final int MSG_EXPLICIT_CALL_TRANSFER = 40;
private static final int MSG_EXPLICIT_CALL_TRANSFER_CONSULTATIVE = 41;
private static final int MSG_ON_CALL_FILTERING_COMPLETED = 42;
private static final int MSG_ON_USING_ALTERNATIVE_UI = 43;
private static final int MSG_ON_TRACKED_BY_NON_UI_SERVICE = 44;
private static Connection sNullConnection;
@@ -583,6 +588,36 @@ public abstract class ConnectionService extends Service {
}
}
@Override
public void onUsingAlternativeUi(String callId, boolean usingAlternativeUiShowing,
Session.Info sessionInfo) {
Log.startSession(sessionInfo, SESSION_USING_ALTERNATIVE_UI);
try {
SomeArgs args = SomeArgs.obtain();
args.arg1 = callId;
args.arg2 = usingAlternativeUiShowing;
args.arg3 = Log.createSubsession();
mHandler.obtainMessage(MSG_ON_USING_ALTERNATIVE_UI, args).sendToTarget();
} finally {
Log.endSession();
}
}
@Override
public void onTrackedByNonUiService(String callId, boolean isTracked,
Session.Info sessionInfo) {
Log.startSession(sessionInfo, SESSION_TRACKED_BY_NON_UI_SERVICE);
try {
SomeArgs args = SomeArgs.obtain();
args.arg1 = callId;
args.arg2 = isTracked;
args.arg3 = Log.createSubsession();
mHandler.obtainMessage(MSG_ON_TRACKED_BY_NON_UI_SERVICE, args).sendToTarget();
} finally {
Log.endSession();
}
}
@Override
public void playDtmfTone(String callId, char digit, Session.Info sessionInfo) {
Log.startSession(sessionInfo, SESSION_PLAY_DTMF);
@@ -1226,6 +1261,34 @@ public abstract class ConnectionService extends Service {
}
break;
}
case MSG_ON_USING_ALTERNATIVE_UI: {
SomeArgs args = (SomeArgs) msg.obj;
Log.continueSession((Session) args.arg3,
SESSION_HANDLER + SESSION_USING_ALTERNATIVE_UI);
try {
String callId = (String) args.arg1;
boolean isUsingAlternativeUi = (boolean) args.arg2;
onUsingAlternativeUi(callId, isUsingAlternativeUi);
} finally {
args.recycle();
Log.endSession();
}
break;
}
case MSG_ON_TRACKED_BY_NON_UI_SERVICE: {
SomeArgs args = (SomeArgs) msg.obj;
Log.continueSession((Session) args.arg3,
SESSION_HANDLER + SESSION_TRACKED_BY_NON_UI_SERVICE);
try {
String callId = (String) args.arg1;
boolean isTracked = (boolean) args.arg2;
onTrackedByNonUiService(callId, isTracked);
} finally {
args.recycle();
Log.endSession();
}
break;
}
case MSG_PLAY_DTMF_TONE: {
SomeArgs args = (SomeArgs) msg.obj;
try {
@@ -1928,10 +1991,12 @@ public abstract class ConnectionService extends Service {
request.getExtras().getBoolean(TelecomManager.EXTRA_IS_HANDOVER, false);
boolean isHandover = request.getExtras() != null && request.getExtras().getBoolean(
TelecomManager.EXTRA_IS_HANDOVER_CONNECTION, false);
Log.d(this, "createConnection, callManagerAccount: %s, callId: %s, request: %s, " +
"isIncoming: %b, isUnknown: %b, isLegacyHandover: %b, isHandover: %b",
callManagerAccount, callId, request, isIncoming, isUnknown, isLegacyHandover,
isHandover);
boolean addSelfManaged = request.getExtras() != null && request.getExtras().getBoolean(
PhoneAccount.EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE, false);
Log.i(this, "createConnection, callManagerAccount: %s, callId: %s, request: %s, "
+ "isIncoming: %b, isUnknown: %b, isLegacyHandover: %b, isHandover: %b, "
+ " addSelfManaged: %b", callManagerAccount, callId, request, isIncoming,
isUnknown, isLegacyHandover, isHandover, addSelfManaged);
Connection connection = null;
if (isHandover) {
@@ -2206,6 +2271,22 @@ public abstract class ConnectionService extends Service {
}
}
private void onUsingAlternativeUi(String callId, boolean isUsingAlternativeUi) {
Log.i(this, "onUsingAlternativeUi %s %s", callId, isUsingAlternativeUi);
if (mConnectionById.containsKey(callId)) {
findConnectionForAction(callId, "onUsingAlternativeUi")
.onUsingAlternativeUi(isUsingAlternativeUi);
}
}
private void onTrackedByNonUiService(String callId, boolean isTracked) {
Log.i(this, "onTrackedByNonUiService %s %s", callId, isTracked);
if (mConnectionById.containsKey(callId)) {
findConnectionForAction(callId, "onTrackedByNonUiService")
.onTrackedByNonUiService(isTracked);
}
}
private void playDtmfTone(String callId, char digit) {
Log.i(this, "playDtmfTone %s %c", callId, digit);
if (mConnectionById.containsKey(callId)) {

View File

@@ -187,6 +187,15 @@ public final class PhoneAccount implements Parcelable {
public static final String EXTRA_SKIP_CALL_FILTERING =
"android.telecom.extra.SKIP_CALL_FILTERING";
/**
* Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which
* indicates whether a Self-managed {@link PhoneAccount} want to expose its calls to all
* {@link InCallService} which declares the metadata
* {@link TelecomManager#METADATA_INCLUDE_SELF_MANAGED_CALLS}.
*/
public static final String EXTRA_ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE =
"android.telecom.extra.ADD_SELF_MANAGED_CALLS_TO_INCALLSERVICE";
/**
* Flag indicating that this {@code PhoneAccount} can act as a connection manager for
* other connections. The {@link ConnectionService} associated with this {@code PhoneAccount}

View File

@@ -136,4 +136,9 @@ oneway interface IConnectionService {
int error, in Session.Info sessionInfo);
void handoverComplete(String callId, in Session.Info sessionInfo);
void onUsingAlternativeUi(String callId, boolean isUsingAlternativeUi,
in Session.Info sessionInfo);
void onTrackedByNonUiService(String callId, boolean isTracked, in Session.Info sessionInfo);
}