Home | History | Annotate | Download | only in overview
      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 
     21 WindowSelectorController::WindowSelectorController() {
     22 }
     23 
     24 WindowSelectorController::~WindowSelectorController() {
     25 }
     26 
     27 // static
     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 
     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 
     58 bool WindowSelectorController::IsSelecting() {
     59   return window_selector_.get() != NULL;
     60 }
     61 
     62 // TODO(flackr): Make WindowSelectorController observe the activation of
     63 // windows, so we can remove WindowSelectorDelegate.
     64 void WindowSelectorController::OnSelectionEnded() {
     65   window_selector_.reset();
     66   last_selection_time_ = base::Time::Now();
     67 }
     68 
     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