Support the new dpi change in the WebView.

Fix http://b/issue?id=2071943
This commit is contained in:
Grace Kloba
2009-09-20 16:34:44 -07:00
parent 7b7029e032
commit 408cf85207
3 changed files with 43 additions and 22 deletions

View File

@@ -707,6 +707,10 @@ class BrowserFrame extends Handler {
return value.string.toString();
}
private float density() {
return mContext.getResources().getDisplayMetrics().density;
}
//==========================================================================
// native functions
//==========================================================================

View File

@@ -4868,7 +4868,7 @@ public class WebView extends AbsoluteLayout
/ draw.mMinPrefWidth;
mMinZoomScaleFixed = false;
} else {
mMinZoomScale = mDefaultScale;
mMinZoomScale = restoreState.mDefaultScale;
mMinZoomScaleFixed = true;
}
} else {
@@ -4891,7 +4891,7 @@ public class WebView extends AbsoluteLayout
&& settings.getLoadWithOverviewMode()) {
if (restoreState.mViewScale == 0
|| (restoreState.mMobileSite
&& mMinZoomScale < mDefaultScale)) {
&& mMinZoomScale < restoreState.mDefaultScale)) {
mInZoomOverview = true;
}
}

View File

@@ -100,6 +100,15 @@ final class WebViewCore {
private boolean mViewportUserScalable = true;
/*
* range is from 70 to 400.
* 0 is a special value means device-dpi. The default scale factor will be
* always 100.
* -1 means undefined. The default scale factor will be
* WebView.DEFAULT_SCALE_PERCENT.
*/
private int mViewportDensityDpi = -1;
private int mRestoredScale = 0;
private int mRestoredScreenWidthScale = 0;
private int mRestoredX = 0;
@@ -1539,6 +1548,7 @@ final class WebViewCore {
float mMaxScale;
float mViewScale;
float mTextWrapScale;
float mDefaultScale;
int mScrollX;
int mScrollY;
boolean mMobileSite;
@@ -1842,30 +1852,38 @@ final class WebViewCore {
// set the viewport settings from WebKit
setViewportSettingsFromNative();
// adjust the default scale to match the density
if (WebView.DEFAULT_SCALE_PERCENT != 100) {
float adjust = (float) WebView.DEFAULT_SCALE_PERCENT / 100.0f;
if (mViewportInitialScale > 0) {
mViewportInitialScale *= adjust;
}
if (mViewportMinimumScale > 0) {
mViewportMinimumScale *= adjust;
}
if (mViewportMaximumScale > 0) {
mViewportMaximumScale *= adjust;
// adjust the default scale to match the densityDpi
float adjust = 1.0f;
if (mViewportDensityDpi == -1) {
if (WebView.DEFAULT_SCALE_PERCENT != 100) {
adjust = WebView.DEFAULT_SCALE_PERCENT / 100.0f;
}
} else if (mViewportDensityDpi > 0) {
adjust = (float) mContext.getResources().getDisplayMetrics().densityDpi
/ mViewportDensityDpi;
}
int defaultScale = (int) (adjust * 100);
if (mViewportInitialScale > 0) {
mViewportInitialScale *= adjust;
}
if (mViewportMinimumScale > 0) {
mViewportMinimumScale *= adjust;
}
if (mViewportMaximumScale > 0) {
mViewportMaximumScale *= adjust;
}
// infer the values if they are not defined.
if (mViewportWidth == 0) {
if (mViewportInitialScale == 0) {
mViewportInitialScale = WebView.DEFAULT_SCALE_PERCENT;
mViewportInitialScale = defaultScale;
}
}
if (mViewportUserScalable == false) {
mViewportInitialScale = WebView.DEFAULT_SCALE_PERCENT;
mViewportMinimumScale = WebView.DEFAULT_SCALE_PERCENT;
mViewportMaximumScale = WebView.DEFAULT_SCALE_PERCENT;
mViewportInitialScale = defaultScale;
mViewportMinimumScale = defaultScale;
mViewportMaximumScale = defaultScale;
}
if (mViewportMinimumScale > mViewportInitialScale
&& mViewportInitialScale != 0) {
@@ -1875,8 +1893,7 @@ final class WebViewCore {
&& mViewportMaximumScale < mViewportInitialScale) {
mViewportMaximumScale = mViewportInitialScale;
}
if (mViewportWidth < 0
&& mViewportInitialScale == WebView.DEFAULT_SCALE_PERCENT) {
if (mViewportWidth < 0 && mViewportInitialScale == defaultScale) {
mViewportWidth = 0;
}
@@ -1893,7 +1910,7 @@ final class WebViewCore {
// we call WebView method from WebCore thread. But not perfect
// reference is better than no reference.
webViewWidth = mWebView.getViewWidth();
viewportWidth = webViewWidth * 100 / WebView.DEFAULT_SCALE_PERCENT;
viewportWidth = (int) (webViewWidth / adjust);
if (viewportWidth == 0) {
Log.w(LOGTAG, "Can't get the viewWidth after the first layout");
}
@@ -1903,6 +1920,7 @@ final class WebViewCore {
mRestoreState = new RestoreState();
mRestoreState.mMinScale = mViewportMinimumScale / 100.0f;
mRestoreState.mMaxScale = mViewportMaximumScale / 100.0f;
mRestoreState.mDefaultScale = adjust;
mRestoreState.mScrollX = mRestoredX;
mRestoreState.mScrollY = mRestoredY;
mRestoreState.mMobileSite = (0 == mViewportWidth);
@@ -1924,8 +1942,7 @@ final class WebViewCore {
mRestoreState.mViewScale = mRestoreState.mTextWrapScale =
(float) webViewWidth / mViewportWidth;
} else {
mRestoreState.mTextWrapScale =
WebView.DEFAULT_SCALE_PERCENT / 100.0f;
mRestoreState.mTextWrapScale = adjust;
// 0 will trigger WebView to turn on zoom overview mode
mRestoreState.mViewScale = 0;
}