diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 47a79bd5484af..04260c47eda32 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -23,7 +23,6 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Point; import android.os.Build; import android.os.RemoteException; import android.provider.Settings; @@ -66,8 +65,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 065e0c3e45c8f..0b22586bb3731 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -60,6 +60,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; @@ -246,6 +250,7 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeSetPointerCapture(long ptr, boolean detached); private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId); private static native void nativeNotifyPortAssociationsChanged(long ptr); + 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; @@ -356,6 +361,7 @@ public class InputManagerService extends IInputManager.Stub registerPointerSpeedSettingObserver(); registerShowTouchesSettingObserver(); registerAccessibilityLargePointerSettingObserver(); + registerLongPressTimeoutObserver(); mContext.registerReceiver(new BroadcastReceiver() { @Override @@ -363,12 +369,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 @@ -1600,7 +1608,7 @@ public class InputManagerService extends IInputManager.Stub setPointerSpeedUnchecked(speed); } - public void updatePointerSpeedFromSettings() { + private void updatePointerSpeedFromSettings() { int speed = getPointerSpeedSetting(); setPointerSpeedUnchecked(speed); } @@ -1632,7 +1640,7 @@ public class InputManagerService extends IInputManager.Stub return speed; } - public void updateShowTouchesFromSettings() { + private void updateShowTouchesFromSettings() { int setting = getShowTouchesSetting(0); nativeSetShowTouches(mPtr, setting != 0); } @@ -1648,7 +1656,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); @@ -1667,6 +1675,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 e0d40452590be..e3f9ae8969b35 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -220,6 +220,7 @@ public: void reloadPointerIcons(); void setCustomPointerIcon(const SpriteIcon& icon); void setPointerCapture(bool enabled); + void setMotionClassifierEnabled(bool enabled); /* --- InputReaderPolicyInterface implementation --- */ @@ -1295,6 +1296,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 */, @@ -1774,6 +1779,13 @@ static void nativeNotifyPortAssociationsChanged(JNIEnv* env, jclass /* clazz */, InputReaderConfiguration::CHANGE_DISPLAY_INFO); } +static void nativeSetMotionClassifierEnabled(JNIEnv* /* env */, jclass /* clazz */, jlong ptr, + jboolean enabled) { + NativeInputManager* im = reinterpret_cast(ptr); + + im->setMotionClassifierEnabled(enabled); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -1832,6 +1844,7 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*)nativeSetCustomPointerIcon}, {"nativeCanDispatchToDisplay", "(JII)Z", (void*)nativeCanDispatchToDisplay}, {"nativeNotifyPortAssociationsChanged", "(J)V", (void*)nativeNotifyPortAssociationsChanged}, + {"nativeSetMotionClassifierEnabled", "(JZ)V", (void*)nativeSetMotionClassifierEnabled}, }; #define FIND_CLASS(var, className) \