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

Commit c1efefa3 authored by Arthur Ishiguro's avatar Arthur Ishiguro
Browse files

Post endpoint callback in async thread

Bug: 381102453
Flag: android.chre.flags.offload_implementation
Test: Test pass
Change-Id: Iad2185bd8fd19eefd7b854e507dc9d28dd2c06aa
parent ee3c074e
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -336,7 +336,6 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
    /* package */ void onEndpointSessionOpenRequest(
            int sessionId, HubEndpointInfo initiator, String serviceDescriptor) {
        if (!hasEndpointPermissions(initiator)) {
            // TODO(b/381102453): Post in async thread
            halCloseEndpointSessionNoThrow(sessionId, Reason.PERMISSION_DENIED);
            return;
        }
@@ -344,7 +343,6 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
        synchronized (mOpenSessionLock) {
            if (hasSessionId(sessionId)) {
                Log.e(TAG, "Existing session in onEndpointSessionOpenRequest: id=" + sessionId);
                // TODO(b/381102453): Post in async thread
                halCloseEndpointSessionNoThrow(sessionId, Reason.UNSPECIFIED);
                return;
            }
@@ -403,7 +401,6 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
                            + sessionId
                            + ") with message: "
                            + message);
            // TODO(b/381102453): Post in async thread
            sendMessageDeliveryStatus(
                    sessionId, message.getMessageSequenceNumber(), ErrorCode.PERMANENT_ERROR);
            return;
@@ -414,7 +411,6 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
                mContextHubEndpointCallback.onMessageReceived(sessionId, message);
            } catch (RemoteException e) {
                Log.e(TAG, "RemoteException while calling onMessageReceived", e);
                // TODO(b/381102453): Post in async thread
                sendMessageDeliveryStatus(
                        sessionId, message.getMessageSequenceNumber(), ErrorCode.TRANSIENT_ERROR);
            }
+33 −14
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@ import android.hardware.contexthub.HubMessage;
import android.hardware.contexthub.IEndpointCallback;
import android.hardware.contexthub.Message;
import android.hardware.contexthub.MessageDeliveryStatus;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.os.RemoteException;

/** IEndpointCallback implementation. */
@@ -29,6 +32,11 @@ public class ContextHubHalEndpointCallback
    private final IEndpointLifecycleCallback mEndpointLifecycleCallback;
    private final IEndpointSessionCallback mEndpointSessionCallback;

    // Use this thread in case where the execution requires to be on an async service thread.
    private final HandlerThread mHandlerThread =
            new HandlerThread("Context Hub endpoint callback", Process.THREAD_PRIORITY_BACKGROUND);
    private Handler mHandler;

    /** Interface for listening for endpoint start and stop events. */
    public interface IEndpointLifecycleCallback {
        /** Called when a batch of endpoints started. */
@@ -65,6 +73,9 @@ public class ContextHubHalEndpointCallback
            IEndpointSessionCallback endpointSessionCallback) {
        mEndpointLifecycleCallback = endpointLifecycleCallback;
        mEndpointSessionCallback = endpointSessionCallback;

        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
    }

    @Override
@@ -77,7 +88,7 @@ public class ContextHubHalEndpointCallback
        for (int i = 0; i < halEndpointInfos.length; i++) {
            endpointInfos[i] = new HubEndpointInfo(halEndpointInfos[i]);
        }
        mEndpointLifecycleCallback.onEndpointStarted(endpointInfos);
        mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStarted(endpointInfos));
    }

    @Override
@@ -87,40 +98,48 @@ public class ContextHubHalEndpointCallback
        for (int i = 0; i < halEndpointIds.length; i++) {
            endpointIds[i] = new HubEndpointInfo.HubEndpointIdentifier(halEndpointIds[i]);
        }
        mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason);
        mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason));
    }

    @Override
    public void onEndpointSessionOpenRequest(
            int i, EndpointId destination, EndpointId initiator, String s) throws RemoteException {
            int sessionId, EndpointId destination, EndpointId initiator, String serviceDescriptor)
            throws RemoteException {
        HubEndpointInfo.HubEndpointIdentifier destinationId =
                new HubEndpointInfo.HubEndpointIdentifier(destination.hubId, destination.id);
        HubEndpointInfo.HubEndpointIdentifier initiatorId =
                new HubEndpointInfo.HubEndpointIdentifier(initiator.hubId, initiator.id);
        mEndpointSessionCallback.onEndpointSessionOpenRequest(i, destinationId, initiatorId, s);
        mHandler.post(
                () ->
                        mEndpointSessionCallback.onEndpointSessionOpenRequest(
                                sessionId, destinationId, initiatorId, serviceDescriptor));
    }

    @Override
    public void onCloseEndpointSession(int i, byte b) throws RemoteException {
        mEndpointSessionCallback.onCloseEndpointSession(i, b);
    public void onCloseEndpointSession(int sessionId, byte reason) throws RemoteException {
        mHandler.post(() -> mEndpointSessionCallback.onCloseEndpointSession(sessionId, reason));
    }

    @Override
    public void onEndpointSessionOpenComplete(int i) throws RemoteException {
        mEndpointSessionCallback.onEndpointSessionOpenComplete(i);
    public void onEndpointSessionOpenComplete(int sessionId) throws RemoteException {
        mHandler.post(() -> mEndpointSessionCallback.onEndpointSessionOpenComplete(sessionId));
    }

    @Override
    public void onMessageReceived(int i, Message message) throws RemoteException {
    public void onMessageReceived(int sessionId, Message message) throws RemoteException {
        HubMessage hubMessage = ContextHubServiceUtil.createHubMessage(message);
        mEndpointSessionCallback.onMessageReceived(i, hubMessage);
        mHandler.post(() -> mEndpointSessionCallback.onMessageReceived(sessionId, hubMessage));
    }

    @Override
    public void onMessageDeliveryStatusReceived(int i, MessageDeliveryStatus messageDeliveryStatus)
            throws RemoteException {
    public void onMessageDeliveryStatusReceived(
            int sessionId, MessageDeliveryStatus messageDeliveryStatus) throws RemoteException {
        mHandler.post(
                () ->
                        mEndpointSessionCallback.onMessageDeliveryStatusReceived(
                i, messageDeliveryStatus.messageSequenceNumber, messageDeliveryStatus.errorCode);
                                sessionId,
                                messageDeliveryStatus.messageSequenceNumber,
                                messageDeliveryStatus.errorCode));
    }

    @Override