Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java

Issue 2762123006: Android Autofill Accessibility, Phase I (Closed)
Patch Set: Creates AX proxy node only if Android autofill accessibility is enabled. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698