blob: 6d8f2a60712b3cade37865407fc42de0ed9784ba [file] [log] [blame]
// Copyright 2020 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/vr/metrics/session_timer.h"
#include "base/metrics/histogram_functions.h"
namespace vr {
SessionTimer::SessionTimer(char const* histogram_name,
base::TimeDelta gap_time,
base::TimeDelta minimum_duration)
: histogram_name_(histogram_name),
maximum_session_gap_time_(gap_time),
minimum_duration_(minimum_duration) {}
SessionTimer::~SessionTimer() {
StopSession(false, base::Time::Now());
}
void SessionTimer::StartSession(base::Time start_time) {
// If the new start time is within the minimum session gap time from the
// last stop, continue the previous session. Otherwise, start a new session,
// sending the event for the last session.
if (!stop_time_.is_null() &&
start_time - stop_time_ <= maximum_session_gap_time_) {
// Mark the previous segment as non-continuable, sending data and clearing
// state.
StopSession(false, stop_time_);
}
start_time_ = start_time;
}
void SessionTimer::StopSession(bool continuable, base::Time stop_time) {
// first accumulate time from this segment of the session
base::TimeDelta segment_duration =
(start_time_.is_null() ? base::TimeDelta() : stop_time - start_time_);
if (!segment_duration.is_zero() && segment_duration > minimum_duration_) {
accumulated_time_ = accumulated_time_ + segment_duration;
}
if (continuable) {
// if we are continuable, accumulate the current segment to the session,
// and set stop_time_ so we may continue later
accumulated_time_ = stop_time - start_time_ + accumulated_time_;
stop_time_ = stop_time;
start_time_ = base::Time();
} else {
// send the histogram now if we aren't continuable, clearing segment state
SendAccumulatedSessionTime();
// clear out start/stop/accumulated time
start_time_ = base::Time();
stop_time_ = base::Time();
accumulated_time_ = base::TimeDelta();
}
}
void SessionTimer::SendAccumulatedSessionTime() {
if (!accumulated_time_.is_zero()) {
base::UmaHistogramCustomTimes(histogram_name_, accumulated_time_,
base::TimeDelta(),
base::TimeDelta::FromHours(5), 100);
}
}
} // namespace vr