• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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/overview/window_selector_controller.h"
6 
7 #include "ash/metrics/user_metrics_recorder.h"
8 #include "ash/root_window_controller.h"
9 #include "ash/session/session_state_delegate.h"
10 #include "ash/shell.h"
11 #include "ash/system/tray/system_tray_delegate.h"
12 #include "ash/wm/mru_window_tracker.h"
13 #include "ash/wm/overview/window_selector.h"
14 #include "ash/wm/window_state.h"
15 #include "ash/wm/window_util.h"
16 #include "base/metrics/histogram.h"
17 #include "ui/aura/window.h"
18 
19 namespace ash {
20 
WindowSelectorController()21 WindowSelectorController::WindowSelectorController() {
22 }
23 
~WindowSelectorController()24 WindowSelectorController::~WindowSelectorController() {
25 }
26 
27 // static
CanSelect()28 bool WindowSelectorController::CanSelect() {
29   // Don't allow a window overview if the screen is locked or a modal dialog is
30   // open or running in kiosk app session.
31   return Shell::GetInstance()->session_state_delegate()->
32              IsActiveUserSessionStarted() &&
33          !Shell::GetInstance()->session_state_delegate()->IsScreenLocked() &&
34          !Shell::GetInstance()->IsSystemModalWindowOpen() &&
35          Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus() !=
36              user::LOGGED_IN_KIOSK_APP;
37 }
38 
ToggleOverview()39 void WindowSelectorController::ToggleOverview() {
40   if (IsSelecting()) {
41     OnSelectionEnded();
42   } else {
43     // Don't start overview if window selection is not allowed.
44     if (!CanSelect())
45       return;
46 
47     std::vector<aura::Window*> windows = ash::Shell::GetInstance()->
48         mru_window_tracker()->BuildMruWindowList();
49     // Don't enter overview mode with no windows.
50     if (windows.empty())
51       return;
52 
53     window_selector_.reset(new WindowSelector(windows, this));
54     OnSelectionStarted();
55   }
56 }
57 
IsSelecting()58 bool WindowSelectorController::IsSelecting() {
59   return window_selector_.get() != NULL;
60 }
61 
62 // TODO(nsatragno): Make WindowSelectorController observe the activation of
63 // windows, so we can remove WindowSelectorDelegate.
OnSelectionEnded()64 void WindowSelectorController::OnSelectionEnded() {
65   window_selector_.reset();
66   last_selection_time_ = base::Time::Now();
67 }
68 
OnSelectionStarted()69 void WindowSelectorController::OnSelectionStarted() {
70   if (!last_selection_time_.is_null()) {
71     UMA_HISTOGRAM_LONG_TIMES(
72         "Ash.WindowSelector.TimeBetweenUse",
73         base::Time::Now() - last_selection_time_);
74   }
75 }
76 
77 }  // namespace ash
78