Android

Haptic responses are implemented using Android’s native predefined haptic feedback constants from the HapticFeedbackConstants class. The haptics are triggered via view.performHapticFeedback() to align with platform behavior and ensure consistency across devices.

Interactions & transitions

Selection Feedback

On Android, selection feedback is handled a bit differently than iOS. Android provides haptic feedback constants for generic UI interactions, but it doesn’t have a dedicated “selection” generator like iOS’s UISelectionFeedbackGenerator. We decided to use EFFECT_TICK which is the closest equivalent to iOS selectionChanged().

Status Feedback

For the status feedback we decided to create our own custom solution based on the iOS solution to ensure that changes in the status are clear and distinctive.

Platform and API Compatibility

Our implementation of native Android haptic feedback is primarily based on the modern Android VibrationEffect API introduced in API level 29 (Android 10).

This API provides access to predefined, system-tuned haptic effects such as EFFECT_CLICK, EFFECT_TICK, EFFECT_THUD, and others. These effects ensure consistent tactile feedback across devices that support the newer vibration framework.

Because the application also supports devices running Android 6.0 – 9.0 (API 23–28), a compatibility layer is used. On these older versions, predefined vibration effects are not available; therefore, the system automatically falls back to the legacy feedback mechanism using View.performHapticFeedback() with corresponding HapticFeedbackConstants values (e.g., VIRTUAL_KEY, LONG_PRESS, CLOCK_TICK).

This fallback ensures that each modern haptic effect has an appropriate legacy equivalent: