未验证 提交 091b6cc5 编写于 作者: E Emmanuel Garcia 提交者: GitHub

Fix talkback in hybrid composition while using FlutterFragmentActivity (#22429)

上级 8534407d
...@@ -15,6 +15,13 @@ public interface PlatformViewsAccessibilityDelegate { ...@@ -15,6 +15,13 @@ public interface PlatformViewsAccessibilityDelegate {
*/ */
View getPlatformViewById(Integer id); 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. * Attaches an accessibility bridge for this platform views accessibility delegate.
* *
......
...@@ -584,6 +584,11 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega ...@@ -584,6 +584,11 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega
return controller.getView(); return controller.getView();
} }
@Override
public boolean usesVirtualDisplay(Integer id) {
return vdControllers.containsKey(id);
}
private void lockInputConnection(@NonNull VirtualDisplayController controller) { private void lockInputConnection(@NonNull VirtualDisplayController controller) {
if (textInputPlugin == null) { if (textInputPlugin == null) {
return; return;
......
...@@ -28,7 +28,6 @@ import androidx.annotation.RequiresApi; ...@@ -28,7 +28,6 @@ import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import io.flutter.BuildConfig; import io.flutter.BuildConfig;
import io.flutter.Log; import io.flutter.Log;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.systemchannels.AccessibilityChannel; import io.flutter.embedding.engine.systemchannels.AccessibilityChannel;
import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate; import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate;
import io.flutter.util.Predicate; import io.flutter.util.Predicate;
...@@ -558,8 +557,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider { ...@@ -558,8 +557,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider {
if (semanticsNode.platformViewId != -1) { if (semanticsNode.platformViewId != -1) {
View embeddedView = View embeddedView =
platformViewsAccessibilityDelegate.getPlatformViewById(semanticsNode.platformViewId); platformViewsAccessibilityDelegate.getPlatformViewById(semanticsNode.platformViewId);
boolean childUsesVirtualDisplay = !(embeddedView.getContext() instanceof FlutterActivity); if (platformViewsAccessibilityDelegate.usesVirtualDisplay(semanticsNode.platformViewId)) {
if (childUsesVirtualDisplay) {
Rect bounds = semanticsNode.getGlobalRect(); Rect bounds = semanticsNode.getGlobalRect();
return accessibilityViewEmbedder.getRootNode(embeddedView, semanticsNode.id, bounds); return accessibilityViewEmbedder.getRootNode(embeddedView, semanticsNode.id, bounds);
} }
...@@ -853,8 +851,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider { ...@@ -853,8 +851,7 @@ public class AccessibilityBridge extends AccessibilityNodeProvider {
// mirrored. // mirrored.
// //
// See the case above for how virtual displays are handled. // See the case above for how virtual displays are handled.
boolean childUsesHybridComposition = embeddedView.getContext() instanceof FlutterActivity; if (!platformViewsAccessibilityDelegate.usesVirtualDisplay(child.platformViewId)) {
if (childUsesHybridComposition) {
result.addChild(embeddedView); result.addChild(embeddedView);
continue; continue;
} }
......
...@@ -17,7 +17,6 @@ import static org.mockito.Mockito.verify; ...@@ -17,7 +17,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
...@@ -27,7 +26,6 @@ import android.view.ViewParent; ...@@ -27,7 +26,6 @@ import android.view.ViewParent;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.systemchannels.AccessibilityChannel; import io.flutter.embedding.engine.systemchannels.AccessibilityChannel;
import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate; import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
...@@ -430,8 +428,7 @@ public class AccessibilityBridgeTest { ...@@ -430,8 +428,7 @@ public class AccessibilityBridgeTest {
View embeddedView = mock(View.class); View embeddedView = mock(View.class);
when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView); when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView);
when(accessibilityDelegate.usesVirtualDisplay(1)).thenReturn(false);
when(embeddedView.getContext()).thenReturn(mock(FlutterActivity.class));
AccessibilityNodeInfo nodeInfo = mock(AccessibilityNodeInfo.class); AccessibilityNodeInfo nodeInfo = mock(AccessibilityNodeInfo.class);
when(embeddedView.createAccessibilityNodeInfo()).thenReturn(nodeInfo); when(embeddedView.createAccessibilityNodeInfo()).thenReturn(nodeInfo);
...@@ -464,7 +461,7 @@ public class AccessibilityBridgeTest { ...@@ -464,7 +461,7 @@ public class AccessibilityBridgeTest {
View embeddedView = mock(View.class); View embeddedView = mock(View.class);
when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView); when(accessibilityDelegate.getPlatformViewById(1)).thenReturn(embeddedView);
when(embeddedView.getContext()).thenReturn(mock(Activity.class)); when(accessibilityDelegate.usesVirtualDisplay(1)).thenReturn(true);
accessibilityBridge.createAccessibilityNodeInfo(0); accessibilityBridge.createAccessibilityNodeInfo(0);
verify(accessibilityViewEmbedder).getRootNode(eq(embeddedView), eq(0), any(Rect.class)); verify(accessibilityViewEmbedder).getRootNode(eq(embeddedView), eq(0), any(Rect.class));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册