Loading core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -42054,6 +42054,7 @@ package android.telecom { method public void disconnect(@NonNull android.telecom.DisconnectCause, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method @NonNull public android.os.ParcelUuid getCallId(); method public void requestCallEndpointChange(@NonNull android.telecom.CallEndpoint, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void sendEvent(@NonNull String, @NonNull android.os.Bundle); method public void setActive(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void setInactive(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void startCallStreaming(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); Loading Loading @@ -42100,6 +42101,7 @@ package android.telecom { method public void onAvailableCallEndpointsChanged(@NonNull java.util.List<android.telecom.CallEndpoint>); method public void onCallEndpointChanged(@NonNull android.telecom.CallEndpoint); method public void onCallStreamingFailed(int); method public void onEvent(@NonNull String, @NonNull android.os.Bundle); method public void onMuteStateChanged(boolean); } telecomm/java/android/telecom/CallControl.java +30 −2 Original line number Diff line number Diff line Loading @@ -147,10 +147,8 @@ public final class CallControl { * <li>{@link DisconnectCause#REJECTED}</li> * <li>{@link DisconnectCause#MISSED}</li> * </ul> * * @param executor The {@link Executor} on which the {@link OutcomeReceiver} callback * will be called on. * * @param callback That will be completed on the Telecom side that details success or * failure of the requested operation. * Loading Loading @@ -253,6 +251,36 @@ public final class CallControl { } } /** * Raises an event to the {@link android.telecom.InCallService} implementations tracking this * call via {@link android.telecom.Call.Callback#onConnectionEvent(Call, String, Bundle)}. * These events and the associated extra keys for the {@code Bundle} parameter are defined * in Android X. This API is used to relay additional information about a call other than * what is specified in the {@link android.telecom.CallAttributes} to * {@link android.telecom.InCallService}s. This might include, for example, a change to the list * of participants in a meeting, or the name of the speakers who have their hand raised. Where * appropriate, the {@link InCallService}s tracking this call may choose to render this * additional information about the call. An automotive calling UX, for example may have enough * screen real estate to indicate the number of participants in a meeting, but to prevent * distractions could suppress the list of participants. * * @param event that is defined in AndroidX (ex. The number of participants changed) * @param extras the updated value in relation to the event (ex. 4 participants) */ public void sendEvent(@NonNull String event, @NonNull Bundle extras) { Objects.requireNonNull(event); Objects.requireNonNull(extras); if (mServerInterface != null) { try { mServerInterface.sendEvent(mCallId, event, extras); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } else { throw new IllegalStateException(INTERFACE_ERROR_MSG); } } /** * Since {@link OutcomeReceiver}s cannot be passed via AIDL, a ResultReceiver (which can) must * wrap the Clients {@link OutcomeReceiver} passed in and await for the Telecom Server side Loading telecomm/java/android/telecom/CallEventCallback.java +14 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.telecom; import android.annotation.NonNull; import android.os.Bundle; import java.util.List; Loading Loading @@ -56,4 +57,17 @@ public interface CallEventCallback { * @param reason Code to indicate the reason of this failure */ void onCallStreamingFailed(@CallStreamingService.StreamingFailedReason int reason); /** * Informs this {@link android.telecom.CallEventCallback} on events raised from a * {@link android.telecom.InCallService} presenting this call. The event key and extra values * are defined in AndroidX. This enables alternative calling surfaces, such as an automotive * UI, to relay requests to perform other non-standard call actions to the app. For example, * an automotive calling solution may offer the ability for the user to raise their hand * during a meeting. * * @param event that is defined in AndroidX (ex. the number of participants changed) * @param extras the updated value in relation to the event (ex. 4 participants) */ void onEvent(@NonNull String event, @NonNull Bundle extras); } telecomm/java/com/android/internal/telecom/ClientTransactionalServiceWrapper.java +20 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telecom; import static android.telecom.TelecomManager.TELECOM_TRANSACTION_SUCCESS; import android.os.Binder; import android.os.Bundle; import android.os.OutcomeReceiver; import android.os.ResultReceiver; import android.telecom.CallAttributes; Loading Loading @@ -148,6 +149,7 @@ public class ClientTransactionalServiceWrapper { private static final String ON_AVAILABLE_CALL_ENDPOINTS = "onAvailableCallEndpointsChanged"; private static final String ON_MUTE_STATE_CHANGED = "onMuteStateChanged"; private static final String ON_CALL_STREAMING_FAILED = "onCallStreamingFailed"; private static final String ON_EVENT = "onEvent"; private void handleHandshakeCallback(String action, String callId, int code, ResultReceiver ackResultReceiver) { Loading Loading @@ -314,5 +316,23 @@ public class ClientTransactionalServiceWrapper { Log.i(TAG, TextUtils.formatSimple("oCSF: id=[%s], reason=[%s]", callId, reason)); handleEventCallback(callId, ON_CALL_STREAMING_FAILED, reason); } @Override public void onEvent(String callId, String event, Bundle extras) { // lookup the callEventCallback associated with the particular call TransactionalCall call = mCallIdToTransactionalCall.get(callId); if (call != null) { CallEventCallback callback = call.getCallStateCallback(); Executor executor = call.getExecutor(); final long identity = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onEvent(event, extras); }); } finally { Binder.restoreCallingIdentity(identity); } } } }; } telecomm/java/com/android/internal/telecom/ICallControl.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telecom; import android.os.Bundle; import android.telecom.CallControl; import android.telecom.CallEndpoint; import android.telecom.DisconnectCause; Loading @@ -30,4 +31,5 @@ oneway interface ICallControl { void disconnect(String callId, in DisconnectCause disconnectCause, in ResultReceiver callback); void startCallStreaming(String callId, in ResultReceiver callback); void requestCallEndpointChange(in CallEndpoint callEndpoint, in ResultReceiver callback); void sendEvent(String callId, String event, in Bundle extras); } No newline at end of file Loading
core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -42054,6 +42054,7 @@ package android.telecom { method public void disconnect(@NonNull android.telecom.DisconnectCause, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method @NonNull public android.os.ParcelUuid getCallId(); method public void requestCallEndpointChange(@NonNull android.telecom.CallEndpoint, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void sendEvent(@NonNull String, @NonNull android.os.Bundle); method public void setActive(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void setInactive(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); method public void startCallStreaming(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.telecom.CallException>); Loading Loading @@ -42100,6 +42101,7 @@ package android.telecom { method public void onAvailableCallEndpointsChanged(@NonNull java.util.List<android.telecom.CallEndpoint>); method public void onCallEndpointChanged(@NonNull android.telecom.CallEndpoint); method public void onCallStreamingFailed(int); method public void onEvent(@NonNull String, @NonNull android.os.Bundle); method public void onMuteStateChanged(boolean); }
telecomm/java/android/telecom/CallControl.java +30 −2 Original line number Diff line number Diff line Loading @@ -147,10 +147,8 @@ public final class CallControl { * <li>{@link DisconnectCause#REJECTED}</li> * <li>{@link DisconnectCause#MISSED}</li> * </ul> * * @param executor The {@link Executor} on which the {@link OutcomeReceiver} callback * will be called on. * * @param callback That will be completed on the Telecom side that details success or * failure of the requested operation. * Loading Loading @@ -253,6 +251,36 @@ public final class CallControl { } } /** * Raises an event to the {@link android.telecom.InCallService} implementations tracking this * call via {@link android.telecom.Call.Callback#onConnectionEvent(Call, String, Bundle)}. * These events and the associated extra keys for the {@code Bundle} parameter are defined * in Android X. This API is used to relay additional information about a call other than * what is specified in the {@link android.telecom.CallAttributes} to * {@link android.telecom.InCallService}s. This might include, for example, a change to the list * of participants in a meeting, or the name of the speakers who have their hand raised. Where * appropriate, the {@link InCallService}s tracking this call may choose to render this * additional information about the call. An automotive calling UX, for example may have enough * screen real estate to indicate the number of participants in a meeting, but to prevent * distractions could suppress the list of participants. * * @param event that is defined in AndroidX (ex. The number of participants changed) * @param extras the updated value in relation to the event (ex. 4 participants) */ public void sendEvent(@NonNull String event, @NonNull Bundle extras) { Objects.requireNonNull(event); Objects.requireNonNull(extras); if (mServerInterface != null) { try { mServerInterface.sendEvent(mCallId, event, extras); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } else { throw new IllegalStateException(INTERFACE_ERROR_MSG); } } /** * Since {@link OutcomeReceiver}s cannot be passed via AIDL, a ResultReceiver (which can) must * wrap the Clients {@link OutcomeReceiver} passed in and await for the Telecom Server side Loading
telecomm/java/android/telecom/CallEventCallback.java +14 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.telecom; import android.annotation.NonNull; import android.os.Bundle; import java.util.List; Loading Loading @@ -56,4 +57,17 @@ public interface CallEventCallback { * @param reason Code to indicate the reason of this failure */ void onCallStreamingFailed(@CallStreamingService.StreamingFailedReason int reason); /** * Informs this {@link android.telecom.CallEventCallback} on events raised from a * {@link android.telecom.InCallService} presenting this call. The event key and extra values * are defined in AndroidX. This enables alternative calling surfaces, such as an automotive * UI, to relay requests to perform other non-standard call actions to the app. For example, * an automotive calling solution may offer the ability for the user to raise their hand * during a meeting. * * @param event that is defined in AndroidX (ex. the number of participants changed) * @param extras the updated value in relation to the event (ex. 4 participants) */ void onEvent(@NonNull String event, @NonNull Bundle extras); }
telecomm/java/com/android/internal/telecom/ClientTransactionalServiceWrapper.java +20 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telecom; import static android.telecom.TelecomManager.TELECOM_TRANSACTION_SUCCESS; import android.os.Binder; import android.os.Bundle; import android.os.OutcomeReceiver; import android.os.ResultReceiver; import android.telecom.CallAttributes; Loading Loading @@ -148,6 +149,7 @@ public class ClientTransactionalServiceWrapper { private static final String ON_AVAILABLE_CALL_ENDPOINTS = "onAvailableCallEndpointsChanged"; private static final String ON_MUTE_STATE_CHANGED = "onMuteStateChanged"; private static final String ON_CALL_STREAMING_FAILED = "onCallStreamingFailed"; private static final String ON_EVENT = "onEvent"; private void handleHandshakeCallback(String action, String callId, int code, ResultReceiver ackResultReceiver) { Loading Loading @@ -314,5 +316,23 @@ public class ClientTransactionalServiceWrapper { Log.i(TAG, TextUtils.formatSimple("oCSF: id=[%s], reason=[%s]", callId, reason)); handleEventCallback(callId, ON_CALL_STREAMING_FAILED, reason); } @Override public void onEvent(String callId, String event, Bundle extras) { // lookup the callEventCallback associated with the particular call TransactionalCall call = mCallIdToTransactionalCall.get(callId); if (call != null) { CallEventCallback callback = call.getCallStateCallback(); Executor executor = call.getExecutor(); final long identity = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onEvent(event, extras); }); } finally { Binder.restoreCallingIdentity(identity); } } } }; }
telecomm/java/com/android/internal/telecom/ICallControl.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telecom; import android.os.Bundle; import android.telecom.CallControl; import android.telecom.CallEndpoint; import android.telecom.DisconnectCause; Loading @@ -30,4 +31,5 @@ oneway interface ICallControl { void disconnect(String callId, in DisconnectCause disconnectCause, in ResultReceiver callback); void startCallStreaming(String callId, in ResultReceiver callback); void requestCallEndpointChange(in CallEndpoint callEndpoint, in ResultReceiver callback); void sendEvent(String callId, String event, in Bundle extras); } No newline at end of file