I have a lot of patience for bugs that only bite me. I have none for watching the same rot land on someone else, and this one landed on a user of Backtalk.
I haven't written about Backtalk here yet; a proper post is coming. It's a fork of Google's TalkBack, built in the open by a handful of blind developers who got tired of waiting for Google to clean up decades of rot. It merges every Google source release and fixes what Google won't: swiping that no longer rebuilds the reading order of the whole screen three times per swipe, the circle menu and pause that TalkBack dropped after 8.1, a rotor, a distinct vibration for every sound, direct touch for audio games, braille keyboard fixes, and on-device image descriptions. A few people, in their own time, doing the work a company worth trillions won't.
My fork installs alongside upstream as Backtalk Aaron. One of our testers, very brave for running my dev builds on their actual phone, put both on the accessibility shortcut to flip between them. Two screen readers on one shortcut, which is exactly where Google's shortcut menu falls on its face.
So at one in the morning I had one of my fuck it moments, and ten minutes later it was fixed. Google has had years.
The menu that can't talk
Android's accessibility shortcut, holding both volume keys by default, toggles whatever feature you assign to it. Assign one and it works. Assign more than one and it stops toggling and asks which one you want instead.
That menu does not speak.
The menu whose entire purpose is to turn on your screen reader appears silently, at the one moment when, by definition, no screen reader is running. A visual chooser for the tool that replaces vision. You hold the volume keys, feel the buzz, and you're prodding at glass hoping to fuck you hit the screen reader and not Cancel, or magnification, or the wrong TalkBack.
On a freshly reset phone, or with one feature assigned, the shortcut just turns TalkBack on. I'm sure that's the case someone tested and ticked off. But needing more than one accessibility service isn't an edge case. It's a low vision user who switches between magnification and a screen reader. It's someone using Select to Speak and TalkBack for different jobs. It's every trainer, developer and tester. It's a blind person with more than one tool, the way every sighted person has more than one app. Adding a second service is the platform working as designed, and the moment you do it, the one thing meant to get you back to speech when everything else has gone wrong stops working. Screen reader crashes mid-call? Find a sighted person. That's the fallback. It shouldn't need one. It should just work.
Everyone else worked this out years ago
Apple had this right years ago: stack several features on the iPhone's shortcut and the menu is usable by the people it's for. Microsoft had a self-voicing Ease of Access Center in Windows 7, in 2009, reading its options aloud from the logon screen before any screen reader was running. If you put a screen reader behind a menu, the menu has to talk. Google has had the volume-key shortcut since Android 8 and still hasn't grasped that.
So I fixed it
Shortcut Menu is an accessibility service you put on the shortcut by itself. Hold the volume keys and:
- With no screen reader on, the menu speaks. Drag your finger to hear each choice and its state, "Backtalk, off", and lift to pick it. The choices fill the screen with Close at the bottom, so there's always something under your finger. It speaks at the accessibility volume, so a muted media volume doesn't silence it.
- With a screen reader on, it's a list of buttons your screen reader reads normally.
Turning one screen reader on turns the others off, so two never talk at once. Services with the same name are labelled by maker, "TalkBack (Samsung)", because Android will happily show you two identical entries called TalkBack. Pressing the shortcut again closes the menu. Choosing a service writes Android's enabled services list directly, so you skip the "Allow full control?" dialog, which also doesn't speak.
The bit that makes me angrier
It needs a computer. Writing that list needs WRITE_SECURE_SETTINGS, which Android only grants through adb or Shizuku. One command, once, but still a command line between a blind person and a working shortcut. Backtalk hits the same wall for switching call audio to the speaker and for migrating app IDs. Every time a small team does what Google should have, their users pay a toll in terminal commands.
None of that is because the job is hard. It's because only the system is allowed to do it, and Google is the system. Every limitation in my README is one Google doesn't have.
The whole fix, Google:
- When no screen reader is running, the shortcut chooser speaks. Touch to explore, lift to select.
- Lay the choices out so there's always a target under the finger.
- Label services that share a name by who makes them.
- Make screen readers mutually exclusive when toggled from the shortcut.
It's shorter than my README.
Ten minutes of my time
Alphabet makes hundreds of billions a year. It employs people with accessibility in their job titles, publishes inclusion blog posts every May, and puts blind people in its adverts. The complete fix for this cost one blind developer ten minutes, and it's sitting in a public repo under a licence that lets Google take it for free.
Google could have paid for those ten minutes at any rate you like and it would round to nothing. It could have paid any blind TalkBack user to hold the volume keys and say "this doesn't talk" before it shipped. It didn't, and it won't. This was never a hard problem or a resources problem. Blind people's time is the one resource Google treats as worthless, so it never buys any, ships menus that break the moment we touch them, and waits for us to fix them for free.
And we do. Backtalk is blind developers doing, unpaid, in their evenings, what Google's accessibility team is paid to do. Google pockets the difference and its marketing takes the credit.
Nobody at Google decided to build a silent menu for turning on screen readers. That isn't a defence. Nobody had to decide, because nobody in the process needed it to work and nobody who did was asked. This is what indifference with a budget looks like at scale.
If you're stuck with a multi-service shortcut you can't use, grab Shortcut Menu. And if you work on Android accessibility at Google: it's Apache 2.0. Take it. You don't even have to pay me, which I know is how you like it. Just ship it, so I can delete the repo.