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

Commit 71f58eb5 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

VDM API for specifying custom home component.

That component is respected whenever a virtual display is created
by the device and that display supports showing home activities.

Using `VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS` for now
and adding a TODO to reference whatever API lands for creating
displays with home support.

Test: atest VirtualDeviceHomeTest
Fix: 297168328
Change-Id: Iced6d176fac39b7cdf375c40de1898c9090a79a3
parent 6182bc4a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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();
@@ -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>);
+39 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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;
@@ -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);
    }

    /**
@@ -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.
@@ -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
@@ -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);
@@ -528,6 +546,7 @@ public final class VirtualDeviceParams implements Parcelable {
                + " mActivityPolicyExemptions=" + mActivityPolicyExemptions
                + " mName=" + mName
                + " mDevicePolicies=" + mDevicePolicies
                + " mHomeComponent=" + mHomeComponent
                + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId
                + " mAudioRecordingSessionId=" + mAudioRecordingSessionId
                + ")";
@@ -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
@@ -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
@@ -1031,6 +1068,7 @@ public final class VirtualDeviceParams implements Parcelable {
                    mActivityPolicyExemptions,
                    mName,
                    mDevicePolicies,
                    mHomeComponent,
                    mVirtualSensorConfigs,
                    virtualSensorCallbackDelegate,
                    mAudioPlaybackSessionId,
+7 −0
Original line number Diff line number Diff line
@@ -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"
+6 −0
Original line number Diff line number Diff line
@@ -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.
+13 −1
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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;
@@ -187,6 +193,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
        mIntentListenerCallback = intentListenerCallback;
        mDisplayCategories = displayCategories;
        mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents;
        mCustomHomeComponent = customHomeComponent;
    }

    /**
@@ -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