Skip to content

About

A floating gesture launcher that puts every app one swipe away

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Linky

A floating gesture launcher that puts every app one swipe away — no launcher apps, no dead links, nothing hard-coded for any phone.

What it does

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.

Prerequisites

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)

Build

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

Quick Start

# 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/.MainActivity

Open 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.

Features

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.

Requirements / platform notes

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

Tested environments

Device OS Result
vivo 1935 (e453421e) Android 10 Overlay, gesture recording, matching and assignment verified
Redmi (MIUI) Android 12 Full flow verified previously

Project layout

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

FAQ

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.

Acknowledgements

Gesture matching adapted from classic stroke-normalization work (1-D resampling + scale/rotation invariance).

About

A floating gesture launcher that puts every app one swipe away

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages