Adjust the logic of isImportantForAccessibility

According to the logic in #isImportantForAccessibility, SurfaceView
wouldn't be important by default. This results in the A11yNodeInfo
generated by this SurfaceView isn't important. If this SurfaceView
hosts an embedded hierarchy, the accessibility services may ignore
it. Hence, it couldn't compose the complete node tree.

Bug: 149266686
Test: a11y CTS & unit tests
Change-Id: I90d9f043339d2ad72607e8ae8c8dfc2c1b0f004d
This commit is contained in:
Jackal Guo
2020-02-11 14:20:16 +08:00
parent 1c4cb8be3b
commit a88ee6f588
2 changed files with 14 additions and 2 deletions

View File

@@ -1596,6 +1596,19 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
info.addChild(wrapper.getLeashToken());
}
@Override
public int getImportantForAccessibility() {
final int mode = super.getImportantForAccessibility();
// If developers explicitly set the important mode for it, don't change the mode.
// Only change the mode to important when this SurfaceView isn't explicitly set and has
// an embedded hierarchy.
if (mRemoteAccessibilityEmbeddedConnection == null
|| mode != IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
return mode;
}
return IMPORTANT_FOR_ACCESSIBILITY_YES;
}
private void initEmbeddedHierarchyForAccessibility(SurfaceControlViewHost.SurfacePackage p) {
final IAccessibilityEmbeddedConnection connection = p.getAccessibilityEmbeddedConnection();
final RemoteAccessibilityEmbeddedConnection wrapper =

View File

@@ -13429,8 +13429,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #getImportantForAccessibility()
*/
public boolean isImportantForAccessibility() {
final int mode = (mPrivateFlags2 & PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK)
>> PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_SHIFT;
final int mode = getImportantForAccessibility();
if (mode == IMPORTANT_FOR_ACCESSIBILITY_NO
|| mode == IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) {
return false;