| Index: ash/system/tray/tray_background_view.cc
|
| diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc
|
| index 0a2a196561af7ce97d1e7c9b6128cd793c431459..49cc7136d551f082f35580a73f14914ba999b363 100644
|
| --- a/ash/system/tray/tray_background_view.cc
|
| +++ b/ash/system/tray/tray_background_view.cc
|
| @@ -11,6 +11,8 @@
|
| #include "ash/system/status_area_widget_delegate.h"
|
| #include "ash/system/tray/tray_constants.h"
|
| #include "ui/aura/window.h"
|
| +#include "ui/base/accessibility/accessible_view_state.h"
|
| +#include "ui/compositor/layer_animation_observer.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/skia_util.h"
|
| #include "ui/views/background.h"
|
| @@ -32,6 +34,33 @@ const int kTrayContainerHorizontalPaddingVerticalAlignment = 1;
|
| namespace ash {
|
| namespace internal {
|
|
|
| +// Observe the tray layer animation and update the anchor when it changes.
|
| +// TODO(stevenjb): Observe or mirror the actual animation, not just the start
|
| +// and end points.
|
| +class TrayLayerAnimationObserver : public ui::LayerAnimationObserver {
|
| + public:
|
| + explicit TrayLayerAnimationObserver(TrayBackgroundView* host)
|
| + : host_(host) {
|
| + }
|
| +
|
| + virtual void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) {
|
| + host_->AnchorUpdated();
|
| + }
|
| +
|
| + virtual void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) {
|
| + host_->AnchorUpdated();
|
| + }
|
| +
|
| + virtual void OnLayerAnimationScheduled(ui::LayerAnimationSequence* sequence) {
|
| + host_->AnchorUpdated();
|
| + }
|
| +
|
| + private:
|
| + TrayBackgroundView* host_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TrayLayerAnimationObserver);
|
| +};
|
| +
|
| class TrayBackground : public views::Background {
|
| public:
|
| TrayBackground() : alpha_(kTrayBackgroundAlpha) {}
|
| @@ -144,22 +173,53 @@ TrayBackgroundView::TrayBackgroundView(
|
| }
|
|
|
| TrayBackgroundView::~TrayBackgroundView() {
|
| + GetWidget()->GetNativeView()->layer()->GetAnimator()->RemoveObserver(
|
| + layer_animation_observer_.get());
|
| +}
|
| +
|
| +void TrayBackgroundView::Initialize() {
|
| + layer_animation_observer_.reset(new TrayLayerAnimationObserver(this));
|
| + GetWidget()->GetNativeView()->layer()->GetAnimator()->AddObserver(
|
| + layer_animation_observer_.get());
|
| + SetBorder();
|
| }
|
|
|
| void TrayBackgroundView::OnMouseEntered(const ui::MouseEvent& event) {
|
| hover_background_animator_.SetPaintsBackground(true,
|
| internal::BackgroundAnimator::CHANGE_ANIMATE);
|
| + UpdateShouldShowLauncher();
|
| }
|
|
|
| void TrayBackgroundView::OnMouseExited(const ui::MouseEvent& event) {
|
| hover_background_animator_.SetPaintsBackground(false,
|
| internal::BackgroundAnimator::CHANGE_ANIMATE);
|
| + UpdateShouldShowLauncher();
|
| }
|
|
|
| void TrayBackgroundView::ChildPreferredSizeChanged(views::View* child) {
|
| PreferredSizeChanged();
|
| }
|
|
|
| +void TrayBackgroundView::OnPaintFocusBorder(gfx::Canvas* canvas) {
|
| + // The tray itself expands to the right and bottom edge of the screen to make
|
| + // sure clicking on the edges brings up the popup. However, the focus border
|
| + // should be only around the container.
|
| + if (HasFocus() && (focusable() || IsAccessibilityFocusable()))
|
| + DrawBorder(canvas, GetContentsBounds());
|
| +}
|
| +
|
| +void TrayBackgroundView::GetAccessibleState(ui::AccessibleViewState* state) {
|
| + state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON;
|
| + state->name = GetAccessibleName();
|
| +}
|
| +
|
| +void TrayBackgroundView::AboutToRequestFocusFromTabTraversal(bool reverse) {
|
| + // Return focus to the login view. See crbug.com/120500.
|
| + views::View* v = GetNextFocusableView();
|
| + if (v)
|
| + v->AboutToRequestFocusFromTabTraversal(reverse);
|
| +}
|
| +
|
| bool TrayBackgroundView::PerformAction(const ui::Event& event) {
|
| return false;
|
| }
|
| @@ -194,9 +254,8 @@ void TrayBackgroundView::SetShelfAlignment(ShelfAlignment alignment) {
|
|
|
| void TrayBackgroundView::SetBorder() {
|
| views::View* parent = status_area_widget_->status_area_widget_delegate();
|
| - int child_count = parent->child_count();
|
| - DCHECK(child_count > 0);
|
| - int on_edge = (this == parent->child_at(child_count-1));
|
| + // Tray views are laid out right-to-left or bottom-to-top
|
| + int on_edge = (this == parent->child_at(0));
|
| // Change the border padding for different shelf alignment.
|
| if (shelf_alignment() == SHELF_ALIGNMENT_BOTTOM) {
|
| set_border(views::Border::CreateEmptyBorder(
|
| @@ -215,5 +274,9 @@ void TrayBackgroundView::SetBorder() {
|
| }
|
| }
|
|
|
| +void TrayBackgroundView::UpdateShouldShowLauncher() {
|
| + status_area_widget()->UpdateShouldShowLauncher();
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace ash
|
|
|