Accessibility

webRoid follows the accessibility settings you have already chosen on your device. There is nothing to switch on inside the app: change a setting in Android’s Settings and webRoid responds.

This page describes what each setting changes, where a code editor behaves differently from an ordinary app, and what is not supported yet. If something here does not match what you find, that is a bug and we would like to hear about it.

TalkBack

Buttons that are only an icon, and would otherwise be announced as the name of their glyph, are named for what they do: the console’s history arrows read “Previous command” and “Next command”, the magnifier beside the input reads “Search history”, and the same is true of the file browser’s buttons, the find-and-replace bar and the plot viewer’s zoom buttons. The buttons on a row say which item they belong to: “Options for analysis.R” on a file, “Close analysis.R tab” on an editor tab, “Edit my-header” on a snippet, “Move up: Insert pipe operator” in R Toolbar Buttons. In the completion list, each suggestion’s type is read as a word, “Function” or “Argument”, rather than the letter on its badge. The Editor’s Run button is announced as “Run selection” while text is selected, since that is what it will run.

File, variable and package rows announce as buttons and read their contents in one pass. A file row gives its name and details together, a variable row its name, type and value, and a plot thumbnail says whether it is pinned, new or selected. Editor tabs announce as tabs, say which one is selected, and add “modified” when a file has unsaved changes. The arrow at the end of a Settings row is marked as decorative, so the row is announced once rather than twice.

Each switch in Settings is a single control named by its label: TalkBack reads the setting’s name, that it is a switch, and whether it is on, in one stop, instead of the label followed by an unnamed switch. The gist sheet’s Public Gist switch and Save token securely checkbox work the same way, as do the Startup Log, Error Log and Session End Log switches in Send Feedback (whose View buttons stay separate), and the checkboxes in the data frame’s column filter and in the import wizard. A theme in the Light Theme and Dark Theme lists is one radio button in a group. Rows that expand, such as Light Theme and the theme editor’s Advanced Colors, say whether they are expanded or collapsed.

webRoid is in English only, and TalkBack reads all of it in English, including the labels of controls Android supplies, such as a bottom sheet’s drag handle, whatever language the device is set to.

Screen titles and section headers are marked as headings, so TalkBack’s heading navigation moves from section to section. The first-launch pages say where you are, “Page 3 of 7”, and say it again after each swipe. The Plots tab reads the number of new plots with its name, “Plots, 3 new”, and the tab bar’s More sheet is announced by name when it opens.

Output announces its severity

Output in the console and in the Editor’s output panel is color-coded: red for errors, amber for warnings, grey for messages. Color alone is no use to a screen reader, so a line is announced with its kind first. An error reads as “Error: could not find function ‘summry’”, a warning as “Warning: …”, a message as “Message: …”, and anything R wrote to standard error as “Standard error: …”. Ordinary results and your own input are read as they are, with no prefix, because there is nothing to distinguish. On screen, warning and error lines also start with an icon, so they can be told apart without color.

Console after a few commands. The warning from warning(“this is a warning”) is amber and starts with a triangle icon. The two errors, from stop(“an error occurred!”) and from typing y, are red and each start with a stop-sign shaped icon holding an exclamation mark

Console after a few commands. The warning from warning(“this is a warning”) is amber and starts with a triangle icon. The two errors, from stop(“an error occurred!”) and from typing y, are red and each start with a stop-sign shaped icon holding an exclamation mark, in dark mode

New output is announced as it arrives, politely, without pulling focus away from what you are doing. A few lines are read out whole; a longer burst is read as a count of lines, the first error if there is one, and the last line. If R stops responding, the banner that offers Restart R is announced straight away. The Packages removed by the update notice is read when it appears and as a reinstall goes on; in the Workspace, where the Console and Packages panes both show it, it is read once.

Long-press actions are in the actions menu

TalkBack takes the long press for itself, which would make anything reached that way unreachable. Those operations are labeled so they appear in TalkBack’s actions menu instead: Rename tab on an editor tab, Show variable actions on a variable in the Environment, Show package options on a package, Share plot on a plot thumbnail, and Show column details on a column header in the data frame viewer. A History entry, which you would otherwise swipe away, offers Delete there too.

A console line is text you can select, so a long press there selects part of it, and copying the whole line is Copy line in the menu the selection brings up. TalkBack offers the whole line as Copy to clipboard in the actions menu. The Editor’s output panel is selectable in the same way, and its Copy all output button copies every line.

With a mouse, a trackpad or a stylus, a right-click (a trackpad’s two-finger click, or a stylus’s side button) does what a long press does, such as opening a variable’s actions or sharing a plot, and never also does what a tap would.

Zooming plots without a pinch

Pinch and double-tap are gestures TalkBack cannot perform. The plot detail view, the comparison view and the full-screen view opened from the floating overlay offer Zoom in, Zoom out and Reset zoom in the actions menu on the plot itself, and draw the same controls as buttons over the plot for anyone who can see it but cannot pinch. The detached plot window, opened with Detach to window, has them too. With a mouse or trackpad, Ctrl and the scroll wheel (or Ctrl and a two-finger scroll) zoom the detail view, the full-screen view and the detached window a step at a time.

Plot detail view showing a histogram, with three round buttons in a row at the bottom of the plot: Zoom out, Reset zoom and Zoom in

Plot detail view showing a histogram, with three round buttons in a row at the bottom of the plot: Zoom out, Reset zoom and Zoom in, in dark mode

