Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java |
| index 6d63ded0c148b0b4c088d373b9af02707346af15..33afba774df9d22591856734bd68217f0ad02c7f 100644 |
| --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java |
| +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java |
| @@ -20,6 +20,7 @@ import android.view.accessibility.AccessibilityEvent; |
| import android.view.accessibility.AccessibilityManager; |
| import android.view.accessibility.AccessibilityNodeInfo; |
| import android.view.accessibility.AccessibilityNodeProvider; |
| +import android.widget.ListView; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.annotations.JNINamespace; |
| @@ -35,8 +36,6 @@ import java.util.Locale; |
| */ |
| @JNINamespace("content") |
| public class BrowserAccessibilityManager { |
| - private static final String TAG = "BrowserAccessibilityManager"; |
| - |
| // Constants from AccessibilityNodeInfo defined in the K SDK. |
| private static final int ACTION_COLLAPSE = 0x00080000; |
| private static final int ACTION_EXPAND = 0x00040000; |
| @@ -75,6 +74,7 @@ public class BrowserAccessibilityManager { |
| private int mSelectionEndIndex; |
| protected int mAccessibilityFocusId; |
| private Runnable mSendWindowContentChangedRunnable; |
| + private ListView mAutofillPopupListView; |
|
dmazzoni
2017/03/28 16:47:35
Does this class need to know it's a ListView or co
csashi
2017/03/28 17:48:10
Done.
|
| /** |
| * Create a BrowserAccessibilityManager object, which is owned by the C++ |
| @@ -162,7 +162,6 @@ public class BrowserAccessibilityManager { |
| if (!mAccessibilityManager.isEnabled() || mNativeObj == 0) { |
| return null; |
| } |
| - |
| int rootId = nativeGetRootId(mNativeObj); |
| if (virtualViewId == View.NO_ID) { |
| @@ -221,7 +220,6 @@ public class BrowserAccessibilityManager { |
| switch (action) { |
| case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: |
| if (!moveAccessibilityFocusToId(virtualViewId)) return true; |
| - |
| if (!mIsHovering) { |
| nativeScrollToMakeNodeVisible( |
| mNativeObj, mAccessibilityFocusId); |
| @@ -357,6 +355,20 @@ public class BrowserAccessibilityManager { |
| return false; |
| } |
| + public void onAutofillPopupDisplayed(ListView listView) { |
| + if (mAccessibilityManager.isEnabled() && mNativeObj != 0) { |
| + mAutofillPopupListView = listView; |
| + nativeOnAutofillPopupDisplayed(mNativeObj); |
| + } |
| + } |
| + |
| + public void onAutofillPopupDismissed() { |
| + if (mAccessibilityManager.isEnabled() && mNativeObj != 0) { |
| + nativeOnAutofillPopupDismissed(mNativeObj); |
| + mAutofillPopupListView = null; |
| + } |
| + } |
| + |
| /** |
| * @see View#onHoverEvent(MotionEvent) |
| */ |
| @@ -543,6 +555,12 @@ public class BrowserAccessibilityManager { |
| // for the whole subtree of the root. |
| if (mAccessibilityFocusId == mCurrentRootId) { |
| nativeSetAccessibilityFocus(mNativeObj, -1); |
| + } else if (nativeIsAutofillPopupNode(mNativeObj, mAccessibilityFocusId)) { |
| + // If we do not call |requestFocus|, the first right swipe does not take talkback into |
| + // the autofill popup. Only subsequent right swipes take talkback into the popup if we |
| + // do not call |requestFocus|. |
| + mAutofillPopupListView.requestFocus(); |
| + mAutofillPopupListView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); |
|
dmazzoni
2017/03/28 16:47:35
Do you need to call this? requestFocus() should be
csashi
2017/03/28 17:48:10
Done.
|
| } else { |
| nativeSetAccessibilityFocus(mNativeObj, mAccessibilityFocusId); |
| } |
| @@ -552,6 +570,19 @@ public class BrowserAccessibilityManager { |
| return true; |
| } |
| + public boolean handleBackPressed() { |
| + if (mAccessibilityManager.isEnabled() && mNativeObj != 0 |
|
dmazzoni
2017/03/28 16:47:35
Reverse these tests to have less indentation and e
csashi
2017/03/28 17:48:10
Acknowledged. Function not needed.
|
| + && nativeIsAutofillPopupNode(mNativeObj, mAccessibilityFocusId)) { |
| + int id = nativeGetElementHostingAutofillPopupId(mNativeObj); |
| + if (id > 0) { |
| + moveAccessibilityFocusToId(id); |
| + nativeScrollToMakeNodeVisible(mNativeObj, mAccessibilityFocusId); |
| + return true; |
| + } |
| + } |
| + return false; |
| + } |
| + |
| private void moveAccessibilityFocusToIdAndRefocusIfNeeded(int newAccessibilityFocusId) { |
| // Work around a bug in the Android framework where it doesn't fully update the object |
| // with accessibility focus even if you send it a WINDOW_CONTENT_CHANGED. To work around |
| @@ -561,7 +592,6 @@ public class BrowserAccessibilityManager { |
| AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); |
| mAccessibilityFocusId = View.NO_ID; |
| } |
| - |
| moveAccessibilityFocusToId(newAccessibilityFocusId); |
| } |
| @@ -1162,8 +1192,16 @@ public class BrowserAccessibilityManager { |
| Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0) == 1); |
| } |
| + private native void nativeOnAutofillPopupDisplayed( |
| + long nativeBrowserAccessibilityManagerAndroid); |
| + private native void nativeOnAutofillPopupDismissed( |
| + long nativeBrowserAccessibilityManagerAndroid); |
| private native int nativeGetRootId(long nativeBrowserAccessibilityManagerAndroid); |
| + private native int nativeGetElementHostingAutofillPopupId( |
| + long nativeBrowserAccessibilityManagerAndroid); |
| private native boolean nativeIsNodeValid(long nativeBrowserAccessibilityManagerAndroid, int id); |
| + private native boolean nativeIsAutofillPopupNode( |
| + long nativeBrowserAccessibilityManagerAndroid, int id); |
| private native boolean nativeIsEditableText( |
| long nativeBrowserAccessibilityManagerAndroid, int id); |
| private native boolean nativeIsFocused( |