xref: /aosp_15_r20/development/samples/VirtualDeviceManager/README.md (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker# VirtualDeviceManager Demo Apps
2*90c8c64dSAndroid Build Coastguard Worker
3*90c8c64dSAndroid Build Coastguard Worker#### Page contents
4*90c8c64dSAndroid Build Coastguard Worker
5*90c8c64dSAndroid Build Coastguard Worker[Overview](#overview) \
6*90c8c64dSAndroid Build Coastguard Worker[Prerequisites](#prerequisites) \
7*90c8c64dSAndroid Build Coastguard Worker[Build & Install](#build-and-install) \
8*90c8c64dSAndroid Build Coastguard Worker[Run](#run) \
9*90c8c64dSAndroid Build Coastguard Worker[Host Options](#host-options) \
10*90c8c64dSAndroid Build Coastguard Worker[Client Options](#client-options) \
11*90c8c64dSAndroid Build Coastguard Worker[Demos](#demos)
12*90c8c64dSAndroid Build Coastguard Worker
13*90c8c64dSAndroid Build Coastguard Worker## Overview
14*90c8c64dSAndroid Build Coastguard Worker
15*90c8c64dSAndroid Build Coastguard WorkerThe VDM Demo Apps allow for showcasing VDM features, rapid prototyping and
16*90c8c64dSAndroid Build Coastguard Workertesting of new features.
17*90c8c64dSAndroid Build Coastguard Worker
18*90c8c64dSAndroid Build Coastguard WorkerThe VDM Demo contains 3 apps:
19*90c8c64dSAndroid Build Coastguard Worker
20*90c8c64dSAndroid Build Coastguard Worker*   **Host**: installed on the host device, creates and manages a virtual
21*90c8c64dSAndroid Build Coastguard Worker    device, which represents the client device and communicates with the
22*90c8c64dSAndroid Build Coastguard Worker    physical client device by sending audio and frames of the virtual displays,
23*90c8c64dSAndroid Build Coastguard Worker    receiving input and sensor data that is injected into the framework. It can
24*90c8c64dSAndroid Build Coastguard Worker    launch apps on the virtual device, which are streamed to the client.
25*90c8c64dSAndroid Build Coastguard Worker
26*90c8c64dSAndroid Build Coastguard Worker*   **Client**: installed on the client device. It receives the audio and frames
27*90c8c64dSAndroid Build Coastguard Worker    from the host device, which it renders, and sends back input and sensor
28*90c8c64dSAndroid Build Coastguard Worker    data. For best experience with app streaming on multiple displays at the
29*90c8c64dSAndroid Build Coastguard Worker    same time, it's best to use a large screen device as a client, like a Pixel
30*90c8c64dSAndroid Build Coastguard Worker    Tablet.
31*90c8c64dSAndroid Build Coastguard Worker
32*90c8c64dSAndroid Build Coastguard Worker*   **Demos**: installed on the host, meant to showcase specific VDM features.
33*90c8c64dSAndroid Build Coastguard Worker    The demos can be also run natively on the host to illustrate better the
34*90c8c64dSAndroid Build Coastguard Worker    difference in the behavior when they are streamed to a virtual device.
35*90c8c64dSAndroid Build Coastguard Worker
36*90c8c64dSAndroid Build Coastguard Worker## Prerequisites
37*90c8c64dSAndroid Build Coastguard Worker
38*90c8c64dSAndroid Build Coastguard Worker*   An Android device running Android 13 or newer to act as a client device.
39*90c8c64dSAndroid Build Coastguard Worker
40*90c8c64dSAndroid Build Coastguard Worker*   A *rooted* Android device running Android 14 or newer (e.g. a `userdebug` or
41*90c8c64dSAndroid Build Coastguard Worker    `eng` build) to act as a host device. Even though VDM is available starting
42*90c8c64dSAndroid Build Coastguard Worker    Android 13, the support there is minimal and the Host app is not compatible
43*90c8c64dSAndroid Build Coastguard Worker    with Android 13.
44*90c8c64dSAndroid Build Coastguard Worker
45*90c8c64dSAndroid Build Coastguard Worker*   Both devices need to support
46*90c8c64dSAndroid Build Coastguard Worker    [Wi-Fi Aware](https://developer.android.com/develop/connectivity/wifi/wifi-aware)
47*90c8c64dSAndroid Build Coastguard Worker
48*90c8c64dSAndroid Build Coastguard WorkerNote: This example app uses an Android device as a client, but there's no such
49*90c8c64dSAndroid Build Coastguard Workergeneral requirement. The client device, its capabilities, the connectivity layer
50*90c8c64dSAndroid Build Coastguard Workerand the communication protocol are entirely up to the virtual device owner.
51*90c8c64dSAndroid Build Coastguard Worker
52*90c8c64dSAndroid Build Coastguard Worker## Build and Install
53*90c8c64dSAndroid Build Coastguard Worker
54*90c8c64dSAndroid Build Coastguard Worker### Using the script
55*90c8c64dSAndroid Build Coastguard Worker
56*90c8c64dSAndroid Build Coastguard WorkerSimply connect your devices, navigate to the root of your Android checkout and
57*90c8c64dSAndroid Build Coastguard Workerrun
58*90c8c64dSAndroid Build Coastguard Worker
59*90c8c64dSAndroid Build Coastguard Worker```
60*90c8c64dSAndroid Build Coastguard Worker./development/samples/VirtualDeviceManager/setup.sh
61*90c8c64dSAndroid Build Coastguard Worker```
62*90c8c64dSAndroid Build Coastguard Worker
63*90c8c64dSAndroid Build Coastguard WorkerThe interactive script will prompt you which apps to install to which of the
64*90c8c64dSAndroid Build Coastguard Workeravailable devices, build the APKs and install them.
65*90c8c64dSAndroid Build Coastguard Worker
66*90c8c64dSAndroid Build Coastguard Worker### Using adevice on the host device
67*90c8c64dSAndroid Build Coastguard Worker
68*90c8c64dSAndroid Build Coastguard Worker1.  Track the required modules.
69*90c8c64dSAndroid Build Coastguard Worker
70*90c8c64dSAndroid Build Coastguard Worker    ```shell
71*90c8c64dSAndroid Build Coastguard Worker    adevice track VdmHost
72*90c8c64dSAndroid Build Coastguard Worker    adevice track VdmDemos
73*90c8c64dSAndroid Build Coastguard Worker    ```
74*90c8c64dSAndroid Build Coastguard Worker
75*90c8c64dSAndroid Build Coastguard Worker1.  Update the device
76*90c8c64dSAndroid Build Coastguard Worker
77*90c8c64dSAndroid Build Coastguard Worker    ```shell
78*90c8c64dSAndroid Build Coastguard Worker    adevice update
79*90c8c64dSAndroid Build Coastguard Worker    ```
80*90c8c64dSAndroid Build Coastguard Worker
81*90c8c64dSAndroid Build Coastguard Worker### Manually
82*90c8c64dSAndroid Build Coastguard Worker
83*90c8c64dSAndroid Build Coastguard Worker1.  Source `build/envsetup.sh` and run `lunch` or set
84*90c8c64dSAndroid Build Coastguard Worker    `UNBUNDLED_BUILD_SDKS_FROM_SOURCE=true` if there's no local build because
85*90c8c64dSAndroid Build Coastguard Worker    the APKs need to be built against a locally built SDK.
86*90c8c64dSAndroid Build Coastguard Worker
87*90c8c64dSAndroid Build Coastguard Worker1.  Build the Host app.
88*90c8c64dSAndroid Build Coastguard Worker
89*90c8c64dSAndroid Build Coastguard Worker    ```shell
90*90c8c64dSAndroid Build Coastguard Worker    m -j VdmHost
91*90c8c64dSAndroid Build Coastguard Worker    ```
92*90c8c64dSAndroid Build Coastguard Worker
93*90c8c64dSAndroid Build Coastguard Worker1.  Install the application as a system app on the host device.
94*90c8c64dSAndroid Build Coastguard Worker
95*90c8c64dSAndroid Build Coastguard Worker    ```shell
96*90c8c64dSAndroid Build Coastguard Worker    adb root && adb disable-verity && adb reboot  # one time
97*90c8c64dSAndroid Build Coastguard Worker    adb root && adb remount
98*90c8c64dSAndroid Build Coastguard Worker    adb push $ANDROID_BUILD_TOP/development/samples/VirtualDeviceManager/host/com.example.android.vdmdemo.host.xml /system/etc/permissions/com.example.android.vdmdemo.host.xml
99*90c8c64dSAndroid Build Coastguard Worker    adb shell mkdir /system/priv-app/VdmDemoHost
100*90c8c64dSAndroid Build Coastguard Worker    adb push $OUT/system/priv-app/VdmHost/VdmHost.apk /system/priv-app/VdmDemoHost/
101*90c8c64dSAndroid Build Coastguard Worker    adb reboot
102*90c8c64dSAndroid Build Coastguard Worker    ```
103*90c8c64dSAndroid Build Coastguard Worker
104*90c8c64dSAndroid Build Coastguard Worker    **Tip:** Subsequent installs without changes to permissions, etc. do not
105*90c8c64dSAndroid Build Coastguard Worker    need all the commands above - you can just run \
106*90c8c64dSAndroid Build Coastguard Worker    \
107*90c8c64dSAndroid Build Coastguard Worker    `adb install -r -d -g $OUT/system/priv-app/VdmHost/VdmHost.apk`
108*90c8c64dSAndroid Build Coastguard Worker
109*90c8c64dSAndroid Build Coastguard Worker1.  Build and install the Demo app on the host device.
110*90c8c64dSAndroid Build Coastguard Worker
111*90c8c64dSAndroid Build Coastguard Worker    ```shell
112*90c8c64dSAndroid Build Coastguard Worker    m -j VdmDemos && adb install -r -d -g $OUT/system/app/VdmDemos/VdmDemos.apk
113*90c8c64dSAndroid Build Coastguard Worker    ```
114*90c8c64dSAndroid Build Coastguard Worker
115*90c8c64dSAndroid Build Coastguard Worker1.  Build and install the Client app on the client device.
116*90c8c64dSAndroid Build Coastguard Worker
117*90c8c64dSAndroid Build Coastguard Worker    ```shell
118*90c8c64dSAndroid Build Coastguard Worker    m -j VdmClient && adb install -r -d -g $OUT/system/app/VdmClient/VdmClient.apk
119*90c8c64dSAndroid Build Coastguard Worker    ```
120*90c8c64dSAndroid Build Coastguard Worker
121*90c8c64dSAndroid Build Coastguard Worker## Run
122*90c8c64dSAndroid Build Coastguard Worker
123*90c8c64dSAndroid Build Coastguard Worker1.  Start both the Client and the Host apps on each respective device.
124*90c8c64dSAndroid Build Coastguard Worker
125*90c8c64dSAndroid Build Coastguard Worker1.  They should find each other and connect automatically. On the first launch
126*90c8c64dSAndroid Build Coastguard Worker    the Host app will ask to create a CDM association: allow it.
127*90c8c64dSAndroid Build Coastguard Worker
128*90c8c64dSAndroid Build Coastguard Worker    WARNING: If there are other devices in the vicinity with one of these apps
129*90c8c64dSAndroid Build Coastguard Worker    running, they might interfere.
130*90c8c64dSAndroid Build Coastguard Worker
131*90c8c64dSAndroid Build Coastguard Worker1.  Check out the different [Host Options](#host-options) and
132*90c8c64dSAndroid Build Coastguard Worker    [Client Options](#client-options) that allow for changing the behavior of
133*90c8c64dSAndroid Build Coastguard Worker    the streamed apps and the virtual device in general.
134*90c8c64dSAndroid Build Coastguard Worker
135*90c8c64dSAndroid Build Coastguard Worker1.  Check out the [Demo apps](#demos) that are specifically meant to showcase
136*90c8c64dSAndroid Build Coastguard Worker    the VDM features.
137*90c8c64dSAndroid Build Coastguard Worker
138*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.IfChange(host_options) -->
139*90c8c64dSAndroid Build Coastguard Worker
140*90c8c64dSAndroid Build Coastguard Worker## Host Options
141*90c8c64dSAndroid Build Coastguard Worker
142*90c8c64dSAndroid Build Coastguard WorkerNOTE: Any flag changes require device reboot or "Force stop" of the host app
143*90c8c64dSAndroid Build Coastguard Workerbecause the flag values are cached and evaluated only when the host app is
144*90c8c64dSAndroid Build Coastguard Workerstarting. Alternatively, run: \
145*90c8c64dSAndroid Build Coastguard Worker\
146*90c8c64dSAndroid Build Coastguard Worker`adb shell am force-stop com.example.android.vdmdemo.host`
147*90c8c64dSAndroid Build Coastguard Worker
148*90c8c64dSAndroid Build Coastguard Worker### Launcher
149*90c8c64dSAndroid Build Coastguard Worker
150*90c8c64dSAndroid Build Coastguard WorkerOnce the connection with the client device is established, the Host app will
151*90c8c64dSAndroid Build Coastguard Workershow a launcher-like list of installed apps on the host device.
152*90c8c64dSAndroid Build Coastguard Worker
153*90c8c64dSAndroid Build Coastguard Worker-   Clicking an app icon will create a new virtual display, launch the app there
154*90c8c64dSAndroid Build Coastguard Worker    and start streaming the display contents to the client. The client will show
155*90c8c64dSAndroid Build Coastguard Worker    the surface of that display and render its contents.
156*90c8c64dSAndroid Build Coastguard Worker
157*90c8c64dSAndroid Build Coastguard Worker-   Long pressing on an app icon will open a dialog to select an existing
158*90c8c64dSAndroid Build Coastguard Worker    display to launch the app on instead of creating a new one.
159*90c8c64dSAndroid Build Coastguard Worker
160*90c8c64dSAndroid Build Coastguard Worker-   The Host app has a **CREATE HOME DISPLAY** button, clicking it will create a
161*90c8c64dSAndroid Build Coastguard Worker    new virtual display, launch the secondary home activity there and start
162*90c8c64dSAndroid Build Coastguard Worker    streaming the display contents to the client. The display on the Client app
163*90c8c64dSAndroid Build Coastguard Worker    will have a home button, clicking it will navigate the streaming experience
164*90c8c64dSAndroid Build Coastguard Worker    back to the home activity. Run the commands below to enable this
165*90c8c64dSAndroid Build Coastguard Worker    functionality.
166*90c8c64dSAndroid Build Coastguard Worker
167*90c8c64dSAndroid Build Coastguard Worker    ```shell
168*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.vdm_custom_home true
169*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
170*90c8c64dSAndroid Build Coastguard Worker    ```
171*90c8c64dSAndroid Build Coastguard Worker
172*90c8c64dSAndroid Build Coastguard Worker-   The Host app has a **CREATE MIRROR DISPLAY** button, clicking it will create
173*90c8c64dSAndroid Build Coastguard Worker    a new virtual display, mirror the default host display there and start
174*90c8c64dSAndroid Build Coastguard Worker    streaming the display contents to the client.
175*90c8c64dSAndroid Build Coastguard Worker
176*90c8c64dSAndroid Build Coastguard Worker### Settings
177*90c8c64dSAndroid Build Coastguard Worker
178*90c8c64dSAndroid Build Coastguard Worker#### Input
179*90c8c64dSAndroid Build Coastguard Worker
180*90c8c64dSAndroid Build Coastguard WorkerThe input menu button enables several different mechanisms for injecting input
181*90c8c64dSAndroid Build Coastguard Workerfrom the host device into the focused display on the client device. The focused
182*90c8c64dSAndroid Build Coastguard Workerdisplay is indicated by the frame around its header whenever there are more than
183*90c8c64dSAndroid Build Coastguard Workerone displays. The display focus is based on user interaction.
184*90c8c64dSAndroid Build Coastguard Worker
185*90c8c64dSAndroid Build Coastguard WorkerEach input screen has a "Back", "Home" and "Forward" buttons.
186*90c8c64dSAndroid Build Coastguard Worker
187*90c8c64dSAndroid Build Coastguard Worker-   **Touchpad** shows an on-screen touchpad for injecting mouse events into the
188*90c8c64dSAndroid Build Coastguard Worker    focused display.
189*90c8c64dSAndroid Build Coastguard Worker
190*90c8c64dSAndroid Build Coastguard Worker-   **Remote** allows the host device to act as a pointer that controls the
191*90c8c64dSAndroid Build Coastguard Worker    mouse movement on the focused display.
192*90c8c64dSAndroid Build Coastguard Worker
193*90c8c64dSAndroid Build Coastguard Worker-   **Navigation** shows an on-screen D-Pad, rotary and touchpad for navigating
194*90c8c64dSAndroid Build Coastguard Worker    the activity on the focused display.
195*90c8c64dSAndroid Build Coastguard Worker
196*90c8c64dSAndroid Build Coastguard Worker-   **Keyboard** shows the host device's on-screen keyboard and sends any key
197*90c8c64dSAndroid Build Coastguard Worker    events to the activity on the focused display.
198*90c8c64dSAndroid Build Coastguard Worker
199*90c8c64dSAndroid Build Coastguard Worker-   **Stylus** allows for injecting simulated stylus events into the focused
200*90c8c64dSAndroid Build Coastguard Worker    display. Use together with the stylus demo. Run the commands below to enable
201*90c8c64dSAndroid Build Coastguard Worker    this functionality.
202*90c8c64dSAndroid Build Coastguard Worker
203*90c8c64dSAndroid Build Coastguard Worker    ```shell
204*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.virtual_stylus true
205*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
206*90c8c64dSAndroid Build Coastguard Worker    ```
207*90c8c64dSAndroid Build Coastguard Worker
208*90c8c64dSAndroid Build Coastguard Worker#### General
209*90c8c64dSAndroid Build Coastguard Worker
210*90c8c64dSAndroid Build Coastguard Worker-   **Device profile**: Enables device streaming CDM role as opposed to app
211*90c8c64dSAndroid Build Coastguard Worker    streaming role, with all differences in policies that this entails. \
212*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
213*90c8c64dSAndroid Build Coastguard Worker
214*90c8c64dSAndroid Build Coastguard Worker-   **Hide streamed app from recents**: Whether streamed apps should show up in
215*90c8c64dSAndroid Build Coastguard Worker    the host device's recent apps. Run the commands below to make this
216*90c8c64dSAndroid Build Coastguard Worker    functionality dynamic. \
217*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically starting with Android V.*
218*90c8c64dSAndroid Build Coastguard Worker
219*90c8c64dSAndroid Build Coastguard Worker    ```shell
220*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.dynamic_policy true
221*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
222*90c8c64dSAndroid Build Coastguard Worker    ```
223*90c8c64dSAndroid Build Coastguard Worker
224*90c8c64dSAndroid Build Coastguard Worker-   **Enable cross-device clipboard**: Whether to share the clipboard between
225*90c8c64dSAndroid Build Coastguard Worker    the host and the virtual device. If disabled, both devices will have their
226*90c8c64dSAndroid Build Coastguard Worker    own isolated clipboards. Run the commands below to enable this
227*90c8c64dSAndroid Build Coastguard Worker    functionality. \
228*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically.*
229*90c8c64dSAndroid Build Coastguard Worker
230*90c8c64dSAndroid Build Coastguard Worker    ```shell
231*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.dynamic_policy true
232*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.cross_device_clipboard true
233*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
234*90c8c64dSAndroid Build Coastguard Worker    ```
235*90c8c64dSAndroid Build Coastguard Worker
236*90c8c64dSAndroid Build Coastguard Worker-   **Enable custom activity policy**: Whether to use custom user notification
237*90c8c64dSAndroid Build Coastguard Worker    for activities that are unable to launch on the virtual display and send
238*90c8c64dSAndroid Build Coastguard Worker    such activities to the default display, whenever possible. Use together with
239*90c8c64dSAndroid Build Coastguard Worker    the activity policy demo. The behavior of the display fallback launch is
240*90c8c64dSAndroid Build Coastguard Worker    different depending on whether an activity result is expected by the caller,
241*90c8c64dSAndroid Build Coastguard Worker    and on whether the default display keyguard is currently locked. \
242*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically.*
243*90c8c64dSAndroid Build Coastguard Worker
244*90c8c64dSAndroid Build Coastguard Worker    ```shell
245*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.dynamic_policy true
246*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtualdevice.flags.activity_control_api true
247*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
248*90c8c64dSAndroid Build Coastguard Worker    ```
249*90c8c64dSAndroid Build Coastguard Worker
250*90c8c64dSAndroid Build Coastguard Worker#### Client capabilities
251*90c8c64dSAndroid Build Coastguard Worker
252*90c8c64dSAndroid Build Coastguard Worker-   **Enable client Sensors**: Enables sensor injection from the client device
253*90c8c64dSAndroid Build Coastguard Worker    into the host device. Any context that is associated with the virtual device
254*90c8c64dSAndroid Build Coastguard Worker    will access the virtual sensors by default. \
255*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
256*90c8c64dSAndroid Build Coastguard Worker
257*90c8c64dSAndroid Build Coastguard Worker-   **Enable client Camera**: Enables front & back camera injection from the
258*90c8c64dSAndroid Build Coastguard Worker    client device into the host device. (WIP: Any context that is associated
259*90c8c64dSAndroid Build Coastguard Worker    with the virtual device will the virtual cameras by default). Run the
260*90c8c64dSAndroid Build Coastguard Worker    commands below on host device to enable this functionality. \
261*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
262*90c8c64dSAndroid Build Coastguard Worker
263*90c8c64dSAndroid Build Coastguard Worker    ```shell
264*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.virtual_camera true
265*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtualdevice.flags.virtual_camera_service_discovery true
266*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
267*90c8c64dSAndroid Build Coastguard Worker    ```
268*90c8c64dSAndroid Build Coastguard Worker
269*90c8c64dSAndroid Build Coastguard Worker-   **Enable client Audio**: Enables audio output on the client device. Any
270*90c8c64dSAndroid Build Coastguard Worker    context that is associated with the virtual device will play audio on the
271*90c8c64dSAndroid Build Coastguard Worker    client by default. \
272*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically.*
273*90c8c64dSAndroid Build Coastguard Worker
274*90c8c64dSAndroid Build Coastguard Worker#### Displays
275*90c8c64dSAndroid Build Coastguard Worker
276*90c8c64dSAndroid Build Coastguard Worker-   **Display rotation**: Whether orientation change requests from streamed apps
277*90c8c64dSAndroid Build Coastguard Worker    should trigger orientation change of the relevant display. The client will
278*90c8c64dSAndroid Build Coastguard Worker    automatically rotate the relevant display upon such request. Disabling this
279*90c8c64dSAndroid Build Coastguard Worker    simulates a fixed orientation display that cannot physically rotate. Then
280*90c8c64dSAndroid Build Coastguard Worker    any streamed apps on that display will be letterboxed/pillarboxed if they
281*90c8c64dSAndroid Build Coastguard Worker    request orientation change. \
282*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically but only applies to newly created
283*90c8c64dSAndroid Build Coastguard Worker    displays.*
284*90c8c64dSAndroid Build Coastguard Worker
285*90c8c64dSAndroid Build Coastguard Worker-   **Display category**: Whether to specify a custom display category for the
286*90c8c64dSAndroid Build Coastguard Worker    virtual displays. This means that only activities that have explicitly set
287*90c8c64dSAndroid Build Coastguard Worker    a matching `android:requiredDisplayCategory` activity attribute can be
288*90c8c64dSAndroid Build Coastguard Worker    launched on that display. \
289*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
290*90c8c64dSAndroid Build Coastguard Worker
291*90c8c64dSAndroid Build Coastguard Worker-   **Always unlocked**: Whether the virtual displays should remain unlocked and
292*90c8c64dSAndroid Build Coastguard Worker    interactive when the host device is locked. Disabling this will result in a
293*90c8c64dSAndroid Build Coastguard Worker    simple lock screen shown on these displays when the host device is locked. \
294*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
295*90c8c64dSAndroid Build Coastguard Worker
296*90c8c64dSAndroid Build Coastguard Worker-   **Show pointer icon**: Whether pointer icon should be shown for virtual
297*90c8c64dSAndroid Build Coastguard Worker    input pointer devices. \
298*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically.*
299*90c8c64dSAndroid Build Coastguard Worker
300*90c8c64dSAndroid Build Coastguard Worker-   **Custom home**: Whether to use a custom activity as home on home displays,
301*90c8c64dSAndroid Build Coastguard Worker    or use the device-default secondary home activity. Run the commands below to
302*90c8c64dSAndroid Build Coastguard Worker    enable this functionality. \
303*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
304*90c8c64dSAndroid Build Coastguard Worker
305*90c8c64dSAndroid Build Coastguard Worker    ```shell
306*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.vdm_custom_home true
307*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
308*90c8c64dSAndroid Build Coastguard Worker    ```
309*90c8c64dSAndroid Build Coastguard Worker
310*90c8c64dSAndroid Build Coastguard Worker-   **Custom status bar**: Whether to add a custom status bar view on the
311*90c8c64dSAndroid Build Coastguard Worker    non-mirror virtual displays. Run the commands below to enable this
312*90c8c64dSAndroid Build Coastguard Worker    functionality. \
313*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically but only applies to newly created
314*90c8c64dSAndroid Build Coastguard Worker    displays.*
315*90c8c64dSAndroid Build Coastguard Worker
316*90c8c64dSAndroid Build Coastguard Worker    ```shell
317*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtualdevice.flags.status_bar_and_insets true
318*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
319*90c8c64dSAndroid Build Coastguard Worker    ```
320*90c8c64dSAndroid Build Coastguard Worker
321*90c8c64dSAndroid Build Coastguard Worker-   **Display timeout**: Whether to keep the displays always awake or to put
322*90c8c64dSAndroid Build Coastguard Worker    them to sleep after a timeout. Run the commands below to enable this
323*90c8c64dSAndroid Build Coastguard Worker    functionality. \
324*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
325*90c8c64dSAndroid Build Coastguard Worker
326*90c8c64dSAndroid Build Coastguard Worker    ```shell
327*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtualdevice.flags.device_aware_display_power true
328*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
329*90c8c64dSAndroid Build Coastguard Worker    ```
330*90c8c64dSAndroid Build Coastguard Worker
331*90c8c64dSAndroid Build Coastguard Worker-   **Enable client brightness**: Whether to propagate any brightness changes
332*90c8c64dSAndroid Build Coastguard Worker    from the virtual display to the client's display. Run the commands below to
333*90c8c64dSAndroid Build Coastguard Worker    enable this functionality. \
334*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically but only applies to newly created
335*90c8c64dSAndroid Build Coastguard Worker    displays.*
336*90c8c64dSAndroid Build Coastguard Worker
337*90c8c64dSAndroid Build Coastguard Worker    ```shell
338*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtualdevice.flags.device_aware_display_power true
339*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
340*90c8c64dSAndroid Build Coastguard Worker    ```
341*90c8c64dSAndroid Build Coastguard Worker
342*90c8c64dSAndroid Build Coastguard Worker#### Audio
343*90c8c64dSAndroid Build Coastguard Worker
344*90c8c64dSAndroid Build Coastguard Worker-   **Use AudioPolicy.updateMixingRules**: Updates the dynamic AudiPolicy mixing rules
345*90c8c64dSAndroid Build Coastguard Worker    instead of unregistering and re-registering the AudioPolicy.
346*90c8c64dSAndroid Build Coastguard Worker
347*90c8c64dSAndroid Build Coastguard Worker#### Input method
348*90c8c64dSAndroid Build Coastguard Worker
349*90c8c64dSAndroid Build Coastguard WorkerNote: The virtual keyboard acts like a physically connected keyboard to the host
350*90c8c64dSAndroid Build Coastguard Workerdevice. If you want the software keyboard to be shown on the virtual displays,
351*90c8c64dSAndroid Build Coastguard Workeryou likely need to enable this in the host Settings. On a Pixel device: System
352*90c8c64dSAndroid Build Coastguard Worker-> Language and input -> Physical keyboard.
353*90c8c64dSAndroid Build Coastguard Worker
354*90c8c64dSAndroid Build Coastguard Worker-   **Display IME policy**: Choose the IME behavior on remote displays. Run the
355*90c8c64dSAndroid Build Coastguard Worker    commands below to enable this functionality. \
356*90c8c64dSAndroid Build Coastguard Worker    *This can be changed dynamically.*
357*90c8c64dSAndroid Build Coastguard Worker
358*90c8c64dSAndroid Build Coastguard Worker    ```shell
359*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.vdm_custom_ime true
360*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
361*90c8c64dSAndroid Build Coastguard Worker    ```
362*90c8c64dSAndroid Build Coastguard Worker
363*90c8c64dSAndroid Build Coastguard Worker-   **Use the native client IME**: Enables the native client IME instead of
364*90c8c64dSAndroid Build Coastguard Worker    streaming the host's IME on the virtual displays. Requires the *Display IME
365*90c8c64dSAndroid Build Coastguard Worker    Policy* to be set to *Show IME on the remote display*. Run the commands
366*90c8c64dSAndroid Build Coastguard Worker    below to enable this functionality. \
367*90c8c64dSAndroid Build Coastguard Worker    *Changing this will recreate the virtual device.*
368*90c8c64dSAndroid Build Coastguard Worker
369*90c8c64dSAndroid Build Coastguard Worker    ```shell
370*90c8c64dSAndroid Build Coastguard Worker    adb shell device_config put virtual_devices android.companion.virtual.flags.vdm_custom_ime true
371*90c8c64dSAndroid Build Coastguard Worker    adb shell am force-stop com.example.android.vdmdemo.host
372*90c8c64dSAndroid Build Coastguard Worker    ```
373*90c8c64dSAndroid Build Coastguard Worker
374*90c8c64dSAndroid Build Coastguard Worker#### Debug
375*90c8c64dSAndroid Build Coastguard Worker
376*90c8c64dSAndroid Build Coastguard Worker-   **Record encoder output**: Enables recording the output of the encoder on
377*90c8c64dSAndroid Build Coastguard Worker    the host device to a local file on the device. This can be helpful with
378*90c8c64dSAndroid Build Coastguard Worker    debugging Encoding related issues. To download and play the file locally:
379*90c8c64dSAndroid Build Coastguard Worker
380*90c8c64dSAndroid Build Coastguard Worker    ```shell
381*90c8c64dSAndroid Build Coastguard Worker    adb pull /sdcard/Download/vdmdemo_encoder_output_<displayId>.h264
382*90c8c64dSAndroid Build Coastguard Worker    ffplay -f h264 vdmdemo_encoder_output_<displayId>.h264
383*90c8c64dSAndroid Build Coastguard Worker    ```
384*90c8c64dSAndroid Build Coastguard Worker
385*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.ThenChange(README.md) -->
386*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.IfChange(client_options) -->
387*90c8c64dSAndroid Build Coastguard Worker
388*90c8c64dSAndroid Build Coastguard Worker## Client Options
389*90c8c64dSAndroid Build Coastguard Worker
390*90c8c64dSAndroid Build Coastguard Worker### Streamed displays
391*90c8c64dSAndroid Build Coastguard Worker
392*90c8c64dSAndroid Build Coastguard Worker-   Each display on the Client app has a "Back" and "Close" buttons. When a
393*90c8c64dSAndroid Build Coastguard Worker    display becomes empty, it's automatically removed.
394*90c8c64dSAndroid Build Coastguard Worker
395*90c8c64dSAndroid Build Coastguard Worker-   Each display on the Client app has a "Rotate" button to switch between
396*90c8c64dSAndroid Build Coastguard Worker    portrait and landscape orientation. This simulates the physical rotation of
397*90c8c64dSAndroid Build Coastguard Worker    the display of the streamed activity. The "Resize" button can be used to
398*90c8c64dSAndroid Build Coastguard Worker    change the display dimensions.
399*90c8c64dSAndroid Build Coastguard Worker
400*90c8c64dSAndroid Build Coastguard Worker-   Each display on the Client app has a "Fullscreen" button which will move the
401*90c8c64dSAndroid Build Coastguard Worker    contents of that display to an immersive fullscreen activity. The client's
402*90c8c64dSAndroid Build Coastguard Worker    back button/gestures are sent back to the streamed app. Use Volume Down on
403*90c8c64dSAndroid Build Coastguard Worker    the client device to exit fullscreen. Volume Up acts as a home key, if the
404*90c8c64dSAndroid Build Coastguard Worker    streamed display is a home display.
405*90c8c64dSAndroid Build Coastguard Worker
406*90c8c64dSAndroid Build Coastguard Worker### Input
407*90c8c64dSAndroid Build Coastguard Worker
408*90c8c64dSAndroid Build Coastguard WorkerThe input menu button enables **on-screen D-Pad, rotary and touchpad** for
409*90c8c64dSAndroid Build Coastguard Workernavigating the activity on the focused display. The focused display is indicated
410*90c8c64dSAndroid Build Coastguard Workerby the frame around its header whenever there are more than one displays. The
411*90c8c64dSAndroid Build Coastguard Workerdisplay focus is based on user interaction.
412*90c8c64dSAndroid Build Coastguard Worker
413*90c8c64dSAndroid Build Coastguard WorkerIn addition, any input events generated from an **externally connected
414*90c8c64dSAndroid Build Coastguard Workerkeyboard** are forwarded to the activity streamed on the focused display.
415*90c8c64dSAndroid Build Coastguard Worker
416*90c8c64dSAndroid Build Coastguard Worker**Externally connected mouse** events are also forwarded to the relevant
417*90c8c64dSAndroid Build Coastguard Workerdisplay, if the mouse pointer is currently positioned on a streamed display.
418*90c8c64dSAndroid Build Coastguard Worker
419*90c8c64dSAndroid Build Coastguard Worker### Power
420*90c8c64dSAndroid Build Coastguard Worker
421*90c8c64dSAndroid Build Coastguard WorkerThe power menu button acts as a "virtual power button". It will toggle the state
422*90c8c64dSAndroid Build Coastguard Workerof the virtual device and all its displays between ON and OFF.
423*90c8c64dSAndroid Build Coastguard WorkerRun the commands below on the host device to enable this functionality.
424*90c8c64dSAndroid Build Coastguard Worker
425*90c8c64dSAndroid Build Coastguard Worker```shell
426*90c8c64dSAndroid Build Coastguard Workeradb shell device_config put virtual_devices android.companion.virtual.flags.device_aware_display_power true
427*90c8c64dSAndroid Build Coastguard Workeradb shell am force-stop com.example.android.vdmdemo.host
428*90c8c64dSAndroid Build Coastguard Worker```
429*90c8c64dSAndroid Build Coastguard Worker
430*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.ThenChange(README.md) -->
431*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.IfChange(demos) -->
432*90c8c64dSAndroid Build Coastguard Worker
433*90c8c64dSAndroid Build Coastguard Worker## Demos
434*90c8c64dSAndroid Build Coastguard Worker
435*90c8c64dSAndroid Build Coastguard Worker-   **Activity policy**: An activity showcasing blocking of activity launches on
436*90c8c64dSAndroid Build Coastguard Worker    the virtual device - either because the activity has opted out via
437*90c8c64dSAndroid Build Coastguard Worker    `android:canDisplayOnRemoteDevices` attribute, or because of the custom
438*90c8c64dSAndroid Build Coastguard Worker    activity policy of that device.
439*90c8c64dSAndroid Build Coastguard Worker
440*90c8c64dSAndroid Build Coastguard Worker-   **Sensors**: A simple activity balancing a beam on the screen based on the
441*90c8c64dSAndroid Build Coastguard Worker    accelerometer events, which allows for selecting which device's sensor to
442*90c8c64dSAndroid Build Coastguard Worker    use. By default, will use the sensors of the device it's shown on.
443*90c8c64dSAndroid Build Coastguard Worker
444*90c8c64dSAndroid Build Coastguard Worker-   **Display Power**: A simple activity showcasing the behavior of proximity
445*90c8c64dSAndroid Build Coastguard Worker    locks, screen brightness override and requesting the screen to be kept on
446*90c8c64dSAndroid Build Coastguard Worker    or turned on.
447*90c8c64dSAndroid Build Coastguard Worker
448*90c8c64dSAndroid Build Coastguard Worker-   **Rotation**: A simple activity that is in landscape by default and can send
449*90c8c64dSAndroid Build Coastguard Worker    orientation change requests on demand. Showcases the display rotation on the
450*90c8c64dSAndroid Build Coastguard Worker    client, which will rotate the user-visible surface.
451*90c8c64dSAndroid Build Coastguard Worker
452*90c8c64dSAndroid Build Coastguard Worker-   **Home**: A simple activity with utilities around launching HOME and
453*90c8c64dSAndroid Build Coastguard Worker    SECONDARY_HOME Intents, as well as other implicit intents.
454*90c8c64dSAndroid Build Coastguard Worker
455*90c8c64dSAndroid Build Coastguard Worker-   **Secure Window**: A simple activity that declares the Window as secure.
456*90c8c64dSAndroid Build Coastguard Worker    This showcases the FLAG_SECURE streaming policies in VDM.
457*90c8c64dSAndroid Build Coastguard Worker
458*90c8c64dSAndroid Build Coastguard Worker-   **Permissions**: A simple activity with buttons to request and revoke
459*90c8c64dSAndroid Build Coastguard Worker    runtime permissions. This can help test the permission streaming and
460*90c8c64dSAndroid Build Coastguard Worker    device-aware permission features.
461*90c8c64dSAndroid Build Coastguard Worker
462*90c8c64dSAndroid Build Coastguard Worker-   **Latency**: Renders a simple counter view that renders a new frame with an
463*90c8c64dSAndroid Build Coastguard Worker    incremented counter every second. Can be useful for debugging latency,
464*90c8c64dSAndroid Build Coastguard Worker    encoder, decoder issues in the demo application.
465*90c8c64dSAndroid Build Coastguard Worker
466*90c8c64dSAndroid Build Coastguard Worker-   **Vibration**: A simple activity making vibration requests via different
467*90c8c64dSAndroid Build Coastguard Worker    APIs and allows for selecting which device's vibrator to use. By default,
468*90c8c64dSAndroid Build Coastguard Worker    will use the vibrator of the device it's shown on. Note that currently there
469*90c8c64dSAndroid Build Coastguard Worker    is no vibration support on virtual devices, so vibration requests from
470*90c8c64dSAndroid Build Coastguard Worker    streamed activities are ignored.
471*90c8c64dSAndroid Build Coastguard Worker
472*90c8c64dSAndroid Build Coastguard Worker-   **Stylus**: A simple drawing activity that reacts on stylus input events.
473*90c8c64dSAndroid Build Coastguard Worker    Use together with the simulated stylus input feature of the host app.
474*90c8c64dSAndroid Build Coastguard Worker
475*90c8c64dSAndroid Build Coastguard Worker-   **Recorder**: A simple activity that can start multiple audio recorders.
476*90c8c64dSAndroid Build Coastguard Worker    This helps test audio recording permissions and concurrent recordings.
477*90c8c64dSAndroid Build Coastguard Worker
478*90c8c64dSAndroid Build Coastguard WorkerThe demo activity depends on whether the **Display Category** Host preference is
479*90c8c64dSAndroid Build Coastguard Workerenabled or not. If enabled, it becomes equivalent to the **Home** demo activity,
480*90c8c64dSAndroid Build Coastguard Workerwhich showcases implicit intent handling.
481*90c8c64dSAndroid Build Coastguard Worker
482*90c8c64dSAndroid Build Coastguard Worker<!-- LINT.ThenChange(README.md) -->
483*90c8c64dSAndroid Build Coastguard Worker
484*90c8c64dSAndroid Build Coastguard Worker## SDK Version
485*90c8c64dSAndroid Build Coastguard Worker
486*90c8c64dSAndroid Build Coastguard Worker### Android 16 / Baklava
487*90c8c64dSAndroid Build Coastguard Worker
488*90c8c64dSAndroid Build Coastguard Worker-   Added support for custom power management.
489*90c8c64dSAndroid Build Coastguard Worker
490*90c8c64dSAndroid Build Coastguard Worker-   Added support for custom system windows (like status bar) and insets.
491*90c8c64dSAndroid Build Coastguard Worker
492*90c8c64dSAndroid Build Coastguard Worker-   Added support for per-display activity policies.
493*90c8c64dSAndroid Build Coastguard Worker
494*90c8c64dSAndroid Build Coastguard Worker-   Added support for custom redirection of blocked activities.
495*90c8c64dSAndroid Build Coastguard Worker
496*90c8c64dSAndroid Build Coastguard Worker-   Added support for hiding the blocked activity dialog.
497*90c8c64dSAndroid Build Coastguard Worker
498*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual display cutout.
499*90c8c64dSAndroid Build Coastguard Worker
500*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual display rotation.
501*90c8c64dSAndroid Build Coastguard Worker
502*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual rotary input.
503*90c8c64dSAndroid Build Coastguard Worker
504*90c8c64dSAndroid Build Coastguard Worker### Android 15 / Vanilla Ice Cream / SDK level 35
505*90c8c64dSAndroid Build Coastguard Worker
506*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual camera.
507*90c8c64dSAndroid Build Coastguard Worker
508*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual stylus input.
509*90c8c64dSAndroid Build Coastguard Worker
510*90c8c64dSAndroid Build Coastguard Worker-   Added support for cross-device clipboard.
511*90c8c64dSAndroid Build Coastguard Worker
512*90c8c64dSAndroid Build Coastguard Worker-   Added support for custom home activities.
513*90c8c64dSAndroid Build Coastguard Worker
514*90c8c64dSAndroid Build Coastguard Worker-   Added support for custom IME component.
515*90c8c64dSAndroid Build Coastguard Worker
516*90c8c64dSAndroid Build Coastguard Worker-   Added support for per-display IME policy.
517*90c8c64dSAndroid Build Coastguard Worker
518*90c8c64dSAndroid Build Coastguard Worker-   Added support for fixed orientation displays (disable display rotation).
519*90c8c64dSAndroid Build Coastguard Worker
520*90c8c64dSAndroid Build Coastguard Worker-   Added support for mirroring the default display on the virtual device.
521*90c8c64dSAndroid Build Coastguard Worker
522*90c8c64dSAndroid Build Coastguard Worker-   Added support for dynamic policy changes, so the device does not need to be
523*90c8c64dSAndroid Build Coastguard Worker    recreated.
524*90c8c64dSAndroid Build Coastguard Worker
525*90c8c64dSAndroid Build Coastguard Worker-   Improved support for displays that support home activities. Removed
526*90c8c64dSAndroid Build Coastguard Worker    navigation bar and added support for normal home intents.
527*90c8c64dSAndroid Build Coastguard Worker
528*90c8c64dSAndroid Build Coastguard Worker-   Improved handling of vibrating requests originating from virtual devices.
529*90c8c64dSAndroid Build Coastguard Worker
530*90c8c64dSAndroid Build Coastguard Worker-   Improved multi-display mouse support.
531*90c8c64dSAndroid Build Coastguard Worker
532*90c8c64dSAndroid Build Coastguard Worker-   Fixed bugs with hiding streamed apps from the host's recent apps.
533*90c8c64dSAndroid Build Coastguard Worker
534*90c8c64dSAndroid Build Coastguard Worker### Android 14 / Upside Down Cake / SDK level 34
535*90c8c64dSAndroid Build Coastguard Worker
536*90c8c64dSAndroid Build Coastguard Worker-   Added support for display categories and restricted activities.
537*90c8c64dSAndroid Build Coastguard Worker
538*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual sensors.
539*90c8c64dSAndroid Build Coastguard Worker
540*90c8c64dSAndroid Build Coastguard Worker-   Added device awareness to contexts.
541*90c8c64dSAndroid Build Coastguard Worker
542*90c8c64dSAndroid Build Coastguard Worker-   Added support for clipboard on the virtual device.
543*90c8c64dSAndroid Build Coastguard Worker
544*90c8c64dSAndroid Build Coastguard Worker-   Added support for hiding streamed apps from the host's recent apps.
545*90c8c64dSAndroid Build Coastguard Worker
546*90c8c64dSAndroid Build Coastguard Worker-   Added `COMPANION_DEVICE_NEARBY_DEVICE_STREAMING` device profile.
547*90c8c64dSAndroid Build Coastguard Worker
548*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual navigation input: D-Pad and navigation touchpad.
549*90c8c64dSAndroid Build Coastguard Worker
550*90c8c64dSAndroid Build Coastguard Worker-   Added support for display categories and restricted activities.
551*90c8c64dSAndroid Build Coastguard Worker
552*90c8c64dSAndroid Build Coastguard Worker-   Improved support for audio, allowing routing to be based on the origin
553*90c8c64dSAndroid Build Coastguard Worker    context.
554*90c8c64dSAndroid Build Coastguard Worker
555*90c8c64dSAndroid Build Coastguard Worker-   Improved support for creation of virtual displays and input devices.
556*90c8c64dSAndroid Build Coastguard Worker
557*90c8c64dSAndroid Build Coastguard Worker-   Improved handling of virtual touch events.
558*90c8c64dSAndroid Build Coastguard Worker
559*90c8c64dSAndroid Build Coastguard Worker### Android 13 / Tiramisu / SDK level 33
560*90c8c64dSAndroid Build Coastguard Worker
561*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual audio device.
562*90c8c64dSAndroid Build Coastguard Worker
563*90c8c64dSAndroid Build Coastguard Worker-   Added support for hiding the mouse pointer icon.
564*90c8c64dSAndroid Build Coastguard Worker
565*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual mouse, keyboard, touchscreen.
566*90c8c64dSAndroid Build Coastguard Worker
567*90c8c64dSAndroid Build Coastguard Worker-   Added support for always unlocked displays.
568*90c8c64dSAndroid Build Coastguard Worker
569*90c8c64dSAndroid Build Coastguard Worker-   Added `COMPANION_DEVICE_APP_STREAMING` device profile.
570*90c8c64dSAndroid Build Coastguard Worker
571*90c8c64dSAndroid Build Coastguard Worker-   Added support for virtual device creation.
572