diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java index 2d2e1576fb3aadd3ee1ae44d70148cf9491d3b91..4b16c0a33f0a490075cdf83da19d0c84c178ebe3 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 b000a903c956d4c6865aebf4826500692294163e..86c73a80029b1d8e0d9db1e638f726e91e445782 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 1f1b9eed39f20f2ffb30ed38ebb302f71dffa06b..c248908875145f745ee9e56bd393baf7a1fb05d7 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 90f05be5eb29716dd4e8049aca6dbd915ab9ec80..e4efedc150bf6f7048534affb9c63acca57c15ad 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));