Loading core/api/system-current.txt +1 −3 Original line number Diff line number Diff line Loading @@ -3247,7 +3247,6 @@ package android.companion.virtual { method @NonNull public java.util.Set<android.content.ComponentName> getBlockedCrossTaskNavigations(); method public int getDefaultActivityPolicy(); method public int getDefaultNavigationPolicy(); method public int getDefaultRecentsPolicy(); method public int getDevicePolicy(int); method public int getLockState(); method @Nullable public String getName(); Loading @@ -3264,8 +3263,8 @@ package android.companion.virtual { field public static final int NAVIGATION_POLICY_DEFAULT_ALLOWED = 0; // 0x0 field public static final int NAVIGATION_POLICY_DEFAULT_BLOCKED = 1; // 0x1 field public static final int POLICY_TYPE_AUDIO = 1; // 0x1 field public static final int POLICY_TYPE_RECENTS = 2; // 0x2 field public static final int POLICY_TYPE_SENSORS = 0; // 0x0 field public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1; // 0x1 } public static final class VirtualDeviceParams.Builder { Loading @@ -3278,7 +3277,6 @@ package android.companion.virtual { method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAudioRecordingSessionId(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@NonNull java.util.Set<android.content.ComponentName>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set<android.content.ComponentName>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDefaultRecentsPolicy(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDevicePolicy(int, int); method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String); core/java/android/companion/virtual/VirtualDeviceParams.java +13 −45 Original line number Diff line number Diff line Loading @@ -140,7 +140,8 @@ public final class VirtualDeviceParams implements Parcelable { * a given policy type. * @hide */ @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO}) @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO, POLICY_TYPE_RECENTS}) @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) public @interface PolicyType {} Loading Loading @@ -169,22 +170,21 @@ public final class VirtualDeviceParams implements Parcelable { * <li>{@link #DEVICE_POLICY_CUSTOM}: audio framework will assign device specific session * ids to players and recorders constructed within device context. The session ids are * used to re-route corresponding audio streams to VirtualAudioDevice. * <ul/> * </ul> */ public static final int POLICY_TYPE_AUDIO = 1; /** @hide */ @IntDef(flag = true, prefix = "RECENTS_POLICY_", value = {RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS}) @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) public @interface RecentsPolicy {} /** * If set, activities launched on this virtual device are allowed to appear in the host device * of the recently launched activities list. * Tells the activity manager how to handle recents entries for activities run on this device. * * <ul> * <li>{@link #DEVICE_POLICY_DEFAULT}: Activities launched on VirtualDisplays owned by this * device will appear in the host device recents. * <li>{@link #DEVICE_POLICY_CUSTOM}: Activities launched on VirtualDisplays owned by this * * device will not appear in recents. * </ul> */ public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1 << 0; public static final int POLICY_TYPE_RECENTS = 2; private final int mLockState; @NonNull private final ArraySet<UserHandle> mUsersWithMatchingAccounts; Loading @@ -201,8 +201,6 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull private final SparseIntArray mDevicePolicies; @NonNull private final List<VirtualSensorConfig> mVirtualSensorConfigs; @Nullable private final IVirtualSensorCallback mVirtualSensorCallback; @RecentsPolicy private final int mDefaultRecentsPolicy; private final int mAudioPlaybackSessionId; private final int mAudioRecordingSessionId; Loading @@ -219,7 +217,6 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull SparseIntArray devicePolicies, @NonNull List<VirtualSensorConfig> virtualSensorConfigs, @Nullable IVirtualSensorCallback virtualSensorCallback, @RecentsPolicy int defaultRecentsPolicy, int audioPlaybackSessionId, int audioRecordingSessionId) { mLockState = lockState; Loading @@ -237,10 +234,8 @@ public final class VirtualDeviceParams implements Parcelable { mDevicePolicies = Objects.requireNonNull(devicePolicies); mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs); mVirtualSensorCallback = virtualSensorCallback; mDefaultRecentsPolicy = defaultRecentsPolicy; mAudioPlaybackSessionId = audioPlaybackSessionId; mAudioRecordingSessionId = audioRecordingSessionId; } @SuppressWarnings("unchecked") Loading @@ -259,7 +254,6 @@ public final class VirtualDeviceParams implements Parcelable { parcel.readTypedList(mVirtualSensorConfigs, VirtualSensorConfig.CREATOR); mVirtualSensorCallback = IVirtualSensorCallback.Stub.asInterface(parcel.readStrongBinder()); mDefaultRecentsPolicy = parcel.readInt(); mAudioPlaybackSessionId = parcel.readInt(); mAudioRecordingSessionId = parcel.readInt(); } Loading Loading @@ -395,16 +389,6 @@ public final class VirtualDeviceParams implements Parcelable { return mVirtualSensorCallback; } /** * Returns the policy of how to handle activities in recents. * * @see RecentsPolicy */ @RecentsPolicy public int getDefaultRecentsPolicy() { return mDefaultRecentsPolicy; } /** * Returns device-specific audio session id for playback. * Loading Loading @@ -443,7 +427,6 @@ public final class VirtualDeviceParams implements Parcelable { dest.writeTypedList(mVirtualSensorConfigs); dest.writeStrongBinder( mVirtualSensorCallback != null ? mVirtualSensorCallback.asBinder() : null); dest.writeInt(mDefaultRecentsPolicy); dest.writeInt(mAudioPlaybackSessionId); dest.writeInt(mAudioRecordingSessionId); } Loading Loading @@ -478,7 +461,6 @@ public final class VirtualDeviceParams implements Parcelable { && Objects.equals(mBlockedActivities, that.mBlockedActivities) && mDefaultActivityPolicy == that.mDefaultActivityPolicy && Objects.equals(mName, that.mName) && mDefaultRecentsPolicy == that.mDefaultRecentsPolicy && mAudioPlaybackSessionId == that.mAudioPlaybackSessionId && mAudioRecordingSessionId == that.mAudioRecordingSessionId; } Loading @@ -489,7 +471,7 @@ public final class VirtualDeviceParams implements Parcelable { mLockState, mUsersWithMatchingAccounts, mAllowedCrossTaskNavigations, mBlockedCrossTaskNavigations, mDefaultNavigationPolicy, mAllowedActivities, mBlockedActivities, mDefaultActivityPolicy, mName, mDevicePolicies, mDefaultRecentsPolicy, mAudioPlaybackSessionId, mAudioRecordingSessionId); mAudioPlaybackSessionId, mAudioRecordingSessionId); for (int i = 0; i < mDevicePolicies.size(); i++) { hashCode = 31 * hashCode + mDevicePolicies.keyAt(i); hashCode = 31 * hashCode + mDevicePolicies.valueAt(i); Loading @@ -511,7 +493,6 @@ public final class VirtualDeviceParams implements Parcelable { + " mDefaultActivityPolicy=" + mDefaultActivityPolicy + " mName=" + mName + " mDevicePolicies=" + mDevicePolicies + " mDefaultRecentsPolicy=" + mDefaultRecentsPolicy + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId + " mAudioRecordingSessionId=" + mAudioRecordingSessionId + ")"; Loading Loading @@ -548,7 +529,6 @@ public final class VirtualDeviceParams implements Parcelable { private boolean mDefaultActivityPolicyConfigured = false; @Nullable private String mName; @NonNull private SparseIntArray mDevicePolicies = new SparseIntArray(); private int mDefaultRecentsPolicy; private int mAudioPlaybackSessionId = AUDIO_SESSION_ID_GENERATE; private int mAudioRecordingSessionId = AUDIO_SESSION_ID_GENERATE; Loading Loading @@ -820,17 +800,6 @@ public final class VirtualDeviceParams implements Parcelable { return this; } /** * Sets the policy to indicate how activities are handled in recents. * * @param defaultRecentsPolicy A policy specifying how to handle activities in recents. */ @NonNull public Builder setDefaultRecentsPolicy(@RecentsPolicy int defaultRecentsPolicy) { mDefaultRecentsPolicy = defaultRecentsPolicy; return this; } /** * Sets audio playback session id specific for this virtual device. * Loading Loading @@ -933,7 +902,6 @@ public final class VirtualDeviceParams implements Parcelable { mDevicePolicies, mVirtualSensorConfigs, mVirtualSensorCallback, mDefaultRecentsPolicy, mAudioPlaybackSessionId, mAudioRecordingSessionId); } Loading services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +6 −8 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.server.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS; import static android.content.pm.ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; Loading @@ -29,7 +28,6 @@ import android.app.compat.CompatChanges; import android.companion.virtual.VirtualDeviceManager.ActivityListener; import android.companion.virtual.VirtualDeviceParams; import android.companion.virtual.VirtualDeviceParams.ActivityPolicy; import android.companion.virtual.VirtualDeviceParams.RecentsPolicy; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.ComponentName; Loading Loading @@ -137,8 +135,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController new ArraySet<>(); @Nullable private final SecureWindowCallback mSecureWindowCallback; @Nullable private final List<String> mDisplayCategories; @RecentsPolicy private final int mDefaultRecentsPolicy; private final boolean mShowTasksInHostDeviceRecents; /** * Creates a window policy controller that is generic to the different use cases of virtual Loading Loading @@ -166,7 +164,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * virtual display. * @param intentListenerCallback Callback that is called to intercept intents when matching * passed in filters. * @param defaultRecentsPolicy a policy to indicate how to handle activities in recents. * @param showTasksInHostDeviceRecents whether to show activities in recents on the host device. */ public GenericWindowPolicyController(int windowFlags, int systemWindowFlags, @NonNull ArraySet<UserHandle> allowedUsers, Loading @@ -181,7 +179,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @NonNull SecureWindowCallback secureWindowCallback, @NonNull IntentListenerCallback intentListenerCallback, @NonNull List<String> displayCategories, @RecentsPolicy int defaultRecentsPolicy) { boolean showTasksInHostDeviceRecents) { super(); mAllowedUsers = allowedUsers; mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations); Loading @@ -196,7 +194,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController mSecureWindowCallback = secureWindowCallback; mIntentListenerCallback = intentListenerCallback; mDisplayCategories = displayCategories; mDefaultRecentsPolicy = defaultRecentsPolicy; mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents; } /** Loading Loading @@ -337,7 +335,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Override public boolean canShowTasksInHostDeviceRecents() { return (mDefaultRecentsPolicy & RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS) != 0; return mShowTasksInHostDeviceRecents; } @Override Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -846,7 +846,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this::onSecureWindowShown, this::shouldInterceptIntent, displayCategories, mParams.getDefaultRecentsPolicy()); mParams.getDevicePolicy( VirtualDeviceParams.POLICY_TYPE_RECENTS) == VirtualDeviceParams.DEVICE_POLICY_DEFAULT); gwpc.registerRunningAppsChangedListener(/* listener= */ this); return gwpc; } Loading services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_INVALID; Loading Loading @@ -117,6 +118,7 @@ import com.android.server.sensors.SensorManagerInternal; import com.google.android.collect.Sets; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; Loading Loading @@ -372,6 +374,11 @@ public class VirtualDeviceManagerServiceTest { mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1); } @After public void tearDown() { mDeviceImpl.close(); } @Test public void getDeviceIdForDisplayId_invalidDisplayId_returnsDefault() { assertThat(mVdm.getDeviceIdForDisplayId(Display.INVALID_DISPLAY)) Loading Loading @@ -444,12 +451,42 @@ public class VirtualDeviceManagerServiceTest { .setBlockedActivities(getBlockedActivities()) .setDevicePolicy(POLICY_TYPE_SENSORS, DEVICE_POLICY_CUSTOM) .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); assertThat(mVdm.getDevicePolicy(mDeviceImpl.getDeviceId(), POLICY_TYPE_SENSORS)) .isEqualTo(DEVICE_POLICY_CUSTOM); } @Test public void getDevicePolicy_defaultRecentsPolicy_gwpcCanShowRecentsOnHostDevice() { VirtualDeviceParams params = new VirtualDeviceParams .Builder() .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); GenericWindowPolicyController gwpc = mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1); assertThat(gwpc.canShowTasksInHostDeviceRecents()).isTrue(); } @Test public void getDevicePolicy_customRecentsPolicy_gwpcCannotShowRecentsOnHostDevice() { VirtualDeviceParams params = new VirtualDeviceParams .Builder() .setDevicePolicy(POLICY_TYPE_RECENTS, DEVICE_POLICY_CUSTOM) .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); GenericWindowPolicyController gwpc = mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1); assertThat(gwpc.canShowTasksInHostDeviceRecents()).isFalse(); } @Test public void getDeviceOwnerUid_oneDevice_returnsCorrectId() { int ownerUid = mLocalService.getDeviceOwnerUid(mDeviceImpl.getDeviceId()); Loading Loading @@ -501,6 +538,7 @@ public class VirtualDeviceManagerServiceTest { doReturn(SENSOR_HANDLE).when(mSensorManagerInternalMock).createRuntimeSensor( anyInt(), anyInt(), anyString(), anyString(), anyInt(), any()); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); VirtualSensor sensor = mLocalService.getVirtualSensor(VIRTUAL_DEVICE_ID_1, SENSOR_HANDLE); Loading Loading
core/api/system-current.txt +1 −3 Original line number Diff line number Diff line Loading @@ -3247,7 +3247,6 @@ package android.companion.virtual { method @NonNull public java.util.Set<android.content.ComponentName> getBlockedCrossTaskNavigations(); method public int getDefaultActivityPolicy(); method public int getDefaultNavigationPolicy(); method public int getDefaultRecentsPolicy(); method public int getDevicePolicy(int); method public int getLockState(); method @Nullable public String getName(); Loading @@ -3264,8 +3263,8 @@ package android.companion.virtual { field public static final int NAVIGATION_POLICY_DEFAULT_ALLOWED = 0; // 0x0 field public static final int NAVIGATION_POLICY_DEFAULT_BLOCKED = 1; // 0x1 field public static final int POLICY_TYPE_AUDIO = 1; // 0x1 field public static final int POLICY_TYPE_RECENTS = 2; // 0x2 field public static final int POLICY_TYPE_SENSORS = 0; // 0x0 field public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1; // 0x1 } public static final class VirtualDeviceParams.Builder { Loading @@ -3278,7 +3277,6 @@ package android.companion.virtual { method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAudioRecordingSessionId(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@NonNull java.util.Set<android.content.ComponentName>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set<android.content.ComponentName>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDefaultRecentsPolicy(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDevicePolicy(int, int); method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String);
core/java/android/companion/virtual/VirtualDeviceParams.java +13 −45 Original line number Diff line number Diff line Loading @@ -140,7 +140,8 @@ public final class VirtualDeviceParams implements Parcelable { * a given policy type. * @hide */ @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO}) @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO, POLICY_TYPE_RECENTS}) @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) public @interface PolicyType {} Loading Loading @@ -169,22 +170,21 @@ public final class VirtualDeviceParams implements Parcelable { * <li>{@link #DEVICE_POLICY_CUSTOM}: audio framework will assign device specific session * ids to players and recorders constructed within device context. The session ids are * used to re-route corresponding audio streams to VirtualAudioDevice. * <ul/> * </ul> */ public static final int POLICY_TYPE_AUDIO = 1; /** @hide */ @IntDef(flag = true, prefix = "RECENTS_POLICY_", value = {RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS}) @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) public @interface RecentsPolicy {} /** * If set, activities launched on this virtual device are allowed to appear in the host device * of the recently launched activities list. * Tells the activity manager how to handle recents entries for activities run on this device. * * <ul> * <li>{@link #DEVICE_POLICY_DEFAULT}: Activities launched on VirtualDisplays owned by this * device will appear in the host device recents. * <li>{@link #DEVICE_POLICY_CUSTOM}: Activities launched on VirtualDisplays owned by this * * device will not appear in recents. * </ul> */ public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1 << 0; public static final int POLICY_TYPE_RECENTS = 2; private final int mLockState; @NonNull private final ArraySet<UserHandle> mUsersWithMatchingAccounts; Loading @@ -201,8 +201,6 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull private final SparseIntArray mDevicePolicies; @NonNull private final List<VirtualSensorConfig> mVirtualSensorConfigs; @Nullable private final IVirtualSensorCallback mVirtualSensorCallback; @RecentsPolicy private final int mDefaultRecentsPolicy; private final int mAudioPlaybackSessionId; private final int mAudioRecordingSessionId; Loading @@ -219,7 +217,6 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull SparseIntArray devicePolicies, @NonNull List<VirtualSensorConfig> virtualSensorConfigs, @Nullable IVirtualSensorCallback virtualSensorCallback, @RecentsPolicy int defaultRecentsPolicy, int audioPlaybackSessionId, int audioRecordingSessionId) { mLockState = lockState; Loading @@ -237,10 +234,8 @@ public final class VirtualDeviceParams implements Parcelable { mDevicePolicies = Objects.requireNonNull(devicePolicies); mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs); mVirtualSensorCallback = virtualSensorCallback; mDefaultRecentsPolicy = defaultRecentsPolicy; mAudioPlaybackSessionId = audioPlaybackSessionId; mAudioRecordingSessionId = audioRecordingSessionId; } @SuppressWarnings("unchecked") Loading @@ -259,7 +254,6 @@ public final class VirtualDeviceParams implements Parcelable { parcel.readTypedList(mVirtualSensorConfigs, VirtualSensorConfig.CREATOR); mVirtualSensorCallback = IVirtualSensorCallback.Stub.asInterface(parcel.readStrongBinder()); mDefaultRecentsPolicy = parcel.readInt(); mAudioPlaybackSessionId = parcel.readInt(); mAudioRecordingSessionId = parcel.readInt(); } Loading Loading @@ -395,16 +389,6 @@ public final class VirtualDeviceParams implements Parcelable { return mVirtualSensorCallback; } /** * Returns the policy of how to handle activities in recents. * * @see RecentsPolicy */ @RecentsPolicy public int getDefaultRecentsPolicy() { return mDefaultRecentsPolicy; } /** * Returns device-specific audio session id for playback. * Loading Loading @@ -443,7 +427,6 @@ public final class VirtualDeviceParams implements Parcelable { dest.writeTypedList(mVirtualSensorConfigs); dest.writeStrongBinder( mVirtualSensorCallback != null ? mVirtualSensorCallback.asBinder() : null); dest.writeInt(mDefaultRecentsPolicy); dest.writeInt(mAudioPlaybackSessionId); dest.writeInt(mAudioRecordingSessionId); } Loading Loading @@ -478,7 +461,6 @@ public final class VirtualDeviceParams implements Parcelable { && Objects.equals(mBlockedActivities, that.mBlockedActivities) && mDefaultActivityPolicy == that.mDefaultActivityPolicy && Objects.equals(mName, that.mName) && mDefaultRecentsPolicy == that.mDefaultRecentsPolicy && mAudioPlaybackSessionId == that.mAudioPlaybackSessionId && mAudioRecordingSessionId == that.mAudioRecordingSessionId; } Loading @@ -489,7 +471,7 @@ public final class VirtualDeviceParams implements Parcelable { mLockState, mUsersWithMatchingAccounts, mAllowedCrossTaskNavigations, mBlockedCrossTaskNavigations, mDefaultNavigationPolicy, mAllowedActivities, mBlockedActivities, mDefaultActivityPolicy, mName, mDevicePolicies, mDefaultRecentsPolicy, mAudioPlaybackSessionId, mAudioRecordingSessionId); mAudioPlaybackSessionId, mAudioRecordingSessionId); for (int i = 0; i < mDevicePolicies.size(); i++) { hashCode = 31 * hashCode + mDevicePolicies.keyAt(i); hashCode = 31 * hashCode + mDevicePolicies.valueAt(i); Loading @@ -511,7 +493,6 @@ public final class VirtualDeviceParams implements Parcelable { + " mDefaultActivityPolicy=" + mDefaultActivityPolicy + " mName=" + mName + " mDevicePolicies=" + mDevicePolicies + " mDefaultRecentsPolicy=" + mDefaultRecentsPolicy + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId + " mAudioRecordingSessionId=" + mAudioRecordingSessionId + ")"; Loading Loading @@ -548,7 +529,6 @@ public final class VirtualDeviceParams implements Parcelable { private boolean mDefaultActivityPolicyConfigured = false; @Nullable private String mName; @NonNull private SparseIntArray mDevicePolicies = new SparseIntArray(); private int mDefaultRecentsPolicy; private int mAudioPlaybackSessionId = AUDIO_SESSION_ID_GENERATE; private int mAudioRecordingSessionId = AUDIO_SESSION_ID_GENERATE; Loading Loading @@ -820,17 +800,6 @@ public final class VirtualDeviceParams implements Parcelable { return this; } /** * Sets the policy to indicate how activities are handled in recents. * * @param defaultRecentsPolicy A policy specifying how to handle activities in recents. */ @NonNull public Builder setDefaultRecentsPolicy(@RecentsPolicy int defaultRecentsPolicy) { mDefaultRecentsPolicy = defaultRecentsPolicy; return this; } /** * Sets audio playback session id specific for this virtual device. * Loading Loading @@ -933,7 +902,6 @@ public final class VirtualDeviceParams implements Parcelable { mDevicePolicies, mVirtualSensorConfigs, mVirtualSensorCallback, mDefaultRecentsPolicy, mAudioPlaybackSessionId, mAudioRecordingSessionId); } Loading
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +6 −8 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.server.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS; import static android.content.pm.ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; Loading @@ -29,7 +28,6 @@ import android.app.compat.CompatChanges; import android.companion.virtual.VirtualDeviceManager.ActivityListener; import android.companion.virtual.VirtualDeviceParams; import android.companion.virtual.VirtualDeviceParams.ActivityPolicy; import android.companion.virtual.VirtualDeviceParams.RecentsPolicy; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.ComponentName; Loading Loading @@ -137,8 +135,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController new ArraySet<>(); @Nullable private final SecureWindowCallback mSecureWindowCallback; @Nullable private final List<String> mDisplayCategories; @RecentsPolicy private final int mDefaultRecentsPolicy; private final boolean mShowTasksInHostDeviceRecents; /** * Creates a window policy controller that is generic to the different use cases of virtual Loading Loading @@ -166,7 +164,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * virtual display. * @param intentListenerCallback Callback that is called to intercept intents when matching * passed in filters. * @param defaultRecentsPolicy a policy to indicate how to handle activities in recents. * @param showTasksInHostDeviceRecents whether to show activities in recents on the host device. */ public GenericWindowPolicyController(int windowFlags, int systemWindowFlags, @NonNull ArraySet<UserHandle> allowedUsers, Loading @@ -181,7 +179,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @NonNull SecureWindowCallback secureWindowCallback, @NonNull IntentListenerCallback intentListenerCallback, @NonNull List<String> displayCategories, @RecentsPolicy int defaultRecentsPolicy) { boolean showTasksInHostDeviceRecents) { super(); mAllowedUsers = allowedUsers; mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations); Loading @@ -196,7 +194,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController mSecureWindowCallback = secureWindowCallback; mIntentListenerCallback = intentListenerCallback; mDisplayCategories = displayCategories; mDefaultRecentsPolicy = defaultRecentsPolicy; mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents; } /** Loading Loading @@ -337,7 +335,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Override public boolean canShowTasksInHostDeviceRecents() { return (mDefaultRecentsPolicy & RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS) != 0; return mShowTasksInHostDeviceRecents; } @Override Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -846,7 +846,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this::onSecureWindowShown, this::shouldInterceptIntent, displayCategories, mParams.getDefaultRecentsPolicy()); mParams.getDevicePolicy( VirtualDeviceParams.POLICY_TYPE_RECENTS) == VirtualDeviceParams.DEVICE_POLICY_DEFAULT); gwpc.registerRunningAppsChangedListener(/* listener= */ this); return gwpc; } Loading
services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.companion.virtual; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; import static android.content.Context.DEVICE_ID_DEFAULT; import static android.content.Context.DEVICE_ID_INVALID; Loading Loading @@ -117,6 +118,7 @@ import com.android.server.sensors.SensorManagerInternal; import com.google.android.collect.Sets; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; Loading Loading @@ -372,6 +374,11 @@ public class VirtualDeviceManagerServiceTest { mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1); } @After public void tearDown() { mDeviceImpl.close(); } @Test public void getDeviceIdForDisplayId_invalidDisplayId_returnsDefault() { assertThat(mVdm.getDeviceIdForDisplayId(Display.INVALID_DISPLAY)) Loading Loading @@ -444,12 +451,42 @@ public class VirtualDeviceManagerServiceTest { .setBlockedActivities(getBlockedActivities()) .setDevicePolicy(POLICY_TYPE_SENSORS, DEVICE_POLICY_CUSTOM) .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); assertThat(mVdm.getDevicePolicy(mDeviceImpl.getDeviceId(), POLICY_TYPE_SENSORS)) .isEqualTo(DEVICE_POLICY_CUSTOM); } @Test public void getDevicePolicy_defaultRecentsPolicy_gwpcCanShowRecentsOnHostDevice() { VirtualDeviceParams params = new VirtualDeviceParams .Builder() .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); GenericWindowPolicyController gwpc = mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1); assertThat(gwpc.canShowTasksInHostDeviceRecents()).isTrue(); } @Test public void getDevicePolicy_customRecentsPolicy_gwpcCannotShowRecentsOnHostDevice() { VirtualDeviceParams params = new VirtualDeviceParams .Builder() .setDevicePolicy(POLICY_TYPE_RECENTS, DEVICE_POLICY_CUSTOM) .build(); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1); GenericWindowPolicyController gwpc = mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1); assertThat(gwpc.canShowTasksInHostDeviceRecents()).isFalse(); } @Test public void getDeviceOwnerUid_oneDevice_returnsCorrectId() { int ownerUid = mLocalService.getDeviceOwnerUid(mDeviceImpl.getDeviceId()); Loading Loading @@ -501,6 +538,7 @@ public class VirtualDeviceManagerServiceTest { doReturn(SENSOR_HANDLE).when(mSensorManagerInternalMock).createRuntimeSensor( anyInt(), anyInt(), anyString(), anyString(), anyInt(), any()); mDeviceImpl.close(); mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params); VirtualSensor sensor = mLocalService.getVirtualSensor(VIRTUAL_DEVICE_ID_1, SENSOR_HANDLE); Loading