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

Commit cab0e63d authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Add ComputerControl access to VirtualDeviceManager

New hidden API to create a VirtualDevice without a CDM association.
These APIs will only be used internally and can only accessed by holders
of the COMPUTER_CONTROL_ACCESS permission (internal|knownSigner).

Bug: 410570802
Flag: android.companion.virtualdevice.flags.computer_control_access
Test: manual
Change-Id: Id51395651c7163b7ca8e9d7aa6c3f7cdff556650
parent 92b95d68
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -50,6 +50,12 @@ interface IVirtualDeviceManager {
            in VirtualDeviceParams params, in IVirtualDeviceActivityListener activityListener,
            in IVirtualDeviceSoundEffectListener soundEffectListener);

    @EnforcePermission("COMPUTER_CONTROL_ACCESS")
    IVirtualDevice createLocalVirtualDevice(
            in IBinder token, in AttributionSource attributionSource,
            in VirtualDeviceParams params, in IVirtualDeviceActivityListener activityListener,
            in IVirtualDeviceSoundEffectListener soundEffectListener);

    /**
     * Returns the details of all available virtual devices.
     */
+17 −0
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_BLOCKED_
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CLIPBOARD;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS;

import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.companion.virtual.audio.VirtualAudioDevice;
@@ -199,6 +201,7 @@ public class VirtualDeviceInternal {
    @Nullable
    private VirtualAudioDevice mVirtualAudioDevice;

    @RequiresPermission(Manifest.permission.CREATE_VIRTUAL_DEVICE)
    VirtualDeviceInternal(
            IVirtualDeviceManager service,
            Context context,
@@ -214,6 +217,20 @@ public class VirtualDeviceInternal {
                mSoundEffectListener);
    }

    @RequiresPermission(Manifest.permission.COMPUTER_CONTROL_ACCESS)
    VirtualDeviceInternal(
            IVirtualDeviceManager service,
            Context context,
            VirtualDeviceParams params) throws RemoteException {
        mContext = context.getApplicationContext();
        mVirtualDevice = service.createLocalVirtualDevice(
                new Binder(),
                mContext.getAttributionSource(),
                params,
                mActivityListenerBinder,
                mSoundEffectListener);
    }

    VirtualDeviceInternal(Context context, IVirtualDevice virtualDevice) {
        mContext = context.getApplicationContext();
        mVirtualDevice = virtualDevice;
+23 −0
Original line number Diff line number Diff line
@@ -220,6 +220,20 @@ public final class VirtualDeviceManager {
        }
    }

    /**
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.COMPUTER_CONTROL_ACCESS)
    @NonNull
    public VirtualDevice createVirtualDevice(@NonNull VirtualDeviceParams params) {
        Objects.requireNonNull(params, "params must not be null");
        try {
            return new VirtualDevice(mService, mContext, params);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Returns the details of all available virtual devices.
     *
@@ -573,6 +587,15 @@ public final class VirtualDeviceManager {
                    new VirtualDeviceInternal(service, context, associationId, params);
        }

        @RequiresPermission(Manifest.permission.COMPUTER_CONTROL_ACCESS)
        private VirtualDevice(
                IVirtualDeviceManager service,
                Context context,
                VirtualDeviceParams params) throws RemoteException {
            mVirtualDeviceInternal =
                    new VirtualDeviceInternal(service, context, params);
        }

        /** @hide */
        public VirtualDevice(Context context, IVirtualDevice virtualDevice) {
            mVirtualDeviceInternal = new VirtualDeviceInternal(context, virtualDevice);
+7 −0
Original line number Diff line number Diff line
@@ -180,3 +180,10 @@ flag {
    description: "Do not duplicate frames if no input is received and the capture request is not PREVIEW"
    bug: "383779587"
}

flag {
    name: "computer_control_access"
    namespace: "virtual_devices"
    description: "Enable VDM access for computer control"
    bug: "410570802"
}
 No newline at end of file
+7 −0
Original line number Diff line number Diff line
@@ -8538,6 +8538,13 @@
    <permission android:name="android.permission.CREATE_VIRTUAL_DEVICE"
                android:protectionLevel="internal|role" />

    <!-- Allows an application access to computer control features.
     @hide -->
    <permission android:name="android.permission.COMPUTER_CONTROL_ACCESS"
        android:protectionLevel="internal|knownSigner"
        android:knownCerts="@array/config_computerControlAccessKnownSigners"
        android:featureFlag="android.companion.virtualdevice.flags.computer_control_access"/>

    <!-- @SystemApi Must be required by a safety source to send an update using the
             {@link android.safetycenter.SafetyCenterManager}.
             <p>Protection level: internal|privileged
Loading