Index: android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java |
index da09a1a3eb0c9816f9cd5e5e638c42e7f5df459b..7e3512d7ec64f28b71cf73d941ba2f3540d9a5f6 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java |
@@ -10,6 +10,7 @@ import android.os.Looper; |
import android.os.Message; |
import android.util.Log; |
import android.view.KeyEvent; |
+import android.view.View; |
import android.webkit.ConsoleMessage; |
import android.webkit.ValueCallback; |
@@ -37,11 +38,14 @@ class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { |
final AwContentsClient mContentsClient; |
final PreferredSizeChangedListener mPreferredSizeChangedListener; |
+ final View mContainerView; |
public AwWebContentsDelegateAdapter(AwContentsClient contentsClient, |
- PreferredSizeChangedListener preferredSizeChangedListener) { |
+ PreferredSizeChangedListener preferredSizeChangedListener, |
+ View containerView) { |
mContentsClient = contentsClient; |
mPreferredSizeChangedListener = preferredSizeChangedListener; |
+ mContainerView = containerView; |
} |
@Override |
@@ -51,10 +55,46 @@ class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { |
@Override |
public void handleKeyboardEvent(KeyEvent event) { |
+ if (event.getAction() == KeyEvent.ACTION_DOWN) { |
+ int direction; |
+ switch (event.getKeyCode()) { |
+ case KeyEvent.KEYCODE_DPAD_DOWN: |
+ direction = View.FOCUS_DOWN; |
+ break; |
+ case KeyEvent.KEYCODE_DPAD_UP: |
+ direction = View.FOCUS_UP; |
+ break; |
+ case KeyEvent.KEYCODE_DPAD_LEFT: |
+ direction = View.FOCUS_LEFT; |
+ break; |
+ case KeyEvent.KEYCODE_DPAD_RIGHT: |
+ direction = View.FOCUS_RIGHT; |
+ break; |
+ default: |
+ direction = 0; |
+ break; |
+ } |
+ if (direction != 0 && tryToMoveFocus(direction)) return; |
+ } |
mContentsClient.onUnhandledKeyEvent(event); |
} |
@Override |
+ public boolean takeFocus(boolean reverse) { |
+ int direction = |
+ (reverse == (mContainerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)) ? |
+ View.FOCUS_RIGHT : View.FOCUS_LEFT; |
+ if (tryToMoveFocus(direction)) return true; |
+ direction = reverse ? View.FOCUS_UP : View.FOCUS_DOWN; |
+ return tryToMoveFocus(direction); |
+ } |
+ |
+ private boolean tryToMoveFocus(int direction) { |
+ View focus = mContainerView.focusSearch(direction); |
+ return focus != null && focus != mContainerView && focus.requestFocus(); |
+ } |
+ |
+ @Override |
public boolean addMessageToConsole(int level, String message, int lineNumber, |
String sourceId) { |
ConsoleMessage.MessageLevel messageLevel = ConsoleMessage.MessageLevel.DEBUG; |