Index: ash/wm/window_cycle_controller.cc |
diff --git a/ash/wm/window_cycle_controller.cc b/ash/wm/window_cycle_controller.cc |
index 42f866e38e0ab17e7ba7cb39ea2e47d6b41e68a0..98f93391c27b009d25e92cb65095bab72bc69fdc 100644 |
--- a/ash/wm/window_cycle_controller.cc |
+++ b/ash/wm/window_cycle_controller.cc |
@@ -4,11 +4,13 @@ |
#include "ash/wm/window_cycle_controller.h" |
+#include "ash/metrics/user_metrics_recorder.h" |
#include "ash/session/session_state_delegate.h" |
#include "ash/shell.h" |
#include "ash/wm/mru_window_tracker.h" |
#include "ash/wm/window_cycle_list.h" |
#include "base/metrics/histogram.h" |
+#include "ui/aura/window.h" |
#include "ui/events/event.h" |
#include "ui/events/event_handler.h" |
@@ -16,6 +18,12 @@ namespace ash { |
namespace { |
+// Returns the most recently active window from the |window_list| or nullptr |
+// if the list is empty. |
+aura::Window* GetActiveWindow(const MruWindowTracker::WindowList& window_list) { |
+ return window_list.size() > 0 ? window_list[0] : nullptr; |
Alexei Svitkine (slow)
2015/05/14 20:42:14
Nit: .size() > 0 -> !.empty()
bruthig
2015/05/14 22:06:40
Done.
|
+} |
+ |
// Filter to watch for the termination of a keyboard gesture to cycle through |
// multiple windows. |
class WindowCycleEventFilter : public ui::EventHandler { |
@@ -77,8 +85,12 @@ void WindowCycleController::HandleCycleWindow(Direction direction) { |
} |
void WindowCycleController::StartCycling() { |
- window_cycle_list_.reset(new WindowCycleList(ash::Shell::GetInstance()-> |
- mru_window_tracker()->BuildMruWindowList())); |
+ MruWindowTracker::WindowList window_list = |
+ Shell::GetInstance()->mru_window_tracker()->BuildMruWindowList(); |
+ |
+ active_window_before_window_cycle_ = GetActiveWindow(window_list); |
oshima
2015/05/14 17:12:36
doesn't GetActiveWindow work here?
bruthig
2015/05/14 17:49:44
Summary of discussion offline.
wm::GetActiveWindo
oshima
2015/05/14 18:13:00
Acknowledged.
|
+ |
+ window_cycle_list_.reset(new WindowCycleList(window_list)); |
event_handler_.reset(new WindowCycleEventFilter()); |
cycle_start_time_ = base::Time::Now(); |
Shell::GetInstance()->metrics()->RecordUserMetricsAction(UMA_WINDOW_CYCLE); |
@@ -94,10 +106,23 @@ void WindowCycleController::Step(Direction direction) { |
void WindowCycleController::StopCycling() { |
window_cycle_list_.reset(); |
+ |
+ aura::Window* active_window_after_window_cycle = GetActiveWindow( |
+ Shell::GetInstance()->mru_window_tracker()->BuildMruWindowList()); |
+ |
// Remove our key event filter. |
event_handler_.reset(); |
UMA_HISTOGRAM_MEDIUM_TIMES("Ash.WindowCycleController.CycleTime", |
base::Time::Now() - cycle_start_time_); |
+ |
+ if (active_window_after_window_cycle != nullptr && |
+ active_window_before_window_cycle_ != active_window_after_window_cycle) { |
+ Shell::GetInstance() |
+ ->metrics() |
+ ->task_switch_metrics_recorder() |
+ .OnTaskSwitch(TaskSwitchMetricsRecorder::kWindowCycleController); |
+ } |
+ active_window_before_window_cycle_ = nullptr; |
} |
} // namespace ash |