Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 112d0567 authored by Andrii Kulian's avatar Andrii Kulian
Browse files

Caps Lock toggle with Meta + Alt (2/2)

Caps Lock implementation in frameworks/base

Bug: 27482276
Change-Id: Ie0d8145c049197d4591e012832a710e4f751d2ac
parent 22098605
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -16,9 +16,7 @@


package android.hardware.input;
package android.hardware.input;


import com.android.internal.inputmethod.InputMethodSubtypeHandle;
import com.android.internal.os.SomeArgs;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;


import android.annotation.IntDef;
import android.annotation.IntDef;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant;
+7 −0
Original line number Original line Diff line number Diff line
@@ -52,4 +52,11 @@ public abstract class InputManagerInternal {
     */
     */
    public abstract void onInputMethodSubtypeChanged(int userId,
    public abstract void onInputMethodSubtypeChanged(int userId,
            @Nullable InputMethodInfo inputMethodInfo, @Nullable InputMethodSubtype subtype);
            @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);
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -1870,6 +1870,11 @@ public class KeyEvent extends InputEvent implements Parcelable {
        return keyCode == KeyEvent.KEYCODE_META_LEFT || keyCode == KeyEvent.KEYCODE_META_RIGHT;
        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} */
    /** {@inheritDoc} */
    @Override
    @Override
    public final int getDeviceId() {
    public final int getDeviceId() {
+6 −0
Original line number Original line Diff line number Diff line
@@ -200,6 +200,7 @@ public class InputManagerService extends IInputManager.Stub
    private static native int nativeInjectInputEvent(long ptr, InputEvent event, int displayId,
    private static native int nativeInjectInputEvent(long ptr, InputEvent event, int displayId,
            int injectorPid, int injectorUid, int syncMode, int timeoutMillis,
            int injectorPid, int injectorUid, int syncMode, int timeoutMillis,
            int policyFlags);
            int policyFlags);
    private static native void nativeToggleCapsLock(long ptr, int deviceId);
    private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles);
    private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles);
    private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen);
    private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen);
    private static native void nativeSetSystemUiVisibility(long ptr, int visibility);
    private static native void nativeSetSystemUiVisibility(long ptr, int visibility);
@@ -2279,5 +2280,10 @@ public class InputManagerService extends IInputManager.Stub
            mHandler.obtainMessage(MSG_INPUT_METHOD_SUBTYPE_CHANGED, userId, 0, someArgs)
            mHandler.obtainMessage(MSG_INPUT_METHOD_SUBTYPE_CHANGED, userId, 0, someArgs)
                    .sendToTarget();
                    .sendToTarget();
        }
        }

        @Override
        public void toggleCapsLock(int deviceId) {
            nativeToggleCapsLock(mPtr, deviceId);
        }
    }
    }
}
}
+42 −0
Original line number Original line Diff line number Diff line
@@ -69,6 +69,7 @@ import android.graphics.Rect;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
import android.hardware.input.InputManagerInternal;
import android.media.AudioAttributes;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.AudioSystem;
@@ -304,6 +305,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    WindowManagerInternal mWindowManagerInternal;
    WindowManagerInternal mWindowManagerInternal;
    PowerManager mPowerManager;
    PowerManager mPowerManager;
    ActivityManagerInternal mActivityManagerInternal;
    ActivityManagerInternal mActivityManagerInternal;
    InputManagerInternal mInputManagerInternal;
    DreamManagerInternal mDreamManagerInternal;
    DreamManagerInternal mDreamManagerInternal;
    PowerManagerInternal mPowerManagerInternal;
    PowerManagerInternal mPowerManagerInternal;
    IStatusBarService mStatusBarService;
    IStatusBarService mStatusBarService;
@@ -601,6 +603,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    boolean mConsumeSearchKeyUp;
    boolean mConsumeSearchKeyUp;
    boolean mAssistKeyLongPressed;
    boolean mAssistKeyLongPressed;
    boolean mPendingMetaAction;
    boolean mPendingMetaAction;
    boolean mPendingCapsLockToggle;
    int mMetaState;
    int mInitialMetaState;
    boolean mForceShowSystemBars;
    boolean mForceShowSystemBars;


    // support for activating the lock screen while the screen is on
    // support for activating the lock screen while the screen is on
@@ -1486,6 +1491,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mWindowManagerFuncs = windowManagerFuncs;
        mWindowManagerFuncs = windowManagerFuncs;
        mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
        mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
        mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
        mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
        mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
        mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);
        mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);
        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
@@ -2954,6 +2960,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (mPendingMetaAction && !KeyEvent.isMetaKey(keyCode)) {
        if (mPendingMetaAction && !KeyEvent.isMetaKey(keyCode)) {
            mPendingMetaAction = false;
            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
        // First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // can never break it, although if keyguard is on, we do let
@@ -3202,6 +3212,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 (KeyEvent.isMetaKey(keyCode)) {
            if (down) {
            if (down) {
                mPendingMetaAction = true;
                mPendingMetaAction = true;
Loading