From b1e2decaeb070ab7a8409290a7c5b3c14078b759 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 6 Aug 2018 14:46:35 -0700 Subject: [PATCH 1/4] apply translation when system nav bar is on left side of screen --- .../io/flutter/view/AccessibilityBridge.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 9c7f9bef0e02f..854d62cc8ffe8 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -4,6 +4,8 @@ package io.flutter.view; +import android.app.Activity; +import android.content.Context; import android.graphics.Rect; import android.opengl.Matrix; import android.os.Build; @@ -19,6 +21,8 @@ import java.nio.ByteBuffer; import java.util.*; +import com.sun.javafx.font.directwrite.RECT; + class AccessibilityBridge extends AccessibilityNodeProvider implements BasicMessageChannel.MessageHandler { private static final String TAG = "FlutterView"; @@ -41,6 +45,7 @@ class AccessibilityBridge private SemanticsObject mHoveredObject; private int previousRouteId = ROOT_NODE_ID; private List previousRoutes; + private final View mDecorView; private final BasicMessageChannel mFlutterAccessibilityChannel; @@ -109,6 +114,7 @@ enum Flag { previousRoutes = new ArrayList<>(); mFlutterAccessibilityChannel = new BasicMessageChannel<>( owner, "flutter/accessibility", StandardMessageCodec.INSTANCE); + mDecorView = ((Activity) owner.getContext()).getWindow().getDecorView(); } void setAccessibilityEnabled(boolean accessibilityEnabled) { @@ -612,6 +618,13 @@ void updateSemantics(ByteBuffer buffer, String[] strings) { if (rootObject != null) { final float[] identity = new float[16]; Matrix.setIdentityM(identity, 0); + // in android devices above AP 23, the system nav bar can be placed on the left side + // of the screen in landscape mode. We must handle the translation ourselves for a11y. + if (Build.VERSION.SDK_INT >= 23) { + Rect visibleFrame = new Rect(); + mDecorView.getWindowVisibleDisplayFrame(visibleFrame); + Matrix.translateM(identity, 0, visibleFrame.left, 0, 0); + } rootObject.updateRecursively(identity, visitedObjects, false); rootObject.collectRoutes(newRoutes); } From cce6a6e71819f7257f6b12f3226211681e184a87 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 6 Aug 2018 18:10:00 -0700 Subject: [PATCH 2/4] more work --- .../android/io/flutter/view/AccessibilityBridge.java | 5 ++--- shell/platform/android/io/flutter/view/FlutterView.java | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 854d62cc8ffe8..881f108078eee 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -21,8 +21,6 @@ import java.nio.ByteBuffer; import java.util.*; -import com.sun.javafx.font.directwrite.RECT; - class AccessibilityBridge extends AccessibilityNodeProvider implements BasicMessageChannel.MessageHandler { private static final String TAG = "FlutterView"; @@ -619,7 +617,8 @@ void updateSemantics(ByteBuffer buffer, String[] strings) { final float[] identity = new float[16]; Matrix.setIdentityM(identity, 0); // in android devices above AP 23, the system nav bar can be placed on the left side - // of the screen in landscape mode. We must handle the translation ourselves for a11y. + // of the screen in landscape mode. We must handle the translation ourselves for the + // a11y nodes. if (Build.VERSION.SDK_INT >= 23) { Rect visibleFrame = new Rect(); mDecorView.getWindowVisibleDisplayFrame(visibleFrame); diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 5728992d8d8c3..a1a7c23b5408e 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -78,6 +78,7 @@ static final class ViewportMetrics { int physicalViewInsetRight = 0; int physicalViewInsetBottom = 0; int physicalViewInsetLeft = 0; + int deviceOrientation = 0; // 0 = portrait, 1 = landscape, 2 = landscape reversed. } private final InputMethodManager mImm; From 764d63ab6ab819eeb3aaee03f2e70a35b1454bed Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 6 Aug 2018 18:10:49 -0700 Subject: [PATCH 3/4] Update FlutterView.java --- shell/platform/android/io/flutter/view/FlutterView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index a1a7c23b5408e..5728992d8d8c3 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -78,7 +78,6 @@ static final class ViewportMetrics { int physicalViewInsetRight = 0; int physicalViewInsetBottom = 0; int physicalViewInsetLeft = 0; - int deviceOrientation = 0; // 0 = portrait, 1 = landscape, 2 = landscape reversed. } private final InputMethodManager mImm; From 10fb6097bfa374ea3b883216e85f60128da01e01 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 7 Aug 2018 10:08:22 -0700 Subject: [PATCH 4/4] mark global geom dirty when inset changes --- .../android/io/flutter/view/AccessibilityBridge.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 881f108078eee..6b22ea890ff8c 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -44,6 +44,7 @@ class AccessibilityBridge private int previousRouteId = ROOT_NODE_ID; private List previousRoutes; private final View mDecorView; + private Integer mLastLeftFrameInset = 0; private final BasicMessageChannel mFlutterAccessibilityChannel; @@ -622,6 +623,11 @@ void updateSemantics(ByteBuffer buffer, String[] strings) { if (Build.VERSION.SDK_INT >= 23) { Rect visibleFrame = new Rect(); mDecorView.getWindowVisibleDisplayFrame(visibleFrame); + if (!mLastLeftFrameInset.equals(visibleFrame.left)) { + rootObject.globalGeometryDirty = true; + rootObject.inverseTransformDirty = true; + } + mLastLeftFrameInset = visibleFrame.left; Matrix.translateM(identity, 0, visibleFrame.left, 0, 0); } rootObject.updateRecursively(identity, visitedObjects, false);