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

Commit 7b900bf8 authored by Joe Antonetti's avatar Joe Antonetti
Browse files

Fix ContinuityDeviceConnected

Protobufs will not include int32 values of "0" on the wire, but ContinuityDeviceConnected will throw an error if `currentForegroundTaskId` is not found. This change fixes the bug by assuming `currentForegroundTaskId` is 0 unless read.

Flag: android.companion.enable_task_continuity
Test: Added unit tests
Bug: 400970610
Change-Id: Icc7a66c1517130b75a6082d1de16aa8a5f17b752
parent 4a6a454b
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.server.companion.datatransfer.continuity.messages;

import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoParseException;

import java.io.IOException;
import java.util.ArrayList;
@@ -40,8 +39,7 @@ public class ContinuityDeviceConnected implements TaskContinuityMessageData {
        mRemoteTasks = remoteTasks;
    }

    ContinuityDeviceConnected(ProtoInputStream pis)
        throws IOException, ProtoParseException {
    ContinuityDeviceConnected(ProtoInputStream pis) throws IOException {

        boolean hasReadForegroundTaskId = false;
        List<RemoteTaskInfo> remoteTasks = new ArrayList<>();
@@ -52,7 +50,6 @@ public class ContinuityDeviceConnected implements TaskContinuityMessageData {
                        android.companion.ContinuityDeviceConnected.CURRENT_FOREGROUND_TASK_ID
                    );

                    hasReadForegroundTaskId = true;
                    break;

                case (int) android.companion.ContinuityDeviceConnected.REMOTE_TASKS:
@@ -64,11 +61,6 @@ public class ContinuityDeviceConnected implements TaskContinuityMessageData {
            }
        }

        if (!hasReadForegroundTaskId) {
            throw new ProtoParseException(
                "Missing required field: current_foreground_task_id");
        }

        mRemoteTasks = remoteTasks;
    }

+1 −2
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.server.companion.datatransfer.continuity.messages;
import android.app.TaskInfo;
import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoParseException;

import java.io.IOException;

@@ -37,7 +36,7 @@ public class RemoteTaskInfo {
    }

    public RemoteTaskInfo(ProtoInputStream protoInputStream)
        throws IOException, ProtoParseException {
        throws IOException {

        while (protoInputStream.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
            switch (protoInputStream.getFieldNumber()) {
+1 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.server.companion.datatransfer.continuity.messages;

import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoParseException;

import java.io.IOException;

@@ -34,8 +33,7 @@ public final class TaskContinuityMessage {
        mData = builder.mData;
    }

    public TaskContinuityMessage(byte[] data)
        throws IOException, ProtoParseException {
    public TaskContinuityMessage(byte[] data) throws IOException {

        ProtoInputStream pis = new ProtoInputStream(data);
        while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
+8 −11
Original line number Diff line number Diff line
@@ -78,18 +78,15 @@ public class ContinuityDeviceConnectedTest {
    }

    @Test
    public void testConstructor_fromProto_missingCurrentForegroundTaskId_throwsException(){
        final ProtoOutputStream pos = new ProtoOutputStream();
        pos.flush();

        final ProtoInputStream pis = new ProtoInputStream(pos.getBytes());
        ProtoParseException e = expectThrows(
            ProtoParseException.class,
            () -> new ContinuityDeviceConnected(pis));
    public void testConstructor_fromProto_setsToDefaultIfNoFieldsSet() throws Exception {
        final ProtoInputStream pis = new ProtoInputStream(new byte[0]);
        final ContinuityDeviceConnected continuityDeviceConnected
            = new ContinuityDeviceConnected(pis);

        assertThat(e)
            .hasMessageThat()
            .isEqualTo("Missing required field: current_foreground_task_id");
        assertThat(continuityDeviceConnected.getCurrentForegroundTaskId())
            .isEqualTo(0);
        assertThat(continuityDeviceConnected.getRemoteTasks())
            .isEmpty();
    }

    @Test