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

Commit 7d1bcfba authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "New VDM callback API onSecureSurfaceShown" into main

parents 1c6f875f 07cf22e0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3470,6 +3470,7 @@ package android.companion.virtual {
  public static interface VirtualDeviceManager.ActivityListener {
    method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public default void onActivityLaunchBlocked(int, @NonNull android.content.ComponentName, @NonNull android.os.UserHandle, @Nullable android.content.IntentSender);
    method public void onDisplayEmpty(int);
    method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public default void onSecureWindowShown(int, @NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
    method @Deprecated public void onTopActivityChanged(int, @NonNull android.content.ComponentName);
    method public default void onTopActivityChanged(int, @NonNull android.content.ComponentName, int);
  }
+9 −0
Original line number Diff line number Diff line
@@ -54,4 +54,13 @@ oneway interface IVirtualDeviceActivityListener {
     */
    void onActivityLaunchBlocked(int displayId, in ComponentName componentName, in UserHandle user,
            in IntentSender intentSender);

    /**
     * Called when a secure surface is shown on the device.
     *
     * @param displayId The display ID on which the secure surface was shown.
     * @param componentName The component name of the activity that showed the secure surface.
     * @param user The user associated with the activity.
     */
    void onSecureWindowShown(int displayId, in ComponentName componentName, in UserHandle user);
}
+23 −0
Original line number Diff line number Diff line
@@ -151,7 +151,24 @@ public class VirtualDeviceInternal {
                        Binder.restoreCallingIdentity(token);
                    }
                }

                @Override
                public void onSecureWindowShown(int displayId, ComponentName componentName,
                        UserHandle user) {
                    final long token = Binder.clearCallingIdentity();
                    try {
                        synchronized (mActivityListenersLock) {
                            for (int i = 0; i < mActivityListeners.size(); i++) {
                                mActivityListeners.valueAt(i)
                                        .onSecureWindowShown(displayId, componentName, user);
                            }
                        }
                    } finally {
                        Binder.restoreCallingIdentity(token);
                    }
                }
            };

    private final IVirtualDeviceSoundEffectListener mSoundEffectListener =
            new IVirtualDeviceSoundEffectListener.Stub() {
                @Override
@@ -584,6 +601,12 @@ public class VirtualDeviceInternal {
                    mActivityListener.onActivityLaunchBlocked(
                            displayId, componentName, user, intentSender));
        }

        public void onSecureWindowShown(int displayId, ComponentName componentName,
                UserHandle user) {
            mExecutor.execute(() ->
                    mActivityListener.onSecureWindowShown(displayId, componentName, user));
        }
    }

    /**
+14 −0
Original line number Diff line number Diff line
@@ -1255,6 +1255,20 @@ public final class VirtualDeviceManager {
        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
        default void onActivityLaunchBlocked(int displayId, @NonNull ComponentName componentName,
                @NonNull UserHandle user, @Nullable IntentSender intentSender) {}

        /**
         * Called when a window with a secure surface is shown on the device.
         *
         * @param displayId The display ID on which the window was shown.
         * @param componentName The component name of the activity that showed the window.
         * @param user The user associated with the activity.
         *
         * @see Display#FLAG_SECURE
         * @see WindowManager.LayoutParams#FLAG_SECURE
         */
        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
        default void onSecureWindowShown(int displayId, @NonNull ComponentName componentName,
                @NonNull UserHandle user) {}
    }

    /**
+26 −2
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.app.Activity;
import android.app.ActivityOptions;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
import android.app.compat.CompatChanges;
import android.companion.AssociationInfo;
import android.companion.virtual.ActivityPolicyExemption;
import android.companion.virtual.IVirtualDevice;
@@ -55,6 +56,8 @@ import android.companion.virtual.camera.VirtualCameraConfig;
import android.companion.virtual.flags.Flags;
import android.companion.virtual.sensor.VirtualSensor;
import android.companion.virtual.sensor.VirtualSensorEvent;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.content.AttributionSource;
import android.content.ComponentName;
import android.content.Context;
@@ -87,6 +90,7 @@ import android.hardware.input.VirtualTouchscreenConfig;
import android.media.AudioManager;
import android.media.audiopolicy.AudioMix;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.Looper;
@@ -131,6 +135,16 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub

    private static final String TAG = "VirtualDeviceImpl";

    /**
     * Do not show a toast on the virtual display when a secure surface is shown after
     * {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}. VDM clients should use
     * {@link VirtualDeviceManager.ActivityListener#onSecureWindowShown} instead to provide
     * a custom notification if desired.
     */
    @ChangeId
    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
    public static final long DO_NOT_SHOW_TOAST_WHEN_SECURE_SURFACE_SHOWN = 311101667L;

    private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS =
            DisplayManager.VIRTUAL_DISPLAY_FLAG_TOUCH_FEEDBACK_DISABLED
                    | DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL
@@ -256,8 +270,18 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub

        @Override
        public void onSecureWindowShown(int displayId, @NonNull ActivityInfo activityInfo) {
            synchronized (mVirtualDeviceLock) {
                if (!mVirtualDisplays.contains(displayId)) {
            if (android.companion.virtualdevice.flags.Flags.activityControlApi()) {
                try {
                    mActivityListener.onSecureWindowShown(
                            displayId,
                            activityInfo.getComponentName(),
                            UserHandle.getUserHandleForUid(activityInfo.applicationInfo.uid));
                } catch (RemoteException e) {
                    Slog.w(TAG, "Unable to call mActivityListener for display: " + displayId, e);
                }

                if (CompatChanges.isChangeEnabled(DO_NOT_SHOW_TOAST_WHEN_SECURE_SURFACE_SHOWN,
                        mOwnerPackageName,  UserHandle.getUserHandleForUid(mOwnerUid))) {
                    return;
                }
            }