Loading core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -3232,6 +3232,7 @@ package android.companion.virtual { method public int getDefaultActivityPolicy(); method public int getDefaultNavigationPolicy(); method public int getDevicePolicy(int); method @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @Nullable public android.content.ComponentName getHomeComponent(); method public int getLockState(); method @Nullable public String getName(); method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts(); Loading Loading @@ -3263,6 +3264,7 @@ package android.companion.virtual { 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 setDevicePolicy(int, int); method @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setHomeComponent(@Nullable android.content.ComponentName); 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); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>); core/java/android/companion/virtual/VirtualDeviceParams.java +39 −1 Original line number Diff line number Diff line Loading @@ -229,6 +229,7 @@ public final class VirtualDeviceParams implements Parcelable { @Nullable private final String mName; // Mapping of @PolicyType to @DevicePolicy @NonNull private final SparseIntArray mDevicePolicies; @Nullable private final ComponentName mHomeComponent; @NonNull private final List<VirtualSensorConfig> mVirtualSensorConfigs; @Nullable private final IVirtualSensorCallback mVirtualSensorCallback; private final int mAudioPlaybackSessionId; Loading @@ -243,6 +244,7 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull Set<ComponentName> activityPolicyExemptions, @Nullable String name, @NonNull SparseIntArray devicePolicies, @Nullable ComponentName homeComponent, @NonNull List<VirtualSensorConfig> virtualSensorConfigs, @Nullable IVirtualSensorCallback virtualSensorCallback, int audioPlaybackSessionId, Loading @@ -258,6 +260,7 @@ public final class VirtualDeviceParams implements Parcelable { new ArraySet<>(Objects.requireNonNull(activityPolicyExemptions)); mName = name; mDevicePolicies = Objects.requireNonNull(devicePolicies); mHomeComponent = homeComponent; mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs); mVirtualSensorCallback = virtualSensorCallback; mAudioPlaybackSessionId = audioPlaybackSessionId; Loading @@ -280,6 +283,7 @@ public final class VirtualDeviceParams implements Parcelable { IVirtualSensorCallback.Stub.asInterface(parcel.readStrongBinder()); mAudioPlaybackSessionId = parcel.readInt(); mAudioRecordingSessionId = parcel.readInt(); mHomeComponent = parcel.readTypedObject(ComponentName.CREATOR); } /** Loading @@ -290,6 +294,19 @@ public final class VirtualDeviceParams implements Parcelable { return mLockState; } /** * Returns the custom component used as home on all displays owned by this virtual device that * support home activities. * * @see Builder#setHomeComponent */ // TODO(b/297168328): Link to the relevant API for creating displays with home support. @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @Nullable public ComponentName getHomeComponent() { return mHomeComponent; } /** * Returns the user handles with matching managed accounts on the remote device to which * this virtual device is streaming. Loading Loading @@ -468,6 +485,7 @@ public final class VirtualDeviceParams implements Parcelable { mVirtualSensorCallback != null ? mVirtualSensorCallback.asBinder() : null); dest.writeInt(mAudioPlaybackSessionId); dest.writeInt(mAudioRecordingSessionId); dest.writeTypedObject(mHomeComponent, flags); } @Override Loading Loading @@ -508,7 +526,7 @@ public final class VirtualDeviceParams implements Parcelable { int hashCode = Objects.hash( mLockState, mUsersWithMatchingAccounts, mCrossTaskNavigationExemptions, mDefaultNavigationPolicy, mActivityPolicyExemptions, mDefaultActivityPolicy, mName, mDevicePolicies, mAudioPlaybackSessionId, mAudioRecordingSessionId); mDevicePolicies, mHomeComponent, mAudioPlaybackSessionId, mAudioRecordingSessionId); for (int i = 0; i < mDevicePolicies.size(); i++) { hashCode = 31 * hashCode + mDevicePolicies.keyAt(i); hashCode = 31 * hashCode + mDevicePolicies.valueAt(i); Loading @@ -528,6 +546,7 @@ public final class VirtualDeviceParams implements Parcelable { + " mActivityPolicyExemptions=" + mActivityPolicyExemptions + " mName=" + mName + " mDevicePolicies=" + mDevicePolicies + " mHomeComponent=" + mHomeComponent + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId + " mAudioRecordingSessionId=" + mAudioRecordingSessionId + ")"; Loading Loading @@ -588,6 +607,7 @@ public final class VirtualDeviceParams implements Parcelable { @Nullable private VirtualSensorCallback mVirtualSensorCallback; @Nullable private Executor mVirtualSensorDirectChannelCallbackExecutor; @Nullable private VirtualSensorDirectChannelCallback mVirtualSensorDirectChannelCallback; @Nullable private ComponentName mHomeComponent; private static class VirtualSensorCallbackDelegate extends IVirtualSensorCallback.Stub { @NonNull Loading Loading @@ -664,6 +684,23 @@ public final class VirtualDeviceParams implements Parcelable { return this; } /** * Specifies a component to be used as home on all displays owned by this virtual device * that support home activities. * * * <p>Note: Only relevant for virtual displays that support home activities.</p> * * @param homeComponent The component name to be used as home. If unset, then the system- * default secondary home activity will be used. */ // TODO(b/297168328): Link to the relevant API for creating displays with home support. @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @NonNull public Builder setHomeComponent(@Nullable ComponentName homeComponent) { mHomeComponent = homeComponent; return this; } /** * Sets the user handles with matching managed accounts on the remote device to which * this virtual device is streaming. The caller is responsible for verifying the presence Loading Loading @@ -1031,6 +1068,7 @@ public final class VirtualDeviceParams implements Parcelable { mActivityPolicyExemptions, mName, mDevicePolicies, mHomeComponent, mVirtualSensorConfigs, virtualSensorCallbackDelegate, mAudioPlaybackSessionId, Loading core/java/android/companion/virtual/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,13 @@ flag { bug: "298401780" } flag { name: "vdm_custom_home" namespace: "virtual_devices" description: "Enable custom home API" bug: "297168328" } flag { name: "vdm_public_apis" namespace: "virtual_devices" Loading core/java/android/window/DisplayWindowPolicyController.java +6 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,12 @@ public abstract class DisplayWindowPolicyController { } } /** * @return the custom home component specified for the relevant display, if any. */ @Nullable public abstract ComponentName getCustomHomeComponent(); /** * Returns {@code true} if all of the given activities can be launched on this virtual display * in the configuration defined by the rest of the arguments. Loading services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +13 −1 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @GuardedBy("mGenericWindowPolicyControllerLock") private boolean mShowTasksInHostDeviceRecents; @Nullable private final ComponentName mCustomHomeComponent; /** * Creates a window policy controller that is generic to the different use cases of virtual Loading @@ -157,6 +158,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * @param intentListenerCallback Callback that is called to intercept intents when matching * passed in filters. * @param showTasksInHostDeviceRecents whether to show activities in recents on the host device. * @param customHomeComponent The component acting as a home activity on the virtual display. If * {@code null}, then the system-default secondary home activity will be used. This is only * applicable to displays that support home activities, i.e. they're created with the relevant * virtual display flag. */ public GenericWindowPolicyController( int windowFlags, Loading @@ -172,7 +177,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Nullable SecureWindowCallback secureWindowCallback, @Nullable IntentListenerCallback intentListenerCallback, @NonNull Set<String> displayCategories, boolean showTasksInHostDeviceRecents) { boolean showTasksInHostDeviceRecents, @Nullable ComponentName customHomeComponent) { super(); mAllowedUsers = allowedUsers; mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault; Loading @@ -187,6 +193,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController mIntentListenerCallback = intentListenerCallback; mDisplayCategories = displayCategories; mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents; mCustomHomeComponent = customHomeComponent; } /** Loading Loading @@ -384,6 +391,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController return false; } @Override public @Nullable ComponentName getCustomHomeComponent() { return mCustomHomeComponent; } /** * Returns true if an app with the given UID has an activity running on the virtual display for * this controller. Loading Loading
core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -3232,6 +3232,7 @@ package android.companion.virtual { method public int getDefaultActivityPolicy(); method public int getDefaultNavigationPolicy(); method public int getDevicePolicy(int); method @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @Nullable public android.content.ComponentName getHomeComponent(); method public int getLockState(); method @Nullable public String getName(); method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts(); Loading Loading @@ -3263,6 +3264,7 @@ package android.companion.virtual { 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 setDevicePolicy(int, int); method @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setHomeComponent(@Nullable android.content.ComponentName); 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); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>);
core/java/android/companion/virtual/VirtualDeviceParams.java +39 −1 Original line number Diff line number Diff line Loading @@ -229,6 +229,7 @@ public final class VirtualDeviceParams implements Parcelable { @Nullable private final String mName; // Mapping of @PolicyType to @DevicePolicy @NonNull private final SparseIntArray mDevicePolicies; @Nullable private final ComponentName mHomeComponent; @NonNull private final List<VirtualSensorConfig> mVirtualSensorConfigs; @Nullable private final IVirtualSensorCallback mVirtualSensorCallback; private final int mAudioPlaybackSessionId; Loading @@ -243,6 +244,7 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull Set<ComponentName> activityPolicyExemptions, @Nullable String name, @NonNull SparseIntArray devicePolicies, @Nullable ComponentName homeComponent, @NonNull List<VirtualSensorConfig> virtualSensorConfigs, @Nullable IVirtualSensorCallback virtualSensorCallback, int audioPlaybackSessionId, Loading @@ -258,6 +260,7 @@ public final class VirtualDeviceParams implements Parcelable { new ArraySet<>(Objects.requireNonNull(activityPolicyExemptions)); mName = name; mDevicePolicies = Objects.requireNonNull(devicePolicies); mHomeComponent = homeComponent; mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs); mVirtualSensorCallback = virtualSensorCallback; mAudioPlaybackSessionId = audioPlaybackSessionId; Loading @@ -280,6 +283,7 @@ public final class VirtualDeviceParams implements Parcelable { IVirtualSensorCallback.Stub.asInterface(parcel.readStrongBinder()); mAudioPlaybackSessionId = parcel.readInt(); mAudioRecordingSessionId = parcel.readInt(); mHomeComponent = parcel.readTypedObject(ComponentName.CREATOR); } /** Loading @@ -290,6 +294,19 @@ public final class VirtualDeviceParams implements Parcelable { return mLockState; } /** * Returns the custom component used as home on all displays owned by this virtual device that * support home activities. * * @see Builder#setHomeComponent */ // TODO(b/297168328): Link to the relevant API for creating displays with home support. @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @Nullable public ComponentName getHomeComponent() { return mHomeComponent; } /** * Returns the user handles with matching managed accounts on the remote device to which * this virtual device is streaming. Loading Loading @@ -468,6 +485,7 @@ public final class VirtualDeviceParams implements Parcelable { mVirtualSensorCallback != null ? mVirtualSensorCallback.asBinder() : null); dest.writeInt(mAudioPlaybackSessionId); dest.writeInt(mAudioRecordingSessionId); dest.writeTypedObject(mHomeComponent, flags); } @Override Loading Loading @@ -508,7 +526,7 @@ public final class VirtualDeviceParams implements Parcelable { int hashCode = Objects.hash( mLockState, mUsersWithMatchingAccounts, mCrossTaskNavigationExemptions, mDefaultNavigationPolicy, mActivityPolicyExemptions, mDefaultActivityPolicy, mName, mDevicePolicies, mAudioPlaybackSessionId, mAudioRecordingSessionId); mDevicePolicies, mHomeComponent, mAudioPlaybackSessionId, mAudioRecordingSessionId); for (int i = 0; i < mDevicePolicies.size(); i++) { hashCode = 31 * hashCode + mDevicePolicies.keyAt(i); hashCode = 31 * hashCode + mDevicePolicies.valueAt(i); Loading @@ -528,6 +546,7 @@ public final class VirtualDeviceParams implements Parcelable { + " mActivityPolicyExemptions=" + mActivityPolicyExemptions + " mName=" + mName + " mDevicePolicies=" + mDevicePolicies + " mHomeComponent=" + mHomeComponent + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId + " mAudioRecordingSessionId=" + mAudioRecordingSessionId + ")"; Loading Loading @@ -588,6 +607,7 @@ public final class VirtualDeviceParams implements Parcelable { @Nullable private VirtualSensorCallback mVirtualSensorCallback; @Nullable private Executor mVirtualSensorDirectChannelCallbackExecutor; @Nullable private VirtualSensorDirectChannelCallback mVirtualSensorDirectChannelCallback; @Nullable private ComponentName mHomeComponent; private static class VirtualSensorCallbackDelegate extends IVirtualSensorCallback.Stub { @NonNull Loading Loading @@ -664,6 +684,23 @@ public final class VirtualDeviceParams implements Parcelable { return this; } /** * Specifies a component to be used as home on all displays owned by this virtual device * that support home activities. * * * <p>Note: Only relevant for virtual displays that support home activities.</p> * * @param homeComponent The component name to be used as home. If unset, then the system- * default secondary home activity will be used. */ // TODO(b/297168328): Link to the relevant API for creating displays with home support. @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @NonNull public Builder setHomeComponent(@Nullable ComponentName homeComponent) { mHomeComponent = homeComponent; return this; } /** * Sets the user handles with matching managed accounts on the remote device to which * this virtual device is streaming. The caller is responsible for verifying the presence Loading Loading @@ -1031,6 +1068,7 @@ public final class VirtualDeviceParams implements Parcelable { mActivityPolicyExemptions, mName, mDevicePolicies, mHomeComponent, mVirtualSensorConfigs, virtualSensorCallbackDelegate, mAudioPlaybackSessionId, Loading
core/java/android/companion/virtual/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,13 @@ flag { bug: "298401780" } flag { name: "vdm_custom_home" namespace: "virtual_devices" description: "Enable custom home API" bug: "297168328" } flag { name: "vdm_public_apis" namespace: "virtual_devices" Loading
core/java/android/window/DisplayWindowPolicyController.java +6 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,12 @@ public abstract class DisplayWindowPolicyController { } } /** * @return the custom home component specified for the relevant display, if any. */ @Nullable public abstract ComponentName getCustomHomeComponent(); /** * Returns {@code true} if all of the given activities can be launched on this virtual display * in the configuration defined by the rest of the arguments. Loading
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +13 −1 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @GuardedBy("mGenericWindowPolicyControllerLock") private boolean mShowTasksInHostDeviceRecents; @Nullable private final ComponentName mCustomHomeComponent; /** * Creates a window policy controller that is generic to the different use cases of virtual Loading @@ -157,6 +158,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * @param intentListenerCallback Callback that is called to intercept intents when matching * passed in filters. * @param showTasksInHostDeviceRecents whether to show activities in recents on the host device. * @param customHomeComponent The component acting as a home activity on the virtual display. If * {@code null}, then the system-default secondary home activity will be used. This is only * applicable to displays that support home activities, i.e. they're created with the relevant * virtual display flag. */ public GenericWindowPolicyController( int windowFlags, Loading @@ -172,7 +177,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Nullable SecureWindowCallback secureWindowCallback, @Nullable IntentListenerCallback intentListenerCallback, @NonNull Set<String> displayCategories, boolean showTasksInHostDeviceRecents) { boolean showTasksInHostDeviceRecents, @Nullable ComponentName customHomeComponent) { super(); mAllowedUsers = allowedUsers; mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault; Loading @@ -187,6 +193,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController mIntentListenerCallback = intentListenerCallback; mDisplayCategories = displayCategories; mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents; mCustomHomeComponent = customHomeComponent; } /** Loading Loading @@ -384,6 +391,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController return false; } @Override public @Nullable ComponentName getCustomHomeComponent() { return mCustomHomeComponent; } /** * Returns true if an app with the given UID has an activity running on the virtual display for * this controller. Loading