Dasher is an information-efficient text-entry interface, driven by continuous pointing gestures. It lets you write using eye gaze, a mouse, a switch, a joystick, or touch — designed for accessibility and augmentative communication (AAC).
This is the Android frontend, built on the shared DasherCore engine.
dasher.at — downloads, user docs, and live demo Feature status — what each platform supports All repos — engine, frontends, design guide
Preview — actively developed. Not on Google Play yet; download the latest signed APK from Releases and sideload it. See the feature matrix for what's implemented.
Download the latest APK from Releases and install it (Settings → Apps → allow unknown sources for your browser, then open the APK). To use Dasher as the system keyboard, enable it in Settings → System → Keyboard → On-screen keyboard and select it as the default input method.
- Android Studio (Ladyfish or newer) — supplies JDK 17, the Android SDK, and the NDK
- Android SDK 35, NDK 27.0.12077973, CMake 3.22.1 (Android Studio offers to install these on first open)
- Git (with submodules)
git clone --recurse-submodules https://github.com/dasher-project/Dasher-Android.git
cd Dasher-Android
./gradlew :app:assembleDebugOr open the project in Android Studio and run the app configuration on a
device or emulator (API 24+, x86_64 or arm64-v8a). On first open, Android
Studio installs the SDK/NDK/CMake and initialises the DasherCore submodule.
DasherCore is consumed through its public C ABI (dasher.h) — the same
integration pattern as Dasher-Windows. A thin JNI shim (libdasher_jni.so)
marshals the per-frame draw-command buffer, pointer input, and engine callbacks
(clipboard / speak / message / output / log) between Kotlin and libdasher.so.
The UI is Jetpack Compose; the same engine drives both the standalone app
(MainActivity) and the system keyboard (DasherImeService).
graph LR
subgraph "Kotlin (Jetpack Compose)"
UI["MainActivity / DasherImeService<br/>Compose shell + IME"]
ENG["DasherEngine.kt<br/>Choreographer frame loop"]
NB["NativeBridge.kt<br/>external funs, 1:1 with dasher.h"]
CV["DasherCanvasView<br/>decodes the 6-int command buffer"]
UI --> ENG
ENG --> NB
ENG --> CV
end
subgraph "libdasher_jni.so (JNI shim)"
JNI["jni_bridge.cpp<br/>pointer + frame buffer + callback trampolines"]
end
subgraph "libdasher.so (DasherCore CAPI)"
API["dasher.h<br/>dasher_frame / dasher_mouse_* / callbacks"]
end
NB <-->|JNI| JNI
JNI <-->|dasher_* C ABI| API
API -.->|"draw commands: opcode, a, b, c, d, argb"| CV
API -.->|clipboard / speak / message / output / log| NB
Each draw command is 6 ints: [opcode, a, b, c, d, argb] (clear / circle / line /
rect-outline / rect-fill / text). Pointer events flow the other way
(DasherCanvasView → dasher_mouse_*). See
DasherCore's C API
for the full engine contract.
| Path | Purpose |
|---|---|
app/src/main/cpp/ |
CMakeLists.txt + jni_bridge.cpp — JNI shim over dasher.h, produces libdasher_jni.so |
app/src/main/java/at/dasher/android/ |
Kotlin: NativeBridge (CAPI decls), DasherEngine (frame loop), MainActivity, DasherImeService (keyboard), SettingsScreen, AnalyticsService, DasherApp, LocaleHelper |
app/src/main/java/at/dasher/android/ui/ |
DasherCanvasView (command buffer → Canvas), Compose theme/ |
app/src/main/res/ |
Strings (incl. values-de), themes, AndroidManifest.xml |
third_party/DasherCore/ |
DasherCore submodule (do not edit here — PR upstream) |
See CONTRIBUTING.md for build details, code style, and DCO sign-off. For project-wide conventions (code of conduct, RFCs, security), see the org contributing guide.
MIT — see LICENSE.