diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinder.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinder.java index c7c6fe01cba6a6665ed462d463eac387fde75f72..de4822ab98de2a066a7fe71aae363812913e5975 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinder.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinder.java @@ -63,9 +63,13 @@ class EdgeToEdgeBottomChinViewBinder { } private static void updateVisibility(PropertyModel model, ViewHolder viewHolder) { - boolean visible = model.get(CAN_SHOW) && model.get(Y_OFFSET) < model.get(HEIGHT); + // Even if the chin has scrolled off, the android view should remain in case other browser + // controls are showing. The presence of the android view is needed to avoid strange + // transparency / cut-off bugs that happen when scrolling browser controls under bottom + // inset when drawing edge-to-edge. + viewHolder.mAndroidView.setVisibility(model.get(CAN_SHOW) ? View.VISIBLE : View.GONE); - viewHolder.mAndroidView.setVisibility(visible ? View.VISIBLE : View.GONE); + boolean visible = model.get(CAN_SHOW) && model.get(Y_OFFSET) < model.get(HEIGHT); viewHolder.mSceneLayer.setIsVisible(visible); } diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinderTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinderTest.java index 0124bc40494c4c7416a16f9a4f7d3a6c57d80bca..8cb675ffc8a248fb9bd5f8cb17c498f36fbc9545 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinderTest.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinViewBinderTest.java @@ -71,7 +71,7 @@ public class EdgeToEdgeBottomChinViewBinderTest { // Set the y-offset to full height. mModel.set(Y_OFFSET, mModel.get(HEIGHT)); verify(mSceneLayer).setYOffset(mModel.get(HEIGHT)); - verify(mAndroidView, atLeastOnce()).setVisibility(eq(View.GONE)); + verify(mAndroidView, never()).setVisibility(eq(View.GONE)); verify(mSceneLayer, atLeastOnce()).setIsVisible(eq(false)); clearInvocations(mSceneLayer); @@ -79,14 +79,14 @@ public class EdgeToEdgeBottomChinViewBinderTest { // Clear the y-offset. mModel.set(Y_OFFSET, 0); verify(mSceneLayer).setYOffset(0); - verify(mAndroidView, atLeastOnce()).setVisibility(eq(View.VISIBLE)); + verify(mAndroidView, never()).setVisibility(eq(View.GONE)); verify(mSceneLayer, atLeastOnce()).setIsVisible(eq(true)); } @Test public void testUpdate_Height() { mModel.set(HEIGHT, 0); - verify(mAndroidView, atLeastOnce()).setVisibility(eq(View.GONE)); + verify(mAndroidView, never()).setVisibility(eq(View.GONE)); verify(mSceneLayer, atLeastOnce()).setIsVisible(eq(false)); mModel.set(HEIGHT, 60);