blob: e588db611a0e9f7e05186400b19756bb62009a9c [file] [log] [blame]
// Copyright 2018 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 "components/ntp_snippets/contextual/contextual_suggestions_metrics_reporter.h"
#include <string>
#include "base/metrics/histogram_macros.h"
#include "components/ntp_snippets/contextual/contextual_suggestions_ukm_entry.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
namespace contextual_suggestions {
ContextualSuggestionsMetricsReporter::ContextualSuggestionsMetricsReporter()
: sheet_peeked_(false),
sheet_opened_(false),
sheet_closed_(false),
any_suggestion_downloaded_(false),
any_suggestion_taken_(false),
ukm_entry_(nullptr) {}
ContextualSuggestionsMetricsReporter::~ContextualSuggestionsMetricsReporter() {
DCHECK(!ukm_entry_) << "Flush should be called before destruction!";
}
void ContextualSuggestionsMetricsReporter::SetupForPage(
const std::string& url,
ukm::SourceId source_id) {
DCHECK(!ukm_entry_) << "Flush should be called before SetupForPage!";
DCHECK(source_id != ukm::kInvalidSourceId);
ukm_entry_.reset(new ContextualSuggestionsUkmEntry(source_id));
}
void ContextualSuggestionsMetricsReporter::RecordEvent(
ContextualSuggestionsEvent event) {
DCHECK(ukm_entry_)
<< "Page not set up. Did you forget to call SetupForPage or Flush?";
ukm_entry_->RecordEventMetrics(event);
RecordUmaMetrics(event);
}
void ContextualSuggestionsMetricsReporter::Flush() {
ResetUma();
if (ukm_entry_) {
ukm_entry_->Flush();
ukm_entry_.reset();
}
}
void ContextualSuggestionsMetricsReporter::RecordUmaMetrics(
ContextualSuggestionsEvent event) {
switch (event) {
case FETCH_DELAYED:
case FETCH_REQUESTED:
case FETCH_ERROR:
case FETCH_SERVER_BUSY:
case FETCH_BELOW_THRESHOLD:
case FETCH_EMPTY:
case FETCH_COMPLETED:
break;
case UI_PEEK_REVERSE_SCROLL:
if (sheet_peeked_)
return;
sheet_peeked_ = true;
break;
case UI_OPENED:
if (sheet_opened_)
return;
sheet_opened_ = true;
break;
case UI_DISMISSED_WITHOUT_OPEN:
case UI_DISMISSED_AFTER_OPEN:
if (sheet_closed_)
return;
sheet_closed_ = true;
break;
case SUGGESTION_DOWNLOADED:
if (any_suggestion_downloaded_)
return;
any_suggestion_downloaded_ = true;
break;
case SUGGESTION_CLICKED:
if (any_suggestion_taken_)
return;
any_suggestion_taken_ = true;
break;
case UI_CLOSED_OBSOLETE:
NOTREACHED() << "Obsolete event, do not use!";
return;
default:
NOTREACHED() << "Unexpected event, not correctly handled!";
return;
}
UMA_HISTOGRAM_ENUMERATION("ContextualSuggestions.Events", event);
}
void ContextualSuggestionsMetricsReporter::ResetUma() {
sheet_peeked_ = false;
sheet_opened_ = false;
sheet_closed_ = false;
any_suggestion_downloaded_ = false;
any_suggestion_taken_ = false;
}
} // namespace contextual_suggestions