Commit 49941fbb authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Remove reflection from DisplayCutoutController.

The P SDK is available for direct use now.

Bug: 1095714
Change-Id: I0357d8c5060871895dbf4a080cf71778e3a867bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2296892Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789099}
parent 397e493b
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
package org.chromium.chrome.browser.display_cutout; package org.chromium.chrome.browser.display_cutout;
import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Build;
import android.view.Window; import android.view.Window;
import android.view.WindowManager.LayoutParams; import android.view.WindowManager.LayoutParams;
...@@ -14,7 +16,6 @@ import androidx.annotation.VisibleForTesting; ...@@ -14,7 +16,6 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.UserData; import org.chromium.base.UserData;
import org.chromium.base.UserDataHost; import org.chromium.base.UserDataHost;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.blink.mojom.ViewportFit; import org.chromium.blink.mojom.ViewportFit;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
...@@ -29,13 +30,7 @@ import org.chromium.ui.base.WindowAndroid; ...@@ -29,13 +30,7 @@ import org.chromium.ui.base.WindowAndroid;
/** /**
* Controls the display cutout state for the tab. * Controls the display cutout state for the tab.
*/ */
@JNINamespace("chrome")
public class DisplayCutoutController implements InsetObserverView.WindowInsetObserver, UserData { public class DisplayCutoutController implements InsetObserverView.WindowInsetObserver, UserData {
/** 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";
private static final Class<DisplayCutoutController> USER_DATA_KEY = private static final Class<DisplayCutoutController> USER_DATA_KEY =
DisplayCutoutController.class; DisplayCutoutController.class;
...@@ -188,49 +183,42 @@ public class DisplayCutoutController implements InsetObserverView.WindowInsetObs ...@@ -188,49 +183,42 @@ public class DisplayCutoutController implements InsetObserverView.WindowInsetObs
* equivalent value. * equivalent value.
*/ */
@VisibleForTesting @VisibleForTesting
protected String getDisplayCutoutMode() { @TargetApi(Build.VERSION_CODES.P)
protected int getDisplayCutoutMode() {
// If we are not interactable then force the default mode. // If we are not interactable then force the default mode.
if (!mTab.isUserInteractable()) return VIEWPORT_FIT_AUTO; if (!mTab.isUserInteractable()) {
return LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
}
switch (mViewportFit) { switch (mViewportFit) {
case ViewportFit.CONTAIN: case ViewportFit.CONTAIN:
return VIEWPORT_FIT_CONTAIN; return LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
case ViewportFit.COVER_FORCED_BY_USER_AGENT: case ViewportFit.COVER_FORCED_BY_USER_AGENT:
case ViewportFit.COVER: case ViewportFit.COVER:
return VIEWPORT_FIT_COVER; return LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
case ViewportFit.AUTO: case ViewportFit.AUTO:
default: default:
return VIEWPORT_FIT_AUTO; return LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
} }
} }
@VisibleForTesting @VisibleForTesting
protected Object getWindowAttributes() { protected LayoutParams getWindowAttributes() {
return mWindow.getAttributes(); return mWindow.getAttributes();
} }
@VisibleForTesting @VisibleForTesting
protected void setWindowAttributes(Object attributes) { protected void setWindowAttributes(LayoutParams attributes) {
mWindow.setAttributes((LayoutParams) attributes); mWindow.setAttributes(attributes);
} }
/** Updates the layout based on internal state. */ /** Updates the layout based on internal state. */
@VisibleForTesting @VisibleForTesting
protected void maybeUpdateLayout() { protected void maybeUpdateLayout() {
try { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
Object attributes = getWindowAttributes();
int layoutValue =
attributes.getClass().getDeclaredField(getDisplayCutoutMode()).getInt(null);
attributes.getClass() LayoutParams attributes = getWindowAttributes();
.getDeclaredField("layoutInDisplayCutoutMode") attributes.layoutInDisplayCutoutMode = getDisplayCutoutMode();
.setInt(attributes, layoutValue); setWindowAttributes(attributes);
setWindowAttributes(attributes);
} catch (Exception ex) {
// API is not available.
return;
}
} }
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.display_cutout; package org.chromium.chrome.browser.display_cutout;
import android.os.Build; import android.os.Build;
import android.view.WindowManager;
import androidx.test.filters.LargeTest; import androidx.test.filters.LargeTest;
...@@ -13,6 +14,7 @@ import org.junit.Test; ...@@ -13,6 +14,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.blink.mojom.ViewportFit; import org.chromium.blink.mojom.ViewportFit;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
...@@ -25,6 +27,7 @@ import java.util.concurrent.TimeoutException; ...@@ -25,6 +27,7 @@ import java.util.concurrent.TimeoutException;
*/ */
@RunWith(ChromeJUnit4ClassRunner.class) @RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@MinAndroidSdkLevel(Build.VERSION_CODES.P)
public class DisplayCutoutTest { public class DisplayCutoutTest {
@Rule @Rule
public DisplayCutoutTestRule mTestRule = public DisplayCutoutTestRule mTestRule =
...@@ -36,15 +39,12 @@ public class DisplayCutoutTest { ...@@ -36,15 +39,12 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitAuto() throws TimeoutException { public void testViewportFitAuto() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_AUTO); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_AUTO);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -53,15 +53,12 @@ public class DisplayCutoutTest { ...@@ -53,15 +53,12 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitContain() throws TimeoutException { public void testViewportFitContain() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_CONTAIN); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_CONTAIN);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER);
} }
/** /**
...@@ -70,21 +67,18 @@ public class DisplayCutoutTest { ...@@ -70,21 +67,18 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitCover() throws TimeoutException { public void testViewportFitCover() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
mTestRule.exitFullscreen(); mTestRule.exitFullscreen();
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -93,9 +87,6 @@ public class DisplayCutoutTest { ...@@ -93,9 +87,6 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitCoverForced() throws TimeoutException { public void testViewportFitCoverForced() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
// Set the viewport fit internally as this value is internal only. // Set the viewport fit internally as this value is internal only.
...@@ -103,13 +94,13 @@ public class DisplayCutoutTest { ...@@ -103,13 +94,13 @@ public class DisplayCutoutTest {
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
mTestRule.exitFullscreen(); mTestRule.exitFullscreen();
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -118,20 +109,17 @@ public class DisplayCutoutTest { ...@@ -118,20 +109,17 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitDefault() throws TimeoutException { public void testViewportFitDefault() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
mTestRule.setViewportFit(""); mTestRule.setViewportFit("");
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -140,16 +128,13 @@ public class DisplayCutoutTest { ...@@ -140,16 +128,13 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitDipScale() throws TimeoutException { public void testViewportFitDipScale() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setDipScale(DisplayCutoutTestRule.TEST_HIGH_DIP_SCALE); mTestRule.setDipScale(DisplayCutoutTestRule.TEST_HIGH_DIP_SCALE);
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT_HIGH_DIP); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT_HIGH_DIP);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
} }
/** /**
...@@ -158,16 +143,13 @@ public class DisplayCutoutTest { ...@@ -158,16 +143,13 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitSubframe() throws TimeoutException { public void testViewportFitSubframe() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_CONTAIN); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_CONTAIN);
mTestRule.enterFullscreenOnSubframe(); mTestRule.enterFullscreenOnSubframe();
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
mTestRule.waitForSafeAreaOnSubframe(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT); mTestRule.waitForSafeAreaOnSubframe(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT);
} }
...@@ -177,15 +159,12 @@ public class DisplayCutoutTest { ...@@ -177,15 +159,12 @@ public class DisplayCutoutTest {
@Test @Test
@LargeTest @LargeTest
public void testViewportFitCoverNoCutout() throws TimeoutException { public void testViewportFitCoverNoCutout() throws TimeoutException {
// Display Cutout API requires Android P+.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return;
mTestRule.setDeviceHasCutout(false); mTestRule.setDeviceHasCutout(false);
mTestRule.enterFullscreen(); mTestRule.enterFullscreen();
mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER); mTestRule.setViewportFit(DisplayCutoutTestRule.VIEWPORT_FIT_COVER);
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
} }
} }
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
package org.chromium.chrome.browser.display_cutout; package org.chromium.chrome.browser.display_cutout;
import android.annotation.TargetApi;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Build;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.view.WindowManager.LayoutParams;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.json.JSONException; import org.json.JSONException;
...@@ -14,7 +17,6 @@ import org.junit.Assert; ...@@ -14,7 +17,6 @@ import org.junit.Assert;
import org.junit.runner.Description; import org.junit.runner.Description;
import org.junit.runners.model.Statement; import org.junit.runners.model.Statement;
import org.chromium.base.annotations.UsedByReflection;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenOptions; import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
...@@ -37,6 +39,7 @@ import java.util.concurrent.TimeoutException; ...@@ -37,6 +39,7 @@ import java.util.concurrent.TimeoutException;
* *
* @param <T> The type of {@link ChromeActivity} to use for the test. * @param <T> The type of {@link ChromeActivity} to use for the test.
*/ */
@TargetApi(Build.VERSION_CODES.P)
public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActivityTestRule<T> { public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActivityTestRule<T> {
/** These are the two test safe areas with and without the test cutout. */ /** These are the two test safe areas with and without the test cutout. */
public static final Rect TEST_SAFE_AREA_WITH_CUTOUT = new Rect(10, 20, 30, 40); public static final Rect TEST_SAFE_AREA_WITH_CUTOUT = new Rect(10, 20, 30, 40);
...@@ -51,26 +54,9 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv ...@@ -51,26 +54,9 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv
public static final String VIEWPORT_FIT_CONTAIN = "contain"; public static final String VIEWPORT_FIT_CONTAIN = "contain";
public static final String VIEWPORT_FIT_COVER = "cover"; public static final String VIEWPORT_FIT_COVER = "cover";
/** This simulates the Android P+ {@link LayoutParams}. */
public static final class LayoutParamsApi28 {
@UsedByReflection("Display Cutout Controller")
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
@UsedByReflection("Display Cutout Controller")
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 1;
@UsedByReflection("Display Cutout Controller")
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 2;
// This tells the Android system whether to extend into the display cutout area.
@UsedByReflection("Display Cutout Controller")
public int layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
}
/** This class has polyfills for Android P+ system apis. */ /** This class has polyfills for Android P+ system apis. */
private static final class TestDisplayCutoutController extends DisplayCutoutController { private static final class TestDisplayCutoutController extends DisplayCutoutController {
private boolean mDeviceHasCutout = true; private boolean mDeviceHasCutout = true;
private LayoutParamsApi28 mLayoutParams = new LayoutParamsApi28();
private float mDipScale = 1; private float mDipScale = 1;
TestDisplayCutoutController(Tab tab) { TestDisplayCutoutController(Tab tab) {
...@@ -78,17 +64,12 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv ...@@ -78,17 +64,12 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv
} }
@Override @Override
protected Object getWindowAttributes() { protected void setWindowAttributes(LayoutParams attributes) {
return mLayoutParams; super.setWindowAttributes(attributes);
}
@Override
protected void setWindowAttributes(Object attributes) {
mLayoutParams = (LayoutParamsApi28) attributes;
// Apply insets based on new layout mode. // Apply insets based on new layout mode.
if (getLayoutInDisplayCutoutMode() if (getLayoutInDisplayCutoutMode()
== LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES == LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
&& mDeviceHasCutout) { && mDeviceHasCutout) {
onSafeAreaChanged(TEST_SAFE_AREA_WITH_CUTOUT); onSafeAreaChanged(TEST_SAFE_AREA_WITH_CUTOUT);
} else { } else {
...@@ -97,7 +78,7 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv ...@@ -97,7 +78,7 @@ public class DisplayCutoutTestRule<T extends ChromeActivity> extends ChromeActiv
} }
public int getLayoutInDisplayCutoutMode() { public int getLayoutInDisplayCutoutMode() {
return mLayoutParams.layoutInDisplayCutoutMode; return getWindowAttributes().layoutInDisplayCutoutMode;
} }
@Override @Override
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
package org.chromium.chrome.browser.display_cutout; package org.chromium.chrome.browser.display_cutout;
import android.os.Build;
import android.view.WindowManager;
import androidx.test.filters.LargeTest; import androidx.test.filters.LargeTest;
import org.junit.Rule; import org.junit.Rule;
...@@ -12,6 +15,7 @@ import org.junit.runner.RunWith; ...@@ -12,6 +15,7 @@ import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.webapps.WebDisplayMode; import org.chromium.chrome.browser.webapps.WebDisplayMode;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
...@@ -23,6 +27,7 @@ import java.util.concurrent.TimeoutException; ...@@ -23,6 +27,7 @@ import java.util.concurrent.TimeoutException;
*/ */
@RunWith(ChromeJUnit4ClassRunner.class) @RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@MinAndroidSdkLevel(Build.VERSION_CODES.P)
public class WebappDisplayCutoutTest { public class WebappDisplayCutoutTest {
@Rule @Rule
public WebappDisplayCutoutTestRule mTestRule = new WebappDisplayCutoutTestRule(); public WebappDisplayCutoutTestRule mTestRule = new WebappDisplayCutoutTestRule();
...@@ -39,7 +44,7 @@ public class WebappDisplayCutoutTest { ...@@ -39,7 +44,7 @@ public class WebappDisplayCutoutTest {
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -54,7 +59,7 @@ public class WebappDisplayCutoutTest { ...@@ -54,7 +59,7 @@ public class WebappDisplayCutoutTest {
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITH_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES);
} }
/** /**
...@@ -70,7 +75,7 @@ public class WebappDisplayCutoutTest { ...@@ -70,7 +75,7 @@ public class WebappDisplayCutoutTest {
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
/** /**
...@@ -86,6 +91,6 @@ public class WebappDisplayCutoutTest { ...@@ -86,6 +91,6 @@ public class WebappDisplayCutoutTest {
mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT); mTestRule.waitForSafeArea(DisplayCutoutTestRule.TEST_SAFE_AREA_WITHOUT_CUTOUT);
mTestRule.waitForLayoutInDisplayCutoutMode( mTestRule.waitForLayoutInDisplayCutoutMode(
DisplayCutoutTestRule.LayoutParamsApi28.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT); WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT);
} }
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
package org.chromium.chrome.browser.display_cutout; package org.chromium.chrome.browser.display_cutout;
import android.annotation.TargetApi;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
...@@ -26,13 +28,14 @@ import java.lang.annotation.Target; ...@@ -26,13 +28,14 @@ import java.lang.annotation.Target;
/** /**
* Custom test rule for simulating a {@link WebappActivity} with a Display Cutout. * Custom test rule for simulating a {@link WebappActivity} with a Display Cutout.
*/ */
@TargetApi(Build.VERSION_CODES.P)
public class WebappDisplayCutoutTestRule extends DisplayCutoutTestRule<WebappActivity> { public class WebappDisplayCutoutTestRule extends DisplayCutoutTestRule<WebappActivity> {
/** Test data for the test webapp. */ /** Test data for the test webapp. */
private static final String WEBAPP_ID = "webapp_id"; private static final String WEBAPP_ID = "webapp_id";
private static final String WEBAPP_NAME = "webapp name"; private static final String WEBAPP_NAME = "webapp name";
private static final String WEBAPP_SHORT_NAME = "webapp short name"; private static final String WEBAPP_SHORT_NAME = "webapp short name";
/** The maximum waiting time to start {@link WebActivity0} in ms. */ /** The maximum waiting time to start {@link WebActivity} in ms. */
private static final long STARTUP_TIMEOUT = 10000L; private static final long STARTUP_TIMEOUT = 10000L;
/** /**
......
...@@ -13,6 +13,7 @@ import static org.mockito.Mockito.when; ...@@ -13,6 +13,7 @@ import static org.mockito.Mockito.when;
import android.app.Activity; import android.app.Activity;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.view.Window; import android.view.Window;
import android.view.WindowManager.LayoutParams;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
...@@ -72,6 +73,7 @@ public class DisplayCutoutControllerTest { ...@@ -72,6 +73,7 @@ public class DisplayCutoutControllerTest {
// Mock dependency on InsetObserverView. // Mock dependency on InsetObserverView.
when(mChromeActivity.getWindow()).thenReturn(mWindow); when(mChromeActivity.getWindow()).thenReturn(mWindow);
when(mWindow.getAttributes()).thenReturn(new LayoutParams());
when(mTab.getWindowAndroid()).thenReturn(mWindowAndroid); when(mTab.getWindowAndroid()).thenReturn(mWindowAndroid);
when(mWindowAndroid.getActivity()).thenReturn(mActivityRef); when(mWindowAndroid.getActivity()).thenReturn(mActivityRef);
when(mChromeActivity.getInsetObserverView()).thenReturn(mInsetObserver); when(mChromeActivity.getInsetObserverView()).thenReturn(mInsetObserver);
...@@ -103,7 +105,7 @@ public class DisplayCutoutControllerTest { ...@@ -103,7 +105,7 @@ public class DisplayCutoutControllerTest {
when(mTab.isUserInteractable()).thenReturn(true); when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.AUTO); mDisplayCutoutController.setViewportFit(ViewportFit.AUTO);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -113,7 +115,7 @@ public class DisplayCutoutControllerTest { ...@@ -113,7 +115,7 @@ public class DisplayCutoutControllerTest {
when(mTab.isUserInteractable()).thenReturn(true); when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.COVER); mDisplayCutoutController.setViewportFit(ViewportFit.COVER);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -123,7 +125,7 @@ public class DisplayCutoutControllerTest { ...@@ -123,7 +125,7 @@ public class DisplayCutoutControllerTest {
when(mTab.isUserInteractable()).thenReturn(true); when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.COVER_FORCED_BY_USER_AGENT); mDisplayCutoutController.setViewportFit(ViewportFit.COVER_FORCED_BY_USER_AGENT);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -133,7 +135,7 @@ public class DisplayCutoutControllerTest { ...@@ -133,7 +135,7 @@ public class DisplayCutoutControllerTest {
when(mTab.isUserInteractable()).thenReturn(true); when(mTab.isUserInteractable()).thenReturn(true);
mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN); mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -141,7 +143,7 @@ public class DisplayCutoutControllerTest { ...@@ -141,7 +143,7 @@ public class DisplayCutoutControllerTest {
@SmallTest @SmallTest
public void testCutoutModeWhenAutoAndNotInteractable() { public void testCutoutModeWhenAutoAndNotInteractable() {
mDisplayCutoutController.setViewportFit(ViewportFit.AUTO); mDisplayCutoutController.setViewportFit(ViewportFit.AUTO);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -149,7 +151,7 @@ public class DisplayCutoutControllerTest { ...@@ -149,7 +151,7 @@ public class DisplayCutoutControllerTest {
@SmallTest @SmallTest
public void testCutoutModeWhenCoverAndNotInteractable() { public void testCutoutModeWhenCoverAndNotInteractable() {
mDisplayCutoutController.setViewportFit(ViewportFit.COVER); mDisplayCutoutController.setViewportFit(ViewportFit.COVER);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -157,7 +159,7 @@ public class DisplayCutoutControllerTest { ...@@ -157,7 +159,7 @@ public class DisplayCutoutControllerTest {
@SmallTest @SmallTest
public void testCutoutModeWhenCoverForcedAndNotInteractable() { public void testCutoutModeWhenCoverForcedAndNotInteractable() {
mDisplayCutoutController.setViewportFit(ViewportFit.COVER_FORCED_BY_USER_AGENT); mDisplayCutoutController.setViewportFit(ViewportFit.COVER_FORCED_BY_USER_AGENT);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
...@@ -165,7 +167,7 @@ public class DisplayCutoutControllerTest { ...@@ -165,7 +167,7 @@ public class DisplayCutoutControllerTest {
@SmallTest @SmallTest
public void testCutoutModeWhenContainAndNotInteractable() { public void testCutoutModeWhenContainAndNotInteractable() {
mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN); mDisplayCutoutController.setViewportFit(ViewportFit.CONTAIN);
Assert.assertEquals("LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT", Assert.assertEquals(LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,
mDisplayCutoutController.getDisplayCutoutMode()); mDisplayCutoutController.getDisplayCutoutMode());
} }
......
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