From a454767b09ecb7d25d00beae0e5a1fdd48605c63 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Wed, 2 Mar 2011 21:38:11 -0800 Subject: [PATCH] Get key repeat timeout and delay from ViewConfiguration. Replaces previously hardcoded values. This ensures that key repeat takes the accessibility long press timeout setting into account. Unfortunately the system must be rebooted for the change to take effect. We will fix that later. Change-Id: I3ab70bb037331620b7e532170c1727287b5c6f91 --- core/java/android/view/ViewConfiguration.java | 27 +++++++++++-- .../com/android/server/wm/InputManager.java | 13 +++++- .../jni/com_android_server_InputManager.cpp | 40 +++++++++++++++++-- 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index d95c5b0cd775f..739758c8c79f1 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -74,11 +74,16 @@ public class ViewConfiguration { private static final int PRESSED_STATE_DURATION = 125; /** - * Defines the duration in milliseconds before a press turns into + * Defines the default duration in milliseconds before a press turns into * a long press */ - private static final int DEFAULTLONG_PRESS_TIMEOUT = 500; - + private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500; + + /** + * Defines the time between successive key repeats in milliseconds. + */ + private static final int KEY_REPEAT_DELAY = 50; + /** * Defines the duration in milliseconds a user needs to hold down the * appropriate button to bring up the global actions dialog (power off, @@ -330,7 +335,21 @@ public class ViewConfiguration { */ public static int getLongPressTimeout() { return AppGlobals.getIntCoreSetting(Settings.Secure.LONG_PRESS_TIMEOUT, - DEFAULTLONG_PRESS_TIMEOUT); + DEFAULT_LONG_PRESS_TIMEOUT); + } + + /** + * @return the time before the first key repeat in milliseconds. + */ + public static int getKeyRepeatTimeout() { + return getLongPressTimeout(); + } + + /** + * @return the time between successive key repeats in milliseconds. + */ + public static int getKeyRepeatDelay() { + return KEY_REPEAT_DELAY; } /** diff --git a/services/java/com/android/server/wm/InputManager.java b/services/java/com/android/server/wm/InputManager.java index 77cec5d737ec2..fc32d5a91761d 100644 --- a/services/java/com/android/server/wm/InputManager.java +++ b/services/java/com/android/server/wm/InputManager.java @@ -40,6 +40,7 @@ import android.view.InputDevice; import android.view.InputEvent; import android.view.KeyEvent; import android.view.Surface; +import android.view.ViewConfiguration; import android.view.WindowManager; import java.io.File; @@ -529,7 +530,17 @@ public class InputManager { return names.toArray(new String[names.size()]); } - + + @SuppressWarnings("unused") + public int getKeyRepeatTimeout() { + return ViewConfiguration.getKeyRepeatTimeout(); + } + + @SuppressWarnings("unused") + public int getKeyRepeatDelay() { + return ViewConfiguration.getKeyRepeatDelay(); + } + @SuppressWarnings("unused") public int getMaxEventsPerSecond() { int result = 0; diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp index 00d0af1c0f374..3be3b1b03aa8f 100644 --- a/services/jni/com_android_server_InputManager.cpp +++ b/services/jni/com_android_server_InputManager.cpp @@ -67,6 +67,8 @@ static struct { jmethodID filterJumpyTouchEvents; jmethodID getVirtualKeyQuietTimeMillis; jmethodID getExcludedDeviceNames; + jmethodID getKeyRepeatTimeout; + jmethodID getKeyRepeatDelay; jmethodID getMaxEventsPerSecond; jmethodID getPointerLayer; jmethodID getPointerIcon; @@ -199,6 +201,10 @@ private: int32_t mFilterJumpyTouchEvents; nsecs_t mVirtualKeyQuietTime; + // Cached key repeat policy. + nsecs_t mKeyRepeatTimeout; + nsecs_t mKeyRepeatDelay; + // Cached throttling policy. int32_t mMaxEventsPerSecond; @@ -234,6 +240,7 @@ private: NativeInputManager::NativeInputManager(jobject callbacksObj, const sp& looper) : mLooper(looper), mFilterTouchEvents(-1), mFilterJumpyTouchEvents(-1), mVirtualKeyQuietTime(-1), + mKeyRepeatTimeout(-1), mKeyRepeatDelay(-1), mMaxEventsPerSecond(-1) { JNIEnv* env = jniEnv(); @@ -526,13 +533,34 @@ nsecs_t NativeInputManager::getKeyRepeatTimeout() { // Disable key repeat when the screen is off. return -1; } else { - // TODO use ViewConfiguration.getLongPressTimeout() - return milliseconds_to_nanoseconds(500); + if (mKeyRepeatTimeout < 0) { + JNIEnv* env = jniEnv(); + + jint result = env->CallIntMethod(mCallbacksObj, + gCallbacksClassInfo.getKeyRepeatTimeout); + if (checkAndClearExceptionFromCallback(env, "getKeyRepeatTimeout")) { + result = 500; + } + + mKeyRepeatTimeout = milliseconds_to_nanoseconds(result); + } + return mKeyRepeatTimeout; } } nsecs_t NativeInputManager::getKeyRepeatDelay() { - return milliseconds_to_nanoseconds(50); + if (mKeyRepeatDelay < 0) { + JNIEnv* env = jniEnv(); + + jint result = env->CallIntMethod(mCallbacksObj, + gCallbacksClassInfo.getKeyRepeatDelay); + if (checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) { + result = 50; + } + + mKeyRepeatDelay = milliseconds_to_nanoseconds(result); + } + return mKeyRepeatDelay; } int32_t NativeInputManager::getMaxEventsPerSecond() { @@ -1262,6 +1290,12 @@ int register_android_server_InputManager(JNIEnv* env) { GET_METHOD_ID(gCallbacksClassInfo.getExcludedDeviceNames, gCallbacksClassInfo.clazz, "getExcludedDeviceNames", "()[Ljava/lang/String;"); + GET_METHOD_ID(gCallbacksClassInfo.getKeyRepeatTimeout, gCallbacksClassInfo.clazz, + "getKeyRepeatTimeout", "()I"); + + GET_METHOD_ID(gCallbacksClassInfo.getKeyRepeatDelay, gCallbacksClassInfo.clazz, + "getKeyRepeatDelay", "()I"); + GET_METHOD_ID(gCallbacksClassInfo.getMaxEventsPerSecond, gCallbacksClassInfo.clazz, "getMaxEventsPerSecond", "()I");