Merge "InputManager: Support amplitude control for InputDeviceVibrator"

This commit is contained in:
TreeHugger Robot
2020-07-21 20:39:15 +00:00
committed by Android (Google) Code Review
4 changed files with 21 additions and 14 deletions

View File

@@ -83,7 +83,7 @@ interface IInputManager {
int isMicMuted();
// Input device vibrator control.
void vibrate(int deviceId, in long[] pattern, int repeat, IBinder token);
void vibrate(int deviceId, in long[] pattern, in int[] amplitudes, int repeat, IBinder token);
void cancelVibrate(int deviceId, IBinder token);
void setPointerIconType(int typeId);

View File

@@ -54,8 +54,8 @@ import com.android.internal.os.SomeArgs;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.List;
import java.util.concurrent.Executor;
/**
* Provides information about input devices and available key layouts.
@@ -1298,14 +1298,17 @@ public final class InputManager {
public void vibrate(int uid, String opPkg, VibrationEffect effect,
String reason, AudioAttributes attributes) {
long[] pattern;
int[] amplitudes;
int repeat;
if (effect instanceof VibrationEffect.OneShot) {
VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) effect;
pattern = new long[] { 0, oneShot.getDuration() };
amplitudes = new int[] { 0, oneShot.getAmplitude() };
repeat = -1;
} else if (effect instanceof VibrationEffect.Waveform) {
VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) effect;
pattern = waveform.getTimings();
amplitudes = waveform.getAmplitudes();
repeat = waveform.getRepeatIndex();
} else {
// TODO: Add support for prebaked effects
@@ -1314,7 +1317,7 @@ public final class InputManager {
}
try {
mIm.vibrate(mDeviceId, pattern, repeat, mToken);
mIm.vibrate(mDeviceId, pattern, amplitudes, repeat, mToken);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}

View File

@@ -236,7 +236,7 @@ public class InputManagerService extends IInputManager.Stub
private static native void nativeSetInteractive(long ptr, boolean interactive);
private static native void nativeReloadCalibration(long ptr);
private static native void nativeVibrate(long ptr, int deviceId, long[] pattern,
int repeat, int token);
int[] amplitudes, int repeat, int token);
private static native void nativeCancelVibrate(long ptr, int deviceId, int token);
private static native void nativeReloadKeyboardLayouts(long ptr);
private static native void nativeReloadDeviceAliases(long ptr);
@@ -1716,7 +1716,7 @@ public class InputManagerService extends IInputManager.Stub
// Binder call
@Override
public void vibrate(int deviceId, long[] pattern, int repeat, IBinder token) {
public void vibrate(int deviceId, long[] pattern, int[] amplitudes, int repeat, IBinder token) {
if (repeat >= pattern.length) {
throw new ArrayIndexOutOfBoundsException();
}
@@ -1738,7 +1738,7 @@ public class InputManagerService extends IInputManager.Stub
synchronized (v) {
v.mVibrating = true;
nativeVibrate(mPtr, deviceId, pattern, repeat, v.mTokenValue);
nativeVibrate(mPtr, deviceId, pattern, amplitudes, repeat, v.mTokenValue);
}
}

View File

@@ -1615,9 +1615,8 @@ static void nativeReloadCalibration(JNIEnv* env, jclass clazz, jlong ptr) {
im->reloadCalibration();
}
static void nativeVibrate(JNIEnv* env,
jclass /* clazz */, jlong ptr, jint deviceId, jlongArray patternObj,
jint repeat, jint token) {
static void nativeVibrate(JNIEnv* env, jclass /* clazz */, jlong ptr, jint deviceId,
jlongArray patternObj, jintArray amplitudesObj, jint repeat, jint token) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
size_t patternSize = env->GetArrayLength(patternObj);
@@ -1630,14 +1629,19 @@ static void nativeVibrate(JNIEnv* env,
jlong* patternMillis = static_cast<jlong*>(env->GetPrimitiveArrayCritical(
patternObj, nullptr));
nsecs_t pattern[patternSize];
jint* amplitudes = static_cast<jint*>(env->GetPrimitiveArrayCritical(amplitudesObj, nullptr));
std::vector<VibrationElement> pattern(patternSize);
for (size_t i = 0; i < patternSize; i++) {
pattern[i] = max(jlong(0), min(patternMillis[i],
(jlong)(MAX_VIBRATE_PATTERN_DELAY_NSECS / 1000000LL))) * 1000000LL;
jlong duration =
max(min(patternMillis[i], (jlong)MAX_VIBRATE_PATTERN_DELAY_MSECS), (jlong)0);
pattern[i].duration = std::chrono::milliseconds(duration);
pattern[i].channels = {amplitudes[i]};
}
env->ReleasePrimitiveArrayCritical(patternObj, patternMillis, JNI_ABORT);
env->ReleasePrimitiveArrayCritical(amplitudesObj, amplitudes, JNI_ABORT);
im->getInputManager()->getReader()->vibrate(deviceId, pattern, patternSize, repeat, token);
im->getInputManager()->getReader()->vibrate(deviceId, pattern, repeat, token);
}
static void nativeCancelVibrate(JNIEnv* /* env */,
@@ -1789,7 +1793,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
{"nativeSetShowTouches", "(JZ)V", (void*)nativeSetShowTouches},
{"nativeSetInteractive", "(JZ)V", (void*)nativeSetInteractive},
{"nativeReloadCalibration", "(J)V", (void*)nativeReloadCalibration},
{"nativeVibrate", "(JI[JII)V", (void*)nativeVibrate},
{"nativeVibrate", "(JI[J[III)V", (void*)nativeVibrate},
{"nativeCancelVibrate", "(JII)V", (void*)nativeCancelVibrate},
{"nativeReloadKeyboardLayouts", "(J)V", (void*)nativeReloadKeyboardLayouts},
{"nativeReloadDeviceAliases", "(J)V", (void*)nativeReloadDeviceAliases},