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

Commit d6103f03 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Support virtual sensor additional info

Higher level API compared to the sensors HAL

Fix: 393517834
Test: CTS
Flag: android.companion.virtualdevice.flags.virtual_sensor_additional_info
Change-Id: Ib59871d6f8e4e63d15ddf507c202b543e236d970
parent 0d1e5461
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -3642,11 +3642,26 @@ package android.companion.virtual.sensor {
    method public int getDeviceId();
    method @NonNull public String getName();
    method public int getType();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_sensor_additional_info") public void sendAdditionalInfo(@NonNull android.companion.virtual.sensor.VirtualSensorAdditionalInfo);
    method public void sendEvent(@NonNull android.companion.virtual.sensor.VirtualSensorEvent);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.sensor.VirtualSensor> CREATOR;
  }
  @FlaggedApi("android.companion.virtualdevice.flags.virtual_sensor_additional_info") public final class VirtualSensorAdditionalInfo implements android.os.Parcelable {
    method public int describeContents();
    method public int getType();
    method @NonNull public java.util.List<float[]> getValues();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.sensor.VirtualSensorAdditionalInfo> CREATOR;
  }
  public static final class VirtualSensorAdditionalInfo.Builder {
    ctor public VirtualSensorAdditionalInfo.Builder(int);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorAdditionalInfo.Builder addValues(@NonNull float[]);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorAdditionalInfo build();
  }
  public interface VirtualSensorCallback {
    method public void onConfigurationChanged(@NonNull android.companion.virtual.sensor.VirtualSensor, boolean, @NonNull java.time.Duration, @NonNull java.time.Duration);
  }
@@ -3664,6 +3679,7 @@ package android.companion.virtual.sensor {
    method public float getResolution();
    method public int getType();
    method @Nullable public String getVendor();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_sensor_additional_info") public boolean isAdditionalInfoSupported();
    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") public boolean isWakeUpSensor();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.sensor.VirtualSensorConfig> CREATOR;
@@ -3672,6 +3688,7 @@ package android.companion.virtual.sensor {
  public static final class VirtualSensorConfig.Builder {
    ctor public VirtualSensorConfig.Builder(@IntRange(from=1) int, @NonNull String);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig build();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_sensor_additional_info") @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setAdditionalInfoSupported(boolean);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setDirectChannelTypesSupported(int);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setHighestDirectReportRateLevel(int);
    method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMaxDelay(int);
+6 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.companion.virtual.IVirtualDeviceSoundEffectListener;
import android.companion.virtual.audio.IAudioConfigChangedCallback;
import android.companion.virtual.audio.IAudioRoutingCallback;
import android.companion.virtual.sensor.VirtualSensor;
import android.companion.virtual.sensor.VirtualSensorAdditionalInfo;
import android.companion.virtual.sensor.VirtualSensorConfig;
import android.companion.virtual.sensor.VirtualSensorEvent;
import android.companion.virtual.camera.VirtualCameraConfig;
@@ -250,6 +251,11 @@ interface IVirtualDevice {
     */
    boolean sendSensorEvent(IBinder token, in VirtualSensorEvent event);

    /**
     * Sends additional information about the virtual sensor corresponding to the given token.
     */
    boolean sendSensorAdditionalInfo(IBinder token, in VirtualSensorAdditionalInfo info);

    /**
     * Launches a pending intent on the given display that is owned by this virtual device.
     */
+8 −0
Original line number Diff line number Diff line
@@ -158,3 +158,11 @@ flag {
    bug: "370720522"
    is_exported: true
}

flag {
    name: "virtual_sensor_additional_info"
    namespace: "virtual_devices"
    description: "API for injecting SensorAdditionalInfo for VirtualSensor"
    bug: "393517834"
    is_exported: true
}
+46 −1
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package android.companion.virtual.sensor;

import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.companion.virtual.IVirtualDevice;
import android.companion.virtualdevice.flags.Flags;
import android.hardware.Sensor;
import android.hardware.SensorAdditionalInfo;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -37,20 +40,33 @@ import android.os.RemoteException;
 */
@SystemApi
public final class VirtualSensor implements Parcelable {

    private final int mHandle;
    private final int mType;
    private final String mName;
    private final int mFlags;
    private final IVirtualDevice mVirtualDevice;
    private final IBinder mToken;
    // Only one additional info frame set at a time.
    private final Object mAdditionalInfoLock = new Object();

    /**
     * @hide
     */
    public VirtualSensor(int handle, int type, String name, IVirtualDevice virtualDevice,
            IBinder token) {
        this(handle, type, name, /*flags=*/0, virtualDevice, token);
    }

    /**
     * @hide
     */
    public VirtualSensor(int handle, int type, String name, int flags, IVirtualDevice virtualDevice,
            IBinder token) {
        mHandle = handle;
        mType = type;
        mName = name;
        mFlags = flags;
        mVirtualDevice = virtualDevice;
        mToken = token;
    }
@@ -61,13 +77,14 @@ public final class VirtualSensor implements Parcelable {
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    public VirtualSensor(int handle, int type, @NonNull String name) {
        this(handle, type, name, /*virtualDevice=*/null, /*token=*/null);
        this(handle, type, name, /*flags=*/0, /*virtualDevice=*/null, /*token=*/null);
    }

    private VirtualSensor(Parcel parcel) {
        mHandle = parcel.readInt();
        mType = parcel.readInt();
        mName = parcel.readString8();
        mFlags = parcel.readInt();
        mVirtualDevice = IVirtualDevice.Stub.asInterface(parcel.readStrongBinder());
        mToken = parcel.readStrongBinder();
    }
@@ -123,6 +140,7 @@ public final class VirtualSensor implements Parcelable {
        parcel.writeInt(mHandle);
        parcel.writeInt(mType);
        parcel.writeString8(mName);
        parcel.writeInt(mFlags);
        parcel.writeStrongBinder(mVirtualDevice.asBinder());
        parcel.writeStrongBinder(mToken);
    }
@@ -143,6 +161,33 @@ public final class VirtualSensor implements Parcelable {
        }
    }

    /**
     * Send additional information about the sensor to the system.
     *
     * @param info the additional sensor information to send.
     * @throws UnsupportedOperationException if the sensor does not support sending additional info.
     * @see Sensor#isAdditionalInfoSupported()
     * @see VirtualSensorConfig.Builder#setAdditionalInfoSupported(boolean)
     * @see SensorAdditionalInfo
     * @see VirtualSensorAdditionalInfo
     */
    @FlaggedApi(Flags.FLAG_VIRTUAL_SENSOR_ADDITIONAL_INFO)
    public void sendAdditionalInfo(@NonNull VirtualSensorAdditionalInfo info) {
        if (!Flags.virtualSensorAdditionalInfo()) {
            return;
        }
        if ((mFlags & VirtualSensorConfig.ADDITIONAL_INFO_MASK) == 0) {
            throw new UnsupportedOperationException("Sensor additional info not supported.");
        }
        try {
            synchronized (mAdditionalInfoLock) {
                mVirtualDevice.sendSensorAdditionalInfo(mToken, info);
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @NonNull
    public static final Parcelable.Creator<VirtualSensor> CREATOR =
            new Parcelable.Creator<VirtualSensor>() {
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.companion.virtual.sensor;

parcelable VirtualSensorAdditionalInfo;
 No newline at end of file
Loading