Merge "Cherry-pick "Dynamically enable spatial navigation based on events"" into klp-dev
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index be362a3..14b8014 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -1184,10 +1184,27 @@
return mContentViewCore.onKeyUp(keyCode, event);
}
+ private boolean isDpadEvent(KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* @see android.webkit.WebView#dispatchKeyEvent(KeyEvent)
*/
public boolean dispatchKeyEvent(KeyEvent event) {
+ if (isDpadEvent(event)) {
+ mSettings.setSpatialNavigationEnabled(true);
+ }
return mContentViewCore.dispatchKeyEvent(event);
}
@@ -1446,6 +1463,10 @@
public boolean onTouchEvent(MotionEvent event) {
if (mNativeAwContents == 0) return false;
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ mSettings.setSpatialNavigationEnabled(false);
+ }
+
mScrollOffsetManager.setProcessingTouchEvent(true);
boolean rv = mContentViewCore.onTouchEvent(event);
mScrollOffsetManager.setProcessingTouchEvent(false);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
index d9a979a..0a7452b 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -84,6 +84,7 @@
private boolean mMediaPlaybackRequiresUserGesture = true;
private String mDefaultVideoPosterURL;
private float mInitialPageScalePercent = 0;
+ private boolean mSpatialNavigationEnabled; // Default depends on device features.
private final boolean mSupportLegacyQuirks;
@@ -210,6 +211,10 @@
mUserAgent = LazyDefaultUserAgent.sInstance;
+ // Best-guess a sensible initial value based on the features supported on the device.
+ mSpatialNavigationEnabled = !context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_TOUCHSCREEN);
+
// Respect the system setting for password echoing.
mPasswordEchoEnabled = Settings.System.getInt(context.getContentResolver(),
Settings.System.TEXT_SHOW_PASSWORD, 1) == 1;
@@ -374,6 +379,20 @@
return mInitialPageScalePercent;
}
+ void setSpatialNavigationEnabled(boolean enable) {
+ synchronized (mAwSettingsLock) {
+ if (mSpatialNavigationEnabled != enable) {
+ mSpatialNavigationEnabled = enable;
+ mEventHandler.updateWebkitPreferencesLocked();
+ }
+ }
+ }
+
+ @CalledByNative
+ private boolean getSpatialNavigationLocked() {
+ return mSpatialNavigationEnabled;
+ }
+
/**
* See {@link android.webkit.WebSettings#setNeedInitialFocus}.
*/
@@ -1100,7 +1119,7 @@
}
@CalledByNative
- private boolean getPasswordEchoEnabled() {
+ private boolean getPasswordEchoEnabledLocked() {
return mPasswordEchoEnabled;
}
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 9537a6d..c951b21 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -73,9 +73,6 @@
// File system API not supported (requires some new API; internal bug 6930981)
cl->AppendSwitch(switches::kDisableFileSystem);
- // Enable D-PAD navigation for application compatibility.
- cl->AppendSwitch(switches::kEnableSpatialNavigation);
-
// Disable compositor touch hit testing for now to mitigate risk of bugs.
cl->AppendSwitch(cc::switches::kDisableCompositorTouchHitTesting);
diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc
index e4aa588..f227ddc 100644
--- a/android_webview/native/aw_settings.cc
+++ b/android_webview/native/aw_settings.cc
@@ -315,7 +315,9 @@
web_prefs->report_screen_size_in_physical_pixels_quirk = support_quirks;
web_prefs->password_echo_enabled =
- Java_AwSettings_getPasswordEchoEnabled(env, obj);
+ Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
+ web_prefs->spatial_navigation_enabled =
+ Java_AwSettings_getSpatialNavigationLocked(env, obj);
}
static jint Init(JNIEnv* env,