Loading core/java/android/webkit/CallbackProxy.java +4 −36 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } private static class ChangeViewModeOnFinishedLoad { boolean mToZoomOverView; String mOriginalUrl; ChangeViewModeOnFinishedLoad(boolean toZoomOverview, String originalUrl) { mToZoomOverView = toZoomOverview; mOriginalUrl = originalUrl; mWebChromeClient.onChangeViewingMode(mWebView, newViewingMode); } } /** * 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. Loading Loading @@ -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: Loading core/java/android/webkit/WebChromeClient.java +4 −4 Original line number Diff line number Diff line Loading @@ -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. Loading core/java/android/webkit/WebView.java +112 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1135,6 +1177,7 @@ public class WebView extends AbsoluteLayout if (mInZoomOverview) { b.putFloat("lastScale", mLastScale); } b.putBoolean("mobile", mMobileSite); return true; } return false; Loading Loading @@ -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; } Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading Loading @@ -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 Loading core/java/android/webkit/WebViewCore.java +2 −0 Original line number Diff line number Diff line Loading @@ -1505,6 +1505,7 @@ final class WebViewCore { float mTextWrapScale; int mScrollX; int mScrollY; boolean mMobileSite; } static class DrawData { Loading Loading @@ -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 = Loading Loading
core/java/android/webkit/CallbackProxy.java +4 −36 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } private static class ChangeViewModeOnFinishedLoad { boolean mToZoomOverView; String mOriginalUrl; ChangeViewModeOnFinishedLoad(boolean toZoomOverview, String originalUrl) { mToZoomOverView = toZoomOverview; mOriginalUrl = originalUrl; mWebChromeClient.onChangeViewingMode(mWebView, newViewingMode); } } /** * 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. Loading Loading @@ -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: Loading
core/java/android/webkit/WebChromeClient.java +4 −4 Original line number Diff line number Diff line Loading @@ -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. Loading
core/java/android/webkit/WebView.java +112 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1135,6 +1177,7 @@ public class WebView extends AbsoluteLayout if (mInZoomOverview) { b.putFloat("lastScale", mLastScale); } b.putBoolean("mobile", mMobileSite); return true; } return false; Loading Loading @@ -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; } Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading Loading @@ -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 Loading
core/java/android/webkit/WebViewCore.java +2 −0 Original line number Diff line number Diff line Loading @@ -1505,6 +1505,7 @@ final class WebViewCore { float mTextWrapScale; int mScrollX; int mScrollY; boolean mMobileSite; } static class DrawData { Loading Loading @@ -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 = Loading