Skip to content

Commit ebd4775

Browse files
jreckAndroid (Google) Code Review
authored andcommitted
Merge "Support fallback action if unhandled key event"
2 parents 069fa7b + d6b1098 commit ebd4775

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

core/java/android/view/ViewRootImpl.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import android.util.Log;
6060
import android.util.Slog;
6161
import android.util.TypedValue;
62+
import android.view.KeyCharacterMap.FallbackAction;
6263
import android.view.View.AttachInfo;
6364
import android.view.View.MeasureSpec;
6465
import android.view.accessibility.AccessibilityEvent;
@@ -323,6 +324,8 @@ class ResizedInfo {
323324

324325
private final int mDensity;
325326

327+
final KeyCharacterMap.FallbackAction mFallbackAction = new KeyCharacterMap.FallbackAction();
328+
326329
/**
327330
* Consistency verifier for debugging purposes.
328331
*/
@@ -4383,6 +4386,31 @@ public void dispatchKeyFromIme(KeyEvent event) {
43834386
mHandler.sendMessage(msg);
43844387
}
43854388

4389+
public void dispatchUnhandledKey(KeyEvent event) {
4390+
if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
4391+
final KeyCharacterMap kcm = event.getKeyCharacterMap();
4392+
final int keyCode = event.getKeyCode();
4393+
final int metaState = event.getMetaState();
4394+
4395+
KeyEvent fallbackEvent = null;
4396+
synchronized (mFallbackAction) {
4397+
// Check for fallback actions specified by the key character map.
4398+
if (kcm.getFallbackAction(keyCode, metaState, mFallbackAction)) {
4399+
int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
4400+
fallbackEvent = KeyEvent.obtain(
4401+
event.getDownTime(), event.getEventTime(),
4402+
event.getAction(), mFallbackAction.keyCode,
4403+
event.getRepeatCount(), mFallbackAction.metaState,
4404+
event.getDeviceId(), event.getScanCode(),
4405+
flags, event.getSource(), null);
4406+
}
4407+
}
4408+
if (fallbackEvent != null) {
4409+
dispatchKey(fallbackEvent);
4410+
}
4411+
}
4412+
}
4413+
43864414
public void dispatchAppVisibility(boolean visible) {
43874415
Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
43884416
msg.arg1 = visible ? 1 : 0;

core/java/android/webkit/WebViewClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import android.net.http.SslError;
2121
import android.os.Message;
2222
import android.view.KeyEvent;
23+
import android.view.ViewRootImpl;
2324

2425
public class WebViewClient {
2526

@@ -273,6 +274,10 @@ public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
273274
* @param event The key event.
274275
*/
275276
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
277+
ViewRootImpl root = view.getViewRootImpl();
278+
if (root != null) {
279+
root.dispatchUnhandledKey(event);
280+
}
276281
}
277282

278283
/**

0 commit comments

Comments
 (0)