A pinch on the Editor’s code changes its size. The same setting, without a gesture, is the Editor’s Font Size slider in Settings > Editor; see Editor Font Size.

Resizing panes without dragging

In Workspace layout the dividers between panes are 8dp drag strips, well under the minimum touch target and impossible to use without a precise drag. Each one is a labeled control that says which panes it sits between, and it carries two actions, Grow the first pane and Shrink the first pane, that move it a step at a time. The Editor’s split divider announces where the split currently sits, as a percentage of each side, and carries Widen the left pane and Narrow the left pane. Both kinds of divider also take keyboard focus and move with the arrow keys; see Hardware keyboards. Under a mouse pointer, a divider shows a left-right or up-down resize arrow.

Remove animations

Android’s Settings > Accessibility > Remove animations (the same switch that Developer options calls animator duration scale) is honoured. Nothing slides, unrolls or bounces. The navigation rail in Sidebar layout, the light and dark theme pickers in Settings, the advanced colors in the theme editor, the editor’s find bar, the package installation banner and the floating plot overlay appear and disappear in place, and a new plot’s thumbnail takes its highlight in the gallery without bouncing. You still see each change, without the travel.

The R runtime’s loading bar still fills as R starts, because it shows real progress. A bar that only sweeps to show that work is under way, such as the one in the package installation banner, stands still while animations are removed.

Time to take action

The floating plot overlay, which appears for a new plot when New Plot Display is set to Floating, dismisses itself after five seconds. If you have set Time to take action in Android’s accessibility settings, it waits that long instead, and it stays for as long as you touch, drag or focus it.

Text size

Text is laid out in scalable units throughout, so Android’s Font size and Display size settings apply across the app, the console and the editor included.

Code is the place to watch. The console and the editor have their own size sliders in Settings, and the system font scale applies on top of what you set there, so a large system size and a large slider size compound. If code is wrapping awkwardly, turn the slider down rather than the system setting.

The first-launch pages and the loading screen scroll once their content no longer fits, so at the largest sizes nothing on them, the storage page’s Choose Folder button included, is pushed off the screen.

The main screens, the first-launch pages and the loading screen are checked automatically at twice the default font size, the largest Android offers, for text that clips and controls that are pushed off the screen or squeezed to nothing. Not every sheet and dialog has been checked that way, or at the largest sizes on a device. If a label clips, or two controls overlap, please tell us which screen and which size.

Colour and contrast

The Default themes meet WCAG AA as they ship. In Default Light and Default Dark, every text color clears 4.5:1 on every surface the app draws on, sheets and dialogs included: secondary text, the accent, and the colors for errors, warnings and success as well as ordinary text. Every syntax color clears it against the editor background and the highlighted line under the cursor. Errors and warnings also carry an icon and are announced by name to TalkBack, so no information is carried by color alone.

The other built-in themes are reproductions. Dracula, Solarized Light, Solarized Dark, Monokai, One Dark, GitHub Light and Nord are faithful copies of palettes from other editors, and some of them place comments well below AA by design. At Android’s standard contrast level they are drawn as designed, because a theme that does not look like the one you picked is not that theme.

Android’s contrast level reaches every theme. Android 14 and later offer a contrast level of Standard, Medium or High, in the accessibility or display settings depending on the device, and webRoid follows it while it runs. At Medium, any text color in the current theme that falls below 4.5:1 on its background is darkened or lightened until it reaches it; at High, until it reaches 7:1, as far as the background allows. That covers the reproduction themes and your own custom and imported themes alike, and only the colors that fall short move. See Contrast in the Themes guide.

Hardware keyboards

webRoid works with a Bluetooth keyboard or a keyboard case. The editor’s shortcuts can be rebound from Settings > Editor > Keyboard Shortcuts; the console’s own keys, and Undo and Redo, are fixed. In the console, the up and down arrow keys walk through command history, and Down past the newest command brings back the line you were typing; Enter runs the current line, Ctrl+K clears the console and Ctrl+F searches its history. Press Meta+/ to see the console, editor and app-wide shortcuts in Android’s keyboard shortcuts list. The full list of defaults is in the Settings guide.

With a keyboard attached, the console prompt has focus as soon as R has loaded (or the Editor’s code, where the Editor is on screen without the console), so you can type straight away. Without a keyboard nothing takes focus, so the on-screen keyboard does not open unasked. Move Focus to Editor (Ctrl+1) and Move Focus to Console (Ctrl+2) move between the two from any pane, and in the Tab Bar and Sidebar layouts they switch to that screen first. Tab, Shift+Tab and the arrow keys pass over the console’s output lines instead of stopping on each one.

The code completion list, at the console prompt and in the editor, works from the keyboard. While it is open, Up and Down move through the suggestions, in place of walking the history at the prompt or moving the cursor in the editor. Once one is highlighted, Enter or Tab inserts it; until then Enter does what it always does, running the command at the prompt or starting a new line in the editor. Escape closes the list.

The Workspace pane dividers and the Editor’s split divider take focus like any other control. With one focused, the arrow keys along the direction it moves step it: Left and Right for a divider between side-by-side panes, Up and Down for one between stacked panes.

Haptics

Short vibrations mark actions such as running code, saving a file or installing a package. If you find them distracting, or your device’s motor is loud, turn off Haptic Feedback in Settings > Appearance.

Anything missing?

If something does not work as described here, or a control is not reachable the way you need it to be, please get in touch. Accessibility problems are treated as bugs, not feature requests.