CHANGELOG.md (21645 bytes)
1 # Changelog 2 3 ## 0.1.1-beta - 2026-09-21 4 5 Version code 17. The source code is now public under GPL-3.0-or-later. 6 7 - **F-Droid.** A new build, the `fdroid` flavour, is free and complete. It has 8 no licence check, no Google Play Billing and no apps of other makers inside. 9 Its permissions are those of the `full` build, less the permission to 10 install apps. F-Droid builds each new `v*` tag by itself; see `fdroid/`. 11 - The `play` and `full` builds do not change. 12 13 ## 0.1.0-beta - 2026-09-21 14 15 Version code 16. The first beta. The alpha versions end here. 16 17 - **Updates: Ink Update.** Rebind has no internet permission, so it cannot 18 look for a new version. Ink Update, an open source app of its own, does 19 that: F-Droid first, then Google Play (it leaves an app that Google Play 20 installed to Google Play), then GitHub. It makes a notification and opens 21 the page. Setup has an "Updates" row that installs or opens it. The build 22 for direct install carries it. 23 - The build for direct install carries Ink Dim too. Hardware hacks lists it. 24 - The lists of carried apps are named "Extensions". 25 26 - **Settings are safe across versions and across an uninstall.** An update 27 always kept the settings: they are in the data of the app. An uninstall 28 removed them. Now Android asks at uninstall whether to keep the data 29 (`hasFragileUserData`), and Rebind keeps an automatic copy of the settings in 30 `Documents/Rebind/rebind-settings.json`, which an uninstall does not touch. 31 Import opens that folder. `StoredFormatTest` holds the texts that every 32 0.0.x version stored, so a new version cannot stop reading them unseen. 33 34 ## 0.0.15-alpha - 2026-09-21 35 36 Version code 15. 37 38 - **The Recents button opens Ink Recents.** Android does not let an app take 39 the place of the recent-apps screen of the system. Rebind now sees that 40 screen open (the task manager of the Viwoods launcher, or the stock Android 41 one), closes it, and opens Ink Recents. It works for the Recents button of 42 the bar, for the swipe, and for the Recents action. Home and recents has the 43 switch "Recents button opens Ink Recents". It is on when Ink Recents is 44 installed. Tests: `SystemRecentsTest`. 45 46 ## 0.0.14-alpha - 2026-09-21 47 48 Version code 14. 49 50 - **Permissions covers the extensions again.** New items, each only where it 51 can apply: "Install apps from Rebind" (the build that carries apps), "Ink 52 Recents: app usage data" (when Ink Recents is installed), and "Home screen" 53 to choose inkOS or ThinkLauncher (when one is installed). "Set up what is 54 missing" walks through them too. The main screen still counts only the 55 grants of Rebind itself. 56 - **Fix: voice typing said "The microphone is not allowed" although it was 57 allowed.** Android gives the microphone to an app only while that app is in 58 use. The Viwoods firmware does not count a speech app as in use while it 59 listens in the background for another app, so Whisper was refused (error 60 9). Rebind now goes to the speech screen of the speech app, where that app 61 is in use, takes the words from its result, and remembers the route. 62 Regression test: `DictationRouteTest`. 63 - **Fix: "Let Rebind get the Power hold" opened nothing.** Android has no 64 request dialog for the assistant role. The row now opens the settings page 65 "Default digital assistant app". 66 67 ## 0.0.13-alpha - 2026-09-21 68 69 Version code 13. 70 71 - **Home screens: inkOS and ThinkLauncher in place of CLauncher.** The build 72 for direct install carries inkOS v0.6 and ThinkLauncher v3.0, both made for 73 e-ink, both GPL-3.0, each the release file of its maker and not changed. 74 ThinkLauncher has the internet permission of its own. Rebind still has 75 none. 76 77 - **Change a button from the Done step.** "Change what it does" and "Change 78 how you press it" go back to those steps with the button kept. Back on the 79 Done step goes to the actions too. Tests: `Route.back`. 80 - **Show or hide the button bar** is an action (build for direct install). 81 Android 16 has no auto-hide for the three-button bar, so a button does it. 82 It uses the shell commands of the Navigation screen and keeps the gestures 83 as they are. The allow step asks for shell access for this action and for 84 the light actions. 85 - **AI voice prompt** is an action of its own (Viwoods). It is what the 86 firmware does on a hold of the AI key: the Viwoods AI screen, told to start 87 its voice prompt. It needs the Viwoods AI account, as the stock hold does. 88 A component launch can now carry text extras (`pkg/class?key=value`). 89 Tests: `ComponentPayloadTest`. 90 - **Ask when the user tries it.** The first run asks for every grant once. 91 After that the app asks at the moment something is missing: after a menu is 92 saved, after the Power switch on the Navigation screen, when a Power press 93 arrives while button remapping is off, and when voice typing starts with no 94 microphone grant. Before, those places showed a short message or nothing. 95 - **Fix: system Back always closed the button setup.** From Android 13 the 96 system does not call `onBackPressed` for an app with this target version. 97 The setup now registers the Back callback, and Back goes one step back. 98 Checked on the reader: Done, actions, how to press, main screen. 99 100 ## 0.0.12-alpha - 2026-09-21 101 102 Version code 12. 103 104 - **Apps of other makers.** The build for direct install carries two apps and 105 can install them: CLauncher v5.3.0 (the release APK of its maker, not 106 changed) and Ink Recents 0.1.1 (open source). Home and recents lists them. Android asks before 107 each install. The APKs are in the build, because Rebind has no internet 108 permission. The Google Play build carries nothing and has no install 109 permission: Google Play does not allow that here. It opens the page of the 110 maker. 111 - Whisper 3.7 (speech to text on the device, MIT, the F-Droid build) is the 112 third app that the build for direct install carries. Voice typing lists it. 113 - **The home screen of Rebind is gone**, with its settings screens. CLauncher 114 is the home screen now, as its maker released it. An old settings file that 115 has home screen settings still imports. Those settings are skipped. 116 - **Recent apps is a program of its own: Ink Recents** (open source, 117 github.com/equwal/ink-recents). Rebind no longer has that screen, and no 118 longer asks for usage access or `KILL_BACKGROUND_PROCESSES`. The Recent apps 119 action opens Ink Recents. Old bindings keep working. Where Ink Recents is 120 not installed, the action opens the screen that offers it. 121 - Hardware hacks: the double tap of Power is one row. Its way in is the camera 122 intent or the wallet intent, as the device decides. There is no wallet 123 button. 124 - The setup of a Power combination no longer says the same thing twice. 125 126 - **Hardware hacks** is a tile on the main screen with a screen of its own: 127 hold Power (assistant role), double tap Power (camera intent), the wallet 128 button, the full Power button (shell access), extra-dim light, and the 129 button settings of the device. Advanced no longer holds them. 130 131 ## 0.0.11-alpha - 2026-09-21 132 133 Version code 11. 134 135 - **Fix: a Camera key in the drawing of a device that has none.** The Viwoods 136 reader declares a camera key to Android and has no such button. Detection 137 put the declared key in the drawing. The drawing now shows only the buttons 138 that the device profile knows, and a button that was really pressed in 139 normal use. The Detect screen still lists what the device declares, and 140 marks a key that was never seen. Regression test: `DeviceKeysTest`. 141 The double tap of Power uses the camera *intent* of Android. It needs no 142 camera button. 143 144 ## 0.0.10-alpha - 2026-09-21 145 146 Version code 10. 147 148 - **No Google Play, no lock.** On a device where the Google Play app is not 149 installed or is turned off, the app is free and complete. There is no way 150 to buy there, so there is nothing to lock. The licence screen says "Free on 151 this device". A bought licence still comes first. Tests: `LicenseDecideTest`. 152 - The build for direct install has a tip link on the Licence screen 153 (ko-fi.com/truex). A tip unlocks nothing. The Google Play build has no such 154 link, because Google Play does not allow it. 155 - The reasons in the allow step are hints of three to seven words. The app 156 says "double tap" for Power too. 157 158 ## 0.0.9-alpha - 2026-09-21 159 160 Version code 9. 161 162 - **New name: Rebind.** The name says what the app does, and it has the words 163 that buyers type in Play search. The package id stays `dev.equwal.assistkey`, 164 so an update keeps all settings. The settings file keeps its `AssistKey` 165 marker, so old exports still import. 166 - **Recent apps.** Swipe up closes the app. Swipe down closes all the others. 167 One swipe sideways moves one card in one step, with no glide. When the screen 168 opens, the card jumps up and sideways once to show the swipes. "Close all but 169 this app" and "Close all" are two tall buttons with space between them. 170 Closing works without shell access too: Android ends the background 171 processes of the app (`KILL_BACKGROUND_PROCESSES`, a normal permission). 172 - **Hardware hacks** have their own box under Advanced: hold Power, double 173 press Power, the wallet button, the full Power button, extra-dim light, and 174 the button settings of the device. 175 - **Ask when it is needed, everywhere.** A binding made under Advanced now opens 176 the same "allow" step as the guided setup, when something is missing. 177 - **The drawing is the main screen.** The device and its buttons are on the 178 first screen. Each button shows what it does now. Tap a button to set it up. 179 Tap two buttons to set up a combination. 180 - **Button order.** A device profile gives the order of its buttons from the 181 top down. Viwoods AiPaper: Power, Volume up, Volume down, AI key. 182 - **On-screen button.** A new button that needs no hardware: a small round 183 button that floats over every app. Tap it to do the action, drag it to move 184 it. The key filter draws it, only while it has an action. Android's own 185 accessibility button is not used, because Android shows that button to every 186 user as soon as a service asks for it. 187 - **More ways to press.** Step two lists tap, double tap, triple tap, hold, 4 188 taps and 5 taps, and an Advanced row with every gesture of the button. 189 - **More actions.** Step three adds Lock screen and Screenshot, and an Advanced 190 row with every action. 191 - **Ask when it is needed.** A Power press that Android hides from apps is now 192 offered where the build can have shell access. The app then asks for shell 193 access, which opens the full Power button. After a double press of Power is 194 set up, the app offers the wallet way for devices that use it. 195 - **Device detection.** At first start the app finds which buttons the device 196 has, and what the device can do. It never asks the user to press a button. 197 Advanced > Detect this device shows the result. The device report has it too. 198 - **Less text.** All "More about this" rows are gone. Notes are one short 199 sentence. The accessibility disclosure is short. Google Play requires it, so 200 it stays. 201 - Tests: selection rules of the drawing, the on-screen button route, shell 202 access as a need, detection parser and round trip. 203 204 ## 0.0.8-alpha - 2026-09-21 205 206 Version code 8. 207 208 - **Set up a button.** The main screen starts with one large button. The user 209 taps a button in a drawing of the device, chooses tap, double tap or hold, 210 and chooses what the button does. The app then works out what that needs 211 (key filter, assistant role, camera role, microphone) and asks only for 212 that, by what it does. The app never asks the user to press a key to find 213 it. A button that is not in the drawing is chosen from a list of names. 214 - **New main screen.** A top bar with the licence state, "Your buttons" with 215 the bindings in use, and five tiles: Navigation, Voice typing, Home and 216 recents, Setup, Advanced. It fits on one screen with no scroll. 217 - **Advanced > Full control.** The screens from before (every key and gesture, 218 the Power button, two-key combinations) are all still there. Guided setup 219 and full control edit the same bindings. 220 - All screens use one look: title bar with a back arrow, state chips, one 221 filled main button for each screen, less text, details behind "More". 222 - Tests: `RouteTest` (what a wish needs, which gestures a button can have) and 223 `SummaryTest` (the one-line states on the main screen). 224 225 ## 0.0.7-alpha - 2026-09-21 226 227 Version code 7. 228 229 - **Fix: Extra dim toggle.** On now goes to the lowest level (1). Off gives the 230 light back to the brightness set in the system. Before, on used the level 231 that was last in use, or a middle level. Regression tests added. 232 - **Emergency SOS switch.** Android starts Emergency SOS on five quick Power 233 presses, which collides with a 5-tap binding. The Power screen now has a 234 switch for it (`emergency_gesture_enabled`). The app never turns it off by 235 itself. The switch shows only where the app can write the setting. 236 - **Permissions screen.** Every grant the app can use, with what it is for and 237 whether it is granted. "Set up what is missing" opens the grant screens one 238 after the other. It opens once by itself on the first run and can be run 239 again at any time from Setup > Permissions. 240 - The accessibility disclosure is one shared text now, and it names voice 241 typing and the app-in-front note, which the old text did not. 242 - Recent apps: each card says "Swipe up to close", and there is "Close all but 243 <app>" beside "Close all". 244 - Store listing: title is now "AssistKey: E-Ink Key Remap", with no maker name 245 in the title and a not-affiliated line in the description. 246 - Shell access and the extra-dim light are under Advanced now, and are not 247 counted as missing permissions. They are for the few devices with Shizuku or 248 root; the app is complete without them. 249 - **Ready-made menus.** The action list offers menus that can be bound in one 250 tap: Brightness (`full` build), Navigation, System, Sound and media, Page 251 turning, and Viwoods AI on Viwoods devices. Each is an ordinary menu after it 252 is bound, and the menu editor can change it. 253 - **Brightness up and down.** Two more light actions, for the system 254 brightness. A step is a quarter of the present value and at least 5. 255 - **Recent apps: easier to read, nicer to scroll.** One swipe moves one card, in 256 the direction of the swipe. A row of icons under the cards shows every recent 257 app at once and marks the one in the middle; a tap on an icon goes to its 258 card. The heading says which app and "2 of 12". 259 - The three light actions are now named Extra dim toggle, Extra dim darker and 260 Extra dim brighter. A binding made by 0.0.6 shows the new name with no change. 261 262 ## 0.0.6-alpha - 2026-09-21 263 264 Version code 6. 265 266 - **Voice typing prefers speech recognition on the device.** When the user has 267 not chosen a speech app, an on-device one (Whisper, FUTO Voice Input, Vosk, 268 Sayboard, Sherpa) wins over one that may use a server. The Voice typing screen 269 says which kind each app is. 270 - **A route to local Whisper.** If no on-device speech app is installed, the 271 screen offers Whisper from F-Droid (`org.woheller69.whisper`): offline after 272 the model download, many languages, automatic language detection. 273 - Language is "Detect the language" by default. A fixed language tag stays 274 possible. 275 - **Menu of actions.** A gesture can open a menu that holds any number of 276 actions, so there can be more actions than keys. The menu lives in its own 277 binding, so export, import and delete treat it like any other binding. 278 - **Export and import.** Settings as one JSON file: save, share, open, paste. 279 The licence, saved firmware values and device facts never enter the file, and 280 a file cannot write them. 281 - **Extra-dim from a key.** Three actions under Light: darker, brighter, on and 282 off. `full` build only. 283 - First unit tests, 20 in all: the speech app choice rule, the settings file 284 round trip (500 random cases) and its allow-list, the light level steps, the 285 menu round trip. Run them with `./gradlew testPlayReleaseUnitTest`. 286 287 ## 0.0.5-alpha - 2026-09-21 288 289 Version code 5. 290 291 - **Recent apps as cards.** The list is now a row of cards, like the Android 292 switcher: swipe sideways, tap a card to open it, swipe a card up to close it. 293 It is drawn for e-ink: outlines only, and the row jumps from card to card with 294 no animation. With shell access a card is a real task and can be closed 295 (`am stack remove`). Where the shell is root, a card shows the picture the 296 system keeps of the task. Otherwise a card shows the app icon. 297 298 ## 0.0.4-alpha - 2026-09-20 299 300 Version code 4. 301 302 - **Voice typing.** A new action. Press the key, speak, and the words go where 303 the cursor is. The app has no speech engine: it uses the Android 304 SpeechRecognizer interface, so any speech recognition app on the device does 305 the listening. The accessibility service puts the text into the focused 306 field. Password fields are never written to. 307 - **Two builds.** `play` for Google Play has no Shizuku code and no Shizuku 308 permission. `full` for direct install keeps shell access. Same app id and 309 signature, so one can replace the other. 310 - **Viwoods: AI key goes back.** Inside the AI screen or the crop screen, the AI 311 key returns to the app that was in use before. Switch on the AI key screen. 312 Test: `tools/e2e/ai-key-return.sh`. 313 - **Fix: Power always wakes and unlocks.** While the app manages the Power 314 button, a press on a sleeping or locked device is never a gesture. The app 315 also sends the wake and the keyguard dismissal through the shell, so waking 316 does not depend on the firmware. Regression test: `tools/e2e/power-wake.sh`. 317 318 Known limits: 319 320 - Voice typing needs a speech recognition app that has its own microphone 321 permission. The Viwoods voice prompt cannot be used: it sends audio to the 322 Viwoods cloud and has no interface for other apps. 323 - The listening screen pauses the app behind it for a moment. An app that 324 clears its text field on resume loses what was typed before. 325 326 ## 0.0.3-alpha - 2026-09-20 327 328 Version code 3. 329 330 - **Shell access** through Shizuku, set up on the device over wireless 331 debugging. No computer, no root. 332 - **Power button, properly.** With shell access: tap, double tap, any number 333 of taps, hold, and true combinations. Defaults: tap Back, hold Home (closing 334 the keyboard first), double tap Recents, triple tap lock. The firmware is 335 told to do nothing on Power meanwhile, which is what stops a single tap from 336 swallowing a double tap, and gets the button back whenever shell access goes. 337 - **Navigation applies itself.** Bar, gestures and Power key in any mix, applied 338 in-app through the shell; adb commands only as the fallback. 339 - **One interface.** Assistant, camera and wallet are no longer "channels" 340 beside the key filter; they are the Power button's side doors for when there 341 is no shell access, and live on the Power screen. 342 - **Any Android device.** Viwoods is now one device profile. More key types; 343 a key appears once the device has produced it. 344 - **Extra-dim light**, below the system's brightness floor. 345 - **Home screen** and **recent apps list**, text-only, made for e-ink. 346 - **Device report**: what a tester can send to get a device supported. Shown in 347 full, sent only by the user. 348 - New action: Home, closing the keyboard first. 349 350 Known limits: 351 352 - Shizuku started over wireless debugging stops at restart; Power reverts to 353 the system until it is started again. 354 - Extra-dim needs a root-level shell. 355 - Purchases are still untested. 356 357 ## 0.0.2-alpha — 2026-09-20 358 359 Version code 2. 360 361 - **Navigation screen.** Button bar, swipe gestures and Power key combinations 362 in any mix, with five named setups. The system half cannot be switched by an 363 app, so the screen reports the live state and gives the commands; 364 `tools/nav-mode` runs them. 365 - **Power key combinations.** Hold Power, then press the AI key, Volume up or 366 Volume down. Defaults to Home, Back and Recents. These three keep working 367 when the app is locked, so a reader with no bar and no gestures always has a 368 way out. 369 - **AI key hook.** Found that the firmware opens its AI screen on every AI key 370 press whether or not an app consumed it. `tools/ai-key hook` points the 371 firmware at a new entry point instead; taps then work cleanly. The app says 372 which state it is in and what that costs. 373 - Fixed: "ai key" in labels. 374 375 Known limits: 376 377 - The notification-shade action does nothing on this firmware. 378 - With the AI key hooked, that key has taps only: no hold, no volume 379 combinations. 380 381 ## 0.0.1-alpha — 2026-09-20 382 383 First alpha. Version code 1. 384 385 - Remaps the AI key and both volume keys through an accessibility key filter: 386 1–5 taps, press-and-hold, and key combinations, each bound separately. 387 - Remaps Power: hold (as the digital assistant), double press (as the default 388 camera app), and the firmware short-press behaviour. 389 - Actions: Viwoods AI screens, navigation, page-turn swipes and scrolls, 390 volume and media, open an app or component, send an intent or broadcast. 391 - Licensing through Google Play Billing: licensed, beta, 7-day trial, locked. 392 The beta is opened and closed from Play Console; testers get a lower price. 393 - In-app accessibility disclosure with explicit consent. 394 - Key tester, and a read-only view of the firmware's own key hooks. 395 - No `INTERNET` permission. 396 397 Known limits: 398 399 - Purchases are untested: Play Billing cannot be exercised until the app exists 400 in Play Console. Everything up to the purchase sheet is tested on the device. 401 - A volume key whose firmware hook is set is invisible to every app, and only 402 adb can unset it. 403 - The reader ships with Google Play disabled; buying needs it switched on.