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()21WindowSelectorController::WindowSelectorController() { 22 } 23 ~WindowSelectorController()24WindowSelectorController::~WindowSelectorController() { 25 } 26 27 // static CanSelect()28bool 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()39void 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()58bool 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()64void WindowSelectorController::OnSelectionEnded() { 65 window_selector_.reset(); 66 last_selection_time_ = base::Time::Now(); 67 } 68 OnSelectionStarted()69void 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