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