Commit 9ce3a207 authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Update BrowserAccessibilityManager to support Lollipop SDK.

Renames KitKatBrowserAccessibilityManager to LollipopBrowserAccessibilityManager
because we were never able to use the KitKat variant due to KitKat framework
bugs.

Adds a new method specifically for adding actions to AccessibilityNodeInfo,
so we can use the new API in Lollipop, and suppresses the deprecation warnings
in the non-Lollipop implementation.

This gets rid of all of the remaining deprecation warnings in content/.

BUG=405174

Review URL: https://codereview.chromium.org/925923003

Cr-Commit-Position: refs/heads/master@{#316293}
parent 8e556e6d
......@@ -253,12 +253,9 @@ jboolean BrowserAccessibilityManagerAndroid::PopulateAccessibilityNodeInfo(
Java_BrowserAccessibilityManager_setAccessibilityNodeInfoBooleanAttributes(
env, obj, info,
id,
node->CanScrollForward(),
node->CanScrollBackward(),
node->IsCheckable(),
node->IsChecked(),
node->IsClickable(),
node->IsEditableText(),
node->IsEnabled(),
node->IsFocusable(),
node->IsFocused(),
......@@ -266,6 +263,16 @@ jboolean BrowserAccessibilityManagerAndroid::PopulateAccessibilityNodeInfo(
node->IsScrollable(),
node->IsSelected(),
node->IsVisibleToUser());
Java_BrowserAccessibilityManager_addAccessibilityNodeInfoActions(
env, obj, info,
id,
node->CanScrollForward(),
node->CanScrollBackward(),
node->IsClickable(),
node->IsEditableText(),
node->IsEnabled(),
node->IsFocusable(),
node->IsFocused());
Java_BrowserAccessibilityManager_setAccessibilityNodeInfoClassName(
env, obj, info,
base::android::ConvertUTF8ToJavaString(env, node->GetClassName()).obj());
......@@ -292,8 +299,7 @@ jboolean BrowserAccessibilityManagerAndroid::PopulateAccessibilityNodeInfo(
absolute_rect.width(), absolute_rect.height(),
is_root);
// New KitKat APIs
Java_BrowserAccessibilityManager_setAccessibilityNodeInfoKitKatAttributes(
Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLollipopAttributes(
env, obj, info,
node->CanOpenPopup(),
node->IsContentInvalid(),
......@@ -392,8 +398,7 @@ jboolean BrowserAccessibilityManagerAndroid::PopulateAccessibilityEvent(
break;
}
// Backwards-compatible fallback for new KitKat APIs.
Java_BrowserAccessibilityManager_setAccessibilityEventKitKatAttributes(
Java_BrowserAccessibilityManager_setAccessibilityEventLollipopAttributes(
env, obj, event,
node->CanOpenPopup(),
node->IsContentInvalid(),
......
......@@ -50,7 +50,6 @@ public class BrowserAccessibilityManager {
private final AccessibilityManager mAccessibilityManager;
private final RenderCoordinates mRenderCoordinates;
private long mNativeObj;
private int mAccessibilityFocusId;
private Rect mAccessibilityFocusRect;
private boolean mIsHovering;
private int mLastHoverId = View.NO_ID;
......@@ -63,7 +62,8 @@ public class BrowserAccessibilityManager {
private int mSelectionGranularity;
private int mSelectionStartIndex;
private int mSelectionEndIndex;
private boolean mVisible = true;
protected int mAccessibilityFocusId;
protected boolean mVisible = true;
/**
* Create a BrowserAccessibilityManager object, which is owned by the C++
......@@ -75,13 +75,10 @@ public class BrowserAccessibilityManager {
@CalledByNative
private static BrowserAccessibilityManager create(long nativeBrowserAccessibilityManagerAndroid,
ContentViewCore contentViewCore) {
// A bug in the KitKat framework prevents us from using these new APIs.
// http://crbug.com/348088/
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// return new KitKatBrowserAccessibilityManager(
// nativeBrowserAccessibilityManagerAndroid, contentViewCore);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return new LollipopBrowserAccessibilityManager(
nativeBrowserAccessibilityManagerAndroid, contentViewCore);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
return new JellyBeanBrowserAccessibilityManager(
nativeBrowserAccessibilityManagerAndroid, contentViewCore);
} else {
......@@ -670,8 +667,8 @@ public class BrowserAccessibilityManager {
@CalledByNative
private void setAccessibilityNodeInfoBooleanAttributes(AccessibilityNodeInfo node,
int virtualViewId, boolean canScrollForward, boolean canScrollBackward,
boolean checkable, boolean checked, boolean clickable, boolean editableText,
int virtualViewId,
boolean checkable, boolean checked, boolean clickable,
boolean enabled, boolean focusable, boolean focused, boolean password,
boolean scrollable, boolean selected, boolean visibleToUser) {
node.setCheckable(checkable);
......@@ -685,15 +682,30 @@ public class BrowserAccessibilityManager {
node.setSelected(selected);
node.setVisibleToUser(visibleToUser && mVisible);
node.addAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT);
node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT);
node.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
node.setMovementGranularities(
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
if (mAccessibilityFocusId == virtualViewId) {
node.setAccessibilityFocused(true);
} else if (mVisible) {
node.setAccessibilityFocused(false);
}
}
// LollipopBrowserAccessibilityManager overrides this with the non-deprecated APIs.
@SuppressWarnings("deprecation")
@CalledByNative
protected void addAccessibilityNodeInfoActions(AccessibilityNodeInfo node,
int virtualViewId, boolean canScrollForward, boolean canScrollBackward,
boolean clickable, boolean editableText, boolean enabled, boolean focusable,
boolean focused) {
node.addAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT);
node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT);
node.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
if (editableText && enabled) {
node.addAction(ACTION_SET_TEXT);
node.addAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
......@@ -716,10 +728,8 @@ public class BrowserAccessibilityManager {
}
if (mAccessibilityFocusId == virtualViewId) {
node.setAccessibilityFocused(true);
node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
} else if (mVisible) {
node.setAccessibilityFocused(false);
node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
}
......@@ -800,32 +810,32 @@ public class BrowserAccessibilityManager {
}
@CalledByNative
protected void setAccessibilityNodeInfoKitKatAttributes(AccessibilityNodeInfo node,
protected void setAccessibilityNodeInfoLollipopAttributes(AccessibilityNodeInfo node,
boolean canOpenPopup,
boolean contentInvalid,
boolean dismissable,
boolean multiLine,
int inputType,
int liveRegion) {
// Requires KitKat or higher.
// Requires Lollipop or higher.
}
@CalledByNative
protected void setAccessibilityNodeInfoCollectionInfo(AccessibilityNodeInfo node,
int rowCount, int columnCount, boolean hierarchical) {
// Requires KitKat or higher.
// Requires Lollipop or higher.
}
@CalledByNative
protected void setAccessibilityNodeInfoCollectionItemInfo(AccessibilityNodeInfo node,
int rowIndex, int rowSpan, int columnIndex, int columnSpan, boolean heading) {
// Requires KitKat or higher.
// Requires Lollipop or higher.
}
@CalledByNative
protected void setAccessibilityNodeInfoRangeInfo(AccessibilityNodeInfo node,
int rangeType, float min, float max, float current) {
// Requires KitKat or higher.
// Requires Lollipop or higher.
}
@CalledByNative
......@@ -878,14 +888,14 @@ public class BrowserAccessibilityManager {
}
@CalledByNative
protected void setAccessibilityEventKitKatAttributes(AccessibilityEvent event,
protected void setAccessibilityEventLollipopAttributes(AccessibilityEvent event,
boolean canOpenPopup,
boolean contentInvalid,
boolean dismissable,
boolean multiLine,
int inputType,
int liveRegion) {
// Backwards compatibility for KitKat AccessibilityNodeInfo fields.
// Backwards compatibility for Lollipop AccessibilityNodeInfo fields.
Bundle bundle = getOrCreateBundleForAccessibilityEvent(event);
bundle.putBoolean("AccessibilityNodeInfo.canOpenPopup", canOpenPopup);
bundle.putBoolean("AccessibilityNodeInfo.contentInvalid", contentInvalid);
......@@ -898,7 +908,7 @@ public class BrowserAccessibilityManager {
@CalledByNative
protected void setAccessibilityEventCollectionInfo(AccessibilityEvent event,
int rowCount, int columnCount, boolean hierarchical) {
// Backwards compatibility for KitKat AccessibilityNodeInfo fields.
// Backwards compatibility for Lollipop AccessibilityNodeInfo fields.
Bundle bundle = getOrCreateBundleForAccessibilityEvent(event);
bundle.putInt("AccessibilityNodeInfo.CollectionInfo.rowCount", rowCount);
bundle.putInt("AccessibilityNodeInfo.CollectionInfo.columnCount", columnCount);
......@@ -908,7 +918,7 @@ public class BrowserAccessibilityManager {
@CalledByNative
protected void setAccessibilityEventHeadingFlag(AccessibilityEvent event,
boolean heading) {
// Backwards compatibility for KitKat AccessibilityNodeInfo fields.
// Backwards compatibility for Lollipop AccessibilityNodeInfo fields.
Bundle bundle = getOrCreateBundleForAccessibilityEvent(event);
bundle.putBoolean("AccessibilityNodeInfo.CollectionItemInfo.heading", heading);
}
......@@ -916,7 +926,7 @@ public class BrowserAccessibilityManager {
@CalledByNative
protected void setAccessibilityEventCollectionItemInfo(AccessibilityEvent event,
int rowIndex, int rowSpan, int columnIndex, int columnSpan) {
// Backwards compatibility for KitKat AccessibilityNodeInfo fields.
// Backwards compatibility for Lollipop AccessibilityNodeInfo fields.
Bundle bundle = getOrCreateBundleForAccessibilityEvent(event);
bundle.putInt("AccessibilityNodeInfo.CollectionItemInfo.rowIndex", rowIndex);
bundle.putInt("AccessibilityNodeInfo.CollectionItemInfo.rowSpan", rowSpan);
......@@ -927,7 +937,7 @@ public class BrowserAccessibilityManager {
@CalledByNative
protected void setAccessibilityEventRangeInfo(AccessibilityEvent event,
int rangeType, float min, float max, float current) {
// Backwards compatibility for KitKat AccessibilityNodeInfo fields.
// Backwards compatibility for Lollipop AccessibilityNodeInfo fields.
Bundle bundle = getOrCreateBundleForAccessibilityEvent(event);
bundle.putInt("AccessibilityNodeInfo.RangeInfo.type", rangeType);
bundle.putFloat("AccessibilityNodeInfo.RangeInfo.min", min);
......
// Copyright 2013 The Chromium Authors. All rights reserved.
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
......@@ -6,27 +6,25 @@ package org.chromium.content.browser.accessibility;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.content.browser.ContentViewCore;
/**
* Subclass of BrowserAccessibilityManager for KitKat that creates an
* Subclass of BrowserAccessibilityManager for Lollipop that creates an
* AccessibilityNodeProvider and delegates its implementation to this object.
*
* THIS CLASS IS NOT USED! A bug in the KitKat framework prevents us
* from using these new APIs. We can re-enable this class after the next
* Android system update. http://crbug.com/348088/
*/
@JNINamespace("content")
public class KitKatBrowserAccessibilityManager extends JellyBeanBrowserAccessibilityManager {
KitKatBrowserAccessibilityManager(long nativeBrowserAccessibilityManagerAndroid,
public class LollipopBrowserAccessibilityManager extends JellyBeanBrowserAccessibilityManager {
LollipopBrowserAccessibilityManager(long nativeBrowserAccessibilityManagerAndroid,
ContentViewCore contentViewCore) {
super(nativeBrowserAccessibilityManagerAndroid, contentViewCore);
}
@Override
protected void setAccessibilityNodeInfoKitKatAttributes(AccessibilityNodeInfo node,
protected void setAccessibilityNodeInfoLollipopAttributes(AccessibilityNodeInfo node,
boolean canOpenPopup,
boolean contentInvalid,
boolean dismissable,
......@@ -63,42 +61,85 @@ public class KitKatBrowserAccessibilityManager extends JellyBeanBrowserAccessibi
}
@Override
protected void setAccessibilityEventKitKatAttributes(AccessibilityEvent event,
protected void setAccessibilityEventLollipopAttributes(AccessibilityEvent event,
boolean canOpenPopup,
boolean contentInvalid,
boolean dismissable,
boolean multiLine,
int inputType,
int liveRegion) {
// This is just a fallback for pre-KitKat systems.
// Do nothing on KitKat and higher.
// This is just a fallback for pre-Lollipop systems.
// Do nothing on Lollipop and higher.
}
@Override
protected void setAccessibilityEventCollectionInfo(AccessibilityEvent event,
int rowCount, int columnCount, boolean hierarchical) {
// This is just a fallback for pre-KitKat systems.
// Do nothing on KitKat and higher.
// This is just a fallback for pre-Lollipop systems.
// Do nothing on Lollipop and higher.
}
@Override
protected void setAccessibilityEventHeadingFlag(AccessibilityEvent event,
boolean heading) {
// This is just a fallback for pre-KitKat systems.
// Do nothing on KitKat and higher.
// This is just a fallback for pre-Lollipop systems.
// Do nothing on Lollipop and higher.
}
@Override
protected void setAccessibilityEventCollectionItemInfo(AccessibilityEvent event,
int rowIndex, int rowSpan, int columnIndex, int columnSpan) {
// This is just a fallback for pre-KitKat systems.
// Do nothing on KitKat and higher.
// This is just a fallback for pre-Lollipop systems.
// Do nothing on Lollipop and higher.
}
@Override
protected void setAccessibilityEventRangeInfo(AccessibilityEvent event,
int rangeType, float min, float max, float current) {
// This is just a fallback for pre-KitKat systems.
// Do nothing on KitKat and higher.
// This is just a fallback for pre-Lollipop systems.
// Do nothing on Lollipop and higher.
}
@CalledByNative
@Override
protected void addAccessibilityNodeInfoActions(AccessibilityNodeInfo node,
int virtualViewId, boolean canScrollForward, boolean canScrollBackward,
boolean clickable, boolean editableText, boolean enabled, boolean focusable,
boolean focused) {
node.addAction(AccessibilityAction.ACTION_NEXT_HTML_ELEMENT);
node.addAction(AccessibilityAction.ACTION_PREVIOUS_HTML_ELEMENT);
node.addAction(AccessibilityAction.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
node.addAction(AccessibilityAction.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
if (editableText && enabled) {
node.addAction(AccessibilityAction.ACTION_SET_TEXT);
node.addAction(AccessibilityAction.ACTION_SET_SELECTION);
}
if (canScrollForward) {
node.addAction(AccessibilityAction.ACTION_SCROLL_FORWARD);
}
if (canScrollBackward) {
node.addAction(AccessibilityAction.ACTION_SCROLL_BACKWARD);
}
if (focusable) {
if (focused) {
node.addAction(AccessibilityAction.ACTION_CLEAR_FOCUS);
} else {
node.addAction(AccessibilityAction.ACTION_FOCUS);
}
}
if (mAccessibilityFocusId == virtualViewId) {
node.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
} else if (mVisible) {
node.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
}
if (clickable) {
node.addAction(AccessibilityAction.ACTION_CLICK);
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment