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

Commit 4eacef22 authored by Marvin Ramin's avatar Marvin Ramin Committed by Android (Google) Code Review
Browse files

Merge "Add additional metrics to VDM usage" into main

parents 75e9f011 3edc88c0
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -29,3 +29,11 @@ flag {
     bug: "291737188"
     is_fixed_read_only: true
}

flag {
     namespace: "virtual_devices"
     name: "metrics_collection"
     description: "Enable collection of VDM-related metrics"
     bug: "324842215"
     is_fixed_read_only: true
}
+13 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.app.compat.CompatChanges;
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.content.AttributionSource;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -44,6 +45,7 @@ import android.window.DisplayWindowPolicyController;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.BlockedAppStreamingActivity;
import com.android.modules.expresslog.Counter;

import java.util.Set;

@@ -104,6 +106,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
    public static final long ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE = 201712607L;
    @NonNull
    private final AttributionSource mAttributionSource;
    @NonNull
    private final ArraySet<UserHandle> mAllowedUsers;
    @GuardedBy("mGenericWindowPolicyControllerLock")
    private boolean mActivityLaunchAllowedByDefault;
@@ -144,6 +148,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
     *
     * @param windowFlags The window flags that this controller is interested in.
     * @param systemWindowFlags The system window flags that this controller is interested in.
     * @param attributionSource The AttributionSource of the VirtualDevice owner application.
     * @param allowedUsers The set of users that are allowed to stream in this display.
     * @param activityLaunchAllowedByDefault Whether activities are default allowed to be launched
     *   or blocked.
