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

Commit 916b649d authored by Michael Wright's avatar Michael Wright
Browse files

Generate locale-aware gamepad fallbacks for webview

Since WebView's input handling is asynchronous its KeyEvents get
re-injected to ViewRootImpl via dispatchUnhandledKey. Make sure these
events generate the new synthetic, locale-aware keys before
using the kcm fallbacks.

Bug: 11193726
Change-Id: I2605f15130ba4bb4ad23c7ad1f3e5edfbc4be99d
parent 385739be
Loading
Loading
Loading
Loading
+83 −66
Original line number Diff line number Diff line
@@ -4859,9 +4859,7 @@ public final class ViewRootImpl implements ViewParent,
        };
    }

    final class SyntheticKeyHandler {

        public boolean process(KeyEvent event) {
    private KeyEvent getSyntheticFallbackKey(KeyEvent event) {
        // In some locales (like Japan) controllers use B for confirm and A for back, rather
        // than vice versa, so we need to special case this here since the input system itself
        // is not locale-aware.
@@ -4904,15 +4902,25 @@ public final class ViewRootImpl implements ViewParent,
            case KeyEvent.KEYCODE_BUTTON_MODE:
                keyCode = KeyEvent.KEYCODE_MENU;
            default:
                    return false;
                return null;
        }

            enqueueInputEvent(new KeyEvent(event.getDownTime(), event.getEventTime(),
        return KeyEvent.obtain(event.getDownTime(), event.getEventTime(),
                        event.getAction(), keyCode, event.getRepeatCount(), event.getMetaState(),
                        event.getDeviceId(), event.getScanCode(),
                        event.getFlags() | KeyEvent.FLAG_FALLBACK, event.getSource()));
                        event.getFlags() | KeyEvent.FLAG_FALLBACK, event.getSource(), null);
    }


    final class SyntheticKeyHandler {

        public boolean process(KeyEvent event) {
            KeyEvent syntheticKey = getSyntheticFallbackKey(event);
            if (syntheticKey != null) {
                enqueueInputEvent(syntheticKey);
                return true;
            }
            return false;
        }

    }

@@ -5851,6 +5859,12 @@ public final class ViewRootImpl implements ViewParent,

    public void dispatchUnhandledKey(KeyEvent event) {
        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
            // Some fallback keys are decided by the ViewRoot as they might have special
            // properties (e.g. are locale aware). These take precedence over fallbacks defined by
            // the kcm.
            KeyEvent fallbackEvent = getSyntheticFallbackKey(event);

            if (fallbackEvent == null) {
                final KeyCharacterMap kcm = event.getKeyCharacterMap();
                final int keyCode = event.getKeyCode();
                final int metaState = event.getMetaState();
@@ -5860,7 +5874,7 @@ public final class ViewRootImpl implements ViewParent,
                        kcm.getFallbackAction(keyCode, metaState);
                if (fallbackAction != null) {
                    final int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
                KeyEvent fallbackEvent = KeyEvent.obtain(
                    fallbackEvent = KeyEvent.obtain(
                            event.getDownTime(), event.getEventTime(),
                            event.getAction(), fallbackAction.keyCode,
                            event.getRepeatCount(), fallbackAction.metaState,
@@ -5868,6 +5882,9 @@ public final class ViewRootImpl implements ViewParent,
                            flags, event.getSource(), null);
                    fallbackAction.recycle();

                }
            }
            if (fallbackEvent != null) {
                dispatchInputEvent(fallbackEvent);
            }
        }