| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h" |
| |
| #include "base/metrics/histogram_macros.h" |
| #include "base/time/tick_clock.h" |
| #include "base/time/time.h" |
| #include "extensions/browser/app_window/app_window.h" |
| |
| namespace { |
| |
| // Name of the count histogram used to keep track of (1-indexed) app launch |
| // request ordinal number in a lock screen session. |
| const char kAppLaunchOrdinalNumberInLockSession[] = |
| "Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber"; |
| |
| // Name of the histogram that tracks total amount of time an app window was |
| // active for a single launch event - i.e. time from app window being shown to |
| // app window closure. |
| const char kTotalAppWindowSessionTime[] = |
| "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.TotalActive"; |
| |
| // Name of the histogram that tracks amount of time an app window was in |
| // foreground, on top the lock screen. |
| const char kTimeAppWindowInForeground[] = |
| "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Foreground"; |
| |
| // Name of the histogram that track amount of time an app window was in |
| // background, behind the lock screen. |
| const char kTimeAppWindowInBackground[] = |
| "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Background"; |
| |
| // Name of the histogram that tracks the amount time needed to show an app |
| // window (the window render view being created) after the app launch was |
| // requested. |
| const char kTimeFromLaunchToWindowBeingShown[] = |
| "Apps.LockScreen.NoteTakingApp.TimeToShowWindow"; |
| |
| // Name of the histogram that tracks the amount of time needed to load the an |
| // app window contents after the app launch was requested. |
| const char kTimeToLoadAppWindowContents[] = |
| "Apps.LockScreen.NoteTakingApp.TimeToLoadAppWindowContents"; |
| |
| // The name of the histogram that tracks the amount of time the app was in |
| // launching state when the launch got canceled. |
| const char kLaunchDurationAtLaunchCancel[] = |
| "Apps.LockScreen.NoteTakingApp.LaunchDurationAtLaunchCancel"; |
| |
| // The name of the histogram that track the app state when the app lock screen |
| // ends. |
| const char kAppWindowStateOnRemoval[] = |
| "Apps.LockScreen.NoteTakingApp.FinalAppSessionState"; |
| |
| } // namespace |
| |
| namespace lock_screen_apps { |
| |
| AppWindowMetricsTracker::AppWindowMetricsTracker(base::TickClock* clock) |
| : clock_(clock) {} |
| |
| AppWindowMetricsTracker::~AppWindowMetricsTracker() = default; |
| |
| void AppWindowMetricsTracker::AppLaunchRequested() { |
| DCHECK_EQ(State::kInitial, state_); |
| SetState(State::kLaunchRequested); |
| |
| ++app_launch_count_; |
| UMA_HISTOGRAM_COUNTS_100(kAppLaunchOrdinalNumberInLockSession, |
| app_launch_count_); |
| } |
| |
| void AppWindowMetricsTracker::MovedToForeground() { |
| DCHECK_NE(State::kInitial, state_); |
| |
| if (state_ == State::kForeground) |
| return; |
| |
| if (state_ == State::kBackground) { |
| SetState(State::kForeground); |
| return; |
| } |
| |
| // Not expected to be in a state different than foreground or background |
| // after |state_after_window_contents_load_| is reset. |
| DCHECK(state_after_window_contents_load_.has_value()); |
| state_after_window_contents_load_ = State::kForeground; |
| } |
| |
| void AppWindowMetricsTracker::MovedToBackground() { |
| DCHECK_NE(State::kInitial, state_); |
| |
| if (state_ == State::kBackground) |
| return; |
| |
| if (state_ == State::kForeground) { |
| SetState(State::kBackground); |
| return; |
| } |
| |
| // Not expected to be in a state different than foreground or background |
| // after |state_after_window_contents_load_| is reset. |
| DCHECK(state_after_window_contents_load_.has_value()); |
| state_after_window_contents_load_ = State::kBackground; |
| } |
| |
| void AppWindowMetricsTracker::AppWindowCreated( |
| extensions::AppWindow* app_window) { |
| Observe(app_window->web_contents()); |
| |
| SetState(State::kWindowCreated); |
| } |
| |
| void AppWindowMetricsTracker::Reset() { |
| if (state_ == State::kInitial) |
| return; |
| |
| UMA_HISTOGRAM_ENUMERATION(kAppWindowStateOnRemoval, state_, State::kCount); |
| |
| if (state_ != State::kLaunchRequested && state_ != State::kWindowCreated) { |
| UMA_HISTOGRAM_LONG_TIMES( |
| kTotalAppWindowSessionTime, |
| clock_->NowTicks() - time_stamps_[State::kWindowShown]); |
| } else { |
| UMA_HISTOGRAM_TIMES( |
| kLaunchDurationAtLaunchCancel, |
| clock_->NowTicks() - time_stamps_[State::kLaunchRequested]); |
| } |
| |
| SetState(State::kInitial); |
| |
| state_after_window_contents_load_ = State::kForeground; |
| |
| time_stamps_.clear(); |
| } |
| |
| void AppWindowMetricsTracker::RenderViewCreated( |
| content::RenderViewHost* render_view_host) { |
| SetState(State::kWindowShown); |
| |
| UMA_HISTOGRAM_TIMES( |
| kTimeFromLaunchToWindowBeingShown, |
| clock_->NowTicks() - time_stamps_[State::kLaunchRequested]); |
| } |
| |
| void AppWindowMetricsTracker::DocumentOnLoadCompletedInMainFrame() { |
| State next_state = state_after_window_contents_load_.value(); |
| state_after_window_contents_load_.reset(); |
| SetState(next_state); |
| |
| UMA_HISTOGRAM_TIMES(kTimeToLoadAppWindowContents, |
| clock_->NowTicks() - time_stamps_[State::kWindowShown]); |
| } |
| |
| void AppWindowMetricsTracker::SetState(State state) { |
| if (state_ == state) |
| return; |
| |
| if (state_ == State::kForeground) { |
| UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInForeground, |
| clock_->NowTicks() - time_stamps_[state_]); |
| } else if (state_ == State::kBackground) { |
| UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInBackground, |
| clock_->NowTicks() - time_stamps_[state_]); |
| } |
| |
| state_ = state; |
| time_stamps_[state] = clock_->NowTicks(); |
| } |
| |
| } // namespace lock_screen_apps |