From 815fb1f40cdfa7d546da38d16223967954d9ffdf Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Mon, 10 Jul 2017 16:14:15 -0700 Subject: [PATCH] Fixed some small keyboard nav bugs (TabHost, directional focus) - TabHost was forwarding Tab/shift+tab/space to its content instead of navigating through the tabs. - FocusFinder's directional focus considered 2 touching Views to be overlapping which would yield confusing directional movement at times. Bug: 62943663 Bug: 62911028 Test: Added CTS tests Change-Id: I253f66b7513daf5c2c9fdeed8a2fb930b4fd8db4 --- core/java/android/view/FocusFinder.java | 4 ++-- core/java/android/widget/TabHost.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java index 48e5ca9a20f4c..8eee1a4bc3cd7 100644 --- a/core/java/android/view/FocusFinder.java +++ b/core/java/android/view/FocusFinder.java @@ -564,10 +564,10 @@ public class FocusFinder { switch (direction) { case View.FOCUS_LEFT: case View.FOCUS_RIGHT: - return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom); + return (rect2.bottom > rect1.top) && (rect2.top < rect1.bottom); case View.FOCUS_UP: case View.FOCUS_DOWN: - return (rect2.right >= rect1.left) && (rect2.left <= rect1.right); + return (rect2.right > rect1.left) && (rect2.left < rect1.right); } throw new IllegalArgumentException("direction must be one of " + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}."); diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java index 8de17c072b595..8696d0d5df7fb 100644 --- a/core/java/android/widget/TabHost.java +++ b/core/java/android/widget/TabHost.java @@ -146,12 +146,17 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1"); // and relays them to the tab content. mTabKeyListener = new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { + if (KeyEvent.isModifierKey(keyCode)) { + return false; + } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_TAB: + case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_ENTER: return false;