1// Copyright (c) 2012 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#include "ash/wm/screen_dimmer.h"
6
7#include "ash/shell.h"
8#include "base/time/time.h"
9#include "ui/aura/window_event_dispatcher.h"
10#include "ui/compositor/layer.h"
11#include "ui/compositor/scoped_layer_animation_settings.h"
12#include "ui/gfx/rect.h"
13#include "ui/gfx/size.h"
14
15namespace ash {
16namespace {
17
18// Opacity for |dimming_layer_| when it's dimming the screen.
19const float kDimmingLayerOpacity = 0.4f;
20
21// Duration for dimming animations, in milliseconds.
22const int kDimmingTransitionMs = 200;
23
24}  // namespace
25
26ScreenDimmer::ScreenDimmer(aura::Window* root_window)
27    : root_window_(root_window),
28      currently_dimming_(false) {
29  root_window_->AddObserver(this);
30}
31
32ScreenDimmer::~ScreenDimmer() {
33  root_window_->RemoveObserver(this);
34}
35
36void ScreenDimmer::SetDimming(bool should_dim) {
37  if (should_dim == currently_dimming_)
38    return;
39
40  if (!dimming_layer_) {
41    dimming_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
42    dimming_layer_->SetColor(SK_ColorBLACK);
43    dimming_layer_->SetOpacity(0.0f);
44    ui::Layer* root_layer = root_window_->layer();
45    dimming_layer_->SetBounds(root_layer->bounds());
46    root_layer->Add(dimming_layer_.get());
47    root_layer->StackAtTop(dimming_layer_.get());
48  }
49
50  currently_dimming_ = should_dim;
51
52  ui::ScopedLayerAnimationSettings scoped_settings(
53      dimming_layer_->GetAnimator());
54  scoped_settings.SetTransitionDuration(
55      base::TimeDelta::FromMilliseconds(kDimmingTransitionMs));
56  dimming_layer_->SetOpacity(should_dim ? kDimmingLayerOpacity : 0.0f);
57}
58
59void ScreenDimmer::OnWindowBoundsChanged(aura::Window* root,
60                                         const gfx::Rect& old_bounds,
61                                         const gfx::Rect& new_bounds) {
62  if (dimming_layer_)
63    dimming_layer_->SetBounds(gfx::Rect(root->bounds().size()));
64}
65
66}  // namespace ash
67