From 091b6cc5b48d9c534f190edd82930023bd11f54b Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Thu, 12 Nov 2020 10:30:29 -0800 Subject: [PATCH] Fix talkback in hybrid composition while using FlutterFragmentActivity (#22429) --- .../platform/PlatformViewsAccessibilityDelegate.java | 7 +++++++ .../flutter/plugin/platform/PlatformViewsController.java | 5 +++++ .../android/io/flutter/view/AccessibilityBridge.java | 7 ++----- .../test/io/flutter/view/AccessibilityBridgeTest.java | 7 ++----- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java index 2d2e1576f..4b16c0a33 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java @@ -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. * diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index b000a903c..86c73a800 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -584,6 +584,11 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega return controller.getView(); } + @Override + public boolean usesVirtualDisplay(Integer id) { + return vdControllers.containsKey(id); + } + private void lockInputConnection(@NonNull VirtualDisplayController controller) { if (textInputPlugin == null) { return; diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 1f1b9eed3..c24890887 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -28,7 +28,6 @@ import androidx.annotation.RequiresApi; 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; @@ -558,8 +557,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider { 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); } @@ -853,8 +851,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider { // 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; } diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 90f05be5e..e4efedc15 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -17,7 +17,6 @@ import static org.mockito.Mockito.verify; 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; @@ -27,7 +26,6 @@ import android.view.ViewParent; 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; @@ -430,8 +428,7 @@ public class AccessibilityBridgeTest { 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); @@ -464,7 +461,7 @@ public class AccessibilityBridgeTest { 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)); -- GitLab