1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.chrome.browser.compositor.overlays.toolbar;
6 
7 import android.content.Context;
8 import android.graphics.RectF;
9 
10 import org.chromium.base.Callback;
11 import org.chromium.base.supplier.Supplier;
12 import org.chromium.chrome.R;
13 import org.chromium.chrome.browser.ActivityTabProvider;
14 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
15 import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
16 import org.chromium.chrome.browser.layouts.EventFilter;
17 import org.chromium.chrome.browser.layouts.LayoutManager;
18 import org.chromium.chrome.browser.layouts.SceneOverlay;
19 import org.chromium.chrome.browser.layouts.components.VirtualView;
20 import org.chromium.chrome.browser.layouts.scene_layer.SceneOverlayLayer;
21 import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar;
22 import org.chromium.ui.modelutil.PropertyModel;
23 import org.chromium.ui.resources.ResourceManager;
24 
25 import java.util.List;
26 
27 /** The public interface for the top toolbar texture component. */
28 public class TopToolbarOverlayCoordinator implements SceneOverlay {
29     /** The view state for this overlay. */
30     private final PropertyModel mModel;
31 
32     /** A handle to the 'view' for this component as the layout manager requires access to it. */
33     private final TopToolbarSceneLayer mSceneLayer;
34 
35     /** Handles processing updates to the model. */
36     private final CompositorModelChangeProcessor mChangeProcessor;
37 
38     /** Business logic for this overlay. */
39     private final TopToolbarOverlayMediator mMediator;
40 
TopToolbarOverlayCoordinator(Context context, LayoutManager layoutManager, Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback, ActivityTabProvider tabSupplier, BrowserControlsStateProvider browserControlsStateProvider, Supplier<ResourceManager> resourceManagerSupplier)41     public TopToolbarOverlayCoordinator(Context context, LayoutManager layoutManager,
42             Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback,
43             ActivityTabProvider tabSupplier,
44             BrowserControlsStateProvider browserControlsStateProvider,
45             Supplier<ResourceManager> resourceManagerSupplier) {
46         mModel = new PropertyModel.Builder(TopToolbarOverlayProperties.ALL_KEYS)
47                          .with(TopToolbarOverlayProperties.RESOURCE_ID, R.id.control_container)
48                          .with(TopToolbarOverlayProperties.URL_BAR_RESOURCE_ID,
49                                  R.drawable.modern_location_bar)
50                          .with(TopToolbarOverlayProperties.VISIBLE, true)
51                          .with(TopToolbarOverlayProperties.CONTENT_OFFSET,
52                                  browserControlsStateProvider.getContentOffset())
53                          .build();
54         mSceneLayer = new TopToolbarSceneLayer(resourceManagerSupplier);
55         mChangeProcessor =
56                 layoutManager.createCompositorMCP(mModel, mSceneLayer, TopToolbarSceneLayer::bind);
57 
58         mMediator = new TopToolbarOverlayMediator(mModel, context, layoutManager,
59                 progressInfoCallback, tabSupplier, browserControlsStateProvider);
60     }
61 
62     /**
63      * Set whether the android view corresponding with this overlay is showing.
64      * @param isVisible Whether the android view is visible.
65      */
setIsAndroidViewVisible(boolean isVisible)66     public void setIsAndroidViewVisible(boolean isVisible) {
67         mMediator.setIsAndroidViewVisible(isVisible);
68     }
69 
70     /** Clean up this component. */
destroy()71     public void destroy() {
72         mChangeProcessor.destroy();
73         mMediator.destroy();
74         mSceneLayer.destroy();
75     }
76 
77     @Override
getUpdatedSceneOverlayTree( RectF viewport, RectF visibleViewport, ResourceManager resourceManager, float yOffset)78     public SceneOverlayLayer getUpdatedSceneOverlayTree(
79             RectF viewport, RectF visibleViewport, ResourceManager resourceManager, float yOffset) {
80         return mSceneLayer;
81     }
82 
83     @Override
isSceneOverlayTreeShowing()84     public boolean isSceneOverlayTreeShowing() {
85         return mMediator.shouldBeAttachedToTree();
86     }
87 
88     @Override
getEventFilter()89     public EventFilter getEventFilter() {
90         return null;
91     }
92 
93     @Override
onSizeChanged( float width, float height, float visibleViewportOffsetY, int orientation)94     public void onSizeChanged(
95             float width, float height, float visibleViewportOffsetY, int orientation) {}
96 
97     @Override
getVirtualViews(List<VirtualView> views)98     public void getVirtualViews(List<VirtualView> views) {}
99 
100     @Override
shouldHideAndroidBrowserControls()101     public boolean shouldHideAndroidBrowserControls() {
102         return false;
103     }
104 
105     @Override
updateOverlay(long time, long dt)106     public boolean updateOverlay(long time, long dt) {
107         return false;
108     }
109 
110     @Override
onBackPressed()111     public boolean onBackPressed() {
112         return false;
113     }
114 
115     @Override
handlesTabCreating()116     public boolean handlesTabCreating() {
117         return false;
118     }
119 }
120