diff options
3 files changed, 56 insertions, 4 deletions
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 9e914d4e7d41..d83bbf6d6abd 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -64,8 +64,9 @@ public class ViewConfiguration { /** * Defines the default duration in milliseconds before a press turns into * a long press + * @hide */ - private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500; + public static final int DEFAULT_LONG_PRESS_TIMEOUT = 400; /** * Defines the default duration in milliseconds between the first tap's up event and the second diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 8fbad4c5910b..86e54f5f7572 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -59,6 +59,7 @@ import android.os.MessageQueue; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; @@ -126,6 +127,9 @@ public class InputManagerService extends IInputManager.Stub private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml"; private static final String PORT_ASSOCIATIONS_PATH = "etc/input-port-associations.xml"; + // Feature flag name for the deep press feature + private static final String DEEP_PRESS_ENABLED = "deep_press_enabled"; + private static final int MSG_DELIVER_INPUT_DEVICES_CHANGED = 1; private static final int MSG_SWITCH_KEYBOARD_LAYOUT = 2; private static final int MSG_RELOAD_KEYBOARD_LAYOUTS = 3; @@ -241,6 +245,7 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon); private static native void nativeSetPointerCapture(long ptr, boolean detached); private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId); + private static native void nativeSetMotionClassifierEnabled(long ptr, boolean enabled); // Input event injection constants defined in InputDispatcher.h. private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0; @@ -346,6 +351,7 @@ public class InputManagerService extends IInputManager.Stub registerPointerSpeedSettingObserver(); registerShowTouchesSettingObserver(); registerAccessibilityLargePointerSettingObserver(); + registerLongPressTimeoutObserver(); mContext.registerReceiver(new BroadcastReceiver() { @Override @@ -353,12 +359,14 @@ public class InputManagerService extends IInputManager.Stub updatePointerSpeedFromSettings(); updateShowTouchesFromSettings(); updateAccessibilityLargePointerFromSettings(); + updateDeepPressStatusFromSettings("user switched"); } }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler); updatePointerSpeedFromSettings(); updateShowTouchesFromSettings(); updateAccessibilityLargePointerFromSettings(); + updateDeepPressStatusFromSettings("just booted"); } // TODO(BT) Pass in parameter for bluetooth system @@ -1572,7 +1580,7 @@ public class InputManagerService extends IInputManager.Stub setPointerSpeedUnchecked(speed); } - public void updatePointerSpeedFromSettings() { + private void updatePointerSpeedFromSettings() { int speed = getPointerSpeedSetting(); setPointerSpeedUnchecked(speed); } @@ -1604,7 +1612,7 @@ public class InputManagerService extends IInputManager.Stub return speed; } - public void updateShowTouchesFromSettings() { + private void updateShowTouchesFromSettings() { int setting = getShowTouchesSetting(0); nativeSetShowTouches(mPtr, setting != 0); } @@ -1620,7 +1628,7 @@ public class InputManagerService extends IInputManager.Stub }, UserHandle.USER_ALL); } - public void updateAccessibilityLargePointerFromSettings() { + private void updateAccessibilityLargePointerFromSettings() { final int accessibilityConfig = Settings.Secure.getIntForUser( mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, 0, UserHandle.USER_CURRENT); @@ -1639,6 +1647,34 @@ public class InputManagerService extends IInputManager.Stub }, UserHandle.USER_ALL); } + private void updateDeepPressStatusFromSettings(String reason) { + // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value + final int timeout = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT, + UserHandle.USER_CURRENT); + final boolean featureEnabledFlag = + DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT, + DEEP_PRESS_ENABLED, true /* default */); + final boolean enabled = + featureEnabledFlag && timeout <= ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT; + Log.i(TAG, + (enabled ? "Enabling" : "Disabling") + " motion classifier because " + reason + + ": feature " + (featureEnabledFlag ? "enabled" : "disabled") + + ", long press timeout = " + timeout); + nativeSetMotionClassifierEnabled(mPtr, enabled); + } + + private void registerLongPressTimeoutObserver() { + mContext.getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), true, + new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange) { + updateDeepPressStatusFromSettings("timeout changed"); + } + }, UserHandle.USER_ALL); + } + private int getShowTouchesSetting(int defaultValue) { int result = defaultValue; try { diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index d331d1f58b2d..b3f24b8d5b9c 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -227,6 +227,7 @@ public: void reloadPointerIcons(); void setCustomPointerIcon(const SpriteIcon& icon); void setPointerCapture(bool enabled); + void setMotionClassifierEnabled(bool enabled); /* --- InputReaderPolicyInterface implementation --- */ @@ -1312,6 +1313,10 @@ int32_t NativeInputManager::getCustomPointerIconId() { return POINTER_ICON_STYLE_CUSTOM; } +void NativeInputManager::setMotionClassifierEnabled(bool enabled) { + mInputManager->setMotionClassifierEnabled(enabled); +} + // ---------------------------------------------------------------------------- static jlong nativeInit(JNIEnv* env, jclass /* clazz */, @@ -1744,6 +1749,14 @@ static jboolean nativeCanDispatchToDisplay(JNIEnv* env, jclass /* clazz */, jlon return im->getInputManager()->getReader()->canDispatchToDisplay(deviceId, displayId); } +static void nativeSetMotionClassifierEnabled(JNIEnv* /* env */, jclass /* clazz */, jlong ptr, + jboolean enabled) { + NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + + im->setMotionClassifierEnabled(enabled); +} + + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -1827,6 +1840,8 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*) nativeSetCustomPointerIcon }, { "nativeCanDispatchToDisplay", "(JII)Z", (void*) nativeCanDispatchToDisplay }, + {"nativeSetMotionClassifierEnabled", "(JZ)V", + (void*) nativeSetMotionClassifierEnabled}, }; #define FIND_CLASS(var, className) \ |