ShizuStore

buttonoo

bractstudio

1.0.1 · GitHub

Download APK
Vendor-specific Android 13+ 1 month ago GPL-3.0
40 ShizuStore
855 GitHub
35 Stars
20 MB Size

More about this app

Remaps the Nothing Essential Key to any press pattern; Shizuku enables the privileged input route.

buttonoo

Remap the Essential Key on Nothing phones to whatever you want, on any press pattern.

Single, double, triple and quadruple press, plus hold — each one can launch an app, open a shortcut or a specific activity, toggle the torch, change volume or brightness, cycle the ringer, fire the assistant, or show a column of apps to pick from. An edge overlay confirms what fired.

Android only. Built with Flutter over a Kotlin accessibility service.


Status

Working, and used daily on the author's device. Not yet on any store.

Single press needs an extra setup step — see Freeing the single press. Everything else works with nothing but the accessibility permission.

Download

Grab the APK from the latest release.

Take app-arm64-v8a-release.apk — every Nothing and CMF phone with an Essential Key is 64-bit ARM. The armeabi-v7a and x86_64 builds are there for completeness and for emulators; you almost certainly do not want them.

Requirements

  • A Nothing or CMF phone with an Essential Key
  • Android 13 (API 33) or newer

Other devices with an unmapped hardware key may work — the app matches on the raw scan code and nothing about it is specific to Nothing hardware — but no one has tested that.

Building

flutter pub get
flutter build apk --release

Release signing is opt-in — without a keystore the release APK comes out unsigned. To sign your own builds, create android/key.properties, which is gitignored:

storeFile=/absolute/path/to/release.jks
storePassword=…
keyAlias=…
keyPassword=…

How it works

The short version: Android exposes hardware key events to accessibility services and almost nowhere else, so the app runs one — KeyRemapService — with canRequestFilterKeyEvents. It watches for a single scan code, classifies the press pattern, and runs the action you mapped to it.

The service does not request canRetrieveWindowContent and onAccessibilityEvent is empty, so it cannot read screen content, text fields, or any other keystroke.

For the details — how the key surfaces, why the classifier is shaped the way it is, and what the unlock flow actually does — see docs/how-it-works.md.

Freeing the single press

Nothing OS claims the single press for Essential Space at the system level. Returning true from an accessibility service does not take it back; the only way is to disable the system apps that hold it. Nothing is uninstalled and it is reversible from inside the app.

Four routes, in order of friction:

  1. App Info — the app deep-links you to each package's settings page and you tap Disable. No tools, works on most Nothing OS builds.
  2. Built-in Wi-Fi ADB — pair over Wireless debugging from the phone itself, no PC.
  3. Shizuku — if you already have it set up.
  4. Manual ADB — the app gives you the exact commands to paste into a terminal.

Double, triple, quadruple and long press need none of this.

Privacy

No network use at runtime, no analytics, no accounts. Configuration lives in local Android DataStore. The INTERNET permission is present only for the built-in ADB route, which connects to the phone's own adbd over loopback.

Contributing

Issues and pull requests are welcome. Please run flutter analyze and flutter test before opening a PR.

The codebase is small: lib/ is the Flutter UI, android/app/src/main/kotlin/ holds the service, the gesture classifier, the action executor and the overlay. lib/native/remapper_channel.dart is the entire boundary between the two.

Licence

GPL-3.0-or-later. See LICENSE.

Third-party components:

Not affiliated with, endorsed by, or connected to Nothing Technology Limited. "Nothing", "CMF" and "Essential Space" are their trademarks, used here only to describe what this app interoperates with.

Close

How Shizuku is used

Can free and restore the Essential Key by disabling system apps via `IPackageManager` through Shizuku.

This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.

How this app uses Shizuku

Shizuku is used to free the Nothing Essential Key for remapping and to restore the original apps afterwards.

  • Free the Essential Key: disables the preinstalled Essential apps that claim single, double and long press (Essential Space, Essential Recorder and related companion) so single press can run the action chosen in the app, using privileged package control through Shizuku. Nothing is uninstalled.
  • Restore Essential apps: re-enables those same Essential apps so the original key behavior returns, using the same privileged package control through Shizuku.

Android APIs or commands used

  • IPackageManager.setApplicationEnabledSetting

Notable details

The same free and restore actions can also be done without Shizuku via Wi-Fi ADB pairing or by opening the system App Info screens manually, as offered in the unlock screen.

Close

Changelog

What's new for version 1.0.1

Bug fixes. Installs straight over 1.0.0, your settings are kept.

Download app-arm64-v8a-release.apk — that's the one for every Nothing and CMF phone.

Fixed

  • Camera works. Mapping a press to the camera did nothing at all before.
  • Settings scrolls again. The page was stuck, so you couldn't reach anything past the first screenful.
  • App shortcuts now tell you why they're empty. Android only lets your default launcher open another app's shortcuts, so buttonoo can't do it — it used to just show a blank list for every app. Map the app itself, or a specific activity, instead.
  • Haptic strength now uses the same slider-style tabs as the overlay settings.

Worth knowing

Actions that open an app won't show up while your phone is locked. Android keeps them behind the lockscreen until you unlock. Torch, volume, brightness, ringer and media all work fine locked — just switch that gesture on under Behaviour.

If the accessibility toggle is greyed out after installing:

Settings → Apps → buttonoo → ⋮ (top right) → Allow restricted settings

Android blocks sideloaded apps from accessibility until you allow it. Installing through F-Droid or Obtainium skips this.

Checking the download is really ours

apksigner verify --print-certs app-arm64-v8a-release.apk

SHA-256: 573688b1648564896cf11893e19688fee9d6bddc17e59ac932325dd22d947b40

Same as 1.0.0. If it differs, it didn't come from us.


GPL-3.0-or-later. Not affiliated with Nothing Technology Limited.

Close

Permissions

9 permissions requested

  • android.permission.INTERNET
  • android.permission.POST_NOTIFICATIONS
  • android.permission.SYSTEM_ALERT_WINDOW
  • android.permission.WRITE_SETTINGS
  • android.permission.ACCESS_NOTIFICATION_POLICY
  • android.permission.VIBRATE
  • android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • moe.shizuku.manager.permission.API_V23
  • dev.buttonooo.essential_key.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
Close

Sources

3 sources

1.0.1 x86_64 GitHub · dev.buttonooo.essential_key
Selected Download
1.0.1 arm64-v8a GitHub · dev.buttonooo.essential_key
Download
1.0.1 armeabi-v7a GitHub · dev.buttonooo.essential_key
Download