// Copyright 2016 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.compositor.scene_layer; import android.content.Context; import org.chromium.base.annotations.JNINamespace; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.LayerTitleCache; import org.chromium.chrome.browser.compositor.layouts.Layout.SizingFlags; import org.chromium.chrome.browser.compositor.layouts.LayoutProvider; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.components.VirtualView; import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.DrawingInfo; import org.chromium.chrome.browser.widget.ControlContainer; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.resources.ResourceManager; import java.util.List; /** * A SceneLayer to render layers for the toolbar. */ @JNINamespace("android") public class ToolbarSceneLayer extends SceneOverlayLayer implements SceneOverlay { /** Pointer to native ToolbarSceneLayer. */ private long mNativePtr; /** Information used to draw the progress bar. */ private DrawingInfo mProgressBarDrawingInfo; /** An Android Context. */ private Context mContext; /** A LayoutProvider for accessing the current layout. */ private LayoutProvider mLayoutProvider; /** A LayoutRenderHost for accessing drawing information about the toolbar. */ private LayoutRenderHost mRenderHost; /** * @param context An Android context to use. * @param provider A LayoutProvider for accessing the current layout. * @param renderHost A LayoutRenderHost for accessing drawing information about the toolbar. */ public ToolbarSceneLayer(Context context, LayoutProvider provider, LayoutRenderHost renderHost) { mContext = context; mLayoutProvider = provider; mRenderHost = renderHost; } /** * Update the toolbar and progress bar layers. * * @param topControlsBackgroundColor The background color of the top controls. * @param topControlsUrlBarAlpha The alpha of the URL bar. * @param fullscreenManager A ChromeFullscreenManager instance. * @param resourceManager A ResourceManager for loading static resources. * @param forceHideAndroidTopControls True if the Android top controls are being hidden. * @param sizingFlags The sizing flags for the toolbar. * @param isTablet If the device is a tablet. */ private void update(int topControlsBackgroundColor, float topControlsUrlBarAlpha, ChromeFullscreenManager fullscreenManager, ResourceManager resourceManager, boolean forceHideAndroidTopControls, int sizingFlags, boolean isTablet) { if (!DeviceClassManager.enableFullscreen()) return; if (fullscreenManager == null) return; ControlContainer toolbarContainer = fullscreenManager.getControlContainer(); if (!isTablet && toolbarContainer != null) { if (mProgressBarDrawingInfo == null) mProgressBarDrawingInfo = new DrawingInfo(); toolbarContainer.getProgressBarDrawingInfo(mProgressBarDrawingInfo); } else { assert mProgressBarDrawingInfo == null; } float offset = fullscreenManager.getControlOffset(); boolean useTexture = fullscreenManager.drawControlsAsTexture() || offset == 0 || forceHideAndroidTopControls; fullscreenManager.setHideTopControlsAndroidView(forceHideAndroidTopControls); if ((sizingFlags & SizingFlags.REQUIRE_FULLSCREEN_SIZE) != 0 && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_HIDE) == 0 && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_ANIMATE) == 0) { useTexture = false; } nativeUpdateToolbarLayer(mNativePtr, resourceManager, R.id.control_container, topControlsBackgroundColor, R.drawable.textbox, topControlsUrlBarAlpha, offset, useTexture, forceHideAndroidTopControls); if (mProgressBarDrawingInfo == null) return; nativeUpdateProgressBar(mNativePtr, mProgressBarDrawingInfo.progressBarRect.left, mProgressBarDrawingInfo.progressBarRect.top, mProgressBarDrawingInfo.progressBarRect.width(), mProgressBarDrawingInfo.progressBarRect.height(), mProgressBarDrawingInfo.progressBarColor, mProgressBarDrawingInfo.progressBarBackgroundRect.left, mProgressBarDrawingInfo.progressBarBackgroundRect.top, mProgressBarDrawingInfo.progressBarBackgroundRect.width(), mProgressBarDrawingInfo.progressBarBackgroundRect.height(), mProgressBarDrawingInfo.progressBarBackgroundColor); } @Override public void setContentTree(SceneLayer contentTree) { nativeSetContentTree(mNativePtr, contentTree); } @Override protected void initializeNative() { if (mNativePtr == 0) { mNativePtr = nativeInit(); } assert mNativePtr != 0; } /** * Destroys this object and the corresponding native component. */ @Override public void destroy() { super.destroy(); mNativePtr = 0; } // SceneOverlay implementation. @Override public SceneOverlayLayer getUpdatedSceneOverlayTree(LayerTitleCache layerTitleCache, ResourceManager resourceManager, float yOffset) { boolean forceHideTopControlsAndroidView = mLayoutProvider.getActiveLayout().forceHideTopControlsAndroidView(); int flags = mLayoutProvider.getActiveLayout().getSizingFlags(); update(mRenderHost.getTopControlsBackgroundColor(), mRenderHost.getTopControlsUrlBarAlpha(), mLayoutProvider.getFullscreenManager(), resourceManager, forceHideTopControlsAndroidView, flags, DeviceFormFactor.isTablet(mContext)); return this; } @Override public boolean isSceneOverlayTreeShowing() { return true; } @Override public EventFilter getEventFilter() { return null; } @Override public void onSizeChanged(float width, float height, float visibleViewportOffsetY, int orientation) {} @Override public void getVirtualViews(List<VirtualView> views) {} @Override public boolean shouldHideAndroidTopControls() { return false; } @Override public boolean updateOverlay(long time, long dt) { return false; } @Override public boolean onBackPressed() { return false; } @Override public void onHideLayout() {} @Override public boolean handlesTabCreating() { return false; } @Override public void tabTitleChanged(int tabId, String title) {} @Override public void tabStateInitialized() {} @Override public void tabModelSwitched(boolean incognito) {} @Override public void tabSelected(long time, boolean incognito, int id, int prevId) {} @Override public void tabMoved(long time, boolean incognito, int id, int oldIndex, int newIndex) {} @Override public void tabClosed(long time, boolean incognito, int id) {} @Override public void tabClosureCancelled(long time, boolean incognito, int id) {} @Override public void tabCreated(long time, boolean incognito, int id, int prevId, boolean selected) {} @Override public void tabPageLoadStarted(int id, boolean incognito) {} @Override public void tabPageLoadFinished(int id, boolean incognito) {} @Override public void tabLoadStarted(int id, boolean incognito) {} @Override public void tabLoadFinished(int id, boolean incognito) {} private native long nativeInit(); private native void nativeSetContentTree( long nativeToolbarSceneLayer, SceneLayer contentTree); private native void nativeUpdateToolbarLayer( long nativeToolbarSceneLayer, ResourceManager resourceManager, int resourceId, int toolbarBackgroundColor, int urlBarResourceId, float urlBarAlpha, float topOffset, boolean visible, boolean showShadow); private native void nativeUpdateProgressBar( long nativeToolbarSceneLayer, int progressBarX, int progressBarY, int progressBarWidth, int progressBarHeight, int progressBarColor, int progressBarBackgroundX, int progressBarBackgroundY, int progressBarBackgroundWidth, int progressBarBackgroundHeight, int progressBarBackgroundColor); }