diff --git a/core/api/current.txt b/core/api/current.txt index 272fab303911b..a6849fe9686fc 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -19594,7 +19594,7 @@ package android.hardware.display { public final class VirtualDisplayConfig implements android.os.Parcelable { method public int describeContents(); method public int getDensityDpi(); - method @NonNull public java.util.List getDisplayCategories(); + method @NonNull public java.util.Set getDisplayCategories(); method public int getFlags(); method public int getHeight(); method @NonNull public String getName(); @@ -19609,7 +19609,7 @@ package android.hardware.display { ctor public VirtualDisplayConfig.Builder(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int); method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder addDisplayCategory(@NonNull String); method @NonNull public android.hardware.display.VirtualDisplayConfig build(); - method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCategories(@NonNull java.util.List); + method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCategories(@NonNull java.util.Set); method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setFlags(int); method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setRequestedRefreshRate(@FloatRange(from=0.0f) float); method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setSurface(@Nullable android.view.Surface); diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index 6cc4c8a24c48d..90681cba7d832 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -545,12 +545,13 @@ public final class VirtualDeviceManager { @VirtualDisplayFlag int flags, @Nullable @CallbackExecutor Executor executor, @Nullable VirtualDisplay.Callback callback) { - VirtualDisplayConfig config = new VirtualDisplayConfig.Builder( + VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder( getVirtualDisplayName(), width, height, densityDpi) - .setSurface(surface) - .setFlags(flags) - .build(); - return createVirtualDisplay(config, executor, callback); + .setFlags(flags); + if (surface != null) { + builder.setSurface(surface); + } + return createVirtualDisplay(builder.build(), executor, callback); } /** diff --git a/core/java/android/hardware/display/VirtualDisplayConfig.java b/core/java/android/hardware/display/VirtualDisplayConfig.java index 6b56a067a1982..067ae4d438ccd 100644 --- a/core/java/android/hardware/display/VirtualDisplayConfig.java +++ b/core/java/android/hardware/display/VirtualDisplayConfig.java @@ -27,13 +27,13 @@ import android.media.projection.MediaProjection; import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; +import android.util.ArraySet; import android.view.Display; import android.view.Surface; -import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Objects; +import java.util.Set; /** * Holds configuration used to create {@link VirtualDisplay} instances. @@ -51,8 +51,8 @@ public final class VirtualDisplayConfig implements Parcelable { private final Surface mSurface; private final String mUniqueId; private final int mDisplayIdToMirror; - private final boolean mWindowManagerMirroring; - private ArrayList mDisplayCategories = null; + private final boolean mWindowManagerMirroringEnabled; + private ArraySet mDisplayCategories = null; private final float mRequestedRefreshRate; private VirtualDisplayConfig( @@ -64,8 +64,8 @@ public final class VirtualDisplayConfig implements Parcelable { @Nullable Surface surface, @Nullable String uniqueId, int displayIdToMirror, - boolean windowManagerMirroring, - @NonNull ArrayList displayCategories, + boolean windowManagerMirroringEnabled, + @NonNull ArraySet displayCategories, float requestedRefreshRate) { mName = name; mWidth = width; @@ -75,7 +75,7 @@ public final class VirtualDisplayConfig implements Parcelable { mSurface = surface; mUniqueId = uniqueId; mDisplayIdToMirror = displayIdToMirror; - mWindowManagerMirroring = windowManagerMirroring; + mWindowManagerMirroringEnabled = windowManagerMirroringEnabled; mDisplayCategories = displayCategories; mRequestedRefreshRate = requestedRefreshRate; } @@ -151,8 +151,8 @@ public final class VirtualDisplayConfig implements Parcelable { * if DisplayManager should record contents instead. * @hide */ - public boolean isWindowManagerMirroring() { - return mWindowManagerMirroring; + public boolean isWindowManagerMirroringEnabled() { + return mWindowManagerMirroringEnabled; } /** @@ -161,8 +161,8 @@ public final class VirtualDisplayConfig implements Parcelable { * @see Builder#setDisplayCategories */ @NonNull - public List getDisplayCategories() { - return Collections.unmodifiableList(mDisplayCategories); + public Set getDisplayCategories() { + return Collections.unmodifiableSet(mDisplayCategories); } /** @@ -185,8 +185,8 @@ public final class VirtualDisplayConfig implements Parcelable { dest.writeTypedObject(mSurface, flags); dest.writeString8(mUniqueId); dest.writeInt(mDisplayIdToMirror); - dest.writeBoolean(mWindowManagerMirroring); - dest.writeStringList(mDisplayCategories); + dest.writeBoolean(mWindowManagerMirroringEnabled); + dest.writeArraySet(mDisplayCategories); dest.writeFloat(mRequestedRefreshRate); } @@ -210,7 +210,7 @@ public final class VirtualDisplayConfig implements Parcelable { && Objects.equals(mSurface, that.mSurface) && Objects.equals(mUniqueId, that.mUniqueId) && mDisplayIdToMirror == that.mDisplayIdToMirror - && mWindowManagerMirroring == that.mWindowManagerMirroring + && mWindowManagerMirroringEnabled == that.mWindowManagerMirroringEnabled && Objects.equals(mDisplayCategories, that.mDisplayCategories) && mRequestedRefreshRate == that.mRequestedRefreshRate; } @@ -219,7 +219,7 @@ public final class VirtualDisplayConfig implements Parcelable { public int hashCode() { int hashCode = Objects.hash( mName, mWidth, mHeight, mDensityDpi, mFlags, mSurface, mUniqueId, - mDisplayIdToMirror, mWindowManagerMirroring, mDisplayCategories, + mDisplayIdToMirror, mWindowManagerMirroringEnabled, mDisplayCategories, mRequestedRefreshRate); return hashCode; } @@ -236,7 +236,7 @@ public final class VirtualDisplayConfig implements Parcelable { + " mSurface=" + mSurface + " mUniqueId=" + mUniqueId + " mDisplayIdToMirror=" + mDisplayIdToMirror - + " mWindowManagerMirroring=" + mWindowManagerMirroring + + " mWindowManagerMirroringEnabled=" + mWindowManagerMirroringEnabled + " mDisplayCategories=" + mDisplayCategories + " mRequestedRefreshRate=" + mRequestedRefreshRate + ")"; @@ -251,9 +251,8 @@ public final class VirtualDisplayConfig implements Parcelable { mSurface = in.readTypedObject(Surface.CREATOR); mUniqueId = in.readString8(); mDisplayIdToMirror = in.readInt(); - mWindowManagerMirroring = in.readBoolean(); - mDisplayCategories = new ArrayList<>(); - in.readStringList(mDisplayCategories); + mWindowManagerMirroringEnabled = in.readBoolean(); + mDisplayCategories = (ArraySet) in.readArraySet(null); mRequestedRefreshRate = in.readFloat(); } @@ -283,8 +282,8 @@ public final class VirtualDisplayConfig implements Parcelable { private Surface mSurface = null; private String mUniqueId = null; private int mDisplayIdToMirror = DEFAULT_DISPLAY; - private boolean mWindowManagerMirroring = false; - private ArrayList mDisplayCategories = new ArrayList<>(); + private boolean mWindowManagerMirroringEnabled = false; + private ArraySet mDisplayCategories = new ArraySet<>(); private float mRequestedRefreshRate = 0.0f; /** @@ -370,8 +369,8 @@ public final class VirtualDisplayConfig implements Parcelable { * @hide */ @NonNull - public Builder setWindowManagerMirroring(boolean windowManagerMirroring) { - mWindowManagerMirroring = windowManagerMirroring; + public Builder setWindowManagerMirroringEnabled(boolean windowManagerMirroringEnabled) { + mWindowManagerMirroringEnabled = windowManagerMirroringEnabled; return this; } @@ -383,7 +382,7 @@ public final class VirtualDisplayConfig implements Parcelable { * {@link android.content.pm.ActivityInfo#requiredDisplayCategory}. */ @NonNull - public Builder setDisplayCategories(@NonNull List displayCategories) { + public Builder setDisplayCategories(@NonNull Set displayCategories) { mDisplayCategories.clear(); mDisplayCategories.addAll(Objects.requireNonNull(displayCategories)); return this; @@ -435,7 +434,7 @@ public final class VirtualDisplayConfig implements Parcelable { mSurface, mUniqueId, mDisplayIdToMirror, - mWindowManagerMirroring, + mWindowManagerMirroringEnabled, mDisplayCategories, mRequestedRefreshRate); } diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java index 9e9012e431119..d70e8b36afdb5 100644 --- a/media/java/android/media/projection/MediaProjection.java +++ b/media/java/android/media/projection/MediaProjection.java @@ -191,7 +191,7 @@ public final class MediaProjection { } else { session = ContentRecordingSession.createTaskSession(launchCookie); } - virtualDisplayConfig.setWindowManagerMirroring(true); + virtualDisplayConfig.setWindowManagerMirroringEnabled(true); final DisplayManager dm = mContext.getSystemService(DisplayManager.class); final VirtualDisplay virtualDisplay = dm.createVirtualDisplay(this, virtualDisplayConfig.build(), callback, handler, windowContext); diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index 1c4602803426f..34033e225b805 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -134,7 +134,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController private final ArraySet mRunningAppsChangedListeners = new ArraySet<>(); @Nullable private final SecureWindowCallback mSecureWindowCallback; - @Nullable private final List mDisplayCategories; + @Nullable private final Set mDisplayCategories; private final boolean mShowTasksInHostDeviceRecents; @@ -178,7 +178,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @NonNull ActivityBlockedCallback activityBlockedCallback, @NonNull SecureWindowCallback secureWindowCallback, @NonNull IntentListenerCallback intentListenerCallback, - @NonNull List displayCategories, + @NonNull Set displayCategories, boolean showTasksInHostDeviceRecents) { super(); mAllowedUsers = allowedUsers; diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index 2d010cf66e9be..b338d89a01696 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -97,6 +97,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; @@ -830,7 +831,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } private GenericWindowPolicyController createWindowPolicyController( - @NonNull List displayCategories) { + @NonNull Set displayCategories) { final GenericWindowPolicyController gwpc = new GenericWindowPolicyController(FLAG_SECURE, SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index 364d53ba3c10a..eda15ae32c8b0 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -285,7 +285,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mUniqueIndex = uniqueIndex; mIsDisplayOn = surface != null; mDisplayIdToMirror = virtualDisplayConfig.getDisplayIdToMirror(); - mIsWindowManagerMirroring = virtualDisplayConfig.isWindowManagerMirroring(); + mIsWindowManagerMirroring = virtualDisplayConfig.isWindowManagerMirroringEnabled(); } @Override diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index 2967c5c53e8ad..339ccd80c351d 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -130,7 +130,6 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -283,7 +282,7 @@ public class VirtualDeviceManagerServiceTest { return blockedActivities; } - private Intent createRestrictedActivityBlockedIntent(List displayCategories, + private Intent createRestrictedActivityBlockedIntent(Set displayCategories, String targetDisplayCategory) { when(mDisplayManagerInternalMock.createVirtualDisplay(any(), any(), any(), any(), eq(NONBLOCKED_APP_PACKAGE_NAME))).thenReturn(DISPLAY_ID_1); @@ -1634,7 +1633,7 @@ public class VirtualDeviceManagerServiceTest { @Test public void nonRestrictedActivityOnRestrictedVirtualDisplay_startBlockedAlertActivity() { - Intent blockedAppIntent = createRestrictedActivityBlockedIntent(List.of("abc"), + Intent blockedAppIntent = createRestrictedActivityBlockedIntent(Set.of("abc"), /* targetDisplayCategory= */ null); verify(mContext).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); @@ -1642,7 +1641,7 @@ public class VirtualDeviceManagerServiceTest { @Test public void restrictedActivityOnRestrictedVirtualDisplay_doesNotStartBlockedAlertActivity() { - Intent blockedAppIntent = createRestrictedActivityBlockedIntent(List.of("abc"), "abc"); + Intent blockedAppIntent = createRestrictedActivityBlockedIntent(Set.of("abc"), "abc"); verify(mContext, never()).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); } @@ -1650,14 +1649,14 @@ public class VirtualDeviceManagerServiceTest { @Test public void restrictedActivityOnNonRestrictedVirtualDisplay_startBlockedAlertActivity() { Intent blockedAppIntent = createRestrictedActivityBlockedIntent( - /* displayCategories= */ List.of(), "abc"); + /* displayCategories= */ Set.of(), "abc"); verify(mContext).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); } @Test public void restrictedActivityNonMatchingRestrictedVirtualDisplay_startBlockedAlertActivity() { - Intent blockedAppIntent = createRestrictedActivityBlockedIntent(List.of("abc"), "def"); + Intent blockedAppIntent = createRestrictedActivityBlockedIntent(Set.of("abc"), "def"); verify(mContext).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); } diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java index d9e4da73c1c30..2bfa44ecb1d6d 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java @@ -89,7 +89,7 @@ public class VirtualAudioControllerTest { /* activityBlockedCallback= */ null, /* secureWindowCallback= */ null, /* intentListenerCallback= */ null, - /* displayCategories= */ new ArrayList<>(), + /* displayCategories= */ new ArraySet<>(), /* showTasksInHostDeviceRecents= */ true); } diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index 7971fd71ea090..de1c2195fcdba 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -967,7 +967,7 @@ public class DisplayManagerServiceTest { final VirtualDisplayConfig.Builder builder2 = new VirtualDisplayConfig.Builder( VIRTUAL_DISPLAY_NAME, width, height, dpi) .setUniqueId(uniqueId2) - .setWindowManagerMirroring(true); + .setWindowManagerMirroringEnabled(true); final int secondDisplayId = binderService.createVirtualDisplay(builder2.build(), mMockAppToken2 /* callback */, null /* projection */, PACKAGE_NAME);