A floating gesture launcher that puts every app one swipe away — no launcher apps, no dead links, nothing hard-coded for any phone.
Linky replaces the home-screen widget your launcher can't. A small floating button sits on top of any app (or the launcher itself), snaps to the edge, and listens for a gesture you drew yourself. Draw it → the assigned action fires.
The app list is discovered from the device at runtime. There are no preset entries, no per-app "actions" — every installed app shows up automatically, and assigning one means exactly one thing: open that app, chosen with a single tap.
Device:
- Android 7.0 (API 24) or newer (minSdk 24, target/compile SDK 36)
- Overlay permission — grant "Display over other apps" to Linky once (Settings → Apps → Linky)
Host (to build):
- JDK 25
- Android SDK (point it via
local.properties: sdk.dir) - Gradle 9.6 + AGP 9.3.0 (bundled with the repo)
git clone https://github.com/devansh0703/linky-android.git
cd linky-android
echo "sdk.dir=/path/to/android-sdk" > local.properties
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk# 1. Grant overlay access on first launch (Settings → Linky → Display over other apps)
# 2. Open the app
adb shell am start -n com.linky.android/.MainActivityOpen Gestures → record a new gesture (draw it a few times to teach it variations), then Assign Action and pick any installed app. Done — the gesture now opens that app.
Gesture capture & matching Prerecorded strokes are normalized (position, scale, rotation) and matched with the recorded template set, so the same gesture drawn bigger/smaller or in a corner still resolves. Multiple samples sharpen accuracy.
Floating overlay (overlay/OverlayService.kt)
A foreground service draws a draggable button above other apps (SYSTEM_ALERT_WINDOW). It snaps to either edge, shows/hides on demand, and hands your stroke to the recognizer the moment you lift your finger.
One-app, one-tap assignment Tapping an installed app in the picker assigns "open that app" directly — there is no second "choose an action" hop, because there is nothing to choose from for a specific phone. Stable negative app ids (derived from the package name) keep assignments valid across reinstalls and app updates.
Custom intents
Define your own URI-scheme actions (e.g. geo:0,0?q=Coffee%20shop) and assign those to gestures too.
Persistence
Gestures, assignments, and settings live in SharedPreferences under the "linky" key — no database, no file juggling, survives reboots.
| Platform | Notes |
|---|---|
| Android 7.0 (API 24) | Minimum supported |
| Android 10+ | Package-visibility: the manifest declares exactly the <queries> needed (launcher intents) so the dynamic app list resolves on Android 11+ |
| Android 10+ | Overlay runs as a foreground specialUse service (notification channel linky_overlay) |
| Android 16 (API 36) | Target SDK — build targets the latest platform rules |
| Device | OS | Result |
|---|---|---|
vivo 1935 (e453421e) |
Android 10 | Overlay, gesture recording, matching and assignment verified |
| Redmi (MIUI) | Android 12 | Full flow verified previously |
| Path | Contents |
|---|---|
app/src/main/java/.../gesture/ |
Capture view, preprocessing/normalization, recognizer |
app/src/main/java/.../action/ |
Launcher catalogue, action model, intent execution |
app/src/main/java/.../data/ |
Storage + repository (SharedPreferences "linky") |
app/src/main/java/.../overlay/ |
Floating gesture overlay foreground service |
app/src/main/java/.../ui/ |
Activities, pickers, settings, stats, help |
Why no "action list" after picking an app? — Because there is nothing phone-specific to choose. Every app supports exactly one action on a given device: open it.
Why are detected app ids negative? — Stable ids are derived from -Math.abs(packageName.hashCode()), keeping them collision-free with the built-in catalogue (ids 0…999) and custom intents (id 1000+).
Why isn't the full list of an app's intents shown? — Android hides declared intent-filters from third-party apps (the public SDK has no readable intentFilters field, even on Android 13+).
Overlay not showing? — Grant "Display over other apps" for Linky. On Android 10+ the service also needs notification permission for its foreground channel. Enable it from Settings → Linky → Floating gesture launcher.
Gesture matching adapted from classic stroke-normalization work (1-D resampling + scale/rotation invariance).



