blob: 4015f17e84c8d495986e7b1605f88da2cfd42e1b [file] [log] [blame]
// Copyright 2014 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.
#include "chrome/browser/android/compositor/layer/toolbar_layer.h"
#include "cc/layers/nine_patch_layer.h"
#include "cc/layers/solid_color_layer.h"
#include "cc/layers/ui_resource_layer.h"
#include "cc/resources/scoped_ui_resource.h"
#include "content/public/browser/android/compositor.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/android/resources/nine_patch_resource.h"
#include "ui/android/resources/resource_manager.h"
namespace android {
// static
scoped_refptr<ToolbarLayer> ToolbarLayer::Create(
ui::ResourceManager* resource_manager) {
return make_scoped_refptr(new ToolbarLayer(resource_manager));
}
scoped_refptr<cc::Layer> ToolbarLayer::layer() {
return layer_;
}
void ToolbarLayer::PushResource(
int toolbar_resource_id,
int toolbar_background_color,
bool anonymize,
int toolbar_textbox_background_color,
int url_bar_background_resource_id,
float url_bar_alpha,
float window_height,
float y_offset,
bool show_debug,
bool clip_shadow,
bool browser_controls_at_bottom) {
// TODO(khushalsagar): This should not be a nine-patch resource.
ui::NinePatchResource* resource =
ui::NinePatchResource::From(resource_manager_->GetResource(
ui::ANDROID_RESOURCE_TYPE_DYNAMIC, toolbar_resource_id));
// Ensure the toolbar resource is available before making the layer visible.
layer_->SetHideLayerAndSubtree(!resource);
if (!resource)
return;
// This layer effectively draws over the space it takes for shadows. Set the
// bounds to the non-shadow size so that other things can properly line up.
// Padding height does not include the height of the tabstrip, so we add
// it explicitly by adding y offset.
gfx::Size size =
gfx::Size(resource->padding().width(),
resource->padding().height() + resource->padding().y());
layer_->SetBounds(size);
// The toolbar_root_ contains all of the layers that make up the toolbar. The
// toolbar_root_ is moved around inside of layer_ to allow appropriate
// clipping of the shadow.
toolbar_root_->SetBounds(resource->padding().size());
gfx::PointF root_layer_position(0, y_offset);
gfx::PointF background_position(resource->padding().origin());
if (browser_controls_at_bottom) {
// The toolbar's position as if it were completely shown.
float base_toolbar_y = window_height - resource->padding().size().height();
float layer_offset =
resource->size().height() - resource->padding().size().height();
root_layer_position.set_y(base_toolbar_y + y_offset);
toolbar_root_->SetPosition(gfx::PointF(0, -layer_offset));
background_position.set_y(layer_offset);
}
layer_->SetPosition(root_layer_position);
toolbar_background_layer_->SetBounds(resource->padding().size());
toolbar_background_layer_->SetPosition(background_position);
toolbar_background_layer_->SetBackgroundColor(toolbar_background_color);
bool url_bar_visible = (resource->aperture().width() != 0);
url_bar_background_layer_->SetHideLayerAndSubtree(!url_bar_visible);
if (url_bar_visible) {
ui::NinePatchResource* url_bar_background_resource =
ui::NinePatchResource::From(resource_manager_->GetResource(
ui::ANDROID_RESOURCE_TYPE_STATIC, url_bar_background_resource_id));
gfx::Size url_bar_size(resource->aperture().width() +
url_bar_background_resource->size().width() -
url_bar_background_resource->padding().width(),
resource->aperture().height() +
url_bar_background_resource->size().height() -
url_bar_background_resource->padding().height());
gfx::Rect url_bar_border(
url_bar_background_resource->Border(url_bar_size));
gfx::PointF url_bar_position = gfx::PointF(
resource->aperture().x() - url_bar_background_resource->padding().x(),
resource->aperture().y() - url_bar_background_resource->padding().y());
url_bar_background_layer_->SetUIResourceId(
url_bar_background_resource->ui_resource()->id());
url_bar_background_layer_->SetBorder(url_bar_border);
url_bar_background_layer_->SetAperture(
url_bar_background_resource->aperture());
url_bar_background_layer_->SetBounds(url_bar_size);
url_bar_background_layer_->SetPosition(url_bar_position);
url_bar_background_layer_->SetOpacity(url_bar_alpha);
}
bitmap_layer_->SetUIResourceId(resource->ui_resource()->id());
bitmap_layer_->SetBounds(resource->size());
layer_->SetMasksToBounds(clip_shadow);
anonymize_layer_->SetHideLayerAndSubtree(!anonymize);
if (anonymize) {
anonymize_layer_->SetPosition(gfx::PointF(resource->aperture().origin()));
anonymize_layer_->SetBounds(resource->aperture().size());
anonymize_layer_->SetBackgroundColor(toolbar_textbox_background_color);
}
debug_layer_->SetBounds(resource->size());
if (show_debug && !debug_layer_->parent())
layer_->AddChild(debug_layer_);
else if (!show_debug && debug_layer_->parent())
debug_layer_->RemoveFromParent();
}
void ToolbarLayer::UpdateProgressBar(int progress_bar_x,
int progress_bar_y,
int progress_bar_width,
int progress_bar_height,
int progress_bar_color,
int progress_bar_background_x,
int progress_bar_background_y,
int progress_bar_background_width,
int progress_bar_background_height,
int progress_bar_background_color) {
bool is_progress_bar_background_visible = SkColorGetA(
progress_bar_background_color);
progress_bar_background_layer_->SetHideLayerAndSubtree(
!is_progress_bar_background_visible);
if (is_progress_bar_background_visible) {
progress_bar_background_layer_->SetPosition(
gfx::PointF(progress_bar_background_x, progress_bar_background_y));
progress_bar_background_layer_->SetBounds(
gfx::Size(progress_bar_background_width,
progress_bar_background_height));
progress_bar_background_layer_->SetBackgroundColor(
progress_bar_background_color);
}
bool is_progress_bar_visible = SkColorGetA(progress_bar_background_color);
progress_bar_layer_->SetHideLayerAndSubtree(!is_progress_bar_visible);
if (is_progress_bar_visible) {
progress_bar_layer_->SetPosition(
gfx::PointF(progress_bar_x, progress_bar_y));
progress_bar_layer_->SetBounds(
gfx::Size(progress_bar_width, progress_bar_height));
progress_bar_layer_->SetBackgroundColor(progress_bar_color);
}
}
ToolbarLayer::ToolbarLayer(ui::ResourceManager* resource_manager)
: resource_manager_(resource_manager),
layer_(cc::Layer::Create()),
toolbar_root_(cc::Layer::Create()),
toolbar_background_layer_(cc::SolidColorLayer::Create()),
url_bar_background_layer_(cc::NinePatchLayer::Create()),
bitmap_layer_(cc::UIResourceLayer::Create()),
progress_bar_layer_(cc::SolidColorLayer::Create()),
progress_bar_background_layer_(cc::SolidColorLayer::Create()),
anonymize_layer_(cc::SolidColorLayer::Create()),
debug_layer_(cc::SolidColorLayer::Create()) {
layer_->AddChild(toolbar_root_);
toolbar_background_layer_->SetIsDrawable(true);
toolbar_root_->AddChild(toolbar_background_layer_);
url_bar_background_layer_->SetIsDrawable(true);
url_bar_background_layer_->SetFillCenter(true);
toolbar_root_->AddChild(url_bar_background_layer_);
bitmap_layer_->SetIsDrawable(true);
toolbar_root_->AddChild(bitmap_layer_);
progress_bar_background_layer_->SetIsDrawable(true);
progress_bar_background_layer_->SetHideLayerAndSubtree(true);
toolbar_root_->AddChild(progress_bar_background_layer_);
progress_bar_layer_->SetIsDrawable(true);
progress_bar_layer_->SetHideLayerAndSubtree(true);
toolbar_root_->AddChild(progress_bar_layer_);
anonymize_layer_->SetIsDrawable(true);
anonymize_layer_->SetBackgroundColor(SK_ColorWHITE);
toolbar_root_->AddChild(anonymize_layer_);
debug_layer_->SetIsDrawable(true);
debug_layer_->SetBackgroundColor(SK_ColorGREEN);
debug_layer_->SetOpacity(0.5f);
}
ToolbarLayer::~ToolbarLayer() {
}
} // namespace android