Commit 6ea15211 authored by rlanday's avatar rlanday Committed by Commit bot

Refactor ZoomControlsDelegate out of ContentViewCore

We can keep this logic entirely in AwContents, it doesn't need to be in
ContentViewCore. I'm using the existing GestureStateListener interface to signal
AwZoomControls of the relevant events, but I did have to add a few more events
to that interface. Hopefully they're OK and will work with our future plans to
refactor more input-handling stuff out of ContentViewCore.

Note on testing this: the Android WebView shell works for testing but I had to
knock out the "&& mAwContents.getSettings().shouldDisplayZoomControls()" check
in getZoomController() to enable the zoom controls. Once you do this they appear
when scrolling.

BUG=664339

Review-Url: https://codereview.chromium.org/2561463004
Cr-Commit-Position: refs/heads/master@{#438045}
parent 982c17a7
...@@ -633,6 +633,22 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess ...@@ -633,6 +633,22 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
@Override @Override
public void onScrollUpdateGestureConsumed() { public void onScrollUpdateGestureConsumed() {
mScrollAccessibilityHelper.postViewScrolledAccessibilityEventCallback(); mScrollAccessibilityHelper.postViewScrolledAccessibilityEventCallback();
mZoomControls.invokeZoomPicker();
}
@Override
public void onScrollStarted(int scrollOffsetY, int scrollExtentY) {
mZoomControls.invokeZoomPicker();
}
@Override
public void onScaleLimitsChanged(float minPageScaleFactor, float maxPageScaleFactor) {
mZoomControls.invokeZoomPicker();
}
@Override
public void onScrollOffsetOrExtentChanged(int scrollOffsetY, int scrollExtentY) {
mZoomControls.updateZoomControls();
} }
} }
...@@ -793,14 +809,12 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess ...@@ -793,14 +809,12 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
Context context, ViewAndroidDelegate viewDelegate, Context context, ViewAndroidDelegate viewDelegate,
InternalAccessDelegate internalDispatcher, WebContents webContents, InternalAccessDelegate internalDispatcher, WebContents webContents,
GestureStateListener gestureStateListener, ContentViewClient contentViewClient, GestureStateListener gestureStateListener, ContentViewClient contentViewClient,
ContentViewCore.ZoomControlsDelegate zoomControlsDelegate,
WindowAndroid windowAndroid) { WindowAndroid windowAndroid) {
contentViewCore.initialize(viewDelegate, internalDispatcher, webContents, windowAndroid); contentViewCore.initialize(viewDelegate, internalDispatcher, webContents, windowAndroid);
contentViewCore.setActionModeCallback( contentViewCore.setActionModeCallback(
new AwActionModeCallback(this, contentViewCore.getActionModeCallbackHelper())); new AwActionModeCallback(this, contentViewCore.getActionModeCallbackHelper()));
contentViewCore.addGestureStateListener(gestureStateListener); contentViewCore.addGestureStateListener(gestureStateListener);
contentViewCore.setContentViewClient(contentViewClient); contentViewCore.setContentViewClient(contentViewClient);
contentViewCore.setZoomControlsDelegate(zoomControlsDelegate);
} }
boolean isFullScreen() { boolean isFullScreen() {
...@@ -1040,7 +1054,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess ...@@ -1040,7 +1054,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
mContentViewCore.getRenderCoordinates()); mContentViewCore.getRenderCoordinates());
initializeContentViewCore(mContentViewCore, mContext, mViewAndroidDelegate, initializeContentViewCore(mContentViewCore, mContext, mViewAndroidDelegate,
mInternalAccessAdapter, webContents, new AwGestureStateListener(), mInternalAccessAdapter, webContents, new AwGestureStateListener(),
mContentViewClient, mZoomControls, mWindowAndroid.getWindowAndroid()); mContentViewClient, mWindowAndroid.getWindowAndroid());
nativeSetJavaPeers(mNativeAwContents, this, mWebContentsDelegate, mContentsClientBridge, nativeSetJavaPeers(mNativeAwContents, this, mWebContentsDelegate, mContentsClientBridge,
mIoThreadClient, mInterceptNavigationDelegate); mIoThreadClient, mInterceptNavigationDelegate);
mWebContents = mContentViewCore.getWebContents(); mWebContents = mContentViewCore.getWebContents();
...@@ -2170,7 +2184,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess ...@@ -2170,7 +2184,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
*/ */
public void invokeZoomPicker() { public void invokeZoomPicker() {
if (TRACE) Log.i(TAG, "%s invokeZoomPicker", this); if (TRACE) Log.i(TAG, "%s invokeZoomPicker", this);
if (!isDestroyed(WARN)) mContentViewCore.invokeZoomPicker(); if (!isDestroyed(WARN)) mZoomControls.invokeZoomPicker();
} }
/** /**
...@@ -3162,6 +3176,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess ...@@ -3162,6 +3176,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
} }
mScrollAccessibilityHelper.removePostedCallbacks(); mScrollAccessibilityHelper.removePostedCallbacks();
mZoomControls.dismissZoomPicker();
} }
@Override @Override
......
...@@ -11,9 +11,7 @@ import android.view.ViewGroup; ...@@ -11,9 +11,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ZoomButtonsController; import android.widget.ZoomButtonsController;
import org.chromium.content.browser.ContentViewCore.ZoomControlsDelegate; class AwZoomControls {
class AwZoomControls implements ZoomControlsDelegate {
private AwContents mAwContents; private AwContents mAwContents;
// It is advised to use getZoomController() where possible. // It is advised to use getZoomController() where possible.
...@@ -23,7 +21,6 @@ class AwZoomControls implements ZoomControlsDelegate { ...@@ -23,7 +21,6 @@ class AwZoomControls implements ZoomControlsDelegate {
mAwContents = awContents; mAwContents = awContents;
} }
@Override
public void invokeZoomPicker() { public void invokeZoomPicker() {
ZoomButtonsController zoomController = getZoomController(); ZoomButtonsController zoomController = getZoomController();
if (zoomController != null) { if (zoomController != null) {
...@@ -31,7 +28,6 @@ class AwZoomControls implements ZoomControlsDelegate { ...@@ -31,7 +28,6 @@ class AwZoomControls implements ZoomControlsDelegate {
} }
} }
@Override
public void dismissZoomPicker() { public void dismissZoomPicker() {
ZoomButtonsController zoomController = getZoomController(); ZoomButtonsController zoomController = getZoomController();
if (zoomController != null) { if (zoomController != null) {
...@@ -39,7 +35,6 @@ class AwZoomControls implements ZoomControlsDelegate { ...@@ -39,7 +35,6 @@ class AwZoomControls implements ZoomControlsDelegate {
} }
} }
@Override
public void updateZoomControls() { public void updateZoomControls() {
ZoomButtonsController zoomController = getZoomController(); ZoomButtonsController zoomController = getZoomController();
if (zoomController == null) { if (zoomController == null) {
......
...@@ -288,12 +288,6 @@ public class ContentView extends FrameLayout ...@@ -288,12 +288,6 @@ public class ContentView extends FrameLayout
mContentViewCore.onDetachedFromWindow(); mContentViewCore.onDetachedFromWindow();
} }
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
mContentViewCore.onVisibilityChanged(changedView, visibility);
}
// Implements SmartClipProvider // Implements SmartClipProvider
@Override @Override
public void extractSmartClipData(int x, int y, int width, int height) { public void extractSmartClipData(int x, int y, int width, int height) {
......
...@@ -98,16 +98,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -98,16 +98,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
// produce little visible difference. // produce little visible difference.
private static final float ZOOM_CONTROLS_EPSILON = 0.007f; private static final float ZOOM_CONTROLS_EPSILON = 0.007f;
private static final ZoomControlsDelegate NO_OP_ZOOM_CONTROLS_DELEGATE =
new ZoomControlsDelegate() {
@Override
public void invokeZoomPicker() {}
@Override
public void dismissZoomPicker() {}
@Override
public void updateZoomControls() {}
};
// If the embedder adds a JavaScript interface object that contains an indirect reference to // If the embedder adds a JavaScript interface object that contains an indirect reference to
// the ContentViewCore, then storing a strong ref to the interface object on the native // the ContentViewCore, then storing a strong ref to the interface object on the native
// side would prevent garbage collection of the ContentViewCore (as that strong ref would // side would prevent garbage collection of the ContentViewCore (as that strong ref would
...@@ -275,26 +265,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -275,26 +265,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
boolean super_awakenScrollBars(int startDelay, boolean invalidate); boolean super_awakenScrollBars(int startDelay, boolean invalidate);
} }
/**
* 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();
}
/** /**
* An interface that allows the embedder to be notified when the results of * An interface that allows the embedder to be notified when the results of
* extractSmartClipData are available. * extractSmartClipData are available.
...@@ -318,7 +288,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -318,7 +288,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
private boolean mAttachedToWindow; private boolean mAttachedToWindow;
private final ObserverList<GestureStateListener> mGestureStateListeners; private final ObserverList<GestureStateListener> mGestureStateListeners;
private final RewindableIterator<GestureStateListener> mGestureStateListenersIterator; private final RewindableIterator<GestureStateListener> mGestureStateListenersIterator;
private ZoomControlsDelegate mZoomControlsDelegate;
private PopupZoomer mPopupZoomer; private PopupZoomer mPopupZoomer;
private SelectPopup mSelectPopup; private SelectPopup mSelectPopup;
...@@ -623,8 +592,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -623,8 +592,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
long windowNativePointer = windowAndroid.getNativePointer(); long windowNativePointer = windowAndroid.getNativePointer();
assert windowNativePointer != 0; assert windowNativePointer != 0;
mZoomControlsDelegate = NO_OP_ZOOM_CONTROLS_DELEGATE;
final float dipScale = windowAndroid.getDisplay().getDipScale(); final float dipScale = windowAndroid.getDisplay().getDipScale();
mRenderCoordinates.reset(); mRenderCoordinates.reset();
...@@ -836,7 +803,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -836,7 +803,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
mWebContentsObserver.destroy(); mWebContentsObserver.destroy();
mWebContentsObserver = null; mWebContentsObserver = null;
setSmartClipDataListener(null); setSmartClipDataListener(null);
setZoomControlsDelegate(null);
mImeAdapter.resetAndHideKeyboard(); mImeAdapter.resetAndHideKeyboard();
// TODO(igsolla): address TODO in ContentViewClient because ContentViewClient is not // TODO(igsolla): address TODO in ContentViewClient because ContentViewClient is not
// currently a real Null Object. // currently a real Null Object.
...@@ -1177,14 +1143,12 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1177,14 +1143,12 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
private void onScrollBeginEventAck() { private void onScrollBeginEventAck() {
setTouchScrollInProgress(true); setTouchScrollInProgress(true);
hidePastePopup(); hidePastePopup();
mZoomControlsDelegate.invokeZoomPicker();
updateGestureStateListener(GestureEventType.SCROLL_START); updateGestureStateListener(GestureEventType.SCROLL_START);
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
@CalledByNative @CalledByNative
private void onScrollUpdateGestureConsumed() { private void onScrollUpdateGestureConsumed() {
mZoomControlsDelegate.invokeZoomPicker();
for (mGestureStateListenersIterator.rewind(); for (mGestureStateListenersIterator.rewind();
mGestureStateListenersIterator.hasNext();) { mGestureStateListenersIterator.hasNext();) {
mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed(); mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed();
...@@ -1420,7 +1384,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1420,7 +1384,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
mAttachedToWindow = false; mAttachedToWindow = false;
mImeAdapter.onViewDetachedFromWindow(); mImeAdapter.onViewDetachedFromWindow();
mJoystickScrollProvider.onViewDetachedFromWindow(); mJoystickScrollProvider.onViewDetachedFromWindow();
mZoomControlsDelegate.dismissZoomPicker();
removeDisplayAndroidObserver(); removeDisplayAndroidObserver();
GamepadList.onDetachedFromWindow(); GamepadList.onDetachedFromWindow();
mAccessibilityManager.removeAccessibilityStateChangeListener(this); mAccessibilityManager.removeAccessibilityStateChangeListener(this);
...@@ -1434,15 +1397,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1434,15 +1397,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
mSystemCaptioningBridge.removeListener(this); mSystemCaptioningBridge.removeListener(this);
} }
/**
* @see View#onVisibilityChanged(android.view.View, int)
*/
public void onVisibilityChanged(View changedView, int visibility) {
if (visibility != View.VISIBLE) {
mZoomControlsDelegate.dismissZoomPicker();
}
}
/** /**
* @see View#onCreateInputConnection(EditorInfo) * @see View#onCreateInputConnection(EditorInfo)
*/ */
...@@ -1836,14 +1790,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1836,14 +1790,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix);
} }
public void setZoomControlsDelegate(ZoomControlsDelegate zoomControlsDelegate) {
if (zoomControlsDelegate == null) {
mZoomControlsDelegate = NO_OP_ZOOM_CONTROLS_DELEGATE;
return;
}
mZoomControlsDelegate = zoomControlsDelegate;
}
public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) { public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) {
if (mNativeContentViewCore == 0) return; if (mNativeContentViewCore == 0) return;
nativeSetMultiTouchZoomSupportEnabled(mNativeContentViewCore, supportsMultiTouchZoom); nativeSetMultiTouchZoomSupportEnabled(mNativeContentViewCore, supportsMultiTouchZoom);
...@@ -1946,7 +1892,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1946,7 +1892,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
.getContentOffsetYPixBottom()) != 0; .getContentOffsetYPixBottom()) != 0;
final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged;
final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChanged;
if (needHidePopupZoomer) mPopupZoomer.hide(true); if (needHidePopupZoomer) mPopupZoomer.hide(true);
...@@ -1974,7 +1919,13 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -1974,7 +1919,13 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
} }
} }
if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); if (scaleLimitsChanged) {
for (mGestureStateListenersIterator.rewind();
mGestureStateListenersIterator.hasNext();) {
mGestureStateListenersIterator.next().onScaleLimitsChanged(
minPageScaleFactor, maxPageScaleFactor);
}
}
if (topBarChanged) { if (topBarChanged) {
float topBarTranslate = topBarShownPix - browserControlsHeightDp * deviceScale; float topBarTranslate = topBarShownPix - browserControlsHeightDp * deviceScale;
...@@ -2332,13 +2283,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa ...@@ -2332,13 +2283,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
return true; return true;
} }
/**
* Invokes the graphical zoom picker widget for this ContentView.
*/
public void invokeZoomPicker() {
mZoomControlsDelegate.invokeZoomPicker();
}
/** /**
* Enables or disables inspection of JavaScript objects added via * Enables or disables inspection of JavaScript objects added via
* {@link #addJavascriptInterface(Object, String)} by means of Object.keys() method and * {@link #addJavascriptInterface(Object, String)} by means of Object.keys() method and
......
...@@ -47,6 +47,11 @@ public class GestureStateListener { ...@@ -47,6 +47,11 @@ public class GestureStateListener {
*/ */
public void onScrollEnded(int scrollOffsetY, int scrollExtentY) {} public void onScrollEnded(int scrollOffsetY, int scrollExtentY) {}
/*
* Called when the min or max scale factor may have been changed.
*/
public void onScaleLimitsChanged(float minPageScaleFactor, float maxPageScaleFactor) {}
/* /*
* Called when the scroll offsets or extents may have changed. * Called when the scroll offsets or extents may have changed.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment