Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ace339b authored by Thomas Stuart's avatar Thomas Stuart
Browse files

add capability to send and receive events

bug: 269512817
Test: CTS
Change-Id: I5f4561192b7c8ab978754e3a7da6549d35c61b1d
parent a0961285
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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>);
@@ -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);
  }
+30 −2
Original line number Diff line number Diff line
@@ -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.
     *
@@ -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
+14 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.telecom;

import android.annotation.NonNull;
import android.os.Bundle;

import java.util.List;

@@ -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);
}
+20 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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);
                }
            }
        }
    };
}
+2 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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