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

Commit 193643cb authored by Utkarsh Nigam's avatar Utkarsh Nigam
Browse files

Update Sidecar Library with CancellationSignal.

Change-Id: I9df773bc51228eb52578a05e219f183863cae753
Flag: android.app.appfunctions.flags.enable_app_function_manager
Test: atest CtsAppFunctionTestCases
Bug: 360864791
parent 6fb90496
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -3,13 +3,15 @@ package com.google.android.appfunctions.sidecar {

  public final class AppFunctionManager {
    ctor public AppFunctionManager(android.content.Context);
    method public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    method public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    method @Deprecated public void executeAppFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
  }

  public abstract class AppFunctionService extends android.app.Service {
    ctor public AppFunctionService();
    method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
    method @MainThread public abstract void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    method @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    method @Deprecated @MainThread public abstract void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    field @NonNull public static final String BIND_APP_FUNCTION_SERVICE = "android.permission.BIND_APP_FUNCTION_SERVICE";
    field @NonNull public static final String SERVICE_INTERFACE = "android.app.appfunctions.AppFunctionService";
  }
+37 −5
Original line number Diff line number Diff line
@@ -19,12 +19,12 @@ package com.google.android.appfunctions.sidecar;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.content.Context;
import android.os.CancellationSignal;

import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.function.Consumer;


/**
 * Provides app functions related functionalities.
 *
@@ -66,6 +66,7 @@ public final class AppFunctionManager {
    public void executeAppFunction(
            @NonNull ExecuteAppFunctionRequest sidecarRequest,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
        Objects.requireNonNull(sidecarRequest);
        Objects.requireNonNull(executor);
@@ -74,9 +75,40 @@ public final class AppFunctionManager {
        android.app.appfunctions.ExecuteAppFunctionRequest platformRequest =
                SidecarConverter.getPlatformExecuteAppFunctionRequest(sidecarRequest);
        mManager.executeAppFunction(
                platformRequest, executor, (platformResponse) -> {
                    callback.accept(SidecarConverter.getSidecarExecuteAppFunctionResponse(
                platformRequest,
                executor,
                cancellationSignal,
                (platformResponse) -> {
                    callback.accept(
                            SidecarConverter.getSidecarExecuteAppFunctionResponse(
                                    platformResponse));
                });
    }

    /**
     * Executes the app function.
     *
     * <p>Proxies request and response to the underlying {@link
     * android.app.appfunctions.AppFunctionManager#executeAppFunction}, converting the request and
     * response in the appropriate type required by the function.
     *
     * @deprecated Use {@link #executeAppFunction(ExecuteAppFunctionRequest, Executor,
     *     CancellationSignal, Consumer)} instead. This method will be removed once usage references
     *     are updated.
     */
    @Deprecated
    public void executeAppFunction(
            @NonNull ExecuteAppFunctionRequest sidecarRequest,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
        Objects.requireNonNull(sidecarRequest);
        Objects.requireNonNull(executor);
        Objects.requireNonNull(callback);

        executeAppFunction(
                sidecarRequest,
                executor,
                new CancellationSignal(),
                callback);
    }
}
+36 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.CancellationSignal;

import java.util.function.Consumer;

@@ -69,10 +70,11 @@ public abstract class AppFunctionService extends Service {
    private final Binder mBinder =
            android.app.appfunctions.AppFunctionService.createBinder(
                    /* context= */ this,
                    /* onExecuteFunction= */ (platformRequest, callback) -> {
                    /* onExecuteFunction= */ (platformRequest, cancellationSignal, callback) -> {
                        AppFunctionService.this.onExecuteFunction(
                                SidecarConverter.getSidecarExecuteAppFunctionRequest(
                                        platformRequest),
                                cancellationSignal,
                                (sidecarResponse) -> {
                                    callback.accept(
                                            SidecarConverter.getPlatformExecuteAppFunctionResponse(
@@ -105,9 +107,42 @@ public abstract class AppFunctionService extends Service {
     * result using the callback, no matter if the execution was successful or not.
     *
     * @param request The function execution request.
     * @param cancellationSignal A {@link CancellationSignal} to cancel the request.
     * @param callback A callback to report back the result.
     */
    @MainThread
    public void onExecuteFunction(
            @NonNull ExecuteAppFunctionRequest request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
        onExecuteFunction(request, callback);
    }

    /**
     * Called by the system to execute a specific app function.
     *
     * <p>This method is triggered when the system requests your AppFunctionService to handle a
     * particular function you have registered and made available.
     *
     * <p>To ensure proper routing of function requests, assign a unique identifier to each
     * function. This identifier doesn't need to be globally unique, but it must be unique within
     * your app. For example, a function to order food could be identified as "orderFood". In most
     * cases this identifier should come from the ID automatically generated by the AppFunctions
     * SDK. You can determine the specific function to invoke by calling {@link
     * ExecuteAppFunctionRequest#getFunctionIdentifier()}.
     *
     * <p>This method is always triggered in the main thread. You should run heavy tasks on a worker
     * thread and dispatch the result with the given callback. You should always report back the
     * result using the callback, no matter if the execution was successful or not.
     *
     * @param request The function execution request.
     * @param callback A callback to report back the result.
     *
     * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, CancellationSignal,
     *     Consumer)} instead. This method will be removed once usage references are updated.
     */
    @MainThread
    @Deprecated
    public abstract void onExecuteFunction(
            @NonNull ExecuteAppFunctionRequest request,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback);