Loading core/java/android/hardware/input/InputManager.java +0 −2 Original line number Diff line number Diff line Loading @@ -16,9 +16,7 @@ package android.hardware.input; import com.android.internal.inputmethod.InputMethodSubtypeHandle; import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import android.annotation.IntDef; import android.annotation.SdkConstant; Loading core/java/android/hardware/input/InputManagerInternal.java +7 −0 Original line number Diff line number Diff line Loading @@ -52,4 +52,11 @@ public abstract class InputManagerInternal { */ public abstract void onInputMethodSubtypeChanged(int userId, @Nullable InputMethodInfo inputMethodInfo, @Nullable InputMethodSubtype subtype); /** * Toggles Caps Lock state for input device with specific id. * * @param deviceId The id of input device. */ public abstract void toggleCapsLock(int deviceId); } core/java/android/view/KeyEvent.java +5 −0 Original line number Diff line number Diff line Loading @@ -1870,6 +1870,11 @@ public class KeyEvent extends InputEvent implements Parcelable { return keyCode == KeyEvent.KEYCODE_META_LEFT || keyCode == KeyEvent.KEYCODE_META_RIGHT; } /** @hide */ public static final boolean isAltKey(int keyCode) { return keyCode == KeyEvent.KEYCODE_ALT_LEFT || keyCode == KeyEvent.KEYCODE_ALT_RIGHT; } /** {@inheritDoc} */ @Override public final int getDeviceId() { Loading services/core/java/com/android/server/input/InputManagerService.java +6 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,7 @@ public class InputManagerService extends IInputManager.Stub private static native int nativeInjectInputEvent(long ptr, InputEvent event, int displayId, int injectorPid, int injectorUid, int syncMode, int timeoutMillis, int policyFlags); private static native void nativeToggleCapsLock(long ptr, int deviceId); private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles); private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen); private static native void nativeSetSystemUiVisibility(long ptr, int visibility); Loading Loading @@ -2279,5 +2280,10 @@ public class InputManagerService extends IInputManager.Stub mHandler.obtainMessage(MSG_INPUT_METHOD_SUBTYPE_CHANGED, userId, 0, someArgs) .sendToTarget(); } @Override public void toggleCapsLock(int deviceId) { nativeToggleCapsLock(mPtr, deviceId); } } } services/core/java/com/android/server/policy/PhoneWindowManager.java +42 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.graphics.Rect; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback; import android.hardware.input.InputManagerInternal; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioSystem; Loading Loading @@ -305,6 +306,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowManagerInternal mWindowManagerInternal; PowerManager mPowerManager; ActivityManagerInternal mActivityManagerInternal; InputManagerInternal mInputManagerInternal; DreamManagerInternal mDreamManagerInternal; PowerManagerInternal mPowerManagerInternal; IStatusBarService mStatusBarService; Loading Loading @@ -604,6 +606,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mConsumeSearchKeyUp; boolean mAssistKeyLongPressed; boolean mPendingMetaAction; boolean mPendingCapsLockToggle; int mMetaState; int mInitialMetaState; boolean mForceShowSystemBars; // support for activating the lock screen while the screen is on Loading Loading @@ -1494,6 +1499,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs = windowManagerFuncs; mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class); mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); Loading Loading @@ -2968,6 +2974,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mPendingMetaAction && !KeyEvent.isMetaKey(keyCode)) { mPendingMetaAction = false; } // Any key that is not Alt or Meta cancels Caps Lock combo tracking. if (mPendingCapsLockToggle && !KeyEvent.isMetaKey(keyCode) && !KeyEvent.isAltKey(keyCode)) { mPendingCapsLockToggle = false; } // First we always handle the home key here, so applications // can never break it, although if keyguard is on, we do let Loading Loading @@ -3216,6 +3226,38 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } // Toggle Caps Lock on META-ALT. boolean actionTriggered = false; if (KeyEvent.isModifierKey(keyCode)) { if (!mPendingCapsLockToggle) { // Start tracking meta state for combo. mInitialMetaState = mMetaState; mPendingCapsLockToggle = true; } else if (event.getAction() == KeyEvent.ACTION_UP) { int altOnMask = mMetaState & KeyEvent.META_ALT_MASK; int metaOnMask = mMetaState & KeyEvent.META_META_MASK; // Check for Caps Lock toggle if ((metaOnMask != 0) && (altOnMask != 0)) { // Check if nothing else is pressed if (mInitialMetaState == (mMetaState ^ (altOnMask | metaOnMask))) { // Handle Caps Lock Toggle mInputManagerInternal.toggleCapsLock(event.getDeviceId()); actionTriggered = true; } } // Always stop tracking when key goes up. mPendingCapsLockToggle = false; } } // Store current meta state to be able to evaluate it later. mMetaState = metaState; if (actionTriggered) { return -1; } if (KeyEvent.isMetaKey(keyCode)) { if (down) { mPendingMetaAction = true; Loading Loading
core/java/android/hardware/input/InputManager.java +0 −2 Original line number Diff line number Diff line Loading @@ -16,9 +16,7 @@ package android.hardware.input; import com.android.internal.inputmethod.InputMethodSubtypeHandle; import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import android.annotation.IntDef; import android.annotation.SdkConstant; Loading
core/java/android/hardware/input/InputManagerInternal.java +7 −0 Original line number Diff line number Diff line Loading @@ -52,4 +52,11 @@ public abstract class InputManagerInternal { */ public abstract void onInputMethodSubtypeChanged(int userId, @Nullable InputMethodInfo inputMethodInfo, @Nullable InputMethodSubtype subtype); /** * Toggles Caps Lock state for input device with specific id. * * @param deviceId The id of input device. */ public abstract void toggleCapsLock(int deviceId); }
core/java/android/view/KeyEvent.java +5 −0 Original line number Diff line number Diff line Loading @@ -1870,6 +1870,11 @@ public class KeyEvent extends InputEvent implements Parcelable { return keyCode == KeyEvent.KEYCODE_META_LEFT || keyCode == KeyEvent.KEYCODE_META_RIGHT; } /** @hide */ public static final boolean isAltKey(int keyCode) { return keyCode == KeyEvent.KEYCODE_ALT_LEFT || keyCode == KeyEvent.KEYCODE_ALT_RIGHT; } /** {@inheritDoc} */ @Override public final int getDeviceId() { Loading
services/core/java/com/android/server/input/InputManagerService.java +6 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,7 @@ public class InputManagerService extends IInputManager.Stub private static native int nativeInjectInputEvent(long ptr, InputEvent event, int displayId, int injectorPid, int injectorUid, int syncMode, int timeoutMillis, int policyFlags); private static native void nativeToggleCapsLock(long ptr, int deviceId); private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles); private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen); private static native void nativeSetSystemUiVisibility(long ptr, int visibility); Loading Loading @@ -2279,5 +2280,10 @@ public class InputManagerService extends IInputManager.Stub mHandler.obtainMessage(MSG_INPUT_METHOD_SUBTYPE_CHANGED, userId, 0, someArgs) .sendToTarget(); } @Override public void toggleCapsLock(int deviceId) { nativeToggleCapsLock(mPtr, deviceId); } } }
services/core/java/com/android/server/policy/PhoneWindowManager.java +42 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.graphics.Rect; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback; import android.hardware.input.InputManagerInternal; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioSystem; Loading Loading @@ -305,6 +306,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowManagerInternal mWindowManagerInternal; PowerManager mPowerManager; ActivityManagerInternal mActivityManagerInternal; InputManagerInternal mInputManagerInternal; DreamManagerInternal mDreamManagerInternal; PowerManagerInternal mPowerManagerInternal; IStatusBarService mStatusBarService; Loading Loading @@ -604,6 +606,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mConsumeSearchKeyUp; boolean mAssistKeyLongPressed; boolean mPendingMetaAction; boolean mPendingCapsLockToggle; int mMetaState; int mInitialMetaState; boolean mForceShowSystemBars; // support for activating the lock screen while the screen is on Loading Loading @@ -1494,6 +1499,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs = windowManagerFuncs; mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class); mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); Loading Loading @@ -2968,6 +2974,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mPendingMetaAction && !KeyEvent.isMetaKey(keyCode)) { mPendingMetaAction = false; } // Any key that is not Alt or Meta cancels Caps Lock combo tracking. if (mPendingCapsLockToggle && !KeyEvent.isMetaKey(keyCode) && !KeyEvent.isAltKey(keyCode)) { mPendingCapsLockToggle = false; } // First we always handle the home key here, so applications // can never break it, although if keyguard is on, we do let Loading Loading @@ -3216,6 +3226,38 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } // Toggle Caps Lock on META-ALT. boolean actionTriggered = false; if (KeyEvent.isModifierKey(keyCode)) { if (!mPendingCapsLockToggle) { // Start tracking meta state for combo. mInitialMetaState = mMetaState; mPendingCapsLockToggle = true; } else if (event.getAction() == KeyEvent.ACTION_UP) { int altOnMask = mMetaState & KeyEvent.META_ALT_MASK; int metaOnMask = mMetaState & KeyEvent.META_META_MASK; // Check for Caps Lock toggle if ((metaOnMask != 0) && (altOnMask != 0)) { // Check if nothing else is pressed if (mInitialMetaState == (mMetaState ^ (altOnMask | metaOnMask))) { // Handle Caps Lock Toggle mInputManagerInternal.toggleCapsLock(event.getDeviceId()); actionTriggered = true; } } // Always stop tracking when key goes up. mPendingCapsLockToggle = false; } } // Store current meta state to be able to evaluate it later. mMetaState = metaState; if (actionTriggered) { return -1; } if (KeyEvent.isMetaKey(keyCode)) { if (down) { mPendingMetaAction = true; Loading