VibratorService: Conditionally Use Callbacks

VTS is enforcing that HALs return error if the callback is not null and
callbacks are not supported.

Bug: 137601983
Test: Manually on devices with and without callback support.
Change-Id: Iada3a4189f8e0986e7894f4bcdc3d9c309d313d8
Signed-off-by: Harpreet \"Eli\" Sangha <eliptus@google.com>
This commit is contained in:
Harpreet \"Eli\" Sangha
2020-02-13 15:53:08 +09:00
committed by Harpreet "Eli" Sangha
parent 2f6d575468
commit 3e7613d16e
2 changed files with 25 additions and 22 deletions

View File

@@ -183,7 +183,8 @@ public class VibratorService extends IVibratorService.Stub
static native boolean vibratorSupportsAmplitudeControl();
static native void vibratorSetAmplitude(int amplitude);
static native int[] vibratorGetSupportedEffects();
static native long vibratorPerformEffect(long effect, long strength, Vibration vibration);
static native long vibratorPerformEffect(long effect, long strength, Vibration vibration,
boolean withCallback);
static native void vibratorPerformComposedEffect(
VibrationEffect.Composition.PrimitiveEffect[] effect, Vibration vibration);
static native boolean vibratorSupportsExternalControl();
@@ -1334,7 +1335,8 @@ public class VibratorService extends IVibratorService.Stub
// Input devices don't support prebaked effect, so skip trying it with them.
if (!usingInputDeviceVibrators) {
long duration = vibratorPerformEffect(prebaked.getId(),
prebaked.getEffectStrength(), vib);
prebaked.getEffectStrength(), vib,
hasCapability(IVibrator.CAP_PERFORM_CALLBACK));
long timeout = duration;
if (hasCapability(IVibrator.CAP_PERFORM_CALLBACK)) {
timeout *= ASYNC_TIMEOUT_MULTIPLIER;

View File

@@ -355,10 +355,11 @@ static jintArray vibratorGetSupportedEffects(JNIEnv *env, jclass) {
}
static jlong vibratorPerformEffect(JNIEnv* env, jclass, jlong effect, jlong strength,
jobject vibration) {
jobject vibration, jboolean withCallback) {
if (auto hal = getHal<aidl::IVibrator>()) {
int32_t lengthMs;
sp<AidlVibratorCallback> effectCallback = new AidlVibratorCallback(env, vibration);
sp<AidlVibratorCallback> effectCallback =
(withCallback != JNI_FALSE ? new AidlVibratorCallback(env, vibration) : nullptr);
aidl::Effect effectType(static_cast<aidl::Effect>(effect));
aidl::EffectStrength effectStrength(static_cast<aidl::EffectStrength>(strength));
@@ -478,24 +479,24 @@ static void vibratorAlwaysOnDisable(JNIEnv* env, jclass, jlong id) {
}
static const JNINativeMethod method_table[] = {
{ "vibratorExists", "()Z", (void*)vibratorExists },
{ "vibratorInit", "()V", (void*)vibratorInit },
{ "vibratorOn", "(J)V", (void*)vibratorOn },
{ "vibratorOff", "()V", (void*)vibratorOff },
{ "vibratorSupportsAmplitudeControl", "()Z", (void*)vibratorSupportsAmplitudeControl},
{ "vibratorSetAmplitude", "(I)V", (void*)vibratorSetAmplitude},
{ "vibratorPerformEffect", "(JJLcom/android/server/VibratorService$Vibration;)J",
(void*)vibratorPerformEffect},
{ "vibratorPerformComposedEffect",
"([Landroid/os/VibrationEffect$Composition$PrimitiveEffect;Lcom/android/server/VibratorService$Vibration;)V",
(void*)vibratorPerformComposedEffect},
{ "vibratorGetSupportedEffects", "()[I",
(void*)vibratorGetSupportedEffects},
{ "vibratorSupportsExternalControl", "()Z", (void*)vibratorSupportsExternalControl},
{ "vibratorSetExternalControl", "(Z)V", (void*)vibratorSetExternalControl},
{ "vibratorGetCapabilities", "()J", (void*)vibratorGetCapabilities},
{ "vibratorAlwaysOnEnable", "(JJJ)V", (void*)vibratorAlwaysOnEnable},
{ "vibratorAlwaysOnDisable", "(J)V", (void*)vibratorAlwaysOnDisable},
{"vibratorExists", "()Z", (void*)vibratorExists},
{"vibratorInit", "()V", (void*)vibratorInit},
{"vibratorOn", "(J)V", (void*)vibratorOn},
{"vibratorOff", "()V", (void*)vibratorOff},
{"vibratorSupportsAmplitudeControl", "()Z", (void*)vibratorSupportsAmplitudeControl},
{"vibratorSetAmplitude", "(I)V", (void*)vibratorSetAmplitude},
{"vibratorPerformEffect", "(JJLcom/android/server/VibratorService$Vibration;Z)J",
(void*)vibratorPerformEffect},
{"vibratorPerformComposedEffect",
"([Landroid/os/VibrationEffect$Composition$PrimitiveEffect;Lcom/android/server/"
"VibratorService$Vibration;)V",
(void*)vibratorPerformComposedEffect},
{"vibratorGetSupportedEffects", "()[I", (void*)vibratorGetSupportedEffects},
{"vibratorSupportsExternalControl", "()Z", (void*)vibratorSupportsExternalControl},
{"vibratorSetExternalControl", "(Z)V", (void*)vibratorSetExternalControl},
{"vibratorGetCapabilities", "()J", (void*)vibratorGetCapabilities},
{"vibratorAlwaysOnEnable", "(JJJ)V", (void*)vibratorAlwaysOnEnable},
{"vibratorAlwaysOnDisable", "(J)V", (void*)vibratorAlwaysOnDisable},
};
int register_android_server_VibratorService(JNIEnv *env) {