| // Copyright 2018 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.chrome.browser.autofill_assistant.overlay; |
| |
| import android.graphics.RectF; |
| |
| import org.chromium.chrome.browser.ChromeActivity; |
| import org.chromium.chrome.browser.compositor.CompositorViewResizer; |
| import org.chromium.chrome.browser.util.AccessibilityUtil; |
| import org.chromium.chrome.browser.widget.ScrimView; |
| import org.chromium.chrome.browser.widget.ScrimView.ScrimParams; |
| |
| import java.util.List; |
| |
| /** |
| * Coordinator responsible for showing a full or partial overlay on top of the web page currently |
| * displayed. |
| */ |
| public class AssistantOverlayCoordinator { |
| private final ChromeActivity mActivity; |
| private final AssistantOverlayEventFilter mEventFilter; |
| private final AssistantOverlayDrawable mDrawable; |
| private final ScrimView mScrim; |
| private boolean mScrimEnabled; |
| |
| public AssistantOverlayCoordinator(ChromeActivity activity, AssistantOverlayModel model, |
| CompositorViewResizer viewResizer) { |
| mActivity = activity; |
| mScrim = mActivity.getScrim(); |
| mEventFilter = new AssistantOverlayEventFilter( |
| mActivity, mActivity.getFullscreenManager(), mActivity.getCompositorViewHolder()); |
| mDrawable = new AssistantOverlayDrawable( |
| mActivity, mActivity.getFullscreenManager(), viewResizer); |
| |
| // Listen for changes in the state. |
| // TODO(crbug.com/806868): Bind model to view through a ViewBinder instead. |
| model.addObserver((source, propertyKey) -> { |
| if (AssistantOverlayModel.STATE == propertyKey) { |
| setState(model.get(AssistantOverlayModel.STATE)); |
| } else if (AssistantOverlayModel.VISUAL_VIEWPORT == propertyKey) { |
| RectF rect = model.get(AssistantOverlayModel.VISUAL_VIEWPORT); |
| mEventFilter.setVisualViewport(rect); |
| mDrawable.setVisualViewport(rect); |
| } else if (AssistantOverlayModel.TOUCHABLE_AREA == propertyKey) { |
| List<RectF> area = model.get(AssistantOverlayModel.TOUCHABLE_AREA); |
| mEventFilter.setTouchableArea(area); |
| mDrawable.setTransparentArea(area); |
| } else if (AssistantOverlayModel.DELEGATE == propertyKey) { |
| AssistantOverlayDelegate delegate = model.get(AssistantOverlayModel.DELEGATE); |
| mEventFilter.setDelegate(delegate); |
| mDrawable.setDelegate(delegate); |
| } else if (AssistantOverlayModel.BACKGROUND_COLOR == propertyKey) { |
| mDrawable.setBackgroundColor(model.get(AssistantOverlayModel.BACKGROUND_COLOR)); |
| } else if (AssistantOverlayModel.HIGHLIGHT_BORDER_COLOR == propertyKey) { |
| mDrawable.setHighlightBorderColor( |
| model.get(AssistantOverlayModel.HIGHLIGHT_BORDER_COLOR)); |
| } |
| }); |
| } |
| |
| /** |
| * Destroy this coordinator. |
| */ |
| public void destroy() { |
| setScrimEnabled(false); |
| mEventFilter.destroy(); |
| mDrawable.destroy(); |
| } |
| |
| /** |
| * Set the overlay state. |
| */ |
| private void setState(@AssistantOverlayState int state) { |
| if (state == AssistantOverlayState.PARTIAL && AccessibilityUtil.isAccessibilityEnabled()) { |
| // Touch exploration is fully disabled if there's an overlay in front. In this case, the |
| // overlay must be fully gone and filtering elements for touch exploration must happen |
| // at another level. |
| // |
| // TODO(crbug.com/806868): filter elements available to touch exploration, when it |
| // is enabled. |
| state = AssistantOverlayState.HIDDEN; |
| } |
| |
| if (state == AssistantOverlayState.HIDDEN) { |
| setScrimEnabled(false); |
| mEventFilter.reset(); |
| } else { |
| setScrimEnabled(true); |
| mDrawable.setPartial(state == AssistantOverlayState.PARTIAL); |
| mEventFilter.setPartial(state == AssistantOverlayState.PARTIAL); |
| } |
| } |
| |
| private void setScrimEnabled(boolean enabled) { |
| if (enabled == mScrimEnabled) return; |
| |
| if (enabled) { |
| ScrimParams params = new ScrimParams(mActivity.getCompositorViewHolder(), |
| /* showInFrontOfAnchorView= */ true, |
| /* affectsStatusBar = */ false, |
| /* topMargin= */ 0, |
| /* observer= */ null); |
| params.backgroundDrawable = mDrawable; |
| params.eventFilter = mEventFilter; |
| mScrim.showScrim(params); |
| } else { |
| mScrim.hideScrim(/* fadeOut= */ true); |
| } |
| mScrimEnabled = enabled; |
| } |
| } |