mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Fix talkback in hybrid composition while using FlutterFragmentActivity (flutter/engine#22429)
This commit is contained in:
parent
5441ac8cf5
commit
1d0a96bd3f
@ -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));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user