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 | |
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
-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 | ||||
-rw-r--r-- | build/android/findbugs_filter/findbugs_known_bugs.txt | 1 | ||||
-rw-r--r-- | content/public/android/java/src/org/chromium/content/browser/ContentSettings.java | 181 | ||||
-rw-r--r-- | content/public/android/java/src/org/chromium/content/browser/ContentView.java | 19 | ||||
-rw-r--r-- | content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java | 60 | ||||
-rw-r--r-- | content/public/android/java/src/org/chromium/content/browser/ZoomManager.java | 94 |
9 files changed, 284 insertions, 342 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 diff --git a/build/android/findbugs_filter/findbugs_known_bugs.txt b/build/android/findbugs_filter/findbugs_known_bugs.txt index c0fe27f..3533af4 100644 --- a/build/android/findbugs_filter/findbugs_known_bugs.txt +++ b/build/android/findbugs_filter/findbugs_known_bugs.txt @@ -27,7 +27,6 @@ M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_we M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_webview.test.ArchiveTest.testExplicitBadPath() At ArchiveTest.java M D SF: Switch statement found in org.chromium.chrome.browser.ChromeBrowserProvider.insert(Uri, ContentValues) where one case falls through to the next case At ChromeBrowserProvider.java M D SF: Switch statement found in org.chromium.chrome.browser.database.SQLiteCursor.fillWindow(int, CursorWindow) where default case is missing At SQLiteCursor.java -M D SF: Switch statement found in org.chromium.content.browser.ContentSettings$EventHandler$1.handleMessage(Message) where default case is missing At ContentSettings.java M D SF: Switch statement found in org.chromium.content.browser.third_party.GestureDetector.onTouchEvent(MotionEvent) where default case is missing At GestureDetector.java M M LI: Incorrect lazy initialization and update of static field org.chromium.content.browser.ContentVideoView.sContentVideoView in org.chromium.content.browser.ContentVideoView.createContentVideoView(int) At ContentVideoView.java M M UG: org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.getBooleanValue() is unsynchronized, org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.setBooleanValue(boolean) is synchronized At JavaBridgeReturnValuesTest.java diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java b/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java index df03f00..d3ca0c6 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java @@ -4,78 +4,25 @@ package org.chromium.content.browser; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - import org.chromium.base.CalledByNative; import org.chromium.base.JNINamespace; import org.chromium.base.ThreadUtils; -import java.util.concurrent.Callable; - /** * Manages settings state for a ContentView. A ContentSettings instance is obtained - * from ContentView.getContentSettings(). If ContentView is used in the - * ContentView.PERSONALITY_VIEW role, all settings are read / write. If ContentView - * is in the ContentView.PERSONALITY_CHROME role, setting can only be read. + * from ContentViewCore.getContentSettings(). */ @JNINamespace("content") public class ContentSettings { private static final String TAG = "ContentSettings"; - // This class must be created on the UI thread. Afterwards, it can be - // used from any thread. Internally, the class uses a message queue - // to call native code on the UI thread only. - // The native side of this object. Ownership is retained native-side by the WebContents // instance that backs the associated ContentViewCore. private int mNativeContentSettings = 0; private ContentViewCore mContentViewCore; - // Custom handler that queues messages to call native code on the UI thread. - private final EventHandler mEventHandler; - - // Protects access to settings fields. - private final Object mContentSettingsLock = new Object(); - - private boolean mSupportZoom = true; - private boolean mBuiltInZoomControls = false; - private boolean mDisplayZoomControls = true; - - // Class to handle messages to be processed on the UI thread. - private class EventHandler { - // Message id for updating multi-touch zoom state in the view - private static final int UPDATE_MULTI_TOUCH = 2; - // Actual UI thread handler - private Handler mHandler; - - EventHandler() { - if (mContentViewCore.isPersonalityView()) { - mHandler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case UPDATE_MULTI_TOUCH: - if (mContentViewCore.isAlive()) { - mContentViewCore.updateMultiTouchZoomSupport(); - } - break; - } - } - }; - } - } - - private void sendUpdateMultiTouchMessageLocked() { - assert Thread.holdsLock(mContentSettingsLock); - if (mNativeContentSettings == 0) return; - mHandler.sendMessage(Message.obtain(null, UPDATE_MULTI_TOUCH)); - } - } - /** * Package constructor to prevent clients from creating a new settings * instance. Must be called on the UI thread. @@ -85,12 +32,6 @@ public class ContentSettings { mContentViewCore = contentViewCore; mNativeContentSettings = nativeInit(nativeContentView); assert mNativeContentSettings != 0; - - mEventHandler = new EventHandler(); - if (!mContentViewCore.isPersonalityView()) { - mBuiltInZoomControls = true; - mDisplayZoomControls = false; - } } /** @@ -104,126 +45,14 @@ public class ContentSettings { } /** - * Sets whether the WebView should support zooming using its on-screen zoom - * controls and gestures. The particular zoom mechanisms that should be used - * can be set with {@link #setBuiltInZoomControls}. This setting does not - * affect zooming performed using the {@link WebView#zoomIn()} and - * {@link WebView#zoomOut()} methods. The default is true. - * - * @param support whether the WebView should support zoom - */ - public void setSupportZoom(boolean support) { - synchronized (mContentSettingsLock) { - mSupportZoom = support; - mEventHandler.sendUpdateMultiTouchMessageLocked(); - } - } - - /** - * Gets whether the WebView supports zoom. - * - * @return true if the WebView supports zoom - * @see #setSupportZoom - */ - public boolean supportZoom() { - return mSupportZoom; - } - - /** - * Sets whether the WebView should use its built-in zoom mechanisms. The - * built-in zoom mechanisms comprise on-screen zoom controls, which are - * displayed over the WebView's content, and the use of a pinch gesture to - * control zooming. Whether or not these on-screen controls are displayed - * can be set with {@link #setDisplayZoomControls}. The default is false, - * due to compatibility reasons. - * <p> - * The built-in mechanisms are the only currently supported zoom - * mechanisms, so it is recommended that this setting is always enabled. - * In other words, there is no point of calling this method other than - * with the 'true' parameter. - * - * @param enabled whether the WebView should use its built-in zoom mechanisms - */ - public void setBuiltInZoomControls(boolean enabled) { - synchronized (mContentSettingsLock) { - mBuiltInZoomControls = enabled; - mEventHandler.sendUpdateMultiTouchMessageLocked(); - } - } - - /** - * Gets whether the zoom mechanisms built into WebView are being used. - * - * @return true if the zoom mechanisms built into WebView are being used - * @see #setBuiltInZoomControls - */ - public boolean getBuiltInZoomControls() { - return mBuiltInZoomControls; - } - - /** - * Sets whether the WebView should display on-screen zoom controls when - * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}. - * The default is true. - * - * @param enabled whether the WebView should display on-screen zoom controls - */ - public void setDisplayZoomControls(boolean enabled) { - synchronized (mContentSettingsLock) { - mDisplayZoomControls = enabled; - mEventHandler.sendUpdateMultiTouchMessageLocked(); - } - } - - /** - * Gets whether the WebView displays on-screen zoom controls when using - * the built-in zoom mechanisms. - * - * @return true if the WebView displays on-screen zoom controls when using - * the built-in zoom mechanisms - * @see #setDisplayZoomControls - */ - public boolean getDisplayZoomControls() { - return mDisplayZoomControls; - } - - boolean supportsMultiTouchZoom() { - return mSupportZoom && mBuiltInZoomControls; - } - - boolean shouldDisplayZoomControls() { - return supportsMultiTouchZoom() && mDisplayZoomControls; - } - - /** - * Return true if JavaScript is enabled. + * Return true if JavaScript is enabled. Must be called on the UI thread. * * @return True if JavaScript is enabled. */ public boolean getJavaScriptEnabled() { - return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() { - @Override - public Boolean call() { - if (mNativeContentSettings != 0) { - return nativeGetJavaScriptEnabled(mNativeContentSettings); - } else { - return false; - } - } - }); - } - - /** - * Sets the settings in this object to those from another - * ContentSettings. - * Required by WebView when we swap a in a new ContentViewCore - * to an existing AwContents (i.e. to support displaying popup - * windows in an already created WebView) - */ - public void initFrom(ContentSettings settings) { - setSupportZoom(settings.supportZoom()); - setBuiltInZoomControls(settings.getBuiltInZoomControls()); - setDisplayZoomControls(settings.getDisplayZoomControls()); + ThreadUtils.assertOnUiThread(); + return mNativeContentSettings != 0 ? + nativeGetJavaScriptEnabled(mNativeContentSettings) : false; } // Initialize the ContentSettings native side. diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentView.java b/content/public/android/java/src/org/chromium/content/browser/ContentView.java index 9ea4fb4..ae00c5b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentView.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentView.java @@ -635,14 +635,6 @@ public class ContentView extends FrameLayout mContentViewCore.onVisibilityChanged(changedView, visibility); } - void updateMultiTouchZoomSupport() { - mContentViewCore.updateMultiTouchZoomSupport(); - } - - public boolean isMultiTouchZoomSupported() { - return mContentViewCore.isMultiTouchZoomSupported(); - } - /** * Register the delegate to be used when content can not be handled by * the rendering engine, and should be downloaded instead. This will replace @@ -742,17 +734,6 @@ public class ContentView extends FrameLayout return mContentViewCore.zoomReset(); } - // Invokes the graphical zoom picker widget for this ContentView. - public void invokeZoomPicker() { - mContentViewCore.invokeZoomPicker(); - } - - // Unlike legacy WebView getZoomControls which returns external zoom controls, - // this method returns built-in zoom controls. This method is used in tests. - public View getZoomControlsForTest() { - return mContentViewCore.getZoomControlsForTest(); - } - /** * Return the current scale of the WebView * @return The current scale. diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java index 88375d7..62a4693 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java @@ -119,7 +119,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { * implementing container view. */ @SuppressWarnings("javadoc") - public static interface InternalAccessDelegate { + public interface InternalAccessDelegate { /** * @see View#drawChild(Canvas, View, long) */ @@ -170,7 +170,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { * An interface that allows the embedder to be notified when the pinch gesture starts and * stops. */ - public static interface PinchGestureStateListener { + public interface PinchGestureStateListener { /** * Called when the pinch gesture starts. */ @@ -181,6 +181,24 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { void onPinchGestureEnd(); } + /** + * An interface for controlling visibility and state of embedder-provided zoom controls. + */ + public interface ZoomControlsDelegate { + /** + * Called when it's reasonable to show zoom controls. + */ + void invokeZoomPicker(); + /** + * Called when zoom controls need to be hidden (e.g. when the view hides). + */ + void dismissZoomPicker(); + /** + * Called when page scale has been changed, so the controls can update their state. + */ + void updateZoomControls(); + } + private VSyncManager.Provider mVSyncProvider; private VSyncManager.Listener mVSyncListener; private int mVSyncSubscriberCount; @@ -276,6 +294,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { private ContentViewGestureHandler mContentViewGestureHandler; private PinchGestureStateListener mPinchGestureStateListener; private ZoomManager mZoomManager; + private ZoomControlsDelegate mZoomControlsDelegate; private PopupZoomer mPopupZoomer; @@ -655,8 +674,15 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { } mZoomManager = new ZoomManager(mContext, this); - mZoomManager.updateMultiTouchSupport(); mContentViewGestureHandler = new ContentViewGestureHandler(mContext, this, mZoomManager); + mZoomControlsDelegate = new ZoomControlsDelegate() { + @Override + public void invokeZoomPicker() {} + @Override + public void dismissZoomPicker() {} + @Override + public void updateZoomControls() {} + }; mRenderCoordinates.reset(); @@ -1367,9 +1393,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { } setAccessibilityState(false); hidePopupDialog(); - if (mContentSettings != null && mContentSettings.supportZoom()) { - mZoomManager.dismissZoomPicker(); - } + mZoomControlsDelegate.dismissZoomPicker(); } /** @@ -1377,9 +1401,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { */ public void onVisibilityChanged(View changedView, int visibility) { if (visibility != View.VISIBLE) { - if (mContentSettings.supportZoom()) { - mZoomManager.dismissZoomPicker(); - } + mZoomControlsDelegate.dismissZoomPicker(); } } @@ -1781,12 +1803,12 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { } } - void updateMultiTouchZoomSupport() { - mZoomManager.updateMultiTouchSupport(); + public void setZoomControlsDelegate(ZoomControlsDelegate zoomControlsDelegate) { + mZoomControlsDelegate = zoomControlsDelegate; } - public boolean isMultiTouchZoomSupported() { - return mZoomManager.isMultiTouchZoomSupported(); + public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) { + mZoomManager.updateMultiTouchSupport(supportsMultiTouchZoom); } public void selectPopupMenuItems(int[] indices) { @@ -2160,7 +2182,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { contentOffsetYPix); if (needTemporarilyHideHandles) temporarilyHideTextHandles(); - if (needUpdateZoomControls) mZoomManager.updateZoomControls(); + if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); if (contentOffsetChanged) updateHandleScreenPositions(); // Update offsets for fullscreen. @@ -2445,15 +2467,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { */ @Override public void invokeZoomPicker() { - if (mContentSettings != null && mContentSettings.supportZoom()) { - mZoomManager.invokeZoomPicker(); - } - } - - // Unlike legacy WebView getZoomControls which returns external zoom controls, - // this method returns built-in zoom controls. This method is used in tests. - public View getZoomControlsForTest() { - return mZoomManager.getZoomControlsViewForTest(); + mZoomControlsDelegate.invokeZoomPicker(); } /** diff --git a/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java b/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java index 8e8df31..986d61e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java @@ -6,23 +6,17 @@ package org.chromium.content.browser; import android.content.Context; import android.util.Log; -import android.view.Gravity; import android.view.MotionEvent; import android.view.ScaleGestureDetector; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ZoomButtonsController; /** - * The ZoomManager is responsible for maintaining the ContentView's current zoom - * level state. It is also responsible for managing the on-screen zoom controls. + * ZoomManager is responsible for maintaining the ContentView's current zoom + * level state and process scaling-related gestures. */ class ZoomManager { private static final String TAG = "ContentViewZoom"; private ContentViewCore mContentViewCore; - private ZoomButtonsController mZoomButtonsController; private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { // Completely silence scaling events. Used in WebView when zoom support @@ -102,26 +96,8 @@ class ZoomManager { mMultiTouchDetector = new ScaleGestureDetector(context, mMultiTouchListener); } - void invokeZoomPicker() { - ZoomButtonsController zoomControls = getZoomControls(); - if (zoomControls != null && !zoomControls.isVisible()) { - zoomControls.setVisible(true); - } - } - - void dismissZoomPicker() { - ZoomButtonsController zoomControls = getZoomControls(); - if (zoomControls != null && zoomControls.isVisible()) { - zoomControls.setVisible(false); - } - } - - boolean isMultiTouchZoomSupported() { - return !mMultiTouchListener.getPermanentlyIgnoreDetectorEvents(); - } - boolean isScaleGestureDetectionInProgress() { - return isMultiTouchZoomSupported() + return !mMultiTouchListener.getPermanentlyIgnoreDetectorEvents() && mMultiTouchDetector.isInProgress(); } @@ -156,67 +132,7 @@ class ZoomManager { return false; } - void updateMultiTouchSupport() { - mMultiTouchListener.setPermanentlyIgnoreDetectorEvents( - !mContentViewCore.getContentSettings().supportsMultiTouchZoom()); - } - - private ZoomButtonsController getZoomControls() { - if (mZoomButtonsController == null && - mContentViewCore.getContentSettings().shouldDisplayZoomControls()) { - mZoomButtonsController = new ZoomButtonsController( - mContentViewCore.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; - } - - // This method is used in tests. It doesn't modify the state of zoom controls. - View getZoomControlsViewForTest() { - return mZoomButtonsController != null ? mZoomButtonsController.getZoomControls() : null; - } - - void updateZoomControls() { - if (mZoomButtonsController == null) return; - boolean canZoomIn = mContentViewCore.canZoomIn(); - boolean canZoomOut = mContentViewCore.canZoomOut(); - if (!canZoomIn && !canZoomOut) { - // Hide the zoom in and out buttons if the page cannot zoom - mZoomButtonsController.getZoomControls().setVisibility(View.GONE); - } else { - // Set each one individually, as a page may be able to zoom in or out - mZoomButtonsController.setZoomInEnabled(canZoomIn); - mZoomButtonsController.setZoomOutEnabled(canZoomOut); - } - } - - 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) { - mContentViewCore.zoomIn(); - } else { - mContentViewCore.zoomOut(); - } - // ContentView will call updateZoomControls after its current page scale - // is got updated from the native code. - } + void updateMultiTouchSupport(boolean supportsMultiTouchZoom) { + mMultiTouchListener.setPermanentlyIgnoreDetectorEvents(!supportsMultiTouchZoom); } } |