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

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

Merge changes I73d51aa1,I7060541a into main

* changes:
  [Handoff][5/N] Notify Listeners of Initial Task State on First Registration
  [Handoff][4/N] Add "Internal Error" code for Handoff.
parents 55323b0b 78eef5a3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3490,12 +3490,12 @@ package android.companion.datatransfer.continuity {
  }
  @FlaggedApi("android.companion.enable_task_continuity") public class TaskContinuityManager {
    method @NonNull public java.util.List<android.companion.datatransfer.continuity.RemoteTask> getRemoteTasks();
    method public void registerRemoteTaskListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.datatransfer.continuity.TaskContinuityManager.RemoteTaskListener);
    method public void requestHandoff(int, int, @NonNull java.util.concurrent.Executor, @NonNull android.companion.datatransfer.continuity.TaskContinuityManager.HandoffRequestCallback);
    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
+1 −2
Original line number Diff line number Diff line
@@ -24,9 +24,8 @@ import android.companion.datatransfer.continuity.RemoteTask;
 * Interface for communication with the task continuity service.
 * {@hide}
 */
interface ITaskContinuityManager {
oneway interface ITaskContinuityManager {

    List<RemoteTask> getRemoteTasks();
    void registerRemoteTaskListener(IRemoteTaskListener listener);
    void unregisterRemoteTaskListener(IRemoteTaskListener listener);
    void requestHandoff(
+16 −14
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,
@@ -143,20 +149,6 @@ public class TaskContinuityManager {
            @HandoffRequestResultCode int resultCode);
    }

    /**
     * Returns a list of tasks currently running on the remote devices owned by the user.
     */
    @NonNull
    public List<RemoteTask> getRemoteTasks() {
        // TODO: joeantonetti - Optimize this call by caching the most recent state pushed to
        // mListenerHolder.
        try {
            return mService.getRemoteTasks();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Registers a listener to be notified when the list of remote tasks changes.
     *
@@ -258,6 +250,9 @@ public class TaskContinuityManager {
        @GuardedBy("mListeners")
        private boolean mRegistered = false;

        @GuardedBy("mListeners")
        private final List<RemoteTask> mLastReceivedRemoteTasks = new ArrayList<>();

        public RemoteTaskListenerHolder(ITaskContinuityManager service) {}

        /**
@@ -277,6 +272,10 @@ public class TaskContinuityManager {
                if (!mRegistered) {
                    mService.registerRemoteTaskListener(this);
                    mRegistered = true;
                } else {
                    executor.execute(() ->
                        listener.onRemoteTasksChanged(mLastReceivedRemoteTasks)
                    );
                }

                mListeners.put(listener, executor);
@@ -305,6 +304,9 @@ public class TaskContinuityManager {
        @Override
        public void onRemoteTasksChanged(List<RemoteTask> remoteTasks) throws RemoteException {
            synchronized(mListeners) {
                mLastReceivedRemoteTasks.clear();
                mLastReceivedRemoteTasks.addAll(remoteTasks);

                for (Map.Entry<RemoteTaskListener, Executor> entry : mListeners.entrySet()) {
                    RemoteTaskListener listener = entry.getKey();
                    Executor executor = entry.getValue();
+0 −5
Original line number Diff line number Diff line
@@ -85,11 +85,6 @@ public final class TaskContinuityManagerService
    }

    private final class TaskContinuityManagerServiceImpl extends ITaskContinuityManager.Stub {
        @Override
        public List<RemoteTask> getRemoteTasks() {
            return mRemoteTaskStore.getMostRecentTasks();
        }

        @Override
        public void registerRemoteTaskListener(@NonNull IRemoteTaskListener listener) {
            mRemoteTaskStore.addListener(listener);
+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(
Loading