diff --git a/modules/vibration/src/main/java/com/gluonhq/attach/vibration/VibrationService.java b/modules/vibration/src/main/java/com/gluonhq/attach/vibration/VibrationService.java index d4c14662..c8d42a40 100644 --- a/modules/vibration/src/main/java/com/gluonhq/attach/vibration/VibrationService.java +++ b/modules/vibration/src/main/java/com/gluonhq/attach/vibration/VibrationService.java @@ -56,14 +56,33 @@ */ public interface VibrationService { + /** * Returns an instance of {@link VibrationService}. + * * @return An instance of {@link VibrationService}. */ static Optional create() { return Services.get(VibrationService.class); } + /** + * Haptic Feedback Styles: Light, Medium, Heavy. + */ + enum HapticFeedbackStyle { + LIGHT(1), MEDIUM(2), HEAVY(3); + + private int style; + + HapticFeedbackStyle(int style) { + this.style = style; + } + + public int getStyle() { + return this.style; + } + } + /** * Vibrates the device with the default pattern and duration */ @@ -88,11 +107,18 @@ static Optional create() { *
  • Wait for 2 seconds
  • *
  • Vibrate for 3 seconds
  • * - * - * Note: the availability of this functionality is platform-restricted, and at present only Android supports it. + *

    + * Note: the availability of this functionality is platform-restricted, and at present only Android supports it. * Calling this method on iOS will result in the same vibration as calling {@link #vibrate()} * * @param pattern The pattern of durations to play the vibration for (with wait periods in between). */ void vibrate(long... pattern); + + /** + * Call Haptic Feedback. + * + * @param hapticFeedbackStyle Feedback Style {@link HapticFeedbackStyle} + */ + void hapticFeedback(HapticFeedbackStyle hapticFeedbackStyle); } diff --git a/modules/vibration/src/main/java/com/gluonhq/attach/vibration/impl/IOSVibrationService.java b/modules/vibration/src/main/java/com/gluonhq/attach/vibration/impl/IOSVibrationService.java index 493759f8..3539090f 100644 --- a/modules/vibration/src/main/java/com/gluonhq/attach/vibration/impl/IOSVibrationService.java +++ b/modules/vibration/src/main/java/com/gluonhq/attach/vibration/impl/IOSVibrationService.java @@ -35,17 +35,24 @@ public class IOSVibrationService implements VibrationService { static { System.loadLibrary("Vibration"); } - + @Override public void vibrate() { doVibrate(); } - + @Override public void vibrate(long... pattern) { // pattern not supported on iOS - vibrate(); + vibrate(); + } + + @Override + public void hapticFeedback(HapticFeedbackStyle hapticFeedbackStyle) { + doHapticFeedback(hapticFeedbackStyle.getStyle()); } private native static void doVibrate(); -} \ No newline at end of file + + private native static void doHapticFeedback(int style); +} diff --git a/modules/vibration/src/main/native/ios/Vibration.m b/modules/vibration/src/main/native/ios/Vibration.m index 2df27dc3..f253b05d 100644 --- a/modules/vibration/src/main/native/ios/Vibration.m +++ b/modules/vibration/src/main/native/ios/Vibration.m @@ -52,3 +52,26 @@ AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); } +JNIEXPORT void JNICALL Java_com_gluonhq_attach_vibration_impl_IOSVibrationService_doHapticFeedback +(JNIEnv *env, jclass jClass,jint style) +{ + UIImpactFeedbackStyle feedbackStyle; + + switch (style) { + case 1: + feedbackStyle = UIImpactFeedbackStyleLight; + break; + case 2: + feedbackStyle = UIImpactFeedbackStyleMedium; + break; + case 3: + feedbackStyle = UIImpactFeedbackStyleHeavy; + break; + default: + feedbackStyle = UIImpactFeedbackStyleMedium; + break; + } + + UIImpactFeedbackGenerator *feedback = [[UIImpactFeedbackGenerator alloc]initWithStyle:UIImpactFeedbackStyleMedium]; + [feedback impactOccurred]; +}