summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrace Kloba <klobag@google.com>2010-03-12 13:32:55 -0800
committerGrace Kloba <klobag@google.com>2010-03-12 13:32:55 -0800
commite8300a1dc544d2118dd577bf9fe9cf3ad1c0ee57 (patch)
tree18215947be9d7e426416f5d34894a31a3f7fc40e
parent34ec95de2f96a5f85d5e4e0f99252b99c0aca14f (diff)
downloadframeworks_base-e8300a1dc544d2118dd577bf9fe9cf3ad1c0ee57.zip
frameworks_base-e8300a1dc544d2118dd577bf9fe9cf3ad1c0ee57.tar.gz
frameworks_base-e8300a1dc544d2118dd577bf9fe9cf3ad1c0ee57.tar.bz2
Expose smart-zoom, or centerFitRect to native.
Clean up the old centerPluginOnScreen so it can be used to center fit any rectangle on the screen. Fix http://b/issue?id=2510670
-rw-r--r--core/java/android/webkit/WebView.java67
-rw-r--r--core/java/android/webkit/WebViewCore.java9
2 files changed, 47 insertions, 29 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 390550f..c5a4e9e 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -535,9 +535,10 @@ public class WebView extends AbsoluteLayout
static final int SET_ROOT_LAYER_MSG_ID = 124;
static final int RETURN_LABEL = 125;
static final int FIND_AGAIN = 126;
+ static final int CENTER_FIT_RECT = 127;
private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID;
- private static final int LAST_PACKAGE_MSG_ID = FIND_AGAIN;
+ private static final int LAST_PACKAGE_MSG_ID = CENTER_FIT_RECT;
static final String[] HandlerPrivateDebugString = {
"REMEMBER_PASSWORD", // = 1;
@@ -578,7 +579,8 @@ public class WebView extends AbsoluteLayout
"IMMEDIATE_REPAINT_MSG_ID", // = 123;
"SET_ROOT_LAYER_MSG_ID", // = 124;
"RETURN_LABEL", // = 125;
- "FIND_AGAIN" // = 126;
+ "FIND_AGAIN", // = 126;
+ "CENTER_FIT_RECT" // = 127;
};
// If the site doesn't use the viewport meta tag to specify the viewport,
@@ -5737,49 +5739,50 @@ public class WebView extends AbsoluteLayout
}
/*
- * Maximize and center the view inside the WebView. If the zoom doesn't need
- * to be changed, do an animated scroll to center it. If the zoom needs to
- * be changed, find the zoom center and do a smooth zoom transition.
+ * Maximize and center the rectangle, specified in the document coordinate
+ * space, inside the WebView. If the zoom doesn't need to be changed, do an
+ * animated scroll to center it. If the zoom needs to be changed, find the
+ * zoom center and do a smooth zoom transition.
*/
- private void centerPluginOnScreen(ViewManager.ChildView child) {
+ private void centerFitRect(int docX, int docY, int docWidth, int docHeight) {
int viewWidth = getViewWidth();
int viewHeight = getViewHeightWithTitle();
- float scale = Math.min((float) viewWidth / child.width,
- (float) viewHeight / child.height);
+ float scale = Math.min((float) viewWidth / docWidth, (float) viewHeight
+ / docHeight);
if (scale < mMinZoomScale) {
scale = mMinZoomScale;
} else if (scale > mMaxZoomScale) {
scale = mMaxZoomScale;
}
if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) {
- pinScrollTo(
- contentToViewX(child.x + child.width / 2) - viewWidth / 2,
- contentToViewY(child.y + child.height / 2) - viewHeight / 2,
+ pinScrollTo(contentToViewX(docX + docWidth / 2) - viewWidth / 2,
+ contentToViewY(docY + docHeight / 2) - viewHeight / 2,
true, 0);
} else {
- int oldScreenX = contentToViewX(child.x) - mScrollX;
- int newPluginX = (int) (child.x * scale);
- int newPluginWidth = (int) (child.width * scale);
+ int oldScreenX = contentToViewX(docX) - mScrollX;
+ int rectViewX = (int) (docX * scale);
+ int rectViewWidth = (int) (docWidth * scale);
int newMaxWidth = (int) (mContentWidth * scale);
- int newScreenX = (viewWidth - newPluginWidth) / 2;
+ int newScreenX = (viewWidth - rectViewWidth) / 2;
// pin the newX to the WebView
- if (newScreenX > newPluginX) {
- newScreenX = newPluginX;
- } else if (newScreenX > (newMaxWidth - newPluginX - newPluginWidth)) {
- newScreenX = viewWidth - (newMaxWidth - newPluginX);
+ if (newScreenX > rectViewX) {
+ newScreenX = rectViewX;
+ } else if (newScreenX > (newMaxWidth - rectViewX - rectViewWidth)) {
+ newScreenX = viewWidth - (newMaxWidth - rectViewX);
}
mZoomCenterX = (oldScreenX * scale - newScreenX * mActualScale)
/ (scale - mActualScale);
- int oldScreenY = contentToViewY(child.y) - mScrollY;
- int newPluginY = (int) (child.y * scale) + getTitleHeight();
- int newPluginHeight = (int) (child.height * scale);
- int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight();
- int newScreenY = (viewHeight - newPluginHeight) / 2;
+ int oldScreenY = contentToViewY(docY) - mScrollY;
+ int rectViewY = (int) (docY * scale) + getTitleHeight();
+ int rectViewHeight = (int) (docHeight * scale);
+ int newMaxHeight = (int) (mContentHeight * scale)
+ + getTitleHeight();
+ int newScreenY = (viewHeight - rectViewHeight) / 2;
// pin the newY to the WebView
- if (newScreenY > newPluginY) {
- newScreenY = newPluginY;
- } else if (newScreenY > (newMaxHeight - newPluginY - newPluginHeight)) {
- newScreenY = viewHeight - (newMaxHeight - newPluginY);
+ if (newScreenY > rectViewY) {
+ newScreenY = rectViewY;
+ } else if (newScreenY > (newMaxHeight - rectViewY - rectViewHeight)) {
+ newScreenY = viewHeight - (newMaxHeight - rectViewY);
}
mZoomCenterY = (oldScreenY * scale - newScreenY * mActualScale)
/ (scale - mActualScale);
@@ -5825,7 +5828,7 @@ public class WebView extends AbsoluteLayout
true);
} else {
mInZoomOverview = false;
- centerPluginOnScreen(plugin);
+ centerFitRect(plugin.x, plugin.y, plugin.width, plugin.height);
}
return;
}
@@ -6642,6 +6645,12 @@ public class WebView extends AbsoluteLayout
}
break;
+ case CENTER_FIT_RECT:
+ Rect r = (Rect)msg.obj;
+ mInZoomOverview = false;
+ centerFitRect(r.left, r.top, r.width(), r.height());
+ break;
+
default:
super.handleMessage(msg);
break;
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 27c7208..a274378 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -2462,6 +2462,15 @@ final class WebViewCore {
}
}
+ // called by JNI
+ private void centerFitRect(int x, int y, int width, int height) {
+ if (mWebView == null) {
+ return;
+ }
+ mWebView.mPrivateHandler.obtainMessage(WebView.CENTER_FIT_RECT,
+ new Rect(x, y, x + width, y + height)).sendToTarget();
+ }
+
private native void nativePause();
private native void nativeResume();
private native void nativeFreeMemory();