am 7bc08e9d: Merge change 21944 into eclair
Merge commit '7bc08e9d51d3142717a94098f897a776f7b7bd71' into eclair-plus-aosp * commit '7bc08e9d51d3142717a94098f897a776f7b7bd71': Implement new title bar hiding/showing behavior.
This commit is contained in:
@@ -70,9 +70,6 @@ class CallbackProxy extends Handler {
|
|||||||
private final WebBackForwardList mBackForwardList;
|
private final WebBackForwardList mBackForwardList;
|
||||||
// Used to call startActivity during url override.
|
// Used to call startActivity during url override.
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
// Stores the URL being loaded and the viewing mode to switch into when
|
|
||||||
// the URL finishes loading.
|
|
||||||
private ChangeViewModeOnFinishedLoad mChange;
|
|
||||||
|
|
||||||
// Message Ids
|
// Message Ids
|
||||||
private static final int PAGE_STARTED = 100;
|
private static final int PAGE_STARTED = 100;
|
||||||
@@ -181,35 +178,15 @@ class CallbackProxy extends Handler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the host application that the WebView has changed viewing modes.
|
* Tell the host application that the WebView has changed viewing modes.
|
||||||
* @param toZoomedOut If true, the WebView has zoomed out so that the page
|
* @param newViewingMode One of the values described in WebView as possible
|
||||||
* fits the screen. If false, it is zoomed to the setting
|
* values for the viewing mode
|
||||||
* specified by the user.
|
|
||||||
*/
|
*/
|
||||||
/* package */ void uiOnChangeViewingMode(boolean toZoomOverview) {
|
/* package */ void uiOnChangeViewingMode(int newViewingMode) {
|
||||||
if (mWebChromeClient != null) {
|
if (mWebChromeClient != null) {
|
||||||
mWebChromeClient.onChangeViewingMode(toZoomOverview);
|
mWebChromeClient.onChangeViewingMode(mWebView, newViewingMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ChangeViewModeOnFinishedLoad {
|
|
||||||
boolean mToZoomOverView;
|
|
||||||
String mOriginalUrl;
|
|
||||||
ChangeViewModeOnFinishedLoad(boolean toZoomOverview,
|
|
||||||
String originalUrl) {
|
|
||||||
mToZoomOverView = toZoomOverview;
|
|
||||||
mOriginalUrl = originalUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keep track of the url and the viewing mode to change into. If/when that
|
|
||||||
* url finishes loading, this will change the viewing mode.
|
|
||||||
*/
|
|
||||||
/* package */ void uiChangeViewingModeOnFinishedLoad(
|
|
||||||
boolean toZoomOverview, String originalUrl) {
|
|
||||||
if (mWebChromeClient == null) return;
|
|
||||||
mChange = new ChangeViewModeOnFinishedLoad(toZoomOverview, originalUrl);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Called by the UI side. Calling overrideUrlLoading from the WebCore
|
* Called by the UI side. Calling overrideUrlLoading from the WebCore
|
||||||
* side will post a message to call this method.
|
* side will post a message to call this method.
|
||||||
@@ -271,15 +248,6 @@ class CallbackProxy extends Handler {
|
|||||||
if (mWebViewClient != null) {
|
if (mWebViewClient != null) {
|
||||||
mWebViewClient.onPageFinished(mWebView, (String) msg.obj);
|
mWebViewClient.onPageFinished(mWebView, (String) msg.obj);
|
||||||
}
|
}
|
||||||
if (mChange != null) {
|
|
||||||
if (mWebView.getOriginalUrl().equals(mChange.mOriginalUrl)) {
|
|
||||||
uiOnChangeViewingMode(mChange.mToZoomOverView);
|
|
||||||
} else {
|
|
||||||
// The user has gone to a different page, so there is
|
|
||||||
// no need to hang on to the old object.
|
|
||||||
mChange = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RECEIVED_ICON:
|
case RECEIVED_ICON:
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ public class WebChromeClient {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the host application that the WebView has changed viewing modes.
|
* Tell the host application that the WebView has changed viewing modes.
|
||||||
* @param toZoomedOut If true, the WebView has zoomed out so that the page
|
* @param view The WebView that initiated the callback.
|
||||||
* fits the screen. If false, it is zoomed to the setting
|
* @param newViewingMode One of the values described in WebView as possible
|
||||||
* specified by the user.
|
* values for the viewing mode
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public void onChangeViewingMode(boolean toZoomedOut) {}
|
public void onChangeViewingMode(WebView view, int newViewingMode) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the host application the current progress of loading a page.
|
* Tell the host application the current progress of loading a page.
|
||||||
|
|||||||
@@ -522,6 +522,48 @@ public class WebView extends AbsoluteLayout
|
|||||||
// the last zoom scale.
|
// the last zoom scale.
|
||||||
boolean mInZoomOverview = false;
|
boolean mInZoomOverview = false;
|
||||||
|
|
||||||
|
// The viewing mode of this webview. Reported back to the WebChromeClient
|
||||||
|
// so we can hide and display the title bar as appropriate.
|
||||||
|
private int mViewingMode;
|
||||||
|
/**
|
||||||
|
* Not supporting overview vs reading mode
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final static int NO_VIEWING_MODE = 0;
|
||||||
|
/**
|
||||||
|
* Zoom overview mode. The page is zoomed all the way out, mInZoomOverview
|
||||||
|
* is true, and the title bar is showing. Double tapping will change to
|
||||||
|
* reading mode.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final static int OVERVIEW_MODE = 1;
|
||||||
|
/**
|
||||||
|
* Reading mode. The page is at the level specified by the user,
|
||||||
|
* mInZoomOverview is false, and the title bar is not showing. Double
|
||||||
|
* tapping will change to zoom overview mode.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final static int READING_MODE = 2;
|
||||||
|
/**
|
||||||
|
* Modified reading mode, which shows the title bar. mInZoomOverview is
|
||||||
|
* false, and double tapping will change to zoom overview mode. However,
|
||||||
|
* if the scrolling will change to reading mode. Used when swiping a
|
||||||
|
* tab into view which was in reading mode, unless it was a mobile site
|
||||||
|
* with zero scroll.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final static int READING_MODE_WITH_TITLE_BAR = 3;
|
||||||
|
/**
|
||||||
|
* Another modified reading mode. For loading a mobile site, or swiping a
|
||||||
|
* tab into view which was displaying a mobile site in reading mode
|
||||||
|
* with zero scroll
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final static int TITLE_BAR_DISMISS_MODE = 4;
|
||||||
|
// Whether the current site is a mobile site. Determined when we receive
|
||||||
|
// NEW_PICTURE_MSG_ID to help determine how to handle double taps
|
||||||
|
private boolean mMobileSite;
|
||||||
|
|
||||||
// ideally mZoomOverviewWidth should be mContentWidth. But sites like espn,
|
// ideally mZoomOverviewWidth should be mContentWidth. But sites like espn,
|
||||||
// engadget always have wider mContentWidth no matter what viewport size is.
|
// engadget always have wider mContentWidth no matter what viewport size is.
|
||||||
int mZoomOverviewWidth = WebViewCore.DEFAULT_VIEWPORT_WIDTH;
|
int mZoomOverviewWidth = WebViewCore.DEFAULT_VIEWPORT_WIDTH;
|
||||||
@@ -1135,6 +1177,7 @@ public class WebView extends AbsoluteLayout
|
|||||||
if (mInZoomOverview) {
|
if (mInZoomOverview) {
|
||||||
b.putFloat("lastScale", mLastScale);
|
b.putFloat("lastScale", mLastScale);
|
||||||
}
|
}
|
||||||
|
b.putBoolean("mobile", mMobileSite);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -1180,12 +1223,20 @@ public class WebView extends AbsoluteLayout
|
|||||||
// correctly
|
// correctly
|
||||||
mActualScale = scale;
|
mActualScale = scale;
|
||||||
float lastScale = b.getFloat("lastScale", -1.0f);
|
float lastScale = b.getFloat("lastScale", -1.0f);
|
||||||
|
mMobileSite = b.getBoolean("mobile", false);
|
||||||
if (lastScale > 0) {
|
if (lastScale > 0) {
|
||||||
mInZoomOverview = true;
|
mInZoomOverview = true;
|
||||||
|
mViewingMode = OVERVIEW_MODE;
|
||||||
mLastScale = lastScale;
|
mLastScale = lastScale;
|
||||||
} else {
|
} else {
|
||||||
mInZoomOverview = false;
|
mInZoomOverview = false;
|
||||||
|
if (mMobileSite && (mScrollX | mScrollY) == 0) {
|
||||||
|
mViewingMode = TITLE_BAR_DISMISS_MODE;
|
||||||
|
} else {
|
||||||
|
mViewingMode = READING_MODE_WITH_TITLE_BAR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
invalidate();
|
invalidate();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -3695,6 +3746,12 @@ public class WebView extends AbsoluteLayout
|
|||||||
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
|
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
|
||||||
super.onScrollChanged(l, t, oldl, oldt);
|
super.onScrollChanged(l, t, oldl, oldt);
|
||||||
|
|
||||||
|
if (mViewingMode == READING_MODE_WITH_TITLE_BAR
|
||||||
|
|| mViewingMode == TITLE_BAR_DISMISS_MODE) {
|
||||||
|
mViewingMode = READING_MODE;
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
|
}
|
||||||
|
|
||||||
sendOurVisibleRect();
|
sendOurVisibleRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3909,6 +3966,13 @@ public class WebView extends AbsoluteLayout
|
|||||||
deltaY = newScrollY - mScrollY;
|
deltaY = newScrollY - mScrollY;
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
if (deltaX == 0 && deltaY == 0) {
|
if (deltaX == 0 && deltaY == 0) {
|
||||||
|
// The user attempted to pan the page, so dismiss the title
|
||||||
|
// bar
|
||||||
|
if (mViewingMode == READING_MODE_WITH_TITLE_BAR
|
||||||
|
|| mViewingMode == TITLE_BAR_DISMISS_MODE) {
|
||||||
|
mViewingMode = READING_MODE;
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
|
}
|
||||||
done = true;
|
done = true;
|
||||||
} else {
|
} else {
|
||||||
if (mSnapScrollMode == SNAP_X || mSnapScrollMode == SNAP_Y) {
|
if (mSnapScrollMode == SNAP_X || mSnapScrollMode == SNAP_Y) {
|
||||||
@@ -4683,14 +4747,42 @@ public class WebView extends AbsoluteLayout
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the Tabs are used to slide this WebView's tab into view.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void slideIntoFocus() {
|
||||||
|
if (mViewingMode == READING_MODE) {
|
||||||
|
if (!mMobileSite || (mScrollX | mScrollY) != 0) {
|
||||||
|
mViewingMode = READING_MODE_WITH_TITLE_BAR;
|
||||||
|
} else {
|
||||||
|
mViewingMode = TITLE_BAR_DISMISS_MODE;
|
||||||
|
}
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void doDoubleTap() {
|
private void doDoubleTap() {
|
||||||
if (mWebViewCore.getSettings().getUseWideViewPort() == false) {
|
if (mWebViewCore.getSettings().getUseWideViewPort() == false ||
|
||||||
|
mViewingMode == NO_VIEWING_MODE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (mViewingMode == TITLE_BAR_DISMISS_MODE) {
|
||||||
|
mViewingMode = READING_MODE;
|
||||||
|
// mInZoomOverview will not change, so change the viewing mode
|
||||||
|
// and return
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mViewingMode == READING_MODE_WITH_TITLE_BAR && mMobileSite) {
|
||||||
|
scrollTo(0,0);
|
||||||
|
}
|
||||||
|
// READING_MODE_WITH_TITLE_BAR will go to OVERVIEW_MODE here.
|
||||||
mZoomCenterX = mLastTouchX;
|
mZoomCenterX = mLastTouchX;
|
||||||
mZoomCenterY = mLastTouchY;
|
mZoomCenterY = mLastTouchY;
|
||||||
mInZoomOverview = !mInZoomOverview;
|
mInZoomOverview = !mInZoomOverview;
|
||||||
mCallbackProxy.uiOnChangeViewingMode(mInZoomOverview);
|
mViewingMode = mInZoomOverview ? OVERVIEW_MODE : READING_MODE;
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
// remove the zoom control after double tap
|
// remove the zoom control after double tap
|
||||||
if (getSettings().getBuiltInZoomControls()) {
|
if (getSettings().getBuiltInZoomControls()) {
|
||||||
if (mZoomButtonsController.isVisible()) {
|
if (mZoomButtonsController.isVisible()) {
|
||||||
@@ -5035,21 +5127,27 @@ public class WebView extends AbsoluteLayout
|
|||||||
} else {
|
} else {
|
||||||
mMaxZoomScale = restoreState.mMaxScale;
|
mMaxZoomScale = restoreState.mMaxScale;
|
||||||
}
|
}
|
||||||
if (useWideViewport && restoreState.mViewScale == 0) {
|
|
||||||
mInZoomOverview = ENABLE_DOUBLETAP_ZOOM
|
|
||||||
&& settings.getLoadWithOverviewMode();
|
|
||||||
}
|
|
||||||
mCallbackProxy.uiOnChangeViewingMode(true);
|
|
||||||
if (!mInZoomOverview) {
|
|
||||||
// We are going to start zoomed in. However, we
|
|
||||||
// truly want to show the title bar, and then hide
|
|
||||||
// it once the page has loaded
|
|
||||||
mCallbackProxy.uiChangeViewingModeOnFinishedLoad(
|
|
||||||
false, getOriginalUrl());
|
|
||||||
}
|
|
||||||
setNewZoomScale(mLastScale, false);
|
setNewZoomScale(mLastScale, false);
|
||||||
setContentScrollTo(restoreState.mScrollX,
|
setContentScrollTo(restoreState.mScrollX,
|
||||||
restoreState.mScrollY);
|
restoreState.mScrollY);
|
||||||
|
if (!ENABLE_DOUBLETAP_ZOOM
|
||||||
|
|| !settings.getLoadWithOverviewMode()) {
|
||||||
|
mMobileSite = false;
|
||||||
|
mViewingMode = NO_VIEWING_MODE;
|
||||||
|
} else {
|
||||||
|
mMobileSite = restoreState.mMobileSite;
|
||||||
|
if (useWideViewport
|
||||||
|
&& restoreState.mViewScale == 0) {
|
||||||
|
mViewingMode = OVERVIEW_MODE;
|
||||||
|
mInZoomOverview = true;
|
||||||
|
} else if (mMobileSite
|
||||||
|
&& (mScrollX | mScrollY) == 0) {
|
||||||
|
mViewingMode = TITLE_BAR_DISMISS_MODE;
|
||||||
|
} else {
|
||||||
|
mViewingMode = READING_MODE_WITH_TITLE_BAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
|
||||||
// As we are on a new page, remove the WebTextView. This
|
// As we are on a new page, remove the WebTextView. This
|
||||||
// is necessary for page loads driven by webkit, and in
|
// is necessary for page loads driven by webkit, and in
|
||||||
// particular when the user was on a password field, so
|
// particular when the user was on a password field, so
|
||||||
|
|||||||
@@ -1505,6 +1505,7 @@ final class WebViewCore {
|
|||||||
float mTextWrapScale;
|
float mTextWrapScale;
|
||||||
int mScrollX;
|
int mScrollX;
|
||||||
int mScrollY;
|
int mScrollY;
|
||||||
|
boolean mMobileSite;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class DrawData {
|
static class DrawData {
|
||||||
@@ -1859,6 +1860,7 @@ final class WebViewCore {
|
|||||||
mRestoreState.mMaxScale = mViewportMaximumScale / 100.0f;
|
mRestoreState.mMaxScale = mViewportMaximumScale / 100.0f;
|
||||||
mRestoreState.mScrollX = mRestoredX;
|
mRestoreState.mScrollX = mRestoredX;
|
||||||
mRestoreState.mScrollY = mRestoredY;
|
mRestoreState.mScrollY = mRestoredY;
|
||||||
|
mRestoreState.mMobileSite = (0 == mViewportWidth);
|
||||||
if (mRestoredScale > 0) {
|
if (mRestoredScale > 0) {
|
||||||
if (mRestoredScreenWidthScale > 0) {
|
if (mRestoredScreenWidthScale > 0) {
|
||||||
mRestoreState.mTextWrapScale =
|
mRestoreState.mTextWrapScale =
|
||||||
|
|||||||
Reference in New Issue
Block a user