Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix talkback in hybrid composition while using FlutterFragmentActivity #22429

Merged
merged 6 commits into from Nov 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -15,6 +15,13 @@ public interface PlatformViewsAccessibilityDelegate {
*/
View getPlatformViewById(Integer id);

/**
* Returns true if the platform view uses virtual displays.
*
* @hide
*/
boolean usesVirtualDisplay(Integer id);

/**
* Attaches an accessibility bridge for this platform views accessibility delegate.
*
Expand Down
Expand Up @@ -584,6 +584,11 @@ public View getPlatformViewById(Integer id) {
return controller.getView();
}

@Override
public boolean usesVirtualDisplay(Integer id) {
return vdControllers.containsKey(id);
}

private void lockInputConnection(@NonNull VirtualDisplayController controller) {
if (textInputPlugin == null) {
return;
Expand Down
Expand Up @@ -28,7 +28,6 @@
import androidx.annotation.VisibleForTesting;
import io.flutter.BuildConfig;
import io.flutter.Log;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.systemchannels.AccessibilityChannel;
import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate;
import io.flutter.util.Predicate;
Expand Down Expand Up @@ -558,8 +557,7 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
if (semanticsNode.platformViewId != -1) {
View embeddedView =
platformViewsAccessibilityDelegate.getPlatformViewById(semanticsNode.platformViewId);
boolean childUsesVirtualDisplay = !(embeddedView.getContext() instanceof FlutterActivity);
if (childUsesVirtualDisplay) {
if (platformViewsAccessibilityDelegate.usesVirtualDisplay(semanticsNode.platformViewId)) {
Rect bounds = semanticsNode.getGlobalRect();
return accessibilityViewEmbedder.getRootNode(embeddedView, semanticsNode.id, bounds);
}
Expand Down Expand Up @@ -853,8 +851,7 @@ && shouldSetCollectionInfo(semanticsNode)) {
// mirrored.
//
// See the case above for how virtual displays are handled.
boolean childUsesHybridComposition = embeddedView.getContext() instanceof FlutterActivity;
if (childUsesHybridComposition) {
if (!platformViewsAccessibilityDelegate.usesVirtualDisplay(child.platformViewId)) {
result.addChild(embeddedView);
continue;
}
Expand Down
Expand Up @@ -17,7 +17,6 @@
import static org.mockito.Mockito.when;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Rect;
Expand All @@ -27,7 +26,6 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.systemchannels.AccessibilityChannel;
import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate;
import java.nio.ByteBuffer;
Expand Down Expand Up @@ -430,8 +428,7 @@ public void itProducesPlatformViewNodeForHybridComposition() {

View embeddedView = mock(View.class);
when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView);

when(embeddedView.getContext()).thenReturn(mock(FlutterActivity.class));
when(accessibilityDelegate.usesVirtualDisplay(1)).thenReturn(false);

AccessibilityNodeInfo nodeInfo = mock(AccessibilityNodeInfo.class);
when(embeddedView.createAccessibilityNodeInfo()).thenReturn(nodeInfo);
Expand Down Expand Up @@ -464,7 +461,7 @@ public void itProducesPlatformViewNodeForVirtualDisplay() {

View embeddedView = mock(View.class);
when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView);
when(embeddedView.getContext()).thenReturn(mock(Activity.class));
when(accessibilityDelegate.usesVirtualDisplay(1)).thenReturn(true);

accessibilityBridge.createAccessibilityNodeInfo(0);
verify(accessibilityViewEmbedder).getRootNode(eq(embeddedView), eq(0), any(Rect.class));
Expand Down