diff --git a/Android.bp b/Android.bp index f6d49e9f7fc7d..15befaef84ae7 100644 --- a/Android.bp +++ b/Android.bp @@ -739,6 +739,7 @@ java_defaults { "android.hardware.vibrator-V1.0-java", "android.hardware.vibrator-V1.1-java", "android.hardware.vibrator-V1.2-java", + "android.hardware.vibrator-V1.3-java", "android.hardware.wifi-V1.0-java-constants", "android.hardware.radio-V1.0-java", "android.hardware.radio-V1.3-java", diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 9f353a80a5be9..5d4c5c359a2bf 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -149,6 +149,8 @@ public class VibratorService extends IVibratorService.Stub native static boolean vibratorSupportsAmplitudeControl(); native static void vibratorSetAmplitude(int amplitude); native static long vibratorPerformEffect(long effect, long strength); + static native boolean vibratorSupportsExternalControl(); + static native void vibratorSetExternalControl(boolean enabled); private final IUidObserver mUidObserver = new IUidObserver.Stub() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index b4fe83704ff29..9ecafb3c70d60 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -119,6 +119,7 @@ cc_defaults { "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", + "android.hardware.vibrator@1.3", "android.hardware.vr@1.0", "android.frameworks.schedulerservice@1.0", "android.frameworks.sensorservice@1.0", diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index defcfd9a33707..63dca62104a1e 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "jni.h" #include @@ -42,6 +43,7 @@ using android::hardware::vibrator::V1_1::Effect_1_1; namespace V1_0 = android::hardware::vibrator::V1_0; namespace V1_1 = android::hardware::vibrator::V1_1; namespace V1_2 = android::hardware::vibrator::V1_2; +namespace V1_3 = android::hardware::vibrator::V1_3; namespace android { @@ -136,6 +138,19 @@ static void vibratorSetAmplitude(JNIEnv*, jobject, jint amplitude) { } } +static jboolean vibratorSupportsExternalControl(JNIEnv*, jobject) { + return halCall(&V1_3::IVibrator::supportsExternalControl).withDefault(false); +} + +static void vibratorSetExternalControl(JNIEnv*, jobject, jboolean enabled) { + Status status = halCall(&V1_3::IVibrator::setExternalControl, static_cast(enabled)) + .withDefault(Status::UNKNOWN_ERROR); + if (status != Status::OK) { + ALOGE("Failed to set vibrator external control (%" PRIu32 ").", + static_cast(status)); + } +} + static jlong vibratorPerformEffect(JNIEnv*, jobject, jlong effect, jint strength) { Status status; uint32_t lengthMs; @@ -187,7 +202,9 @@ static const JNINativeMethod method_table[] = { { "vibratorOff", "()V", (void*)vibratorOff }, { "vibratorSupportsAmplitudeControl", "()Z", (void*)vibratorSupportsAmplitudeControl}, { "vibratorSetAmplitude", "(I)V", (void*)vibratorSetAmplitude}, - { "vibratorPerformEffect", "(JJ)J", (void*)vibratorPerformEffect} + { "vibratorPerformEffect", "(JJ)J", (void*)vibratorPerformEffect}, + { "vibratorSupportsExternalControl", "()Z", (void*)vibratorSupportsExternalControl}, + { "vibratorSetExternalControl", "(Z)V", (void*)vibratorSetExternalControl}, }; int register_android_server_VibratorService(JNIEnv *env)