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

Commit dfdfce57 authored by Joe Antonetti's avatar Joe Antonetti
Browse files

[Handoff][4/N] Add "Internal Error" code for Handoff.

Add an "Internal Error" code for Handoff if an unexpected failure occurred during the handoff flow.

Flag: android.companion.enable_task_continuity
Bug: 400970610
API-Coverage-Bug: 419601871
Test: Updated Unit Tests
Change-Id: I7060541abec2fc8c23628a639ad6c9309419b573
parent ea666b27
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3496,6 +3496,7 @@ package android.companion.datatransfer.continuity {
    method public void unregisterRemoteTaskListener(@NonNull android.companion.datatransfer.continuity.TaskContinuityManager.RemoteTaskListener);
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND = 5; // 0x5
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_NO_DATA_PROVIDED_BY_TASK = 2; // 0x2
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR = 6; // 0x6
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_SENDER_LOST_CONNECTION = 3; // 0x3
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_TASK_NOT_FOUND = 1; // 0x1
    field public static final int HANDOFF_REQUEST_RESULT_FAILURE_TIMEOUT = 4; // 0x4
+6 −0
Original line number Diff line number Diff line
@@ -103,6 +103,12 @@ public class TaskContinuityManager {
     */
    public static final int HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND = 5;

    /**
     * Indicates a request for handoff failed because of an internal error outside of Handoff's data
     * transfer flow.
     */
    public static final int HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR = 6;

    /** @hide */
    public TaskContinuityManager(
        @NonNull Context context,
+4 −4
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.server.companion.datatransfer.continuity.handoff;
import static android.companion.datatransfer.continuity.TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND;
import static android.companion.datatransfer.continuity.TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_NO_DATA_PROVIDED_BY_TASK;
import static android.companion.datatransfer.continuity.TaskContinuityManager.HANDOFF_REQUEST_RESULT_SUCCESS;
import static android.companion.datatransfer.continuity.TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_SENDER_LOST_CONNECTION;
import static android.companion.datatransfer.continuity.TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR;

import com.android.server.companion.datatransfer.continuity.connectivity.TaskContinuityMessenger;
import com.android.server.companion.datatransfer.continuity.messages.HandoffRequestMessage;
@@ -98,7 +98,7 @@ public class OutboundHandoffRequestController {
                    finishHandoffRequest(
                        associationId,
                        taskId,
                        HANDOFF_REQUEST_RESULT_FAILURE_SENDER_LOST_CONNECTION);
                        HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);
                    break;
                case TaskContinuityMessenger.SendMessageResult.FAILURE_ASSOCIATION_NOT_FOUND:
                    Slog.w(TAG, "Association " + associationId + " is not connected.");
@@ -112,7 +112,7 @@ public class OutboundHandoffRequestController {
                    finishHandoffRequest(
                        associationId,
                        taskId,
                        HANDOFF_REQUEST_RESULT_FAILURE_SENDER_LOST_CONNECTION);
                        HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);
                    break;
            }
        }
@@ -141,7 +141,7 @@ public class OutboundHandoffRequestController {
                finishHandoffRequest(
                    associationId,
                    handoffRequestResultMessage.taskId(),
                    HANDOFF_REQUEST_RESULT_FAILURE_NO_DATA_PROVIDED_BY_TASK);
                    HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);
                return;
            } else {
                finishHandoffRequest(
+41 −1
Original line number Diff line number Diff line
@@ -246,9 +246,49 @@ public class OutboundHandoffRequestControllerTest {
        callback.verifyInvoked(
            associationId,
            taskId,
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_NO_DATA_PROVIDED_BY_TASK);
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);

        // Verify no intent was launched.
        verify(mMockContext, never()).startActivitiesAsUser(any(), any(), any());
    }

    @Test
    public void testRequestHandoff_serializationFailure_returnsFailure() {
        verifyTaskContinuityMessengerFailureCausesFailure(
            TaskContinuityMessenger.SendMessageResult.FAILURE_MESSAGE_SERIALIZATION_FAILED,
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);
    }

    @Test
    public void testRequestHandoff_internalError_returnsFailure() {
        verifyTaskContinuityMessengerFailureCausesFailure(
            TaskContinuityMessenger.SendMessageResult.FAILURE_INTERNAL_ERROR,
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_OTHER_INTERNAL_ERROR);
    }

    @Test
    public void testRequestHandoff_associationNotFound_returnsFailure() {
        verifyTaskContinuityMessengerFailureCausesFailure(
            TaskContinuityMessenger.SendMessageResult.FAILURE_ASSOCIATION_NOT_FOUND,
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND);
    }

    private void verifyTaskContinuityMessengerFailureCausesFailure(
        TaskContinuityMessenger.SendMessageResult sendMessageResult,
        int expectedStatusCode) {

        int associationId = 1;
        int taskId = 1;
        doReturn(sendMessageResult)
            .when(mMockTaskContinuityMessenger).sendMessage(
                eq(associationId),
                any());
        FakeHandoffRequestCallback callback = new FakeHandoffRequestCallback();
        mOutboundHandoffRequestController.requestHandoff(
            associationId,
            taskId,
            callback);
        callback.verifyInvoked(associationId, taskId, expectedStatusCode);
        verify(mMockContext, never()).startActivitiesAsUser(any(), any(), any());
    }
}
 No newline at end of file