Commit 21d1516e authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Android: CompositorViewHolder manages viewport sizing

This CL moves the logic in ChromeFullscreenManager that controls
viewport to CompositorViewHolder so that it will be the source of
viewport information.

ContentView sizing/offset update is still initiated by
ChromeFullscreenManager but they are decoupled(i.e. no more
ViewSizeDelegate), and now the flow is handled through CVH
listening to BrowserControlsStateProvider.onControlOffsetChanged.

Bug: 966272
Change-Id: I111b47d4fd93f4d1866dc0cab7012c9339278788
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2278742
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786580}
parent 0055de9a
......@@ -43,6 +43,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/browserservices/ui/view/trustedwebactivity/DisclosureNotificationTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/ui/view/trustedwebactivity/DisclosureSnackbarTest.java",
"junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java",
"junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java",
"junit/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimationHandlerTest.java",
"junit/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimatorTest.java",
"junit/src/org/chromium/chrome/browser/compositor/layouts/CompositorModelChangeProcessorUnitTest.java",
......
......@@ -18,6 +18,7 @@ import android.os.Handler;
import android.util.AttributeSet;
import android.util.Pair;
import android.view.DragEvent;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.PointerIcon;
import android.view.View;
......@@ -26,6 +27,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityEventCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
......@@ -66,6 +68,7 @@ import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.components.browser_ui.widget.InsetObserverView;
import org.chromium.components.content_capture.ContentCaptureConsumer;
import org.chromium.components.content_capture.ContentCaptureConsumerImpl;
import org.chromium.components.embedder_support.view.ContentView;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.UiUtils;
......@@ -91,7 +94,8 @@ import java.util.Set;
public class CompositorViewHolder extends FrameLayout
implements ContentOffsetProvider, LayoutManagerHost, LayoutRenderHost, Invalidator.Host,
BrowserControlsStateProvider.Observer, InsetObserverView.WindowInsetObserver,
ChromeAccessibilityUtil.Observer, TabObscuringHandler.Observer {
ChromeAccessibilityUtil.Observer, TabObscuringHandler.Observer,
ViewGroup.OnHierarchyChangeListener {
private static final long SYSTEM_UI_VIEWPORT_UPDATE_DELAY_MS = 500;
/**
......@@ -155,6 +159,12 @@ public class CompositorViewHolder extends FrameLayout
/** The currently attached View. */
private View mView;
/**
* Current ContentView. Updates when active tab is switched or WebContents is swapped
* in the current Tab.
*/
private ContentView mContentView;
private TabObserver mTabObserver;
// Cache objects that should not be created frequently.
......@@ -290,6 +300,7 @@ public class CompositorViewHolder extends FrameLayout
@Override
public void onContentViewScrollingStateChanged(boolean scrolling) {
mContentViewScrolling = scrolling;
if (!scrolling) updateContentViewChildrenDimension();
}
@Override
......@@ -521,6 +532,9 @@ public class CompositorViewHolder extends FrameLayout
mContentCaptureConsumer.onWebContentsChanged(null);
mContentCaptureConsumer = null;
}
if (mContentView != null) {
mContentView.removeOnHierarchyChangeListener(this);
}
}
/**
......@@ -708,7 +722,8 @@ public class CompositorViewHolder extends FrameLayout
return currentTab;
}
private View getContentView() {
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
ViewGroup getContentView() {
Tab tab = getCurrentTab();
return tab != null ? tab.getContentView() : null;
}
......@@ -788,10 +803,7 @@ public class CompositorViewHolder extends FrameLayout
* Called whenever the host activity is started.
*/
public void onStart() {
if (mFullscreenManager != null) {
mFullscreenManager.addObserver(this);
mFullscreenManager.setViewportSizeDelegate(this::updateViewportSize);
}
if (mFullscreenManager != null) mFullscreenManager.addObserver(this);
requestRender();
}
......@@ -799,10 +811,7 @@ public class CompositorViewHolder extends FrameLayout
* Called whenever the host activity is stopped.
*/
public void onStop() {
if (mFullscreenManager != null) {
mFullscreenManager.removeObserver(this);
mFullscreenManager.setViewportSizeDelegate(null);
}
if (mFullscreenManager != null) mFullscreenManager.removeObserver(this);
}
@Override
......@@ -810,6 +819,7 @@ public class CompositorViewHolder extends FrameLayout
int bottomOffset, int bottomControlsMinHeightOffset, boolean needsAnimate) {
onViewportChanged();
if (needsAnimate) requestRender();
updateContentViewChildrenDimension();
}
@Override
......@@ -861,6 +871,65 @@ public class CompositorViewHolder extends FrameLayout
setSize(getWebContents(), getContentView(), viewportSize.x, viewportSize.y);
}
// View.OnHierarchyChangeListener implementation
@Override
public void onChildViewRemoved(View parent, View child) {
updateContentViewChildrenDimension();
}
@Override
public void onChildViewAdded(View parent, View child) {
updateContentViewChildrenDimension();
}
private void updateContentViewChildrenDimension() {
TraceEvent.begin("CompositorViewHolder:updateContentViewChildrenDimension");
ViewGroup view = getContentView();
if (view != null) {
assert mFullscreenManager != null;
float topViewsTranslation = getOverlayTranslateY();
float bottomMargin = BrowserControlsUtils.getBottomContentOffset(mFullscreenManager);
applyTranslationToTopChildViews(view, topViewsTranslation);
applyMarginToFullscreenChildViews(view, topViewsTranslation, bottomMargin);
updateViewportSize();
}
TraceEvent.end("CompositorViewHolder:updateContentViewChildrenDimension");
}
private static void applyMarginToFullscreenChildViews(
ViewGroup contentView, float topMargin, float bottomMargin) {
for (int i = 0; i < contentView.getChildCount(); i++) {
View child = contentView.getChildAt(i);
if (!(child.getLayoutParams() instanceof FrameLayout.LayoutParams)) continue;
FrameLayout.LayoutParams layoutParams =
(FrameLayout.LayoutParams) child.getLayoutParams();
if (layoutParams.height == LayoutParams.MATCH_PARENT
&& (layoutParams.topMargin != (int) topMargin
|| layoutParams.bottomMargin != (int) bottomMargin)) {
layoutParams.topMargin = (int) topMargin;
layoutParams.bottomMargin = (int) bottomMargin;
child.requestLayout();
TraceEvent.instant("FullscreenManager:child.requestLayout()");
}
}
}
private static void applyTranslationToTopChildViews(ViewGroup contentView, float translation) {
for (int i = 0; i < contentView.getChildCount(); i++) {
View child = contentView.getChildAt(i);
if (!(child.getLayoutParams() instanceof FrameLayout.LayoutParams)) continue;
FrameLayout.LayoutParams layoutParams =
(FrameLayout.LayoutParams) child.getLayoutParams();
if (Gravity.TOP == (layoutParams.gravity & Gravity.FILL_VERTICAL)) {
child.setTranslationY(translation);
TraceEvent.instant("FullscreenManager:child.setTranslationY()");
}
}
}
/**
* Sets the overlay mode.
*/
......@@ -1041,7 +1110,6 @@ public class CompositorViewHolder extends FrameLayout
public void setFullscreenHandler(ChromeFullscreenManager fullscreen) {
mFullscreenManager = fullscreen;
mFullscreenManager.addObserver(this);
mFullscreenManager.setViewportSizeDelegate(this::updateViewportSize);
onViewportChanged();
}
......@@ -1224,6 +1292,7 @@ public class CompositorViewHolder extends FrameLayout
tab.addObserver(mTabObserver);
mCompositorView.onTabChanged();
}
updateViewStateListener(tab != null ? tab.getContentView() : null);
}
mTabVisible = tab;
......@@ -1245,6 +1314,16 @@ public class CompositorViewHolder extends FrameLayout
}
}
private void updateViewStateListener(ContentView newContentView) {
if (mContentView != null) {
mContentView.removeOnHierarchyChangeListener(this);
}
if (newContentView != null) {
newContentView.addOnHierarchyChangeListener(this);
}
mContentView = newContentView;
}
/**
* Sets the correct size for {@link View} on {@code tab} and sets the correct rendering
* parameters on {@link WebContents} on {@code tab}.
......
......@@ -278,10 +278,6 @@ public class FullscreenManagerTest {
final CallbackHelper viewportCallback = new CallbackHelper();
ChromeFullscreenManager fullscreenManager =
mActivityTestRule.getActivity().getFullscreenManager();
fullscreenManager.setViewportSizeDelegate(viewportCallback::notifyCalled);
Assert.assertEquals(0, scrollStartCallback.getCallCount());
Assert.assertEquals(0, viewportCallback.getCallCount());
......
......@@ -6,6 +6,7 @@ include_rules = [
"+chrome/browser/performance_hints/android/java",
"+chrome/browser/profiles/android",
"+chrome/browser/tab",
"+chrome/browser/tabmodel",
"+chrome/browser/thumbnail/generator/android/java",
"+chrome/browser/ui/messages/android/java",
"+components/autofill/android/java/src/org/chromium/components/autofill",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment