Commit ca85be85 authored by boliu's avatar boliu Committed by Commit bot

android: Use DisplayAndroid in java

This replaces usage of java DeviceDisplayInfo with DisplayAndroid.
Unfortunately java code generally only pass around the Context instead
of WindowAndroid, so need to officially expose the DisplayAndroid.get
method to the public.

The rest is pretty easy. Only had to add getDIPScale.

BUG=625089

Review-Url: https://codereview.chromium.org/2394773006
Cr-Commit-Position: refs/heads/master@{#423806}
parent 1b83bb77
......@@ -11,7 +11,7 @@ import android.widget.FrameLayout;
import org.chromium.base.VisibleForTesting;
import org.chromium.content.browser.RenderCoordinates;
import org.chromium.ui.base.ViewAndroidDelegate;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.util.LinkedHashMap;
import java.util.Map;
......@@ -99,8 +99,7 @@ public class AwViewAndroidDelegate extends ViewAndroidDelegate {
}
containerView.addView(anchorView);
if (position != null) {
float scale = (float) DeviceDisplayInfo.create(containerView.getContext())
.getDIPScale();
float scale = (float) DisplayAndroid.get(containerView.getContext()).getDIPScale();
setViewPosition(anchorView, position.mX, position.mY,
position.mWidth, position.mHeight, scale,
position.mLeftMargin, position.mTopMargin);
......
......@@ -22,7 +22,7 @@ import org.chromium.base.test.util.parameter.ParameterizedTest;
import org.chromium.content.browser.test.util.CallbackHelper;
import org.chromium.content_public.browser.GestureStateListener;
import org.chromium.net.test.util.TestWebServer;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.util.Locale;
import java.util.concurrent.Callable;
......@@ -322,7 +322,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
enableJavaScriptOnUiThread(testContainerView.getAwContents());
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int targetScrollXCss = 233;
final int targetScrollYCss = 322;
final int targetScrollXPix = (int) Math.ceil(targetScrollXCss * deviceDIPScale);
......@@ -356,7 +356,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
enableJavaScriptOnUiThread(testContainerView.getAwContents());
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int targetScrollXCss = 132;
final int targetScrollYCss = 243;
final int targetScrollXPix = (int) Math.floor(targetScrollXCss * deviceDIPScale);
......@@ -384,7 +384,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
enableJavaScriptOnUiThread(testContainerView.getAwContents());
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int targetScrollXCss = 132;
final int targetScrollYCss = 243;
final int targetScrollXPix = (int) Math.floor(targetScrollXCss * deviceDIPScale);
......@@ -414,7 +414,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
enableJavaScriptOnUiThread(testContainerView.getAwContents());
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int targetScrollXCss = 132;
final int targetScrollYCss = 243;
final int targetScrollXPix = (int) Math.floor(targetScrollXCss * deviceDIPScale);
......@@ -458,7 +458,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
final int targetScrollYPix = dragStepSize * dragSteps;
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int maxScrollXPix = 101;
final int maxScrollYPix = 211;
// Make sure we can't hit these values simply as a result of scrolling.
......@@ -683,7 +683,7 @@ public class AndroidScrollIntegrationTest extends AwTestBase {
enableJavaScriptOnUiThread(testContainerView.getAwContents());
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int targetScrollYCss = 243;
final int targetScrollYPix = (int) Math.ceil(targetScrollYCss * deviceDIPScale);
......
......@@ -16,7 +16,7 @@ import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.android_webview.test.util.GraphicsTestUtils;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.CallbackHelper;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.util.concurrent.atomic.AtomicReference;
......@@ -308,7 +308,7 @@ public class AndroidViewIntegrationTest extends AwTestBase {
assertZeroHeight(testContainerView);
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int contentWidthCss = 142;
final int contentHeightCss = 180;
......@@ -335,7 +335,7 @@ public class AndroidViewIntegrationTest extends AwTestBase {
assertZeroHeight(testContainerView);
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int contentWidthCss = 142;
final int contentHeightCss = 180;
......@@ -363,7 +363,7 @@ public class AndroidViewIntegrationTest extends AwTestBase {
assertZeroHeight(testContainerView);
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int contentWidthCss = 142;
final int contentHeightCss = 180;
......@@ -389,7 +389,7 @@ public class AndroidViewIntegrationTest extends AwTestBase {
final AwContents awContents = testContainerView.getAwContents();
final double deviceDIPScale =
DeviceDisplayInfo.create(testContainerView.getContext()).getDIPScale();
DisplayAndroid.get(testContainerView.getContext()).getDIPScale();
final int physicalWidth = 600;
final int spanWidth = 42;
final int expectedWidthCss =
......
......@@ -13,7 +13,7 @@ import android.widget.FrameLayout;
import org.chromium.android_webview.AwViewAndroidDelegate;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.RenderCoordinates;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
/**
* Tests anchor views are correctly added/removed when their container view is updated.
......@@ -181,7 +181,7 @@ public class AwContentsAnchorViewTest extends AwTestBase {
}
private LayoutParams setLayoutParams(View anchorView, int coords, int dimension) {
float scale = (float) DeviceDisplayInfo.create(mContainerView.getContext()).getDIPScale();
float scale = (float) DisplayAndroid.get(mContainerView.getContext()).getDIPScale();
mViewDelegate.setViewPosition(
anchorView, coords, coords, dimension, dimension, scale, 10, 10);
return anchorView.getLayoutParams();
......
......@@ -12,7 +12,7 @@ import org.chromium.android_webview.AwSettings;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.CallbackHelper;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.util.Locale;
import java.util.concurrent.Callable;
......@@ -41,14 +41,13 @@ public class AwLegacyQuirksTest extends AwTestBase {
settings.setJavaScriptEnabled(true);
DeviceDisplayInfo deviceInfo =
DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
DisplayAndroid displayAndroid = DisplayAndroid.get(getInstrumentation().getTargetContext());
loadDataSync(awContents, onPageFinishedHelper, pageDeviceDpi, "text/html", false);
int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
assertEquals(deviceInfo.getDisplayWidth(), actualWidth, 10f);
assertEquals(displayAndroid.getDisplayWidth(), actualWidth, 10f);
float displayWidth = (deviceInfo.getDisplayWidth());
float deviceDpi = (float) (160f * deviceInfo.getDIPScale());
float displayWidth = (displayAndroid.getDisplayWidth());
float deviceDpi = (float) (160f * displayAndroid.getDIPScale());
loadDataSync(awContents, onPageFinishedHelper, pageHighDpi, "text/html", false);
actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
......@@ -76,10 +75,10 @@ public class AwLegacyQuirksTest extends AwTestBase {
settings.setJavaScriptEnabled(true);
settings.setUseWideViewPort(true);
DeviceDisplayInfo deviceInfo =
DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
DisplayAndroid displayAndroid = DisplayAndroid.get(getInstrumentation().getTargetContext());
loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
float displayWidth = (float) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
float displayWidth =
(float) (displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
assertEquals(displayWidth, actualWidth, 10f);
assertEquals(1.0f, getScaleOnUiThread(awContents));
......@@ -102,10 +101,10 @@ public class AwLegacyQuirksTest extends AwTestBase {
settings.setJavaScriptEnabled(true);
DeviceDisplayInfo deviceInfo =
DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
DisplayAndroid displayAndroid = DisplayAndroid.get(getInstrumentation().getTargetContext());
loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
float displayWidth = (float) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
float displayWidth =
(float) (displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
assertEquals(displayWidth, actualWidth, 10f);
assertEquals(1.0f, getScaleOnUiThread(awContents));
......@@ -132,16 +131,15 @@ public class AwLegacyQuirksTest extends AwTestBase {
loadUrlSync(awContents, onPageFinishedHelper, "about:blank");
DeviceDisplayInfo deviceInfo =
DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
float dipScale = (float) deviceInfo.getDIPScale();
float physicalDisplayWidth = deviceInfo.getPhysicalDisplayWidth() != 0
? deviceInfo.getPhysicalDisplayWidth()
: deviceInfo.getDisplayWidth();
DisplayAndroid displayAndroid = DisplayAndroid.get(getInstrumentation().getTargetContext());
float dipScale = (float) displayAndroid.getDIPScale();
float physicalDisplayWidth = displayAndroid.getPhysicalDisplayWidth() != 0
? displayAndroid.getPhysicalDisplayWidth()
: displayAndroid.getDisplayWidth();
float cssDisplayWidth = physicalDisplayWidth / dipScale;
float physicalDisplayHeight = deviceInfo.getPhysicalDisplayHeight() != 0
? deviceInfo.getPhysicalDisplayHeight()
: deviceInfo.getDisplayHeight();
float physicalDisplayHeight = displayAndroid.getPhysicalDisplayHeight() != 0
? displayAndroid.getPhysicalDisplayHeight()
: displayAndroid.getDisplayHeight();
float cssDisplayHeight = physicalDisplayHeight / dipScale;
float screenWidth = Integer.parseInt(
......
......@@ -22,6 +22,7 @@ import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwSettings;
import org.chromium.android_webview.AwWebResourceResponse;
......@@ -41,7 +42,7 @@ import org.chromium.content.browser.test.util.HistoryUtils;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content_public.browser.WebContents;
import org.chromium.net.test.util.TestWebServer;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.io.File;
import java.util.concurrent.Callable;
......@@ -958,8 +959,9 @@ public class AwSettingsTest extends AwTestBase {
}
protected String getData() {
DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(mContext);
int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
DisplayAndroid displayAndroid = DisplayAndroid.get(mContext);
int displayWidth =
(int) (displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
int layoutWidth = (int) (displayWidth * 2.5f); // Use 2.5 as autosizing layout tests do.
StringBuilder sb = new StringBuilder();
sb.append("<html>"
......@@ -1464,10 +1466,10 @@ public class AwSettingsTest extends AwTestBase {
loadDataSync(getData());
final int reportedClientWidth = Integer.parseInt(getTitleOnUiThread());
if (value) {
final DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(mContext);
final DisplayAndroid displayAndroid = DisplayAndroid.get(mContext);
// The clientWidth is subject to pixel snapping.
final int displayWidth = (int) Math.ceil(
deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
assertEquals(displayWidth, reportedClientWidth);
} else {
assertEquals(3000, reportedClientWidth);
......@@ -2536,8 +2538,8 @@ public class AwSettingsTest extends AwTestBase {
pageTemplate,
"<meta name='viewport' content='width=" + viewportTagSpecifiedWidth + "' />");
DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(testContainer.getContext());
int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
DisplayAndroid displayAndroid = DisplayAndroid.get(testContainer.getContext());
int displayWidth = (int) (displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
settings.setJavaScriptEnabled(true);
assertFalse(settings.getUseWideViewPort());
......@@ -2604,9 +2606,9 @@ public class AwSettingsTest extends AwTestBase {
AwSettings settings = getAwSettingsOnUiThread(awContents);
settings.setBuiltInZoomControls(true);
DeviceDisplayInfo deviceInfo =
DeviceDisplayInfo.create(testContainerView.getContext());
int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
DisplayAndroid displayAndroid =
DisplayAndroid.get(testContainerView.getContext());
int displayWidth = (int) (displayAndroid.getDisplayWidth() / displayAndroid.getDIPScale());
int layoutWidth = displayWidth * 2;
final String page = "<html>"
+ "<head><meta name='viewport' content='width=" + layoutWidth + "'>"
......
......@@ -21,7 +21,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileDownloader;
import org.chromium.chrome.browser.profiles.ProfileDownloader.Observer;
import org.chromium.components.signin.AccountManagerHelper;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import java.util.HashMap;
......@@ -62,9 +62,9 @@ public class ProfileDataCache implements Observer {
mContext = context;
mProfile = profile;
final DeviceDisplayInfo info = DeviceDisplayInfo.create(context);
mImageSizePx = (int) Math.ceil(PROFILE_IMAGE_SIZE_DP * info.getDIPScale());
mImageStrokePx = (int) Math.ceil(PROFILE_IMAGE_STROKE_DP * info.getDIPScale());
final DisplayAndroid displayAndroid = DisplayAndroid.get(context);
mImageSizePx = (int) Math.ceil(PROFILE_IMAGE_SIZE_DP * displayAndroid.getDIPScale());
mImageStrokePx = (int) Math.ceil(PROFILE_IMAGE_STROKE_DP * displayAndroid.getDIPScale());
mImageStrokeColor = Color.WHITE;
Bitmap placeHolder = BitmapFactory.decodeResource(mContext.getResources(),
......
......@@ -20,7 +20,7 @@ import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.ui.UiUtils;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
/**
* The Autofill suggestion view that lists relevant suggestions. It sits above the keyboard and
......@@ -48,7 +48,7 @@ public class AutofillKeyboardAccessory extends LinearLayout
mWindowAndroid = windowAndroid;
mAutofillDelegate = autofillDelegate;
int deviceWidthPx = DeviceDisplayInfo.create(getContext()).getDisplayWidth();
int deviceWidthPx = DisplayAndroid.get(getContext()).getDisplayWidth();
mMaximumLabelWidthPx = deviceWidthPx / 2;
mMaximumSublabelWidthPx = deviceWidthPx / 4;
......
......@@ -7,6 +7,7 @@ package org.chromium.content.browser;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.view.Surface;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Log;
......@@ -16,7 +17,6 @@ import org.chromium.base.annotations.JNINamespace;
import org.chromium.content_public.common.ScreenOrientationConstants;
import org.chromium.content_public.common.ScreenOrientationValues;
import org.chromium.ui.display.DisplayAndroid;
import org.chromium.ui.gfx.DeviceDisplayInfo;
/**
* This is the implementation of the C++ counterpart ScreenOrientationProvider.
......@@ -45,15 +45,15 @@ public class ScreenOrientationProvider {
case ScreenOrientationValues.ANY:
return ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR;
case ScreenOrientationValues.NATURAL:
DeviceDisplayInfo displayInfo = DeviceDisplayInfo.create(activity);
int rotation = displayInfo.getRotationDegrees();
if (rotation == 0 || rotation == 180) {
if (displayInfo.getDisplayHeight() >= displayInfo.getDisplayWidth()) {
DisplayAndroid displayAndroid = DisplayAndroid.get(activity);
int rotation = displayAndroid.getRotation();
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
if (displayAndroid.getDisplayHeight() >= displayAndroid.getDisplayWidth()) {
return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
if (displayInfo.getDisplayHeight() < displayInfo.getDisplayWidth()) {
if (displayAndroid.getDisplayHeight() < displayAndroid.getDisplayWidth()) {
return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
......
......@@ -8,6 +8,7 @@ import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Point;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.Display;
import java.util.WeakHashMap;
......@@ -42,13 +43,18 @@ public class DisplayAndroid {
// Updated by updateFromDisplay.
private final Point mSize;
private final Point mPhysicalSize;
private final DisplayMetrics mDisplayMetrics;
private int mRotation;
private static DisplayAndroidManager getManager() {
return DisplayAndroidManager.getInstance();
}
// Internal implementation. Should not be called outside of UI.
/**
* Get the DisplayAndroid for this context. It's safe to call this with any type of context
* including the Application. However to support multi-display, prefer to use the Activity
* context if available, or obtain DisplayAndroid from WindowAndroid instead.
*/
public static DisplayAndroid get(Context context) {
Display display = DisplayAndroidManager.getDisplayFromContext(context);
int id = display.getDisplayId();
......@@ -90,6 +96,13 @@ public class DisplayAndroid {
return mRotation;
}
/**
* @return A scaling factor for the Density Independent Pixel unit.
*/
public double getDIPScale() {
return mDisplayMetrics.density;
}
/**
* Add observer. Note repeat observers will be called only one.
* Observers are held only weakly by Display.
......@@ -126,12 +139,14 @@ public class DisplayAndroid {
mObservers = new WeakHashMap<>();
mSize = new Point();
mPhysicalSize = new Point();
mDisplayMetrics = new DisplayMetrics();
updateFromDisplay(display);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
/* package */ void updateFromDisplay(Display display) {
display.getSize(mSize);
display.getMetrics(mDisplayMetrics);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealSize(mPhysicalSize);
......
......@@ -14,7 +14,7 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.MainDex;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.gfx.DeviceDisplayInfo;
import org.chromium.ui.display.DisplayAndroid;
import org.chromium.ui.resources.ResourceLoader.ResourceLoaderCallback;
import org.chromium.ui.resources.dynamics.DynamicResource;
import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
......@@ -73,13 +73,13 @@ public class ResourceManager implements ResourceLoaderCallback {
throw new IllegalStateException("Context should not be null during initialization.");
}
DeviceDisplayInfo displayInfo = DeviceDisplayInfo.create(context);
int screenWidth = displayInfo.getPhysicalDisplayWidth() != 0
? displayInfo.getPhysicalDisplayWidth()
: displayInfo.getDisplayWidth();
int screenHeight = displayInfo.getPhysicalDisplayHeight() != 0
? displayInfo.getPhysicalDisplayHeight()
: displayInfo.getDisplayHeight();
DisplayAndroid displayAndroid = windowAndroid.getDisplay();
int screenWidth = displayAndroid.getPhysicalDisplayWidth() != 0
? displayAndroid.getPhysicalDisplayWidth()
: displayAndroid.getDisplayWidth();
int screenHeight = displayAndroid.getPhysicalDisplayHeight() != 0
? displayAndroid.getPhysicalDisplayHeight()
: displayAndroid.getDisplayHeight();
int minScreenSideLength = Math.min(screenWidth, screenHeight);
Resources resources = context.getResources();
......
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