The library is built for simplicity and ease of use. It eliminates most boilerplate code for dealing with setting up sensor based event and gesture detection on Android.
| Gesture | Event type |
|---|---|
| Shake | ShakeEvent.Detected, ShakeEvent.Stopped |
| Flip | FlipEvent.FaceUp, FlipEvent.FaceDown |
| Light | LightEvent.Dark, LightEvent.Light |
| Proximity | ProximityEvent.Near, ProximityEvent.Far |
| Movement | MovementEvent.Moved, MovementEvent.Stationary |
| Orientation | OrientationEvent.TopSideUp, BottomSideUp, LeftSideUp, RightSideUp |
| Chop | ChopEvent.Chopped |
| TapOnBack | TapOnBackEvent |
| WristTwist | WristTwistEvent.Twisted |
| Wave | WaveEvent.Waved |
| Scoop | ScoopEvent.Scooped |
| PickupDevice | PickupDeviceEvent.PickedUp, PutDown |
| TiltDirection | AxisXTilt, AxisYTilt, AxisZTilt (with clockwise/anticlockwise) |
| RotationAngle | RotationAngleEvent (angles in degrees) |
| PinchScale | PinchScaleEvent (scale factor) |
| TouchType | DoubleTap, LongPress, SingleTap, Swipe (8 dirs), Scroll (4 dirs) |
| SoundLevel | SoundLevelEvent (dB level) |
| Step | StepEvent (step count, distance, activity type) |
import com.github.nisrulz.sensey.senseyRegister
import com.github.nisrulz.sensey.senseyStop
import com.github.nisrulz.sensey.gesture.shake.ShakeEvent
import com.github.nisrulz.sensey.gesture.flip.FlipEvent
// In an Activity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
senseyRegister(lifecycle) {
shakePlugin { event ->
when (event) {
ShakeEvent.Detected -> println("Shake detected!")
ShakeEvent.Stopped -> println("Shake stopped")
}
}
flipPlugin { event ->
when (event) {
FlipEvent.FaceUp -> println("Face up")
FlipEvent.FaceDown -> println("Face down")
}
}
}
}
// In Compose:
@Composable
fun MyScreen(lifecycle: Lifecycle) {
SenseyGestureEffect(lifecycle) {
shakePlugin { event ->
when (event) {
ShakeEvent.Detected -> println("Shake detected!")
ShakeEvent.Stopped -> println("Shake stopped")
}
}
}
Box(modifier = Modifier.fillMaxSize().senseyGestures())
}See the full usage guide for every gesture with parameter options and common examples.
Sensey is available on Maven Central:
implementation 'com.github.nisrulz:sensey:{latest version}'where {latest version} corresponds to the latest published version on Maven Central.
Each gesture is split into three components:
GestureTrigger<T>— Pure Kotlin contract with no Android dependencies. The detection algorithm lives here and can be unit tested without a device. All complex logic is extracted into private functions for readability.GesturePlugin— Wraps a trigger into a plugin that registers with aSenseyinstance viaSensey.register(plugin). Sensor-based gestures useTypedSensorDetectordirectly (composition over inheritance), avoiding intermediate Detector classes.Senseyclass — Plugin registry with lifecycle management. Providesregister {}DSL,senseyRegister()/SenseyGestureEffect()extension functions, and auto-cleanup on lifecycle destroy.
Starting with 1.0.1, Changes exist in the releases tab.
I welcome and encourage all pull requests. It usually will take me within 24-48 hours to respond to any issue or request. Here are some basic rules to follow to ensure timely addition of your request:
- Match coding style (braces, spacing, etc.) This is best achieved using CMD+Option+L (Reformat code) on Mac (not sure for Windows) with Android Studio defaults. This project uses a modified version of Grandcentrix's code style, so please use the same when editing this project.
- If its a feature, bugfix, or anything please only change code to what you specify.
- Please keep PR titles easy to read and descriptive of changes, this will make them easier to merge :)
- Pull requests must be made against
developbranch. Any other branch (unless specified by the maintainers) will get rejected. - Check for existing issues first, before filing an issue.
- Have fun!
Sensey is being used in production apps as well as research & development for thesis at universities.
Click here for the full list of references
Licensed under the Apache License, Version 2.0, click here for the full license.
This project was created by Nishant Srivastava but hopefully developed and maintained by many others. See the the list of contributors here.
-
Star this repository and tell all your friends about it.
-
Watch for new releases to get an update if something happens.
-
Open an Issue if you catch any error in copy text or within the project itself.
-
Open a Pull Request to add more reference links of where Sensey is being used or fixes against existing issues.
-
If you can spare a few 💵:
- Buy me a coffee ☕ (one-time),
- or Sponsor me on GitHub (recurring monthly).
-
Tell me you like this project or how it helped you out!
- Comment in the project's guestbook 😊,
- Reach out on Twitter,
- or send a nice email my way!
Thanks for your interest in this software ❤️


