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

Commit 5ccea396 authored by Joe Antonetti's avatar Joe Antonetti
Browse files

Return Available Tasks via Binder

Update TaskContinuityManager to use RemoteTaskStore to provide data to clients.

Flag: android.companion.enable_task_continuity
Test: Added unit tests
Bug: 400970610
Change-Id: Ie6bab5c8fea9a450ee263770975e4bb14cb39a23
parent b2b56af1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ public final class TaskContinuityManagerService extends SystemService {
    private final class TaskContinuityManagerServiceImpl extends ITaskContinuityManager.Stub {
        @Override
        public List<RemoteTask> getRemoteTasks() {
            return new ArrayList<>();
            return mRemoteTaskStore.getMostRecentTasks();
        }

        @Override
+9 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.companion.datatransfer.continuity.messages;

import android.app.TaskInfo;
import android.companion.datatransfer.continuity.RemoteTask;
import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;

@@ -95,4 +96,12 @@ public class RemoteTaskInfo {
        protoOutputStream
            .writeBytes(android.companion.RemoteTaskInfo.TASK_ICON, mTaskIcon);
    }

    public RemoteTask toRemoteTask(int id, String deviceName) {
        return new RemoteTask.Builder(id)
                .setLabel(mLabel)
                .setLastUsedTimestampMillis((int) mLastUsedTimeMillis)
                .setSourceDeviceName(deviceName)
                .build();
    }
}
 No newline at end of file
+5 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

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

import android.companion.datatransfer.continuity.RemoteTask;

import com.android.server.companion.datatransfer.continuity.messages.RemoteTaskInfo;

import java.util.ArrayList;
@@ -71,7 +73,7 @@ class RemoteDeviceTaskList {
     * Gets the most recently used task on this device, or null if there are no
     * tasks.
     */
    RemoteTaskInfo getMostRecentTask() {
    RemoteTask getMostRecentTask() {
        if (mTasks.isEmpty()) {
            return null;
        }
@@ -85,6 +87,7 @@ class RemoteDeviceTaskList {
                mostRecentTask = task;
            }
        }
        return mostRecentTask;

        return mostRecentTask.toRemoteTask(mAssociationId, mDeviceName);
    }
}
 No newline at end of file
+5 −3
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.util.Slog;
import com.android.server.companion.datatransfer.continuity.connectivity.ConnectedAssociationStore;
import com.android.server.companion.datatransfer.continuity.messages.RemoteTaskInfo;

import android.companion.datatransfer.continuity.RemoteTask;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -70,11 +72,11 @@ public class RemoteTaskStore implements ConnectedAssociationStore.Observer {
     * @return A list of the most recent tasks from all devices in the task
     * store.
     */
    public List<RemoteTaskInfo> getMostRecentTasks() {
    public List<RemoteTask> getMostRecentTasks() {
        synchronized (mRemoteDeviceTaskLists) {
            List<RemoteTaskInfo> mostRecentTasks = new ArrayList<>();
            List<RemoteTask> mostRecentTasks = new ArrayList<>();
            for (RemoteDeviceTaskList taskList : mRemoteDeviceTaskLists.values()) {
                RemoteTaskInfo mostRecentTask = taskList.getMostRecentTask();
                RemoteTask mostRecentTask = taskList.getMostRecentTask();
                if (mostRecentTask != null) {
                    mostRecentTasks.add(mostRecentTask);
                }
+29 −35
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.testing.AndroidTestingRunner;
import com.android.server.companion.datatransfer.continuity.messages.RemoteTaskInfo;

import org.junit.Test;
import org.junit.Before;
import org.junit.runner.RunWith;

import java.util.Arrays;
@@ -36,86 +37,79 @@ import java.util.List;
@RunWith(AndroidTestingRunner.class)
public class RemoteDeviceTaskListTest {

    private static final int ASSOCIATION_ID = 123;
    private static final String DEVICE_NAME = "device1";

    private RemoteDeviceTaskList taskList;

    @Before
    public void setUp() {
        taskList = new RemoteDeviceTaskList(ASSOCIATION_ID, DEVICE_NAME);
    }

    @Test
    public void testConstructor_initializesCorrectly() {
        int associationId = 123;
        String deviceName = "device1";
        RemoteDeviceTaskList taskList = new RemoteDeviceTaskList(
            associationId,
            deviceName);

        assertThat(taskList.getMostRecentTask()).isNull();
        assertThat(taskList.getAssociationId()).isEqualTo(associationId);
        assertThat(taskList.getDeviceName()).isEqualTo(deviceName);
        assertThat(taskList.getAssociationId()).isEqualTo(ASSOCIATION_ID);
        assertThat(taskList.getDeviceName()).isEqualTo(DEVICE_NAME);
    }

    @Test
    public void testAddTask_updatesMostRecentTask() {
        RemoteDeviceTaskList taskList = new RemoteDeviceTaskList(
            0,
            "device name");

        RemoteTaskInfo firstAddedTask = createNewRemoteTaskInfo(2, "task2", 200);

        taskList.addTask(firstAddedTask);

        assertThat(taskList.getMostRecentTask()).isEqualTo(firstAddedTask);
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(firstAddedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));

        // Add another task with an older timestamp, verify it doesn't update
        // the most recent task.
        RemoteTaskInfo secondAddedTask = createNewRemoteTaskInfo(1, "task1", 100);
        taskList.addTask(secondAddedTask);
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(firstAddedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(firstAddedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));

        // Add another task with a newer timestamp, verifying it changes the
        // most recently used task.
        RemoteTaskInfo thirdAddedTask = createNewRemoteTaskInfo(3, "task3", 300);
        taskList.addTask(thirdAddedTask);
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(thirdAddedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(thirdAddedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));
    }

    @Test
    public void testGetMostRecentTask_noTasks_returnsNull() {
        RemoteDeviceTaskList taskList = new RemoteDeviceTaskList(
            0,
            "device name");

        assertThat(taskList.getMostRecentTask()).isNull();
    }

    @Test
    public void testGetMostRecentTask_multipleTasks_returnsMostRecent() {
        RemoteTaskInfo expectedTask = createNewRemoteTaskInfo(2, "task2", 200);
        int associationId = 123;
        List<RemoteTaskInfo> initialTasks = Arrays.asList(
                createNewRemoteTaskInfo(1, "task1", 100),
                expectedTask,
                createNewRemoteTaskInfo(3, "task3", 150));

        RemoteDeviceTaskList taskList = new RemoteDeviceTaskList(
            associationId,
            "device name");

        taskList.setTasks(initialTasks);

        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(expectedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(expectedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));
    }

    @Test
    public void testSetTasks_updatesMostRecentTask() {
        RemoteDeviceTaskList taskList
            = new RemoteDeviceTaskList(0, "device name");

        // Set tasks initially, verify the most recent task is the first one.
        RemoteTaskInfo firstExpectedTask
            = createNewRemoteTaskInfo(1, "task2", 200);
        int associationId = 123;
        List<RemoteTaskInfo> initialTasks = Arrays.asList(
                createNewRemoteTaskInfo(2, "task1", 100),
                firstExpectedTask,
                createNewRemoteTaskInfo(3, "task3", 150));
        taskList.setTasks(initialTasks);
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(firstExpectedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(firstExpectedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));

        // Set the tasks to a different list, verify the most recent task is the
        // first one.
@@ -126,18 +120,17 @@ public class RemoteDeviceTaskListTest {
                createNewRemoteTaskInfo(5, "task5", 200),
                createNewRemoteTaskInfo(6, "task6", 100));
        taskList.setTasks(secondExpectedTasks);
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(secondExpectedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(secondExpectedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));
    }

    @Test
    public void testSetTasks_overwritesExistingTasks() {
        RemoteDeviceTaskList taskList
            = new RemoteDeviceTaskList(0, "device name");

        // Set the initial state of the list.
        RemoteTaskInfo firstExpectedTask = createNewRemoteTaskInfo(1, "task1", 100);
        taskList.setTasks(Arrays.asList(firstExpectedTask));
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(firstExpectedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(firstExpectedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));

        // Replace the tasks with a different list. The only task in this was used before the
        // previous task.
@@ -145,7 +138,8 @@ public class RemoteDeviceTaskListTest {
        taskList.setTasks(Arrays.asList(secondExpectedTask));

        // Because the task list is overwritten, the most recent task should be the second task.
        assertThat(taskList.getMostRecentTask().getId()).isEqualTo(secondExpectedTask.getId());
        assertThat(taskList.getMostRecentTask())
            .isEqualTo(secondExpectedTask.toRemoteTask(ASSOCIATION_ID, DEVICE_NAME));
    }

    private RemoteTaskInfo createNewRemoteTaskInfo(
Loading