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

Commit d24ae599 authored by Utkarsh Nigam's avatar Utkarsh Nigam
Browse files

Add calling package onExecuteAppFunction

Flag: android.app.appfunctions.flags.enable_app_function_manager
Test: cts
Bug: 357551503
Change-Id: I54440175a5c327d0af4b3605904064c080dd76ff
parent 66c96334
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -8788,7 +8788,8 @@ package android.app.appfunctions {
    ctor public AppFunctionService();
    method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
    method @Deprecated @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
    method @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
    method @Deprecated @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
    method @MainThread public void onExecuteFunction(@NonNull android.app.appfunctions.ExecuteAppFunctionRequest, @NonNull String, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<android.app.appfunctions.ExecuteAppFunctionResponse>);
    field @NonNull public static final String SERVICE_INTERFACE = "android.app.appfunctions.AppFunctionService";
  }
+45 −9
Original line number Diff line number Diff line
@@ -29,11 +29,9 @@ import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.IBinder;
import android.os.ICancellationSignal;
import android.os.CancellationSignal;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.util.Log;

@@ -80,6 +78,7 @@ public abstract class AppFunctionService extends Service {
         */
        void perform(
                @NonNull ExecuteAppFunctionRequest request,
                @NonNull String callingPackage,
                @NonNull CancellationSignal cancellationSignal,
                @NonNull Consumer<ExecuteAppFunctionResponse> callback);
    }
@@ -92,6 +91,7 @@ public abstract class AppFunctionService extends Service {
            @Override
            public void executeAppFunction(
                    @NonNull ExecuteAppFunctionRequest request,
                    @NonNull String callingPackage,
                    @NonNull ICancellationCallback cancellationCallback,
                    @NonNull IExecuteAppFunctionCallback callback) {
                if (context.checkCallingPermission(BIND_APP_FUNCTION_SERVICE)
@@ -103,6 +103,7 @@ public abstract class AppFunctionService extends Service {
                try {
                    onExecuteFunction.perform(
                            request,
                            callingPackage,
                            buildCancellationSignal(cancellationCallback),
                            safeCallback::onResult);
                } catch (Exception ex) {
@@ -131,9 +132,8 @@ public abstract class AppFunctionService extends Service {
        return cancellationSignal;
    }

    private final Binder mBinder = createBinder(
            AppFunctionService.this,
            AppFunctionService.this::onExecuteFunction);
    private final Binder mBinder =
            createBinder(AppFunctionService.this, AppFunctionService.this::onExecuteFunction);

    @NonNull
    @Override
@@ -141,7 +141,6 @@ public abstract class AppFunctionService extends Service {
        return mBinder;
    }


    /**
     * Called by the system to execute a specific app function.
     *
@@ -161,7 +160,6 @@ public abstract class AppFunctionService extends Service {
     *
     * @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.
     */
@@ -198,12 +196,50 @@ public abstract class AppFunctionService extends Service {
     * @param request The function execution request.
     * @param cancellationSignal A signal to cancel the execution.
     * @param callback A callback to report back the result.
     * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, String,
     *     CancellationSignal, Consumer)} instead. This method will be removed once usage references
     *     are updated.
     */
    @MainThread
    @Deprecated
    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.
     *
     * <p>This method also accepts a {@link CancellationSignal} that the app should listen to cancel
     * the execution of function if requested by the system.
     *
     * @param request The function execution request.
     * @param callingPackage The package name of the app that is requesting the execution.
     * @param cancellationSignal A signal to cancel the execution.
     * @param callback A callback to report back the result.
     */
    @MainThread
    public void onExecuteFunction(
            @NonNull ExecuteAppFunctionRequest request,
            @NonNull String callingPackage,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
        onExecuteFunction(request, cancellationSignal, callback);
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -34,11 +34,13 @@ oneway interface IAppFunctionService {
     * Called by the system to execute a specific app function.
     *
     * @param request  the function execution request.
     * @param callingPackage The package name of the app that is requesting the execution.
     * @param cancellationCallback a callback to send back the cancellation transport.
     * @param callback a callback to report back the result.
     */
    void executeAppFunction(
        in ExecuteAppFunctionRequest request,
        in String callingPackage,
        in ICancellationCallback cancellationCallback,
        in IExecuteAppFunctionCallback callback
    );
+2 −1
Original line number Diff line number Diff line
@@ -15,7 +15,8 @@ package com.google.android.appfunctions.sidecar {
  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 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 @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull String, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>);
    method @Deprecated @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 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";
+45 −5
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.CancellationSignal;
import android.os.IBinder;
import android.util.Log;

import java.util.function.Consumer;
@@ -71,18 +71,21 @@ public abstract class AppFunctionService extends Service {
    private final Binder mBinder =
            android.app.appfunctions.AppFunctionService.createBinder(
                    /* context= */ this,
                    /* onExecuteFunction= */ (platformRequest, cancellationSignal, callback) -> {
                    /* onExecuteFunction= */ (platformRequest,
                            callingPackage,
                            cancellationSignal,
                            callback) -> {
                        AppFunctionService.this.onExecuteFunction(
                                SidecarConverter.getSidecarExecuteAppFunctionRequest(
                                        platformRequest),
                                callingPackage,
                                cancellationSignal,
                                (sidecarResponse) -> {
                                    callback.accept(
                                            SidecarConverter.getPlatformExecuteAppFunctionResponse(
                                                    sidecarResponse));
                                });
                    }
            );
                    });

    @NonNull
    @Override
@@ -90,6 +93,40 @@ public abstract class AppFunctionService extends Service {
        return mBinder;
    }

    /**
     * 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.
     *
     * <p>This method also accepts a {@link CancellationSignal} that the app should listen to cancel
     * the execution of function if requested by the system.
     *
     * @param request The function execution request.
     * @param callingPackage The package name of the app that is requesting the execution.
     * @param cancellationSignal A signal to cancel the execution.
     * @param callback A callback to report back the result.
     */
    @MainThread
    public void onExecuteFunction(
            @NonNull ExecuteAppFunctionRequest request,
            @NonNull String callingPackage,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Consumer<ExecuteAppFunctionResponse> callback) {
        onExecuteFunction(request, cancellationSignal, callback);
    }

    /**
     * Called by the system to execute a specific app function.
     *
@@ -110,8 +147,12 @@ public abstract class AppFunctionService extends Service {
     * @param request The function execution request.
     * @param cancellationSignal A {@link CancellationSignal} to cancel the request.
     * @param callback A callback to report back the result.
     * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, String,
     *     CancellationSignal, Consumer)} instead. This method will be removed once usage references
     *     are updated.
     */
    @MainThread
    @Deprecated
    public void onExecuteFunction(
            @NonNull ExecuteAppFunctionRequest request,
            @NonNull CancellationSignal cancellationSignal,
@@ -138,7 +179,6 @@ public abstract class AppFunctionService extends Service {
     *
     * @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.
     */
Loading