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

Commit 13759a57 authored by Joe Antonetti's avatar Joe Antonetti Committed by Android (Google) Code Review
Browse files

Merge "[Handoff][3/N] Return error if requesting Handoff from an unknown association." into main

parents b1bf8433 1ee5c9b0
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -70,7 +70,9 @@ public final class TaskContinuityManagerService extends SystemService {

        mTaskContinuityMessageReceiver = new TaskContinuityMessageReceiver(context);
        mRemoteTaskStore = new RemoteTaskStore(mConnectedAssociationStore);
        mOutboundHandoffRequestController = new OutboundHandoffRequestController(context);
        mOutboundHandoffRequestController = new OutboundHandoffRequestController(
            context,
            mConnectedAssociationStore);
        mInboundHandoffRequestController = new InboundHandoffRequestController(context);
    }

+21 −1
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@
package com.android.server.companion.datatransfer.continuity.handoff;

import static android.companion.CompanionDeviceManager.MESSAGE_ONEWAY_TASK_CONTINUITY;
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 com.android.server.companion.datatransfer.continuity.connectivity.ConnectedAssociationStore;
import com.android.server.companion.datatransfer.continuity.messages.HandoffRequestMessage;
import com.android.server.companion.datatransfer.continuity.messages.HandoffRequestResultMessage;
import com.android.server.companion.datatransfer.continuity.messages.TaskContinuityMessage;
@@ -51,15 +53,33 @@ public class OutboundHandoffRequestController {

    private final Context mContext;
    private final CompanionDeviceManager mCompanionDeviceManager;
    private final ConnectedAssociationStore mConnectedAssociationStore;
    private final Map<Integer, Map<Integer, List<IHandoffRequestCallback>>> mPendingCallbacks
        = new HashMap<>();

    public OutboundHandoffRequestController(Context context) {
    public OutboundHandoffRequestController(
        Context context,
        ConnectedAssociationStore connectedAssociationStore) {
        mContext = context;
        mCompanionDeviceManager = context.getSystemService(CompanionDeviceManager.class);
        mConnectedAssociationStore = connectedAssociationStore;
    }

    public void requestHandoff(int associationId, int taskId, IHandoffRequestCallback callback) {
        if (mConnectedAssociationStore.getConnectedAssociationById(associationId) == null) {
            Slog.w(TAG, "Association " + associationId + " is not connected.");
            try {
                callback.onHandoffRequestFinished(
                    associationId,
                    taskId,
                    HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND);
            } catch (RemoteException e) {
                Slog.e(TAG, "Failed to notify callback of handoff request result", e);
            }

            return;
        }

        synchronized (mPendingCallbacks) {
            if (!mPendingCallbacks.containsKey(associationId)) {
                mPendingCallbacks.put(associationId, new HashMap<>());
+44 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.companion.datatransfer.continuity.handoff;

import static com.android.server.companion.datatransfer.continuity.TaskContinuityTestUtils.createAssociationInfo;
import static com.android.server.companion.datatransfer.continuity.TaskContinuityTestUtils.createMockContext;
import static com.android.server.companion.datatransfer.continuity.TaskContinuityTestUtils.createMockCompanionDeviceManager;
import static com.android.server.companion.datatransfer.continuity.TaskContinuityTestUtils.verifyMessageSent;
@@ -25,9 +26,12 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.doNothing;
import static org.mockito.ArgumentMatchers.any;

import com.android.server.companion.datatransfer.continuity.connectivity.ConnectedAssociationStore;
import com.android.server.companion.datatransfer.continuity.messages.HandoffRequestMessage;
import com.android.server.companion.datatransfer.continuity.messages.HandoffRequestResultMessage;
import com.android.server.companion.datatransfer.continuity.messages.TaskContinuityMessage;
@@ -37,6 +41,7 @@ import android.app.HandoffActivityData;
import android.content.Context;
import android.content.ComponentName;
import android.content.Intent;
import android.companion.AssociationInfo;
import android.companion.CompanionDeviceManager;
import android.companion.ICompanionDeviceManager;
import android.companion.datatransfer.continuity.IHandoffRequestCallback;
@@ -47,6 +52,8 @@ import android.os.RemoteException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.List;
@@ -56,14 +63,19 @@ public class OutboundHandoffRequestControllerTest {
    private Context mContext;
    private ICompanionDeviceManager mMockCompanionDeviceManagerService;

    @Mock private ConnectedAssociationStore mMockConnectedAssociationStore;

    private OutboundHandoffRequestController mOutboundHandoffRequestController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = createMockContext();
        mMockCompanionDeviceManagerService = createMockCompanionDeviceManager(mContext);

        mOutboundHandoffRequestController = new OutboundHandoffRequestController(mContext);
        mOutboundHandoffRequestController = new OutboundHandoffRequestController(
            mContext,
            mMockConnectedAssociationStore);
    }

    @Test
@@ -71,6 +83,9 @@ public class OutboundHandoffRequestControllerTest {
        int associationId = 1;
        int taskId = 1;
        HandoffRequestCallbackHolder callbackHolder = new HandoffRequestCallbackHolder();
        AssociationInfo mockAssociationInfo = createAssociationInfo(associationId, "device");
        when(mMockConnectedAssociationStore.getConnectedAssociationById(associationId))
            .thenReturn(mockAssociationInfo);

        // Request a handoff to a device.
        mOutboundHandoffRequestController.requestHandoff(
@@ -125,10 +140,32 @@ public class OutboundHandoffRequestControllerTest {
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_SUCCESS);
    }

    @Test
    public void testRequestHandoff_associationNotConnected_returnsFailure() {
        int associationId = 1;
        int taskId = 1;
        HandoffRequestCallbackHolder callbackHolder = new HandoffRequestCallbackHolder();
        when(mMockConnectedAssociationStore.getConnectedAssociationById(associationId))
            .thenReturn(null);
        mOutboundHandoffRequestController.requestHandoff(
            associationId,
            taskId,
            callbackHolder.callback);

        // Verify the callback was invoked.
        callbackHolder.verifyInvoked(
            associationId,
            taskId,
            TaskContinuityManager.HANDOFF_REQUEST_RESULT_FAILURE_DEVICE_NOT_FOUND);
    }

    @Test
    public void testRequestHandoff_multipleTimes_onlySendsOneMessage() throws Exception {
        int associationId = 1;
        int taskId = 1;
        AssociationInfo mockAssociationInfo = createAssociationInfo(associationId, "device");
        when(mMockConnectedAssociationStore.getConnectedAssociationById(associationId))
            .thenReturn(mockAssociationInfo);

        // Request handoff multiple times.
        HandoffRequestCallbackHolder firstCallback = new HandoffRequestCallbackHolder();
@@ -155,6 +192,9 @@ public class OutboundHandoffRequestControllerTest {
        // Request a handoff
        int associationId = 1;
        int taskId = 1;
        AssociationInfo mockAssociationInfo = createAssociationInfo(associationId, "device");
        when(mMockConnectedAssociationStore.getConnectedAssociationById(associationId))
            .thenReturn(mockAssociationInfo);
        HandoffRequestCallbackHolder callback = new HandoffRequestCallbackHolder();
        mOutboundHandoffRequestController.requestHandoff(
            associationId,
@@ -183,6 +223,9 @@ public class OutboundHandoffRequestControllerTest {
        // Request a handoff
        int associationId = 1;
        int taskId = 1;
        AssociationInfo mockAssociationInfo = createAssociationInfo(associationId, "device");
        when(mMockConnectedAssociationStore.getConnectedAssociationById(associationId))
            .thenReturn(mockAssociationInfo);
        HandoffRequestCallbackHolder callback = new HandoffRequestCallbackHolder();
        mOutboundHandoffRequestController.requestHandoff(
            associationId,