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 | |
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')
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwContents.java | 20 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwSettings.java | 97 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwZoomControls.java | 102 | ||||
-rw-r--r-- | android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java (renamed from android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java) | 52 |
4 files changed, 237 insertions, 34 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. + } + } +} diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java index c50d6f5..db46d07 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java @@ -14,8 +14,6 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwSettings; import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Feature; -import org.chromium.content.browser.ContentSettings; -import org.chromium.content.browser.ContentViewCore; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -24,13 +22,12 @@ import java.util.concurrent.Callable; /** * A test suite for zooming-related methods and settings. */ -public class ContentViewZoomTest extends AwTestBase { +public class AwZoomTest extends AwTestBase { private static final long TEST_TIMEOUT_MS = 20000L; private static final int CHECK_INTERVAL_MS = 100; private TestAwContentsClient mContentsClient; private AwContents mAwContents; - private ContentViewCore mContentViewCore; @Override public void setUp() throws Exception { @@ -39,7 +36,6 @@ public class ContentViewZoomTest extends AwTestBase { final AwTestContainerView testContainerView = createAwTestContainerViewOnMainSync(mContentsClient); mAwContents = testContainerView.getAwContents(); - mContentViewCore = testContainerView.getContentViewCore(); } private String getZoomableHtml() { @@ -62,7 +58,7 @@ public class ContentViewZoomTest extends AwTestBase { return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { @Override public Boolean call() throws Exception { - return mContentViewCore.isMultiTouchZoomSupported(); + return mAwContents.isMultiTouchZoomSupported(); } }); } @@ -80,7 +76,7 @@ public class ContentViewZoomTest extends AwTestBase { return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { @Override public Boolean call() throws Exception { - return mContentViewCore.canZoomIn(); + return mAwContents.canZoomIn(); } }); } @@ -89,7 +85,7 @@ public class ContentViewZoomTest extends AwTestBase { return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { @Override public Boolean call() throws Exception { - return mContentViewCore.canZoomOut(); + return mAwContents.canZoomOut(); } }); } @@ -98,7 +94,7 @@ public class ContentViewZoomTest extends AwTestBase { return runTestOnUiThreadAndGetResult(new Callable<Float>() { @Override public Float call() throws Exception { - return mContentViewCore.getScale(); + return mAwContents.getScale(); } }); } @@ -107,7 +103,7 @@ public class ContentViewZoomTest extends AwTestBase { return runTestOnUiThreadAndGetResult(new Callable<View>() { @Override public View call() throws Exception { - return mContentViewCore.getZoomControlsForTest(); + return mAwContents.getZoomControlsForTest(); } }); } @@ -116,7 +112,7 @@ public class ContentViewZoomTest extends AwTestBase { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - mContentViewCore.invokeZoomPicker(); + mAwContents.invokeZoomPicker(); } }); } @@ -126,7 +122,7 @@ public class ContentViewZoomTest extends AwTestBase { if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() { @Override public Boolean call() throws Exception { - return mContentViewCore.zoomIn(); + return mAwContents.zoomIn(); } })) return false; @@ -139,7 +135,7 @@ public class ContentViewZoomTest extends AwTestBase { if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() { @Override public Boolean call() throws Exception { - return mContentViewCore.zoomOut(); + return mAwContents.zoomOut(); } })) return false; @@ -182,7 +178,7 @@ public class ContentViewZoomTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); mContentsClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); - getContentSettingsOnUiThread(mAwContents).setSupportZoom(supportZoom); + getAwSettingsOnUiThread(mAwContents).setSupportZoom(supportZoom); assertTrue("Should be able to zoom in", canZoomInOnUiThread()); assertFalse("Should not be able to zoom out", canZoomOutOnUiThread()); @@ -218,14 +214,14 @@ public class ContentViewZoomTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); - assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom()); - assertFalse(getContentSettingsOnUiThread(mAwContents).getBuiltInZoomControls()); + assertTrue(webSettings.supportZoom()); + assertFalse(webSettings.getBuiltInZoomControls()); assertFalse(isMultiTouchZoomSupportedOnUiThread()); - getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true); + webSettings.setBuiltInZoomControls(true); assertTrue(isMultiTouchZoomSupportedOnUiThread()); - getContentSettingsOnUiThread(mAwContents).setSupportZoom(false); + webSettings.setSupportZoom(false); assertFalse(isMultiTouchZoomSupportedOnUiThread()); } @@ -240,9 +236,9 @@ public class ContentViewZoomTest extends AwTestBase { // It must be possible to zoom in (or zoom out) for zoom controls to be shown assertTrue("Should be able to zoom in", canZoomInOnUiThread()); - assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom()); - getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true); - getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(false); + assertTrue(webSettings.supportZoom()); + webSettings.setBuiltInZoomControls(true); + webSettings.setDisplayZoomControls(false); // With DisplayZoomControls set to false, attempts to display zoom // controls must be ignored. @@ -250,7 +246,7 @@ public class ContentViewZoomTest extends AwTestBase { invokeZoomPickerOnUiThread(); assertNull(getZoomControlsOnUiThread()); - getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true); + webSettings.setDisplayZoomControls(true); assertNull(getZoomControlsOnUiThread()); invokeZoomPickerOnUiThread(); View zoomControls = getZoomControlsOnUiThread(); @@ -267,9 +263,9 @@ public class ContentViewZoomTest extends AwTestBase { // ContentView must update itself according to the viewport setup. waitUntilCanNotZoom(); - assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom()); - getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true); - getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true); + assertTrue(webSettings.supportZoom()); + webSettings.setBuiltInZoomControls(true); + webSettings.setDisplayZoomControls(true); assertNull(getZoomControlsOnUiThread()); invokeZoomPickerOnUiThread(); View zoomControls = getZoomControlsOnUiThread(); @@ -283,9 +279,9 @@ public class ContentViewZoomTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); - assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom()); - getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true); - getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true); + assertTrue(webSettings.supportZoom()); + webSettings.setBuiltInZoomControls(true); + webSettings.setDisplayZoomControls(true); invokeZoomPickerOnUiThread(); // Now force an orientation change, and try to display the zoom picker |