Commit 042f8bc3 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Revert "Display Cutout: Add controller and factory to Android"

This reverts commit edff5481.

Reason for revert: This CL depends on r565449, but FindIt reverted
r565449 because it caused MSAN errors. So revert this CL as well.

Original change's description:
> Display Cutout: Add controller and factory to Android
> 
> Add a DisplayCutoutController that will decide when
> to adjust the layout based on the cutout. This depends
> on Android P APIs which are called by reflection.
> 
> BUG=838400
> 
> Change-Id: Iaf808709ded2f3c1b3d7a060942ea8c65396ad9f
> Reviewed-on: https://chromium-review.googlesource.com/1043248
> Commit-Queue: Becca Hughes <beccahughes@chromium.org>
> Reviewed-by: Ted Choc <tedchoc@chromium.org>
> Reviewed-by: Mounir Lamouri <mlamouri@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#565494}

TBR=mlamouri@chromium.org,tedchoc@chromium.org,beccahughes@chromium.org

Change-Id: If626817c04b52541d486881b207a259eabf433fd
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 838400
Reviewed-on: https://chromium-review.googlesource.com/1092047Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565529}
parent a13aeb16
// Copyright 2018 The Chromium Authors. All rights reserved.
// 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.display_cutout;
import android.support.annotation.VisibleForTesting;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import org.chromium.blink.mojom.ViewportFit;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.content_public.browser.WebContentsObserver;
/**
* Controls the display cutout state for the tab.
*/
public class DisplayCutoutController {
/** These are the property names of the different cutout mode states. */
private static final String VIEWPORT_FIT_AUTO = "LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT";
private static final String VIEWPORT_FIT_CONTAIN = "LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER";
private static final String VIEWPORT_FIT_COVER = "LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES";
/** The tab that this controller belongs to. */
private Tab mTab;
/** The current viewport fit value. */
private @WebContentsObserver.ViewportFitType int mViewportFit = ViewportFit.AUTO;
/** Listens to various Tab events. */
private final TabObserver mTabObserver = new EmptyTabObserver() {
@Override
public void onShown(Tab tab) {
assert tab == mTab;
// Force a layout update if we are now being shown.
maybeUpdateLayout();
}
@Override
public void onInteractabilityChanged(boolean interactable) {
// Force a layout update if the tab is now in the foreground.
maybeUpdateLayout();
}
};
/**
* Constructs a new DisplayCutoutController for a specific tab.
* @param tab The tab that this controller belongs to.
*/
public DisplayCutoutController(Tab tab) {
mTab = tab;
tab.addObserver(mTabObserver);
}
/**
* Set the viewport fit value for the tab.
* @param value The new viewport fit value.
*/
public void setViewportFit(@WebContentsObserver.ViewportFitType int value) {
if (value == mViewportFit) return;
mViewportFit = value;
maybeUpdateLayout();
}
/**
* Converts a {@link ViewportFit} value into the Android P+ equivalent.
* @returns String containing the {@link LayoutParams} field name of the
* equivalent value.
*/
@VisibleForTesting
protected String getDisplayCutoutMode() {
// If we are not interactable then force the default mode.
if (!mTab.isUserInteractable()) return VIEWPORT_FIT_AUTO;
switch (mViewportFit) {
case ViewportFit.CONTAIN:
return VIEWPORT_FIT_CONTAIN;
case ViewportFit.COVER:
return VIEWPORT_FIT_COVER;
case ViewportFit.AUTO:
default:
return VIEWPORT_FIT_AUTO;
}
}
/** Updates the layout based on internal state. */
@VisibleForTesting
protected void maybeUpdateLayout() {
try {
Window window = mTab.getActivity().getWindow();
LayoutParams attributes = window.getAttributes();
LayoutParams.class.getDeclaredField("layoutInDisplayCutoutMode")
.setInt(attributes,
LayoutParams.class.getDeclaredField(getDisplayCutoutMode())
.getInt(null));
window.setAttributes(attributes);
} catch (Exception ex) {
// API is not available.
return;
}
}
}
beccahughes@chromium.org
mlamouri@chromium.org
# COMPONENT: Blink>Layout
...@@ -62,7 +62,6 @@ import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; ...@@ -62,7 +62,6 @@ import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchTabHelper; import org.chromium.chrome.browser.contextualsearch.ContextualSearchTabHelper;
import org.chromium.chrome.browser.crypto.CipherFactory; import org.chromium.chrome.browser.crypto.CipherFactory;
import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.display_cutout.DisplayCutoutController;
import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.download.ChromeDownloadDelegate; import org.chromium.chrome.browser.download.ChromeDownloadDelegate;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
...@@ -560,9 +559,6 @@ public class Tab ...@@ -560,9 +559,6 @@ public class Tab
/** Whether or not the tab's active view is attached to the window. */ /** Whether or not the tab's active view is attached to the window. */
private boolean mIsViewAttachedToWindow; private boolean mIsViewAttachedToWindow;
/** Controls display cutout states on the tab. */
private DisplayCutoutController mDisplayCutoutController;
/** /**
* Creates an instance of a {@link Tab}. * Creates an instance of a {@link Tab}.
* *
...@@ -649,8 +645,6 @@ public class Tab ...@@ -649,8 +645,6 @@ public class Tab
updateInteractableState(); updateInteractableState();
} }
}; };
mDisplayCutoutController = new DisplayCutoutController(this);
} }
private int calculateDefaultThemeColor() { private int calculateDefaultThemeColor() {
...@@ -913,13 +907,6 @@ public class Tab ...@@ -913,13 +907,6 @@ public class Tab
return mInfoBarContainer; return mInfoBarContainer;
} }
/**
* @return The display cutout controller for the tab.
*/
public final DisplayCutoutController getDisplayCutoutController() {
return mDisplayCutoutController;
}
/** @return An opaque "state" object that can be persisted to storage. */ /** @return An opaque "state" object that can be persisted to storage. */
public TabState getState() { public TabState getState() {
if (!isInitialized()) return null; if (!isInitialized()) return null;
......
...@@ -280,11 +280,6 @@ public class TabWebContentsObserver extends WebContentsObserver { ...@@ -280,11 +280,6 @@ public class TabWebContentsObserver extends WebContentsObserver {
mTab.notifyNavigationEntriesDeleted(); mTab.notifyNavigationEntriesDeleted();
} }
@Override
public void viewportFitChanged(@WebContentsObserver.ViewportFitType int value) {
mTab.getDisplayCutoutController().setViewportFit(value);
}
@Override @Override
public void destroy() { public void destroy() {
MediaCaptureNotificationService.updateMediaNotificationForTab( MediaCaptureNotificationService.updateMediaNotificationForTab(
......
...@@ -380,7 +380,6 @@ chrome_java_sources = [ ...@@ -380,7 +380,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java", "java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java",
"java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java", "java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java",
"java/src/org/chromium/chrome/browser/device/DeviceClassManager.java", "java/src/org/chromium/chrome/browser/device/DeviceClassManager.java",
"java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutController.java",
"java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java", "java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java",
"java/src/org/chromium/chrome/browser/document/DocumentActivity.java", "java/src/org/chromium/chrome/browser/document/DocumentActivity.java",
"java/src/org/chromium/chrome/browser/document/DocumentUtils.java", "java/src/org/chromium/chrome/browser/document/DocumentUtils.java",
...@@ -2050,7 +2049,6 @@ chrome_junit_test_java_sources = [ ...@@ -2050,7 +2049,6 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java", "junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java",
"junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java", "junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java",
"junit/src/org/chromium/chrome/browser/customtabs/NavigationInfoCaptureTriggerTest.java", "junit/src/org/chromium/chrome/browser/customtabs/NavigationInfoCaptureTriggerTest.java",
"junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java",
"junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java", "junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java",
"junit/src/org/chromium/chrome/browser/download/home/filter/DeleteUndoOfflineItemFilterTest.java", "junit/src/org/chromium/chrome/browser/download/home/filter/DeleteUndoOfflineItemFilterTest.java",
"junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java", "junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// 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.display_cutout;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.support.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.blink.mojom.ViewportFit;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.testing.local.LocalRobolectricTestRunner;
/**
* Tests for {@link DisplayCutoutController} class.
*/
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class DisplayCutoutControllerTest {
@Mock
private Tab mTab;
@Captor
private ArgumentCaptor<TabObserver> mTabObserverCaptor;
private DisplayCutoutController mDisplayCutoutController;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mDisplayCutoutController = spy(new DisplayCutoutController(mTab));
}
@Test
@SmallTest
public void testViewportFitUpdate() throws Throwable {
verify(mDisplayCutoutController, never()).maybeUpdateLayout();
mDisplayCutoutController.setViewportFit(ViewportFit.COVER);
verify(mDisplayCutoutController).maybeUpdateLayout();
}
@Test
@SmallTest
public void testViewportFitUpdateNotChanged() throws Throwable {
verify(mDisplayCutoutController, never()).maybeUpdateLayout();
mDisplayCutoutController.setViewportFit(ViewportFit.AUTO);
verify(mDisplayCutoutController, never()).maybeUpdateLayout();
}
@Test
@SmallTest
public void testCutoutModeWhenAutoAndInteractable() throws Throwable {
when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.AUTO);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testCutoutModeWhenCoverAndInteractable() throws Throwable {
when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.COVER);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testCutoutModeWhenContainAndInteractable() throws Throwable {
when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testCutoutModeWhenAutoAndNotInteractable() throws Throwable {
mDisplayCutoutController.setViewportFit(ViewportFit.AUTO);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testCutoutModeWhenCoverAndNotInteractable() throws Throwable {
mDisplayCutoutController.setViewportFit(ViewportFit.COVER);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testCutoutModeWhenContainAndNotInteractable() throws Throwable {
mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT",
mDisplayCutoutController.getDisplayCutoutMode());
}
@Test
@SmallTest
public void testLayoutOnInteractability_True() throws Throwable {
// In this test we are checking for a side effect of maybeUpdateLayout.
// This is because the tab observer holds a reference to the original
// mDisplayCutoutController and not the spied one.
verify(mTab, never()).getActivity();
verify(mTab).addObserver(mTabObserverCaptor.capture());
mTabObserverCaptor.getValue().onInteractabilityChanged(true);
verify(mTab).getActivity();
}
@Test
@SmallTest
public void testLayoutOnInteractability_False() throws Throwable {
// In this test we are checking for a side effect of maybeUpdateLayout.
// This is because the tab observer holds a reference to the original
// mDisplayCutoutController and not the spied one.
verify(mTab, never()).getActivity();
verify(mTab).addObserver(mTabObserverCaptor.capture());
mTabObserverCaptor.getValue().onInteractabilityChanged(false);
verify(mTab).getActivity();
}
@Test
@SmallTest
public void testLayoutOnShown() throws Throwable {
// In this test we are checking for a side effect of maybeUpdateLayout.
// This is because the tab observer holds a reference to the original
// mDisplayCutoutController and not the spied one.
verify(mTab, never()).getActivity();
verify(mTab).addObserver(mTabObserverCaptor.capture());
mTabObserverCaptor.getValue().onShown(mTab);
verify(mTab).getActivity();
}
}
beccahughes@chromium.org
mlamouri@chromium.org
# COMPONENT: Blink>Layout
...@@ -270,11 +270,4 @@ void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded( ...@@ -270,11 +270,4 @@ void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded(
} }
} }
void WebContentsObserverProxy::ViewportFitChanged(
blink::mojom::ViewportFit value) {
JNIEnv* env = AttachCurrentThread();
Java_WebContentsObserverProxy_viewportFitChanged(
env, java_observer_, as_jint(static_cast<int>(value)));
}
} // namespace content } // namespace content
...@@ -58,7 +58,6 @@ class WebContentsObserverProxy : public WebContentsObserver { ...@@ -58,7 +58,6 @@ class WebContentsObserverProxy : public WebContentsObserver {
void DidChangeThemeColor(SkColor color) override; void DidChangeThemeColor(SkColor color) override;
void MediaEffectivelyFullscreenChanged(bool is_fullscreen) override; void MediaEffectivelyFullscreenChanged(bool is_fullscreen) override;
void SetToBaseURLForDataURLIfNeeded(std::string* url); void SetToBaseURLForDataURLIfNeeded(std::string* url);
void ViewportFitChanged(blink::mojom::ViewportFit value) override;
base::android::ScopedJavaGlobalRef<jobject> java_observer_; base::android::ScopedJavaGlobalRef<jobject> java_observer_;
GURL base_url_of_last_started_data_url_; GURL base_url_of_last_started_data_url_;
......
...@@ -226,14 +226,6 @@ class WebContentsObserverProxy extends WebContentsObserver { ...@@ -226,14 +226,6 @@ class WebContentsObserverProxy extends WebContentsObserver {
} }
} }
@Override
@CalledByNative
public void viewportFitChanged(@WebContentsObserver.ViewportFitType int value) {
for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
mObserversIterator.next().viewportFitChanged(value);
}
}
@Override @Override
@CalledByNative @CalledByNative
public void destroy() { public void destroy() {
......
...@@ -4,13 +4,8 @@ ...@@ -4,13 +4,8 @@
package org.chromium.content_public.browser; package org.chromium.content_public.browser;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.chromium.blink.mojom.ViewportFit;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
...@@ -166,20 +161,6 @@ public abstract class WebContentsObserver { ...@@ -166,20 +161,6 @@ public abstract class WebContentsObserver {
*/ */
public void hasEffectivelyFullscreenVideoChange(boolean isFullscreen) {} public void hasEffectivelyFullscreenVideoChange(boolean isFullscreen) {}
/**
* The Viewport Fit Type passed to viewportFitChanged. This is mirrored
* in an enum in display_cutout.mojom.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({ViewportFit.AUTO, ViewportFit.CONTAIN, ViewportFit.COVER})
public @interface ViewportFitType {}
/**
* Called when the viewport fit of the Web Contents changes.
* @param value the new viewport fit value.
*/
public void viewportFitChanged(@ViewportFitType int value) {}
/** /**
* Stop observing the web contents and clean up associated references. * Stop observing the web contents and clean up associated references.
*/ */
......
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