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
@Override
public void onScrollUpdateGestureConsumed() {
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
Context context, ViewAndroidDelegate viewDelegate,
InternalAccessDelegate internalDispatcher, WebContents webContents,
GestureStateListener gestureStateListener, ContentViewClient contentViewClient,
ContentViewCore.ZoomControlsDelegate zoomControlsDelegate,
WindowAndroid windowAndroid) {
contentViewCore.initialize(viewDelegate, internalDispatcher, webContents, windowAndroid);
contentViewCore.setActionModeCallback(
new AwActionModeCallback(this, contentViewCore.getActionModeCallbackHelper()));
contentViewCore.addGestureStateListener(gestureStateListener);
contentViewCore.setContentViewClient(contentViewClient);
contentViewCore.setZoomControlsDelegate(zoomControlsDelegate);
}
boolean isFullScreen() {
......@@ -1040,7 +1054,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
mContentViewCore.getRenderCoordinates());
initializeContentViewCore(mContentViewCore, mContext, mViewAndroidDelegate,
mInternalAccessAdapter, webContents, new AwGestureStateListener(),
mContentViewClient, mZoomControls, mWindowAndroid.getWindowAndroid());
mContentViewClient, mWindowAndroid.getWindowAndroid());
nativeSetJavaPeers(mNativeAwContents, this, mWebContentsDelegate, mContentsClientBridge,
mIoThreadClient, mInterceptNavigationDelegate);
mWebContents = mContentViewCore.getWebContents();
......@@ -2170,7 +2184,7 @@ public class AwContents implements SmartClipProvider, PostMessageSender.PostMess
*/
public void invokeZoomPicker() {
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
}
mScrollAccessibilityHelper.removePostedCallbacks();
mZoomControls.dismissZoomPicker();
}
@Override
......
......@@ -11,9 +11,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ZoomButtonsController;
import org.chromium.content.browser.ContentViewCore.ZoomControlsDelegate;
class AwZoomControls implements ZoomControlsDelegate {
class AwZoomControls {
private AwContents mAwContents;
// It is advised to use getZoomController() where possible.
......@@ -23,7 +21,6 @@ class AwZoomControls implements ZoomControlsDelegate {
mAwContents = awContents;
}
@Override
public void invokeZoomPicker() {
ZoomButtonsController zoomController = getZoomController();
if (zoomController != null) {
......@@ -31,7 +28,6 @@ class AwZoomControls implements ZoomControlsDelegate {
}
}
@Override
public void dismissZoomPicker() {
ZoomButtonsController zoomController = getZoomController();
if (zoomController != null) {
......@@ -39,7 +35,6 @@ class AwZoomControls implements ZoomControlsDelegate {
}
}
@Override
public void updateZoomControls() {
ZoomButtonsController zoomController = getZoomController();
if (zoomController == null) {
......
......@@ -288,12 +288,6 @@ public class ContentView extends FrameLayout
mContentViewCore.onDetachedFromWindow();
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
mContentViewCore.onVisibilityChanged(changedView, visibility);
}
// Implements SmartClipProvider
@Override
public void extractSmartClipData(int x, int y, int width, int height) {
......
......@@ -98,16 +98,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
// produce little visible difference.
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
// 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
......@@ -275,26 +265,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
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
* extractSmartClipData are available.
......@@ -318,7 +288,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
private boolean mAttachedToWindow;
private final ObserverList<GestureStateListener> mGestureStateListeners;
private final RewindableIterator<GestureStateListener> mGestureStateListenersIterator;
private ZoomControlsDelegate mZoomControlsDelegate;
private PopupZoomer mPopupZoomer;
private SelectPopup mSelectPopup;
......@@ -623,8 +592,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
long windowNativePointer = windowAndroid.getNativePointer();
assert windowNativePointer != 0;
mZoomControlsDelegate = NO_OP_ZOOM_CONTROLS_DELEGATE;
final float dipScale = windowAndroid.getDisplay().getDipScale();
mRenderCoordinates.reset();
......@@ -836,7 +803,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
mWebContentsObserver.destroy();
mWebContentsObserver = null;
setSmartClipDataListener(null);
setZoomControlsDelegate(null);
mImeAdapter.resetAndHideKeyboard();
// TODO(igsolla): address TODO in ContentViewClient because ContentViewClient is not
// currently a real Null Object.
......@@ -1177,14 +1143,12 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
private void onScrollBeginEventAck() {
setTouchScrollInProgress(true);
hidePastePopup();
mZoomControlsDelegate.invokeZoomPicker();
updateGestureStateListener(GestureEventType.SCROLL_START);
}
@SuppressWarnings("unused")
@CalledByNative
private void onScrollUpdateGestureConsumed() {
mZoomControlsDelegate.invokeZoomPicker();
for (mGestureStateListenersIterator.rewind();
mGestureStateListenersIterator.hasNext();) {
mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed();
......@@ -1420,7 +1384,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
mAttachedToWindow = false;
mImeAdapter.onViewDetachedFromWindow();
mJoystickScrollProvider.onViewDetachedFromWindow();
mZoomControlsDelegate.dismissZoomPicker();
removeDisplayAndroidObserver();
GamepadList.onDetachedFromWindow();
mAccessibilityManager.removeAccessibilityStateChangeListener(this);
......@@ -1434,15 +1397,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
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)
*/
......@@ -1836,14 +1790,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
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) {
if (mNativeContentViewCore == 0) return;
nativeSetMultiTouchZoomSupportEnabled(mNativeContentViewCore, supportsMultiTouchZoom);
......@@ -1946,7 +1892,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
.getContentOffsetYPixBottom()) != 0;
final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged;
final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChanged;
if (needHidePopupZoomer) mPopupZoomer.hide(true);
......@@ -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) {
float topBarTranslate = topBarShownPix - browserControlsHeightDp * deviceScale;
......@@ -2332,13 +2283,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Displa
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
* {@link #addJavascriptInterface(Object, String)} by means of Object.keys() method and
......
......@@ -47,6 +47,11 @@ public class GestureStateListener {
*/
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.
*/
......
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