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

Commit 7572a290 authored by Joe Antonetti's avatar Joe Antonetti
Browse files

[2/N][Requesting Handoff From App] Create HandoffRequestResultMessage

This is part of a stack of changes to send requests for Handoff to connected associations and process response messages into actual app launches

This change adds a response message class, to receive Handoff information from another device. As part of this change, serialization of TaskContinuityMessages has been updated to throw exceptions from HandoffActivityData serialization

Test: Added unit tests
Bug: 400970610
Flag: android.companion.enable_task_continuity
Change-Id: Ia4eaac89d9424504434ac8d9bd26457eda172a2c
parent 6bb1b7c1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ message TaskContinuityMessage {
        RemoteTaskRemovedMessage remote_task_removed = 3;
        HandoffRequestMessage handoff_request = 4;
        RemoteTaskUpdatedMessage remote_task_updated = 5;
        HandoffRequestResultMessage handoff_request_result = 6;
    }
}

@@ -59,6 +60,12 @@ message RemoteTaskRemovedMessage {
    int32 taskId = 1;
}

message HandoffRequestResultMessage {
    int32 statusCode = 1;
    int32 taskId = 2;
    repeated HandoffActivityData activities = 3;
}

message HandoffActivityData {
    string componentName = 1;
    string fallbackUri = 2;
+9 −4
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.server.companion.datatransfer.continuity.messages.RemoteTaskI
import com.android.server.companion.datatransfer.continuity.messages.TaskContinuityMessage;
import com.android.server.companion.datatransfer.continuity.messages.TaskContinuityMessageData;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -179,10 +180,14 @@ class TaskBroadcaster
                .setData(data)
                .build();

        try {
            mCompanionDeviceManager.sendMessage(
                CompanionDeviceManager.MESSAGE_ONEWAY_TASK_CONTINUITY,
                message.toBytes(),
                new int[] {associationId});
        } catch (IOException e) {
            Slog.e(TAG, "Failed to send message to device " + associationId, e);
        }
    }

    private void sendMessageToAllConnectedAssociations(
+1 −1
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ public class ContinuityDeviceConnected implements TaskContinuityMessageData {
     * Writes this object to a proto output stream.
     */
    @Override
    public void writeToProto(ProtoOutputStream pos) {
    public void writeToProto(ProtoOutputStream pos) throws IOException {
        pos.writeInt32(
            android.companion.ContinuityDeviceConnected.CURRENT_FOREGROUND_TASK_ID,
            mCurrentForegroundTaskId);
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

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

import android.app.HandoffActivityData;
import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Deserialized version of the HandoffRequestResultMessage proto.
 * Contains a status code and a list of activities for handoff.
 */
public record HandoffRequestResultMessage(
    int taskId,
    int statusCode,
    List<HandoffActivityData> activities) implements TaskContinuityMessageData {

    public static HandoffRequestResultMessage readFromProto(
        ProtoInputStream pis) throws IOException {

        int statusCode = 0;
        int taskId = 0;
        List<HandoffActivityData> activities = new ArrayList<>();

        while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
            switch (pis.getFieldNumber()) {
                case (int) android.companion.HandoffRequestResultMessage.STATUS_CODE:
                    statusCode = pis.readInt(
                        android.companion.HandoffRequestResultMessage.STATUS_CODE);

                    break;
                case (int) android.companion.HandoffRequestResultMessage.TASK_ID:
                    taskId = pis.readInt(android.companion.HandoffRequestResultMessage.TASK_ID);
                    break;
                case (int) android.companion.HandoffRequestResultMessage.ACTIVITIES:
                    long token = pis.start(
                            android.companion.HandoffRequestResultMessage.ACTIVITIES);
                    HandoffActivityData activityData =
                            HandoffActivityDataSerializer.readFromProto(pis);
                    activities.add(activityData);
                    pis.end(token);
                    break;
            }
        }

        return new HandoffRequestResultMessage(taskId, statusCode, activities);
    }

    @Override
    public long getFieldNumber() {
        return android.companion.TaskContinuityMessage.HANDOFF_REQUEST_RESULT;
    }

    @Override
    public void writeToProto(ProtoOutputStream pos) throws IOException {
        pos.write(android.companion.HandoffRequestResultMessage.STATUS_CODE, statusCode);
        pos.write(android.companion.HandoffRequestResultMessage.TASK_ID, taskId);

        for (android.app.HandoffActivityData activity : activities) {
            long token = pos.start(android.companion.HandoffRequestResultMessage.ACTIVITIES);
            HandoffActivityDataSerializer.writeToProto(activity, pos);
            pos.end(token);
        }
    }
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ public class RemoteTaskAddedMessage implements TaskContinuityMessageData {
    }

    @Override
    public void writeToProto(ProtoOutputStream pos) {
    public void writeToProto(ProtoOutputStream pos) throws IOException {
        long taskToken = pos.start(
            android.companion.RemoteTaskAddedMessage.TASK);

Loading