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

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

上级 8534407d
......@@ -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.
*
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册