Merge change 21944 into eclair

* changes:
  Implement new title bar hiding/showing behavior.
This commit is contained in:
Android (Google) Code Review
2009-08-24 14:13:05 -07:00
4 changed files with 122 additions and 54 deletions

View File

@@ -70,9 +70,6 @@ class CallbackProxy extends Handler {
private final WebBackForwardList mBackForwardList;
// Used to call startActivity during url override.
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
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.
* @param toZoomedOut If true, the WebView has zoomed out so that the page
* fits the screen. If false, it is zoomed to the setting
* specified by the user.
* @param newViewingMode One of the values described in WebView as possible
* values for the viewing mode
*/
/* package */ void uiOnChangeViewingMode(boolean toZoomOverview) {
/* package */ void uiOnChangeViewingMode(int newViewingMode) {
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
* side will post a message to call this method.
@@ -271,15 +248,6 @@ class CallbackProxy extends Handler {
if (mWebViewClient != null) {
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;
case RECEIVED_ICON:

View File

@@ -24,12 +24,12 @@ public class WebChromeClient {
/**
* Tell the host application that the WebView has changed viewing modes.
* @param toZoomedOut If true, the WebView has zoomed out so that the page
* fits the screen. If false, it is zoomed to the setting
* specified by the user.
* @param view The WebView that initiated the callback.
* @param newViewingMode One of the values described in WebView as possible
* values for the viewing mode
* @hide
*/
public void onChangeViewingMode(boolean toZoomedOut) {}
public void onChangeViewingMode(WebView view, int newViewingMode) {}
/**
* Tell the host application the current progress of loading a page.

View File

@@ -522,6 +522,48 @@ public class WebView extends AbsoluteLayout
// the last zoom scale.
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,
// engadget always have wider mContentWidth no matter what viewport size is.
int mZoomOverviewWidth = WebViewCore.DEFAULT_VIEWPORT_WIDTH;
@@ -1135,6 +1177,7 @@ public class WebView extends AbsoluteLayout
if (mInZoomOverview) {
b.putFloat("lastScale", mLastScale);
}
b.putBoolean("mobile", mMobileSite);
return true;
}
return false;
@@ -1180,12 +1223,20 @@ public class WebView extends AbsoluteLayout
// correctly
mActualScale = scale;
float lastScale = b.getFloat("lastScale", -1.0f);
mMobileSite = b.getBoolean("mobile", false);
if (lastScale > 0) {
mInZoomOverview = true;
mViewingMode = OVERVIEW_MODE;
mLastScale = lastScale;
} else {
mInZoomOverview = false;
if (mMobileSite && (mScrollX | mScrollY) == 0) {
mViewingMode = TITLE_BAR_DISMISS_MODE;
} else {
mViewingMode = READING_MODE_WITH_TITLE_BAR;
}
}
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
invalidate();
return true;
}
@@ -3695,6 +3746,12 @@ public class WebView extends AbsoluteLayout
protected void onScrollChanged(int l, int t, int oldl, int 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();
}
@@ -3909,6 +3966,13 @@ public class WebView extends AbsoluteLayout
deltaY = newScrollY - mScrollY;
boolean done = false;
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;
} else {
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() {
if (mWebViewCore.getSettings().getUseWideViewPort() == false) {
if (mWebViewCore.getSettings().getUseWideViewPort() == false ||
mViewingMode == NO_VIEWING_MODE) {
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;
mZoomCenterY = mLastTouchY;
mInZoomOverview = !mInZoomOverview;
mCallbackProxy.uiOnChangeViewingMode(mInZoomOverview);
mViewingMode = mInZoomOverview ? OVERVIEW_MODE : READING_MODE;
mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
// remove the zoom control after double tap
if (getSettings().getBuiltInZoomControls()) {
if (mZoomButtonsController.isVisible()) {
@@ -5035,21 +5127,27 @@ public class WebView extends AbsoluteLayout
} else {
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);
setContentScrollTo(restoreState.mScrollX,
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
// is necessary for page loads driven by webkit, and in
// particular when the user was on a password field, so

View File

@@ -1505,6 +1505,7 @@ final class WebViewCore {
float mTextWrapScale;
int mScrollX;
int mScrollY;
boolean mMobileSite;
}
static class DrawData {
@@ -1859,6 +1860,7 @@ final class WebViewCore {
mRestoreState.mMaxScale = mViewportMaximumScale / 100.0f;
mRestoreState.mScrollX = mRestoredX;
mRestoreState.mScrollY = mRestoredY;
mRestoreState.mMobileSite = (0 == mViewportWidth);
if (mRestoredScale > 0) {
if (mRestoredScreenWidthScale > 0) {
mRestoreState.mTextWrapScale =