diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 07:56:16 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 07:56:16 +0000 |
commit | c0b970f01e3f58382cdb3439b8c53f7b117d1f55 (patch) | |
tree | fb1b38c678b8c453b4febd7ab92d6ad8fbbb4015 /android_webview/java | |
parent | a1726beda77bdab1bf0324e74b300279e683f712 (diff) | |
download | chromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.zip chromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.tar.gz chromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.tar.bz2 |
[Android] Move zoom controls management into WebView
Chrome for Android doesn't use zoom controls, so it makes sense
to move all the related code into android_webview.
However, as visibility of zoom controls is controlled from the
internals of ContentView*, we are providing hooks through a new
delegate interface.
BUG=b/8296421
R=benm@chromium.org, joth@chromium.org
Review URL: https://codereview.chromium.org/14840011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198862 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/java')
3 files changed, 213 insertions, 6 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 4118f49..683304f 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -115,6 +115,7 @@ public class AwContents { private InterceptNavigationDelegateImpl mInterceptNavigationDelegate; private InternalAccessDelegate mInternalAccessAdapter; private final AwLayoutSizer mLayoutSizer; + private AwZoomControls mZoomControls; // This can be accessed on any thread after construction. See AwContentsIoThreadClient. private final AwSettings mSettings; private boolean mIsPaused; @@ -328,12 +329,15 @@ public class AwContents { mCleanupReference = new CleanupReference(this, new DestroyRunnable(mNativeAwContents)); int nativeWebContents = nativeGetWebContents(mNativeAwContents); - mContentViewCore.initialize(containerView, internalAccessAdapter, nativeWebContents, null); + mContentViewCore.initialize( + containerView, internalAccessAdapter, nativeWebContents, null); mContentViewCore.setContentViewClient(mContentsClient.getContentViewClient()); + mZoomControls = new AwZoomControls(this); + mContentViewCore.setZoomControlsDelegate(mZoomControls); mContentsClient.installWebContentsObserver(mContentViewCore); mSettings = new AwSettings(mContentViewCore.getContext(), nativeWebContents, - isAccessFromFileURLsGrantedByDefault); + mContentViewCore, isAccessFromFileURLsGrantedByDefault); setIoThreadClient(new IoThreadClientImpl()); setInterceptNavigationDelegate(new InterceptNavigationDelegateImpl()); @@ -573,11 +577,9 @@ public class AwContents { ContentViewCore.PERSONALITY_VIEW); newCore.initialize(mContainerView, mInternalAccessAdapter, newWebContentsPtr, null); newCore.setContentViewClient(mContentsClient.getContentViewClient()); + newCore.setZoomControlsDelegate(mZoomControls); mContentsClient.installWebContentsObserver(newCore); - ContentSettings oldSettings = mContentViewCore.getContentSettings(); - newCore.getContentSettings().initFrom(oldSettings); - // Now swap the Java side reference. mContentViewCore.destroy(); mContentViewCore = newCore; @@ -610,6 +612,14 @@ public class AwContents { } } + public boolean isMultiTouchZoomSupported() { + return mSettings.supportsMultiTouchZoom(); + } + + public View getZoomControlsForTest() { + return mZoomControls.getZoomControlsViewForTest(); + } + //-------------------------------------------------------------------------------------------- // WebView[Provider] method implementations (where not provided by ContentViewCore) //-------------------------------------------------------------------------------------------- diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index 8d1c57c7..cd8c484 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -17,6 +17,7 @@ import android.webkit.WebView; import org.chromium.base.CalledByNative; import org.chromium.base.JNINamespace; import org.chromium.base.ThreadUtils; +import org.chromium.content.browser.ContentViewCore; /** * Stores Android WebView specific settings that does not need to be synced to WebKit. @@ -89,6 +90,9 @@ public class AwSettings { private int mCacheMode = WebSettings.LOAD_DEFAULT; private boolean mShouldFocusFirstNode = true; private boolean mGeolocationEnabled = true; + private boolean mSupportZoom = true; + private boolean mBuiltInZoomControls = false; + private boolean mDisplayZoomControls = true; static class LazyDefaultUserAgent{ // Lazy Holder pattern private static final String sInstance = nativeGetDefaultUserAgent(); @@ -104,6 +108,8 @@ public class AwSettings { // The native side of this object. private int mNativeAwSettings = 0; + private ContentViewCore mContentViewCore; + // A flag to avoid sending superfluous synchronization messages. private boolean mIsUpdateWebkitPrefsMessagePending = false; // Custom handler that queues messages to call native code on the UI thread. @@ -159,7 +165,9 @@ public class AwSettings { } } - public AwSettings(Context context, int nativeWebContents, + public AwSettings(Context context, + int nativeWebContents, + ContentViewCore contentViewCore, boolean isAccessFromFileURLsGrantedByDefault) { ThreadUtils.assertOnUiThread(); mContext = context; @@ -169,6 +177,8 @@ public class AwSettings { Process.myUid()) != PackageManager.PERMISSION_GRANTED; mNativeAwSettings = nativeInit(nativeWebContents); assert mNativeAwSettings != 0; + mContentViewCore = contentViewCore; + mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked()); if (isAccessFromFileURLsGrantedByDefault) { mAllowUniversalAccessFromFileURLs = true; @@ -1059,6 +1069,91 @@ public class AwSettings { } } + private void updateMultiTouchZoomSupport(final boolean supportsMultiTouchZoom) { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoom); + } + }); + } + + /** + * See {@link android.webkit.WebSettings#setSupportZoom}. + */ + public void setSupportZoom(boolean support) { + synchronized (mAwSettingsLock) { + if (mSupportZoom != support) { + mSupportZoom = support; + updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked()); + } + } + } + + /** + * See {@link android.webkit.WebSettings#supportZoom}. + */ + public boolean supportZoom() { + synchronized (mAwSettingsLock) { + return mSupportZoom; + } + } + + /** + * See {@link android.webkit.WebSettings#setBuiltInZoomControls}. + */ + public void setBuiltInZoomControls(boolean enabled) { + synchronized (mAwSettingsLock) { + if (mBuiltInZoomControls != enabled) { + mBuiltInZoomControls = enabled; + updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked()); + } + } + } + + /** + * See {@link android.webkit.WebSettings#getBuiltInZoomControls}. + */ + public boolean getBuiltInZoomControls() { + synchronized (mAwSettingsLock) { + return mBuiltInZoomControls; + } + } + + /** + * See {@link android.webkit.WebSettings#setDisplayZoomControls}. + */ + public void setDisplayZoomControls(boolean enabled) { + synchronized (mAwSettingsLock) { + mDisplayZoomControls = enabled; + } + } + + /** + * See {@link android.webkit.WebSettings#getDisplayZoomControls}. + */ + public boolean getDisplayZoomControls() { + synchronized (mAwSettingsLock) { + return mDisplayZoomControls; + } + } + + private boolean supportsMultiTouchZoomLocked() { + return mSupportZoom && mBuiltInZoomControls; + } + + boolean supportsMultiTouchZoom() { + synchronized (mAwSettingsLock) { + return supportsMultiTouchZoomLocked(); + } + } + + boolean shouldDisplayZoomControls() { + synchronized (mAwSettingsLock) { + return supportsMultiTouchZoomLocked() && mDisplayZoomControls; + } + } + private int clipFontSize(int size) { if (size < MINIMUM_FONT_SIZE) { return MINIMUM_FONT_SIZE; diff --git a/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java new file mode 100644 index 0000000..0bcae18 --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java @@ -0,0 +1,102 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview; + +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ZoomButtonsController; +import org.chromium.content.browser.ContentViewCore.ZoomControlsDelegate; + +class AwZoomControls implements ZoomControlsDelegate { + + private AwContents mAwContents; + // It is advised to use getZoomController() where possible. + private ZoomButtonsController mZoomButtonsController; + + AwZoomControls(AwContents awContents) { + mAwContents = awContents; + } + + @Override + public void invokeZoomPicker() { + ZoomButtonsController zoomController = getZoomController(); + if (zoomController != null) { + zoomController.setVisible(true); + } + } + + @Override + public void dismissZoomPicker() { + ZoomButtonsController zoomController = getZoomController(); + if (zoomController != null) { + zoomController.setVisible(false); + } + } + + @Override + public void updateZoomControls() { + ZoomButtonsController zoomController = getZoomController(); + if (zoomController == null) { + return; + } + boolean canZoomIn = mAwContents.canZoomIn(); + boolean canZoomOut = mAwContents.canZoomOut(); + if (!canZoomIn && !canZoomOut) { + // Hide the zoom in and out buttons if the page cannot zoom + zoomController.getZoomControls().setVisibility(View.GONE); + } else { + // Set each one individually, as a page may be able to zoom in or out + zoomController.setZoomInEnabled(canZoomIn); + zoomController.setZoomOutEnabled(canZoomOut); + } + } + + // This method is used in tests. It doesn't modify the state of zoom controls. + View getZoomControlsViewForTest() { + return mZoomButtonsController != null ? mZoomButtonsController.getZoomControls() : null; + } + + private ZoomButtonsController getZoomController() { + if (mZoomButtonsController == null && + mAwContents.getSettings().shouldDisplayZoomControls()) { + mZoomButtonsController = new ZoomButtonsController( + mAwContents.getContentViewCore().getContainerView()); + mZoomButtonsController.setOnZoomListener(new ZoomListener()); + // ZoomButtonsController positions the buttons at the bottom, but in + // the middle. Change their layout parameters so they appear on the + // right. + View controls = mZoomButtonsController.getZoomControls(); + ViewGroup.LayoutParams params = controls.getLayoutParams(); + if (params instanceof FrameLayout.LayoutParams) { + ((FrameLayout.LayoutParams) params).gravity = Gravity.RIGHT; + } + } + return mZoomButtonsController; + } + + private class ZoomListener implements ZoomButtonsController.OnZoomListener { + @Override + public void onVisibilityChanged(boolean visible) { + if (visible) { + // Bring back the hidden zoom controls. + mZoomButtonsController.getZoomControls().setVisibility(View.VISIBLE); + updateZoomControls(); + } + } + + @Override + public void onZoom(boolean zoomIn) { + if (zoomIn) { + mAwContents.zoomIn(); + } else { + mAwContents.zoomOut(); + } + // ContentView will call updateZoomControls after its current page scale + // is got updated from the native code. + } + } +} |