blob: fc737ed8d593db6d8600184ff8f059645aa0d1d8 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/login/error_screens_histogram_helper.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
namespace ash {
namespace {
const char kOobeErrorScreensCounterPrefix[] = "OOBE.NetworkErrorShown.";
const char kOobeTimeSpentOnErrorScreensPrefix[] = "OOBE.ErrorScreensTime.";
const int kTimeMinInMS = 10;
const int kTimeMaxInMinutes = 3;
const int kTimeBucketCount = 50;
std::string GetParentScreenString(
ErrorScreensHistogramHelper::ErrorParentScreen screen) {
switch (screen) {
case ErrorScreensHistogramHelper::ErrorParentScreen::kEnrollment:
return "Enrollment";
case ErrorScreensHistogramHelper::ErrorParentScreen::kSignin:
return "Signin";
case ErrorScreensHistogramHelper::ErrorParentScreen::kUpdate:
return "Update";
case ErrorScreensHistogramHelper::ErrorParentScreen::kUpdateRequired:
return "UpdateRequired";
case ErrorScreensHistogramHelper::ErrorParentScreen::kUserCreation:
return "UserCreation";
case ErrorScreensHistogramHelper::ErrorParentScreen::kAddChild:
return "AddChild";
case ErrorScreensHistogramHelper::ErrorParentScreen::kConsumerUpdate:
return "ConsumerUpdate";
}
}
std::string GetErrorStateString(NetworkError::ErrorState state) {
switch (state) {
case NetworkError::ERROR_STATE_PORTAL:
return ".Portal";
case NetworkError::ERROR_STATE_OFFLINE:
return ".Offline";
case NetworkError::ERROR_STATE_PROXY:
return ".Proxy";
case NetworkError::ERROR_STATE_LOADING_TIMEOUT:
return ".LoadingTimeout";
case NetworkError::ERROR_STATE_NONE:
return ".None";
default:
NOTREACHED() << "Invalid ErrorState " << state;
}
}
void RecordErrorStateCountOnParentScreen(
NetworkError::ErrorState state,
ErrorScreensHistogramHelper::ErrorParentScreen screen) {
if (state <= NetworkError::ERROR_STATE_UNKNOWN ||
state > NetworkError::ERROR_STATE_NONE) {
return;
}
std::string histogram_name =
kOobeErrorScreensCounterPrefix + GetParentScreenString(screen);
int boundary = NetworkError::ERROR_STATE_NONE + 1;
// This comes from UMA_HISTOGRAM_ENUMERATION macros. Can't use it because of
// non const histogram name.
base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
histogram_name, 1, boundary, boundary + 1,
base::HistogramBase::kUmaTargetedHistogramFlag);
histogram->Add(state);
}
void RecordErrorScreenTimeOnParentScreenWithLastError(
const base::TimeDelta& time_delta,
ErrorScreensHistogramHelper::ErrorParentScreen screen,
NetworkError::ErrorState state) {
if (state <= NetworkError::ERROR_STATE_UNKNOWN ||
state > NetworkError::ERROR_STATE_NONE) {
return;
}
std::string histogram_name = kOobeTimeSpentOnErrorScreensPrefix +
GetParentScreenString(screen) +
GetErrorStateString(state);
// This comes from UMA_HISTOGRAM_MEDIUM_TIMES macros. Can't use it because of
// non const histogram name.
base::HistogramBase* histogram = base::Histogram::FactoryTimeGet(
histogram_name, base::Milliseconds(kTimeMinInMS),
base::Minutes(kTimeMaxInMinutes), kTimeBucketCount,
base::HistogramBase::kUmaTargetedHistogramFlag);
histogram->AddTime(time_delta);
}
} // namespace
ErrorScreensHistogramHelper::ErrorScreensHistogramHelper(
ErrorParentScreen parent_screen)
: parent_screen_(parent_screen) {}
void ErrorScreensHistogramHelper::OnScreenShow() {
was_shown_ = true;
}
void ErrorScreensHistogramHelper::OnErrorShow(NetworkError::ErrorState error) {
// Don't record anything if the same error is shown.
if (last_error_shown_ == error) {
return;
}
// ERROR_STATE_NONE represents that the ErrorScreen was hidden or not shown.
// Start recording time at this point.
if (last_error_shown_ == NetworkError::ErrorState::ERROR_STATE_NONE) {
error_screen_start_time_ = base::Time::Now();
}
// New error state is shown so we want to record it.
last_error_shown_ = error;
RecordErrorStateCountOnParentScreen(last_error_shown_, parent_screen_);
}
void ErrorScreensHistogramHelper::OnErrorHide() {
if (error_screen_start_time_.is_null()) {
return;
}
// Reset last error to represent that the ErrorScreen is hidden.
last_error_shown_ = NetworkError::ErrorState::ERROR_STATE_NONE;
// Increase the time spent on the ErrorScreen.
time_on_error_screens_ += base::Time::Now() - error_screen_start_time_;
error_screen_start_time_ = base::Time();
}
ErrorScreensHistogramHelper::~ErrorScreensHistogramHelper() {
if (!was_shown_) {
return;
}
if (!error_screen_start_time_.is_null()) {
time_on_error_screens_ += base::Time::Now() - error_screen_start_time_;
error_screen_start_time_ = base::Time();
}
RecordErrorScreenTimeOnParentScreenWithLastError(
time_on_error_screens_, parent_screen_, last_error_shown_);
}
} // namespace ash