diff --git a/nymea-app/platformintegration/android/platformhelperandroid.cpp b/nymea-app/platformintegration/android/platformhelperandroid.cpp index 342c2d97..125b0c8d 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.cpp +++ b/nymea-app/platformintegration/android/platformhelperandroid.cpp @@ -145,7 +145,7 @@ QString PlatformHelperAndroid::deviceManufacturer() const void PlatformHelperAndroid::vibrate(PlatformHelper::HapticsFeedback feedbackType) { - int duration; + jlong duration; switch (feedbackType) { case HapticsFeedbackSelection: duration = 10; @@ -164,13 +164,28 @@ void PlatformHelperAndroid::vibrate(PlatformHelper::HapticsFeedback feedbackType return; } - QJniObject vibrator = context.callMethod("getSystemService", "Landroid/content/Context;Ljava/lang/String;", QJniObject::fromString("vibrator").object()); + QJniObject vibrator = context.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", QJniObject::fromString("vibrator").object()); if (!vibrator.isValid()) { qDebug() << "Could not get vibrator service."; return; } - // Call the vibrate method + const jint sdkInt = QJniObject::getStaticField("android/os/Build$VERSION", "SDK_INT"); + if (sdkInt >= 26) { + const jint defaultAmplitude = QJniObject::getStaticField("android/os/VibrationEffect", "DEFAULT_AMPLITUDE"); + QJniObject vibrationEffect = QJniObject::callStaticObjectMethod("android/os/VibrationEffect", + "createOneShot", + "(JI)Landroid/os/VibrationEffect;", + duration, + defaultAmplitude); + if (vibrationEffect.isValid()) { + vibrator.callMethod("vibrate", "(Landroid/os/VibrationEffect;)V", vibrationEffect.object()); + return; + } + qDebug() << "Falling back to legacy vibrate API, vibration effect invalid."; + } + + // Fallback for pre-API 26 or if creating the vibration effect failed vibrator.callMethod("vibrate", "(J)V", duration); }