summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/input/InputManagerInternal.java6
-rw-r--r--services/companion/java/com/android/server/companion/virtual/InputController.java4
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java10
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp31
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java12
5 files changed, 62 insertions, 1 deletions
diff --git a/core/java/android/hardware/input/InputManagerInternal.java b/core/java/android/hardware/input/InputManagerInternal.java
index f866a2e1c691..ad6c12be69ba 100644
--- a/core/java/android/hardware/input/InputManagerInternal.java
+++ b/core/java/android/hardware/input/InputManagerInternal.java
@@ -90,6 +90,12 @@ public abstract class InputManagerInternal {
public abstract PointF getCursorPosition();
/**
+ * Sets the pointer acceleration.
+ * See {@code frameworks/native/include/input/VelocityControl.h#VelocityControlParameters}.
+ */
+ public abstract void setPointerAcceleration(float acceleration);
+
+ /**
* Sets the eligibility of windows on a given display for pointer capture. If a display is
* marked ineligible, requests to enable pointer capture for windows on that display will be
* ignored.
diff --git a/services/companion/java/com/android/server/companion/virtual/InputController.java b/services/companion/java/com/android/server/companion/virtual/InputController.java
index ae39d7ef0b83..6c56e2f777f3 100644
--- a/services/companion/java/com/android/server/companion/virtual/InputController.java
+++ b/services/companion/java/com/android/server/companion/virtual/InputController.java
@@ -27,6 +27,7 @@ import android.hardware.input.VirtualMouseRelativeEvent;
import android.hardware.input.VirtualMouseScrollEvent;
import android.hardware.input.VirtualTouchEvent;
import android.os.IBinder;
+import android.os.IInputConstants;
import android.os.RemoteException;
import android.util.ArrayMap;
import android.util.Slog;
@@ -126,6 +127,7 @@ class InputController {
final InputManagerInternal inputManagerInternal =
LocalServices.getService(InputManagerInternal.class);
inputManagerInternal.setVirtualMousePointerDisplayId(displayId);
+ inputManagerInternal.setPointerAcceleration(1);
mActivePointerDisplayId = displayId;
}
try {
@@ -210,6 +212,8 @@ class InputController {
final InputManagerInternal inputManagerInternal =
LocalServices.getService(InputManagerInternal.class);
inputManagerInternal.setVirtualMousePointerDisplayId(Display.INVALID_DISPLAY);
+ inputManagerInternal.setPointerAcceleration(
+ IInputConstants.DEFAULT_POINTER_ACCELERATION);
mActivePointerDisplayId = Display.INVALID_DISPLAY;
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 2dd7a10ffe29..b9c7123e1010 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -317,6 +317,7 @@ public class InputManagerService extends IInputManager.Stub
IBinder fromChannelToken, IBinder toChannelToken, boolean isDragDrop);
private static native boolean nativeTransferTouch(long ptr, IBinder destChannelToken);
private static native void nativeSetPointerSpeed(long ptr, int speed);
+ private static native void nativeSetPointerAcceleration(long ptr, float acceleration);
private static native void nativeSetShowTouches(long ptr, boolean enabled);
private static native void nativeSetInteractive(long ptr, boolean interactive);
private static native void nativeReloadCalibration(long ptr);
@@ -1797,6 +1798,10 @@ public class InputManagerService extends IInputManager.Stub
nativeSetPointerSpeed(mPtr, speed);
}
+ private void setPointerAcceleration(float acceleration) {
+ nativeSetPointerAcceleration(mPtr, acceleration);
+ }
+
private void registerPointerSpeedSettingObserver() {
mContext.getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.POINTER_SPEED), true,
@@ -3487,6 +3492,11 @@ public class InputManagerService extends IInputManager.Stub
}
@Override
+ public void setPointerAcceleration(float acceleration) {
+ InputManagerService.this.setPointerAcceleration(acceleration);
+ }
+
+ @Override
public void setDisplayEligibilityForPointerCapture(int displayId, boolean isEligible) {
InputManagerService.this.setDisplayEligibilityForPointerCapture(displayId, isEligible);
}
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index c71686abe9de..df5fb2827a16 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -277,6 +277,7 @@ public:
void setInputDispatchMode(bool enabled, bool frozen);
void setSystemUiLightsOut(bool lightsOut);
void setPointerSpeed(int32_t speed);
+ void setPointerAcceleration(float acceleration);
void setInputDeviceEnabled(uint32_t deviceId, bool enabled);
void setShowTouches(bool enabled);
void setInteractive(bool interactive);
@@ -363,6 +364,9 @@ private:
// Pointer speed.
int32_t pointerSpeed;
+ // Pointer acceleration.
+ float pointerAcceleration;
+
// True if pointer gestures are enabled.
bool pointerGesturesEnabled;
@@ -412,6 +416,7 @@ NativeInputManager::NativeInputManager(jobject contextObj,
AutoMutex _l(mLock);
mLocked.systemUiLightsOut = false;
mLocked.pointerSpeed = 0;
+ mLocked.pointerAcceleration = android::os::IInputConstants::DEFAULT_POINTER_ACCELERATION;
mLocked.pointerGesturesEnabled = true;
mLocked.showTouches = false;
mLocked.pointerDisplayId = ADISPLAY_ID_DEFAULT;
@@ -439,6 +444,7 @@ void NativeInputManager::dump(std::string& dump) {
dump += StringPrintf(INDENT "System UI Lights Out: %s\n",
toString(mLocked.systemUiLightsOut));
dump += StringPrintf(INDENT "Pointer Speed: %" PRId32 "\n", mLocked.pointerSpeed);
+ dump += StringPrintf(INDENT "Pointer Acceleration: %0.3f\n", mLocked.pointerAcceleration);
dump += StringPrintf(INDENT "Pointer Gestures Enabled: %s\n",
toString(mLocked.pointerGesturesEnabled));
dump += StringPrintf(INDENT "Show Touches: %s\n", toString(mLocked.showTouches));
@@ -628,6 +634,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon
outConfig->pointerVelocityControlParameters.scale = exp2f(mLocked.pointerSpeed
* POINTER_SPEED_EXPONENT);
+ outConfig->pointerVelocityControlParameters.acceleration = mLocked.pointerAcceleration;
outConfig->pointerGesturesEnabled = mLocked.pointerGesturesEnabled;
outConfig->showTouches = mLocked.showTouches;
@@ -1066,6 +1073,22 @@ void NativeInputManager::setPointerSpeed(int32_t speed) {
InputReaderConfiguration::CHANGE_POINTER_SPEED);
}
+void NativeInputManager::setPointerAcceleration(float acceleration) {
+ { // acquire lock
+ AutoMutex _l(mLock);
+
+ if (mLocked.pointerAcceleration == acceleration) {
+ return;
+ }
+
+ ALOGI("Setting pointer acceleration to %0.3f", acceleration);
+ mLocked.pointerAcceleration = acceleration;
+ } // release lock
+
+ mInputManager->getReader().requestRefreshConfiguration(
+ InputReaderConfiguration::CHANGE_POINTER_SPEED);
+}
+
void NativeInputManager::setInputDeviceEnabled(uint32_t deviceId, bool enabled) {
{ // acquire lock
AutoMutex _l(mLock);
@@ -1882,6 +1905,13 @@ static void nativeSetPointerSpeed(JNIEnv* /* env */, jclass /* clazz */, jlong p
im->setPointerSpeed(speed);
}
+static void nativeSetPointerAcceleration(JNIEnv* /* env */, jclass /* clazz */, jlong ptr,
+ jfloat acceleration) {
+ NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+
+ im->setPointerAcceleration(acceleration);
+}
+
static void nativeSetShowTouches(JNIEnv* /* env */,
jclass /* clazz */, jlong ptr, jboolean enabled) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
@@ -2373,6 +2403,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
(void*)nativeTransferTouchFocus},
{"nativeTransferTouch", "(JLandroid/os/IBinder;)Z", (void*)nativeTransferTouch},
{"nativeSetPointerSpeed", "(JI)V", (void*)nativeSetPointerSpeed},
+ {"nativeSetPointerAcceleration", "(JF)V", (void*)nativeSetPointerAcceleration},
{"nativeSetShowTouches", "(JZ)V", (void*)nativeSetShowTouches},
{"nativeSetInteractive", "(JZ)V", (void*)nativeSetInteractive},
{"nativeReloadCalibration", "(J)V", (void*)nativeReloadCalibration},
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
index 53468c81a1e2..ff1b6f66ef85 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
@@ -19,11 +19,13 @@ package com.android.server.companion.virtual;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.hardware.input.InputManagerInternal;
import android.os.Binder;
import android.os.IBinder;
+import android.os.IInputConstants;
import android.platform.test.annotations.Presubmit;
import android.view.Display;
@@ -64,9 +66,13 @@ public class InputControllerTest {
final IBinder deviceToken = new Binder();
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
/* displayId= */ 1);
+ verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
+ verify(mInputManagerInternalMock).setPointerAcceleration(eq(1f));
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(
eq(Display.INVALID_DISPLAY));
+ verify(mInputManagerInternalMock).setPointerAcceleration(
+ eq((float) IInputConstants.DEFAULT_POINTER_ACCELERATION));
}
@Test
@@ -75,10 +81,14 @@ public class InputControllerTest {
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
/* displayId= */ 1);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
- mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
+ verify(mInputManagerInternalMock).setPointerAcceleration(eq(1f));
+ final IBinder deviceToken2 = new Binder();
+ mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken2,
/* displayId= */ 2);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(2));
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
+ verify(mInputManagerInternalMock, times(0)).setPointerAcceleration(
+ eq((float) IInputConstants.DEFAULT_POINTER_ACCELERATION));
}
}