Commit 6a3ae7d6 authored by Mehran Mahmoudi's avatar Mehran Mahmoudi Committed by Commit Bot

[TabViewManager] Use ChromeFullScreenManager for providing margins

Using TabBrowserControlsOffsetHelper for providing margins for
browser controls cause problems for SadTab, since margins are reset
in TabBrowserControlsOffsetHelper on crash.

This CL uses ChromeFullscreenManager instead for providing the browser
control margins.

Bug: 1081628
Change-Id: Ifa9a2687bc3726d851e739552f64d7f9111e6b6a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2208921
Commit-Queue: Mehran Mahmoudi <mahmoudi@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771120}
parent de318c34
......@@ -729,6 +729,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/firstrun/ToSAckedReceiver.java",
"java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java",
"java/src/org/chromium/chrome/browser/flags/ChromeSessionState.java",
"java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsMarginSupplier.java",
"java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsStateProvider.java",
"java/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegate.java",
"java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java",
......@@ -924,7 +925,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcher.java",
"java/src/org/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl.java",
"java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java",
"java/src/org/chromium/chrome/browser/native_page/BrowserControlsMarginSupplier.java",
"java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java",
"java/src/org/chromium/chrome/browser/native_page/NativePageAssassin.java",
"java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java",
......
......@@ -2,23 +2,24 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.native_page;
package org.chromium.chrome.browser.fullscreen;
import android.graphics.Rect;
import org.chromium.base.supplier.DestroyableObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.browser.fullscreen.BrowserControlsStateProvider;
/**
* An implementation of {@link DestroyableObservableSupplier} that monitors changes to browser
* controls and updates top/bottom margins as needed.
* controls and updates a Rect indicating top/bottom margins for Views that should be inset by the
* browser control(s) height(s).
*/
class BrowserControlsMarginSupplier extends ObservableSupplierImpl<Rect>
public class BrowserControlsMarginSupplier extends ObservableSupplierImpl<Rect>
implements BrowserControlsStateProvider.Observer, DestroyableObservableSupplier<Rect> {
private final BrowserControlsStateProvider mBrowserControlsStateProvider;
BrowserControlsMarginSupplier(BrowserControlsStateProvider browserControlsStateProvider) {
public BrowserControlsMarginSupplier(
BrowserControlsStateProvider browserControlsStateProvider) {
mBrowserControlsStateProvider = browserControlsStateProvider;
mBrowserControlsStateProvider.addObserver(this);
updateMargins();
......
......@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.bookmarks.BookmarkPage;
import org.chromium.chrome.browser.download.DownloadPage;
import org.chromium.chrome.browser.explore_sites.ExploreSitesPage;
import org.chromium.chrome.browser.fullscreen.BrowserControlsMarginSupplier;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.history.HistoryManagerUtils;
import org.chromium.chrome.browser.history.HistoryPage;
......
......@@ -62,4 +62,7 @@ specific_include_rules = {
"+ui/android/java/src/org/chromium/ui/base",
"+ui/android/java/src/org/chromium/ui/mojom",
],
'TabViewManager\.java': [
"+chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsMarginSupplier.java",
],
}
......@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.tab;
import android.graphics.Rect;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.FrameLayout;
......@@ -12,6 +13,8 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.UserData;
import org.chromium.base.supplier.DestroyableObservableSupplier;
import org.chromium.chrome.browser.fullscreen.BrowserControlsMarginSupplier;
import java.util.Comparator;
import java.util.PriorityQueue;
......@@ -56,7 +59,8 @@ public class TabViewManager implements UserData, Comparator<TabViewProvider> {
private PriorityQueue<TabViewProvider> mTabViewProviders;
private TabImpl mTab;
private View mCurrentView;
private BrowserControlsOffsetObserver mBrowserControlsOffsetObserver;
private DestroyableObservableSupplier<Rect> mMarginSupplier;
private final Rect mViewMargins = new Rect();
public static TabViewManager get(Tab tab) {
if (tab.getUserDataHost().getUserData(USER_DATA_KEY) == null) {
......@@ -69,8 +73,15 @@ public class TabViewManager implements UserData, Comparator<TabViewProvider> {
TabViewManager(Tab tab) {
mTab = (TabImpl) tab;
mTabViewProviders = new PriorityQueue<>(PRIORITIZED_TAB_VIEW_PROVIDER_TYPES.length, this);
mBrowserControlsOffsetObserver = new BrowserControlsOffsetObserver();
mTab.addObserver(mBrowserControlsOffsetObserver);
if (mTab.getActivity() == null) return;
mMarginSupplier =
new BrowserControlsMarginSupplier(mTab.getActivity().getFullscreenManager());
mMarginSupplier.addObserver(this::updateViewMargins);
// Update margins immediately if available rather than waiting for a posted notification.
// Waiting for a posted notification could allow a layout pass to occur before the margins
// are set.
updateViewMargins(mMarginSupplier.get());
}
/**
......@@ -124,18 +135,20 @@ public class TabViewManager implements UserData, Comparator<TabViewProvider> {
}
}
/**
* Updates the top margin for the current view according to
* {@link TabBrowserControlsOffsetHelper}.
*/
private void updateViewMargins(Rect viewMargins) {
if (viewMargins == null) return;
mViewMargins.set(viewMargins);
updateViewMargins();
}
private void updateViewMargins() {
if (mCurrentView == null) return;
int topOffset = TabBrowserControlsOffsetHelper.get(mTab).contentOffset();
int bottomOffset = TabBrowserControlsOffsetHelper.get(mTab).bottomControlsOffset();
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(0, topOffset, 0, bottomOffset);
layoutParams.setMargins(
mViewMargins.left, mViewMargins.top, mViewMargins.right, mViewMargins.bottom);
mCurrentView.setLayoutParams(layoutParams);
}
......@@ -158,16 +171,7 @@ public class TabViewManager implements UserData, Comparator<TabViewProvider> {
TabViewProvider currentTabViewProvider = mTabViewProviders.peek();
if (currentTabViewProvider != null) currentTabViewProvider.onHidden();
mTabViewProviders.clear();
mTab.removeObserver(mBrowserControlsOffsetObserver);
if (mMarginSupplier != null) mMarginSupplier.destroy();
mTab = null;
}
private class BrowserControlsOffsetObserver extends EmptyTabObserver {
@Override
public void onBrowserControlsOffsetChanged(Tab tab, int topControlsOffsetY,
int bottomControlsOffsetY, int contentOffsetY, int topControlsMinHeightOffsetY,
int bottomControlsMinHeightOffsetY) {
updateViewMargins();
}
}
}
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