@@ -169,6 +174,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
    public GenericWindowPolicyController(
            int windowFlags,
            int systemWindowFlags,
            AttributionSource attributionSource,
            @NonNull ArraySet<UserHandle> allowedUsers,
            boolean activityLaunchAllowedByDefault,
            @NonNull Set<ComponentName> activityPolicyExemptions,
@@ -184,6 +190,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
            boolean showTasksInHostDeviceRecents,
            @Nullable ComponentName customHomeComponent) {
        super();
        mAttributionSource = attributionSource;
        mAllowedUsers = allowedUsers;
        mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault;
        mActivityPolicyExemptions = activityPolicyExemptions;
@@ -436,6 +443,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
        if (!mIsMirrorDisplay && mActivityBlockedCallback != null) {
            mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo);
        }
        if (android.companion.virtualdevice.flags.Flags.metricsCollection()) {
            Counter.logIncrementWithUid(
                    "virtual_devices.value_activity_blocked_count",
                    mAttributionSource.getUid());
        }

    }

    private static boolean isAllowedByPolicy(boolean allowedByDefault,
+35 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.text.TextUtils.formatSimple;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.StringDef;
import android.content.AttributionSource;
import android.graphics.PointF;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.InputDeviceIdentifier;
@@ -38,6 +39,7 @@ import android.os.IBinder;
import android.os.IInputConstants;
import android.os.RemoteException;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.InputDevice;
@@ -45,6 +47,7 @@ import android.view.WindowManager;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.expresslog.Counter;
import com.android.server.LocalServices;
import com.android.server.input.InputManagerInternal;

@@ -98,11 +101,12 @@ class InputController {
    private final DisplayManagerInternal mDisplayManagerInternal;
    private final InputManagerInternal mInputManagerInternal;
    private final WindowManager mWindowManager;
    private final AttributionSource mAttributionSource;
    private final DeviceCreationThreadVerifier mThreadVerifier;

    InputController(@NonNull Handler handler,
            @NonNull WindowManager windowManager) {
        this(new NativeWrapper(), handler, windowManager,
            @NonNull WindowManager windowManager, AttributionSource attributionSource) {
        this(new NativeWrapper(), handler, windowManager, attributionSource,
                // Verify that virtual devices are not created on the handler thread.
                () -> !handler.getLooper().isCurrentThread());
    }
@@ -110,12 +114,14 @@ class InputController {
    @VisibleForTesting
    InputController(@NonNull NativeWrapper nativeWrapper,
            @NonNull Handler handler, @NonNull WindowManager windowManager,
            AttributionSource attributionSource,
            @NonNull DeviceCreationThreadVerifier threadVerifier) {
        mHandler = handler;
        mNativeWrapper = nativeWrapper;
        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
        mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
        mWindowManager = windowManager;
        mAttributionSource = attributionSource;
        mThreadVerifier = threadVerifier;
    }

@@ -838,6 +844,33 @@ class InputController {
                    new InputDeviceDescriptor(ptr, binderDeathRecipient, type, displayId, phys,
                            deviceName, inputDeviceId));
        }

        if (android.companion.virtualdevice.flags.Flags.metricsCollection()) {
            String metricId = getMetricIdForInputType(type);
            if (metricId != null) {
                Counter.logIncrementWithUid(metricId, mAttributionSource.getUid());
            }
        }
    }

    private static String getMetricIdForInputType(@InputDeviceDescriptor.Type int type) {
        switch (type) {
            case InputDeviceDescriptor.TYPE_KEYBOARD:
                return "virtual_devices.value_virtual_keyboard_created_count";
            case InputDeviceDescriptor.TYPE_MOUSE:
                return "virtual_devices.value_virtual_mouse_created_count";
            case InputDeviceDescriptor.TYPE_TOUCHSCREEN:
                return "virtual_devices.value_virtual_touchscreen_created_count";
            case InputDeviceDescriptor.TYPE_DPAD:
                return "virtual_devices.value_virtual_dpad_created_count";
            case InputDeviceDescriptor.TYPE_NAVIGATION_TOUCHPAD:
                return "virtual_devices.value_virtual_navigationtouchpad_created_count";
            case InputDeviceDescriptor.TYPE_STYLUS:
                return "virtual_devices.value_virtual_stylus_created_count";
            default:
                Log.e(TAG, "No metric known for input type: " + type);
                return null;
        }
    }

    @VisibleForTesting
+11 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.companion.virtual.sensor.IVirtualSensorCallback;
import android.companion.virtual.sensor.VirtualSensor;
import android.companion.virtual.sensor.VirtualSensorConfig;
import android.companion.virtual.sensor.VirtualSensorEvent;
import android.content.AttributionSource;
import android.hardware.SensorDirectChannel;
import android.os.Binder;
import android.os.IBinder;
@@ -35,6 +36,7 @@ import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.expresslog.Counter;
import com.android.server.LocalServices;
import com.android.server.sensors.SensorManagerInternal;

@@ -70,15 +72,19 @@ public class SensorController {
    @GuardedBy("mLock")
    private List<VirtualSensor> mVirtualSensorList = null;

    @NonNull
    private final AttributionSource mAttributionSource;
    @NonNull
    private final SensorManagerInternal.RuntimeSensorCallback mRuntimeSensorCallback;
    private final SensorManagerInternal mSensorManagerInternal;
    private final VirtualDeviceManagerInternal mVdmInternal;

    public SensorController(@NonNull IVirtualDevice virtualDevice, int virtualDeviceId,
            @NonNull AttributionSource attributionSource,
            @Nullable IVirtualSensorCallback virtualSensorCallback,
            @NonNull List<VirtualSensorConfig> sensors) {
        mVirtualDeviceId = virtualDeviceId;
        mAttributionSource = attributionSource;
        mRuntimeSensorCallback = new RuntimeSensorCallbackWrapper(virtualSensorCallback);
        mSensorManagerInternal = LocalServices.getService(SensorManagerInternal.class);
        mVdmInternal = LocalServices.getService(VirtualDeviceManagerInternal.class);
@@ -139,6 +145,11 @@ public class SensorController {
            mSensorDescriptors.put(sensorToken, sensorDescriptor);
            mVirtualSensors.put(handle, sensor);
        }
        if (android.companion.virtualdevice.flags.Flags.metricsCollection()) {
            Counter.logIncrementWithUid(
                    "virtual_devices.value_virtual_sensors_created_count",
                    mAttributionSource.getUid());
        }
    }

    boolean sendSensorEvent(@NonNull IBinder token, @NonNull VirtualSensorEvent event) {
+20 −4
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ import android.widget.Toast;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.BlockedAppStreamingActivity;
import com.android.modules.expresslog.Counter;
import com.android.server.LocalServices;
import com.android.server.companion.virtual.GenericWindowPolicyController.RunningAppsChangedListener;
import com.android.server.companion.virtual.audio.VirtualAudioController;
@@ -152,6 +153,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
    private final int mOwnerUid;
    private final VirtualDeviceLog mVirtualDeviceLog;
    private final String mOwnerPackageName;
    @NonNull
    private final AttributionSource mAttributionSource;
    private final int mDeviceId;
    @Nullable
    private final String mPersistentDeviceId;
@@ -288,6 +291,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        super(PermissionEnforcer.fromContext(context));
        mVirtualDeviceLog = virtualDeviceLog;
        mOwnerPackageName = attributionSource.getPackageName();
        mAttributionSource = attributionSource;
        UserHandle ownerUserHandle = UserHandle.getUserHandleForUid(attributionSource.getUid());
        mContext = context.createContextAsUser(ownerUserHandle, 0);
        mAssociationInfo = associationInfo;
@@ -307,11 +311,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        if (inputController == null) {
            mInputController = new InputController(
                    context.getMainThreadHandler(),
                    context.getSystemService(WindowManager.class));
                    context.getSystemService(WindowManager.class), mAttributionSource);
        } else {
            mInputController = inputController;
        }
        mSensorController = new SensorController(this, mDeviceId,
        mSensorController = new SensorController(this, mDeviceId, mAttributionSource,
                mParams.getVirtualSensorCallback(), mParams.getVirtualSensorConfigs());
        mCameraAccessController = cameraAccessController;
        if (mCameraAccessController != null) {
@@ -620,7 +624,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
            }

            if (mVirtualAudioController == null) {
                mVirtualAudioController = new VirtualAudioController(mContext);
                mVirtualAudioController = new VirtualAudioController(mContext, mAttributionSource);
                GenericWindowPolicyController gwpc = mVirtualDisplays.get(
                        displayId).getWindowPolicyController();
                mVirtualAudioController.startListening(gwpc, routingCallback,
@@ -1028,7 +1032,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        if (mVirtualCameraController == null) {
            throw new UnsupportedOperationException("Virtual camera controller is not available");
        }
        mVirtualCameraController.registerCamera(cameraConfig);
        mVirtualCameraController.registerCamera(cameraConfig, mAttributionSource);
    }

    @Override // Binder call
@@ -1110,6 +1114,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        final GenericWindowPolicyController gwpc = new GenericWindowPolicyController(
                FLAG_SECURE,
                SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,
                mAttributionSource,
                getAllowedUserHandles(),
                activityLaunchAllowedByDefault,
                mActivityPolicyExemptions,
@@ -1179,6 +1184,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
            Binder.restoreCallingIdentity(token);
        }

        if (android.companion.virtualdevice.flags.Flags.metricsCollection()) {
            Counter.logIncrementWithUid(
                    "virtual_devices.value_virtual_display_created_count",
                    mAttributionSource.getUid());
        }
        return displayId;
    }

@@ -1220,6 +1230,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
        if ((display.getFlags() & FLAG_SECURE) == 0) {
            showToastWhereUidIsRunning(uid, com.android.internal.R.string.vdm_secure_window,
                    Toast.LENGTH_LONG, mContext.getMainLooper());

            if (android.companion.virtualdevice.flags.Flags.metricsCollection()) {
                Counter.logIncrementWithUid(
                        "virtual_devices.value_secure_window_blocked_count",
                        mAttributionSource.getUid());
            }
        }
    }

Loading