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

Commit 9e738ef9 authored by Tom Chan's avatar Tom Chan
Browse files

Add API to provide read-only file descriptor to WearableSensingService

WearableSensingService#onDataStreamProvided will be deprecated in a
separate change

Test: atest CtsWearableSensingServiceTestCases
Bug: 358130861
Flag: android.app.wearable.enable_provide_read_only_pfd
Change-Id: I2079e1e275d47fbc3bc1e882fd93ee2d9cdcf8a6
parent b50e7b7a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3385,6 +3385,7 @@ package android.app.wearable {
    method @FlaggedApi("android.app.wearable.enable_concurrent_wearable_connections") @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void provideConnection(@NonNull android.app.wearable.WearableConnection, @NonNull java.util.concurrent.Executor);
    method @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void provideData(@NonNull android.os.PersistableBundle, @Nullable android.os.SharedMemory, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void provideDataStream(@NonNull android.os.ParcelFileDescriptor, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @FlaggedApi("android.app.wearable.enable_provide_read_only_pfd") @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void provideReadOnlyParcelFileDescriptor(@NonNull android.os.ParcelFileDescriptor, @NonNull android.os.PersistableBundle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void registerDataRequestObserver(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @FlaggedApi("android.app.wearable.enable_concurrent_wearable_connections") @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public void removeAllConnections();
    method @FlaggedApi("android.app.wearable.enable_concurrent_wearable_connections") @RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE) public boolean removeConnection(@NonNull android.app.wearable.WearableConnection);
@@ -14050,6 +14051,7 @@ package android.service.wearable {
    method @BinderThread public void onDataRequestObserverUnregistered(int, @NonNull String, @NonNull android.service.wearable.WearableSensingDataRequester, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @BinderThread public abstract void onDataStreamProvided(@NonNull android.os.ParcelFileDescriptor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @BinderThread public abstract void onQueryServiceStatus(@NonNull java.util.Set<java.lang.Integer>, @NonNull String, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionServiceStatus>);
    method @FlaggedApi("android.app.wearable.enable_provide_read_only_pfd") @BinderThread public void onReadOnlyParcelFileDescriptorProvided(@NonNull android.os.ParcelFileDescriptor, @NonNull android.os.PersistableBundle, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @BinderThread public void onSecureConnectionProvided(@NonNull android.os.ParcelFileDescriptor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @FlaggedApi("android.app.wearable.enable_concurrent_wearable_connections") @BinderThread public void onSecureConnectionProvided(@NonNull android.os.ParcelFileDescriptor, @NonNull android.os.PersistableBundle, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @BinderThread public abstract void onStartDetection(@NonNull android.app.ambientcontext.AmbientContextEventRequest, @NonNull String, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionServiceStatus>, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionResult>);
+2 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ interface IWearableSensingManager {
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
     void removeAllConnections();
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
     void provideReadOnlyParcelFileDescriptor(in ParcelFileDescriptor parcelFileDescriptor, in PersistableBundle metadata, in RemoteCallback statusCallback);
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
     void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in @nullable IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
     void provideData(in PersistableBundle data, in SharedMemory sharedMemory, in RemoteCallback callback);
+29 −0
Original line number Diff line number Diff line
@@ -425,6 +425,35 @@ public class WearableSensingManager {
        }
    }

    /**
     * Provides a read-only {@link ParcelFileDescriptor} to the WearableSensingService.
     *
     * <p>This is used by the application that will also provide an implementation of the isolated
     * WearableSensingService. If the {@link ParcelFileDescriptor} was provided successfully, {@link
     * WearableSensingManager#STATUS_SUCCESS} will be sent to the {@code statusConsumer}.
     *
     * @param parcelFileDescriptor The read-only {@link ParcelFileDescriptor} to provide
     * @param metadata Metadata used to identify the {@code parcelFileDescriptor}
     * @param executor Executor on which to run the {@code statusConsumer}
     * @param statusConsumer A consumer that handles the status codes
     * @throws IllegalArgumentException when the {@code parcelFileDescriptor} is not read-only
     */
    @RequiresPermission(Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)
    @FlaggedApi(Flags.FLAG_ENABLE_PROVIDE_READ_ONLY_PFD)
    public void provideReadOnlyParcelFileDescriptor(
            @NonNull ParcelFileDescriptor parcelFileDescriptor,
            @NonNull PersistableBundle metadata,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull @StatusCode Consumer<Integer> statusConsumer) {
        RemoteCallback statusCallback = createStatusCallback(executor, statusConsumer);
        try {
            mService.provideReadOnlyParcelFileDescriptor(
                    parcelFileDescriptor, metadata, statusCallback);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Provides a data stream to the WearableSensingService that's backed by the
     * parcelFileDescriptor, and sends the result to the {@link Consumer} right after the call. This
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.os.SharedMemory;
oneway interface IWearableSensingService {
    void provideSecureConnection(in ParcelFileDescriptor parcelFileDescriptor, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
    void provideConcurrentSecureConnection(in ParcelFileDescriptor parcelFileDescriptor, in PersistableBundle metadata, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
    void provideReadOnlyParcelFileDescriptor(in ParcelFileDescriptor parcelFileDescriptor, in PersistableBundle metadata, in RemoteCallback statusCallback);
    void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
    void provideData(in PersistableBundle data, in SharedMemory sharedMemory, in RemoteCallback callback);
    void registerDataRequestObserver(int dataType, in RemoteCallback dataRequestCallback, int dataRequestObserverId, in String packageName, in RemoteCallback statusCallback);
+35 −0
Original line number Diff line number Diff line
@@ -159,6 +159,18 @@ public abstract class WearableSensingService extends Service {
                            secureWearableConnection, metadata, consumer);
                }

                /** {@inheritDoc} */
                @Override
                public void provideReadOnlyParcelFileDescriptor(
                        ParcelFileDescriptor parcelFileDescriptor,
                        PersistableBundle metadata,
                        RemoteCallback callback) {
                    Objects.requireNonNull(parcelFileDescriptor);
                    Consumer<Integer> consumer = createWearableStatusConsumer(callback);
                    WearableSensingService.this.onReadOnlyParcelFileDescriptorProvided(
                            parcelFileDescriptor, metadata, consumer);
                }

                /** {@inheritDoc} */
                @Override
                public void provideDataStream(
@@ -393,6 +405,29 @@ public abstract class WearableSensingService extends Service {
        statusConsumer.accept(WearableSensingManager.STATUS_UNSUPPORTED_OPERATION);
    }

    /**
     * Called when a read-only {@link ParcelFileDescriptor} is provided.
     *
     * <p>It is up to the implementation to close the {@link ParcelFileDescriptor} when it is
     * finished.
     *
     * <p>The implementation should return one of the status code defined in the {@link
     * WearableSensingManager} via the {@code statusConsumer}.
     *
     * @param parcelFileDescriptor The provided read-only {@link ParcelFileDescriptor}
     * @param metadata The metadata provided along with the {@code parcelFileDescriptor}
     * @param statusConsumer the consumer for the status code
     */
    @FlaggedApi(Flags.FLAG_ENABLE_PROVIDE_READ_ONLY_PFD)
    @BinderThread
    public void onReadOnlyParcelFileDescriptorProvided(
            @NonNull ParcelFileDescriptor parcelFileDescriptor,
            @NonNull PersistableBundle metadata,
            @NonNull Consumer<Integer> statusConsumer) {
        // placeholder implementation
        statusConsumer.accept(WearableSensingManager.STATUS_UNSUPPORTED_OPERATION);
    }

    /**
     * Called when a data stream to the wearable is provided. This data stream can be used to obtain
     * data from a wearable device. It is up to the implementation to maintain the data stream and
Loading