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

Commit 3edc88c0 authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Add additional metrics to VDM usage

Log metrics for VD creation as well as each of the VD features when they
are created for a VD.

Bug: 324842215
Test: statsd_testdrive locally
Change-Id: I372fa785f4c4d46b60957c97238cc0349b03954a
parent bae9399d
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