Commit 1640a491 authored by Clemens Arbesser's avatar Clemens Arbesser Committed by Commit Bot

[Autofill Assistant] Scrolling is now disabled when showing full-screen...

[Autofill Assistant] Scrolling is now disabled when showing full-screen overlays (but remains enabled for partial-screen overlays).

Refactored the touch event filter to support setting full and partial overlays independently. This also fixes a screen flickering issue that could occur when a full overlay was disabled while a partial overlay was enabled.

Bug: 806868
Change-Id: Idac393d47293020ab76fb04aa55d08291a25f27d
Reviewed-on: https://chromium-review.googlesource.com/c/1340306Reviewed-by: default avatarStephane Zermatten <szermatt@chromium.org>
Commit-Queue: Clemens Arbesser <arbesser@google.com>
Cr-Commit-Position: refs/heads/master@{#609322}
parent 74945024
...@@ -456,12 +456,12 @@ class AutofillAssistantUiDelegate { ...@@ -456,12 +456,12 @@ class AutofillAssistantUiDelegate {
/** Called to show overlay. */ /** Called to show overlay. */
public void showOverlay() { public void showOverlay() {
mTouchEventFilter.setEnableFiltering(true); mTouchEventFilter.setFullOverlay(true);
} }
/** Called to hide overlay. */ /** Called to hide overlay. */
public void hideOverlay() { public void hideOverlay() {
mTouchEventFilter.setEnableFiltering(false); mTouchEventFilter.setFullOverlay(false);
} }
public void hideDetails() { public void hideDetails() {
...@@ -657,7 +657,7 @@ class AutofillAssistantUiDelegate { ...@@ -657,7 +657,7 @@ class AutofillAssistantUiDelegate {
} }
public void updateTouchableArea(boolean enabled, List<RectF> boxes) { public void updateTouchableArea(boolean enabled, List<RectF> boxes) {
mTouchEventFilter.updateTouchableArea(enabled, boxes); mTouchEventFilter.setPartialOverlay(enabled, boxes);
} }
/** /**
......
...@@ -70,8 +70,13 @@ public class TouchEventFilter ...@@ -70,8 +70,13 @@ public class TouchEventFilter
private final Paint mGrayOut; private final Paint mGrayOut;
private final Paint mClear; private final Paint mClear;
/** Whether filtering is enabled. */ /** Whether a partial-screen overlay is enabled or not. Has precedence over {@link
private boolean mEnabled; * @mFullOverlayEnabled}. */
private boolean mPartialOverlayEnabled;
/** Whether a full-screen overlay is enabled or not. Is overridden by {@link
* @mPartialOverlayEnabled}.*/
private boolean mFullOverlayEnabled;
/** Padding added between the element area and the grayed-out area. */ /** Padding added between the element area and the grayed-out area. */
private final float mPaddingPx; private final float mPaddingPx;
...@@ -153,12 +158,14 @@ public class TouchEventFilter ...@@ -153,12 +158,14 @@ public class TouchEventFilter
@Override @Override
public boolean onScroll(MotionEvent downEvent, MotionEvent moveEvent, float distanceX, public boolean onScroll(MotionEvent downEvent, MotionEvent moveEvent, float distanceX,
float distanceY) { float distanceY) {
if (mPartialOverlayEnabled)
mClient.scrollBy(distanceX / getWidth(), distanceY / getVisualViewportHeight()); mClient.scrollBy(distanceX / getWidth(), distanceY / getVisualViewportHeight());
return true; return true;
} }
}); });
updateTouchableArea(false, Collections.emptyList()); setFullOverlay(false);
setPartialOverlay(false, Collections.emptyList());
} }
/** Initializes dependencies. */ /** Initializes dependencies. */
...@@ -175,32 +182,49 @@ public class TouchEventFilter ...@@ -175,32 +182,49 @@ public class TouchEventFilter
mGrayOut.setColor(color); mGrayOut.setColor(color);
} }
/** Enables/disables the filter. Clears all currently set touchable areas. */ /**
public void setEnableFiltering(boolean enabled) { * Enables/disables a full screen overlay.
if (mEnabled != enabled) { *
clearTouchableArea(); * If both a full and a partial screen overlay are set, the partial overlay has precedence.
mEnabled = enabled; *
setAlpha(mEnabled ? 1.0f : 0.0f); * @param enabled if {@code false}, the full screen overlay is disabled
*/
// reset tap counter each time the filter is disabled. public void setFullOverlay(boolean enabled) {
if (!mEnabled) mUnexpectedTapTimes.clear(); if (mFullOverlayEnabled != enabled) {
mFullOverlayEnabled = enabled;
// reset tap counter each time the full screen overlay is disabled.
if (!mFullOverlayEnabled) mUnexpectedTapTimes.clear();
updateVisibility();
invalidate(); invalidate();
} }
} }
/** /**
* Defines the area of the visible viewport that can be used. * Enables/disables a partial screen overlay.
*
* If both a full and a partial screen overlay are set, the partial overlay has precedence.
* *
* @param enabled if {@code false}, the filter is fully disabled and invisible * @param enabled if {@code false}, the partial overlay is disabled
* @param rectangles rectangles defining the area that can be used, may be empty * @param rectangles rectangles defining the area that can be used, may be empty
*/ */
public void updateTouchableArea(boolean enabled, List<RectF> rectangles) { public void setPartialOverlay(boolean enabled, List<RectF> rectangles) {
setEnableFiltering(enabled); if (mPartialOverlayEnabled != enabled || (enabled && !mTouchableArea.equals(rectangles))) {
if (!mTouchableArea.equals(rectangles)) { mPartialOverlayEnabled = enabled;
clearTouchableArea(); clearTouchableArea();
mTouchableArea.addAll(rectangles); mTouchableArea.addAll(rectangles);
updateVisibility();
invalidate();
}
}
private boolean isOverlayShown() {
return mFullOverlayEnabled || mPartialOverlayEnabled;
} }
private void updateVisibility() {
setAlpha(isOverlayShown() ? 1.0f : 0.0f);
} }
private void clearTouchableArea() { private void clearTouchableArea() {
...@@ -208,16 +232,21 @@ public class TouchEventFilter ...@@ -208,16 +232,21 @@ public class TouchEventFilter
mOffsetY = 0; mOffsetY = 0;
mInitialBrowserScrollOffsetY += mBrowserScrollOffsetY; mInitialBrowserScrollOffsetY += mBrowserScrollOffsetY;
mBrowserScrollOffsetY = 0; mBrowserScrollOffsetY = 0;
invalidate();
} }
@Override @Override
public boolean dispatchTouchEvent(MotionEvent event) { public boolean dispatchTouchEvent(MotionEvent event) {
// Note that partial overlays have precedence over full overlays
if (mPartialOverlayEnabled) return dispatchTouchEventWithPartialOverlay(event);
if (mFullOverlayEnabled) return dispatchTouchEventWithFullOverlay(event);
return false;
}
private boolean dispatchTouchEventWithPartialOverlay(MotionEvent event) {
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_SCROLL: case MotionEvent.ACTION_SCROLL:
// Scrolling is always safe. Let it through. // Scrolling is always safe. Let it through.
return false; return false;
case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_CANCEL:
...@@ -236,8 +265,6 @@ public class TouchEventFilter ...@@ -236,8 +265,6 @@ public class TouchEventFilter
// fallthrough // fallthrough
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
if (!mEnabled) return false; // let everything through
// Only let through events if they're meant for the touchable area of the screen. // Only let through events if they're meant for the touchable area of the screen.
int yTop = getVisualViewportTop(); int yTop = getVisualViewportTop();
int yBottom = getVisualViewportBottom(); int yBottom = getVisualViewportBottom();
...@@ -259,12 +286,17 @@ public class TouchEventFilter ...@@ -259,12 +286,17 @@ public class TouchEventFilter
} }
} }
private boolean dispatchTouchEventWithFullOverlay(MotionEvent event) {
mNonBrowserGesture.onTouchEvent(event);
return true;
}
/** Returns the origin of the visual viewport in this view. */ /** Returns the origin of the visual viewport in this view. */
@Override @Override
@SuppressLint("CanvasSize") @SuppressLint("CanvasSize")
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
super.onDraw(canvas); super.onDraw(canvas);
if (!mEnabled) { if (!isOverlayShown()) {
return; return;
} }
canvas.drawPaint(mGrayOut); canvas.drawPaint(mGrayOut);
......
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