diff options
| author | Grace Kloba <klobag@google.com> | 2009-06-25 11:20:51 -0700 |
|---|---|---|
| committer | Grace Kloba <klobag@google.com> | 2009-06-25 11:20:51 -0700 |
| commit | 0d8b77c2453d0e597f94e39212e4bfeed8affffa (patch) | |
| tree | 90cccf494b1cf0c2b14accb8f1f12a6b193365f2 /core/java | |
| parent | d4eac5f3840de7ddf084a36053d8e63766b4a0f7 (diff) | |
| download | frameworks_base-0d8b77c2453d0e597f94e39212e4bfeed8affffa.zip frameworks_base-0d8b77c2453d0e597f94e39212e4bfeed8affffa.tar.gz frameworks_base-0d8b77c2453d0e597f94e39212e4bfeed8affffa.tar.bz2 | |
Add ZoomDensity so that we can change the desired default scale.
Fix a bug where we didn't adjust the viewport scale according to our density.
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/webkit/WebSettings.java | 50 | ||||
| -rw-r--r-- | core/java/android/webkit/WebView.java | 31 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 18 |
3 files changed, 88 insertions, 11 deletions
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index dcba943..ec671d5 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -69,7 +69,24 @@ public class WebSettings { } int value; } - + + /** + * Enum for specifying the WebView's desired density. + * FAR makes 100% looking like in 240dpi + * MEDIUM makes 100% looking like in 160dpi + * CLOSE makes 100% looking like in 120dpi + * @hide Pending API council approval + */ + public enum ZoomDensity { + FAR(150), // 240dpi + MEDIUM(100), // 160dpi + CLOSE(75); // 120dpi + ZoomDensity(int size) { + value = size; + } + int value; + } + /** * Default cache usage pattern Use with {@link #setCacheMode}. */ @@ -105,6 +122,8 @@ public class WebSettings { LOW } + // WebView associated with this WebSettings. + private WebView mWebView; // BrowserFrame used to access the native frame pointer. private BrowserFrame mBrowserFrame; // Flag to prevent multiple SYNC messages at one time. @@ -145,6 +164,7 @@ public class WebSettings { // Don't need to synchronize the get/set methods as they // are basic types, also none of these values are used in // native WebCore code. + private ZoomDensity mDefaultZoom = ZoomDensity.MEDIUM; private RenderPriority mRenderPriority = RenderPriority.NORMAL; private int mOverrideCacheMode = LOAD_DEFAULT; private boolean mSaveFormData = true; @@ -237,9 +257,10 @@ public class WebSettings { * Package constructor to prevent clients from creating a new settings * instance. */ - WebSettings(Context context) { + WebSettings(Context context, WebView webview) { mEventHandler = new EventHandler(); mContext = context; + mWebView = webview; mDefaultTextEncoding = context.getString(com.android.internal. R.string.default_text_encoding); @@ -447,6 +468,31 @@ public class WebSettings { } /** + * Set the default zoom density of the page. This should be called from UI + * thread. + * @param zoom A ZoomDensity value + * @see WebSettings.ZoomDensity + * @hide Pending API council approval + */ + public void setDefaultZoom(ZoomDensity zoom) { + if (mDefaultZoom != zoom) { + mDefaultZoom = zoom; + mWebView.updateDefaultZoomDensity(zoom.value); + } + } + + /** + * Get the default zoom density of the page. This should be called from UI + * thread. + * @return A ZoomDensity value + * @see WebSettings.ZoomDensity + * @hide Pending API council approval + */ + public ZoomDensity getDefaultZoom() { + return mDefaultZoom; + } + + /** * Enables using light touches to make a selection and activate mouseovers. */ public void setLightTouchEnabled(boolean enabled) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 1179c1c..ffd4d90 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -408,7 +408,7 @@ public class WebView extends AbsoluteLayout // default scale. Depending on the display density. static int DEFAULT_SCALE_PERCENT; - private float DEFAULT_SCALE; + private float mDefaultScale; // set to true temporarily while the zoom control is being dragged private boolean mPreviewZoomOnly = false; @@ -640,7 +640,7 @@ public class WebView extends AbsoluteLayout mZoomFitPageButton.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { - zoomWithPreview(DEFAULT_SCALE); + zoomWithPreview(mDefaultScale); updateZoomButtonsEnabled(); } }); @@ -663,7 +663,7 @@ public class WebView extends AbsoluteLayout // or out. mZoomButtonsController.setZoomInEnabled(canZoomIn); mZoomButtonsController.setZoomOutEnabled(canZoomOut); - mZoomFitPageButton.setEnabled(mActualScale != DEFAULT_SCALE); + mZoomFitPageButton.setEnabled(mActualScale != mDefaultScale); } mZoomOverviewButton.setVisibility(canZoomScrollOut() ? View.VISIBLE: View.GONE); @@ -685,7 +685,7 @@ public class WebView extends AbsoluteLayout mNavSlop = (int) (16 * density); // density adjusted scale factors DEFAULT_SCALE_PERCENT = (int) (100 * density); - DEFAULT_SCALE = density; + mDefaultScale = density; mActualScale = density; mInvActualScale = 1 / density; DEFAULT_MAX_ZOOM_SCALE = 4.0f * density; @@ -694,6 +694,23 @@ public class WebView extends AbsoluteLayout mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE; } + /* package */void updateDefaultZoomDensity(int zoomDensity) { + final float density = getContext().getResources().getDisplayMetrics().density + * 100 / zoomDensity; + if (Math.abs(density - mDefaultScale) > 0.01) { + float scaleFactor = density / mDefaultScale; + // adjust the limits + mNavSlop = (int) (16 * density); + DEFAULT_SCALE_PERCENT = (int) (100 * density); + DEFAULT_MAX_ZOOM_SCALE = 4.0f * density; + DEFAULT_MIN_ZOOM_SCALE = 0.25f * density; + mDefaultScale = density; + mMaxZoomScale *= scaleFactor; + mMinZoomScale *= scaleFactor; + setNewZoomScale(mActualScale * scaleFactor, false); + } + } + /* package */ boolean onSavePassword(String schemePlusHost, String username, String password, final Message resumeMsg) { boolean rVal = false; @@ -4172,8 +4189,8 @@ public class WebView extends AbsoluteLayout float oldScale = mActualScale; // snap to DEFAULT_SCALE if it is close - if (scale > (DEFAULT_SCALE - 0.05) && scale < (DEFAULT_SCALE + 0.05)) { - scale = DEFAULT_SCALE; + if (scale > (mDefaultScale - 0.05) && scale < (mDefaultScale + 0.05)) { + scale = mDefaultScale; } setNewZoomScale(scale, false); @@ -4689,7 +4706,7 @@ public class WebView extends AbsoluteLayout int initialScale = msg.arg1; int viewportWidth = msg.arg2; // start a new page with DEFAULT_SCALE zoom scale. - float scale = DEFAULT_SCALE; + float scale = mDefaultScale; if (mInitialScale > 0) { scale = mInitialScale / 100.0f; } else { diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index e2efb43..e9b2fc0 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -139,7 +139,7 @@ final class WebViewCore { // ready. mEventHub = new EventHub(); // Create a WebSettings object for maintaining all settings - mSettings = new WebSettings(mContext); + mSettings = new WebSettings(mContext, mWebView); // The WebIconDatabase needs to be initialized within the UI thread so // just request the instance here. WebIconDatabase.getInstance(); @@ -1560,6 +1560,20 @@ 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 = WebView.DEFAULT_SCALE_PERCENT / 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) { @@ -1586,7 +1600,7 @@ final class WebViewCore { mViewportMaximumScale = mViewportInitialScale; } else if (mViewportInitialScale == 0) { mViewportInitialScale = mViewportMaximumScale; - } + } } if (mViewportWidth < 0 && mViewportInitialScale == WebView.DEFAULT_SCALE_PERCENT) { |
