Demo mode for the status bar allows you to force the status bar into a fixed state, useful for taking screenshots with a consistent status bar state, or testing different status icon permutations. Demo mode is available in recent versions of Android.
Demo mode is protected behind a system setting. To enable it for a device, run:
adb shell settings put global sysui_demo_allowed 1
The protocol is based on broadcast intents, and thus can be driven via the command line (adb shell am broadcast) or an app (Context.sendBroadcast).
com.android.systemui.demo
Commands and subcommands (below) are sent as string extras in the broadcast intent.
Commands are sent as string extras with key command (required). Possible values are:
| Command | Subcommand | Argument | Description |
|---|---|---|---|
enter | Enters demo mode, bar state allowed to be modified (for convenience, any of the other non-exit commands will automatically flip demo mode on, no need to call this explicitly in practice) | ||
exit | Exits demo mode, bars back to their system-driven state | ||
battery | Control the battery display | ||
level | Sets the battery level (0 - 100) | ||
plugged | Sets charging state (true, false) | ||
powersave | Sets power save mode (true, anything else) | ||
network | Control the RSSI display | ||
airplane | show to show icon, any other value to hide | ||
fully | Sets MCS state to fully connected (true, false) | ||
wifi | show to show icon, carriermerged to show a carrier merged (W+) connection, any other value to hide | ||
level | Sets wifi level (null or 0-4) | ||
hotspot | Sets the wifi to be from an Instant Hotspot. Values: none, unknown, phone, tablet, laptop, watch, auto. (See DemoModeWifiDataSource.kt.) | ||
numlevels | Sets the default maximum number of levels (typically 5) | ||
inflate | True if numlevels should be increased by 1 (represents a carrier configuration) | ||
mobile | show to show icon, any other value to hide | ||
datatype | Values: 1x, 3g, 4g, e, g, h, lte, roam, any other value to hide | ||
level | Sets mobile signal strength level (null or 0-4) | ||
slot | Sets the subscription ID for this demo mobile icon. Allows you to have multiple demo SIMs. | ||
inflate | True if there should be 5 bars instead of 4 | ||
satellite | show to show icon, any other value to hide | ||
connection | connected, off, on, or unknown (matches SatelliteConnectionState enum) | ||
level | Sets satellite signal strength level (0-4) | ||
carriernetworkchange | Sets mobile signal icon to carrier network change UX when disconnected (show to show icon, any other value to hide) | ||
sims | Sets the number of sims (1-8) | ||
nosim | show to show icon, any other value to hide | ||
bars | Control the visual style of the bars (opaque, translucent, etc) | ||
mode | Sets the bars visual style (opaque, translucent, semi-transparent) | ||
status | Control the system status icons | ||
volume | Sets the icon in the volume slot (silent, vibrate, any other value to hide) | ||
bluetooth | Sets the icon in the bluetooth slot (connected, disconnected, any other value to hide) | ||
location | Sets the icon in the location slot (show, any other value to hide) | ||
alarm | Sets the icon in the alarm_clock slot (show, any other value to hide) | ||
sync | Sets the icon in the sync_active slot (show, any other value to hide) | ||
tty | Sets the icon in the tty slot (show, any other value to hide) | ||
eri | Sets the icon in the cdma_eri slot (show, any other value to hide) | ||
mute | Sets the icon in the mute slot (show, any other value to hide) | ||
speakerphone | Sets the icon in the speakerphone slot (show, any other value to hide) | ||
notifications | Control the notification icons | ||
visible | false to hide the notification icons, any other value to show | ||
clock | Control the clock display | ||
millis | Sets the time in millis | ||
hhmm | Sets the time in hh:mm |
Enter demo mode
adb shell am broadcast -a com.android.systemui.demo -e command enter
Exit demo mode
adb shell am broadcast -a com.android.systemui.demo -e command exit
Set the clock to 12:31
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1231
Set mobile to 3 bars with LTE
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 3 -e datatype lte
Set mobile to no bars with 3g
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 0 -e datatype 3g
Set 2 SIMs with the same number of levels (so they'll be stacked)
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e slot 10 -e level 1 adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e slot 11 -e level 2
Set 2 SIMs with different number of levels
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e slot 10 -e level 1 -e inflate false adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e slot 11 -e level 2 -e inflate true
Set the wifi level to max
adb shell am broadcast -a com.android.systemui.demo -e command network -e wifi show -e level 4
Set carrier merged to max
adb shell am broadcast -a com.android.systemui.demo -e command network -e wifi carriermerged -e slot 3 -e level 4 -e numlevels 5
Show the satellite icon
# Sets mobile to be out-of-service, which is required for satellite to show adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 0 # Sets satellite to be connected adb shell am broadcast -a com.android.systemui.demo -e command network -e satellite show -e level 4 -e connection connected
Show the silent volume icon
adb shell am broadcast -a com.android.systemui.demo -e command status -e volume silent
Empty battery, and not charging (red exclamation point)
adb shell am broadcast -a com.android.systemui.demo -e command battery -e level 0 -e plugged false
Hide the notification icons
adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false
Exit demo mode
adb shell am broadcast -a com.android.systemui.demo -e command exit
frameworks/base/tests/SystemUIDemoModeController
#!/bin/sh CMD=$1 if [[ $ADB == "" ]]; then ADB=adb fi if [[ $CMD != "on" && $CMD != "off" ]]; then echo "Usage: $0 [on|off] [hhmm]" >&2 exit fi if [[ "$2" != "" ]]; then HHMM="$2" fi $ADB root || exit $ADB wait-for-devices $ADB shell settings put global sysui_demo_allowed 1 if [ $CMD == "on" ]; then $ADB shell am broadcast -a com.android.systemui.demo -e command enter || exit if [[ "$HHMM" != "" ]]; then $ADB shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm ${HHMM} fi $ADB shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false $ADB shell am broadcast -a com.android.systemui.demo -e command battery -e level 100 $ADB shell am broadcast -a com.android.systemui.demo -e command network -e wifi show -e level 4 $ADB shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e datatype none -e level 4 $ADB shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false elif [ $CMD == "off" ]; then $ADB shell am broadcast -a com.android.systemui.demo -e command exit fi
SysUI also has a TunerActivity that can customize other behaviors of the status bar, like showing seconds in the clock. It is not officially supported as of Android P, but we do still have some support in code for it.
See go/enable-sysui-tuner for directions on enabling and launching the Tuner activity. Copied here for reference:
adb root && adb shell pm enable com.android.systemui/.tuner.TunerActivity && adb shell am start -n com.android.systemui/.tuner.TunerActivity
After running the above, you can also find the Tuner activity in the Settings app: Android Settings > System > System UI Tuner