blob: 8bd1c59c855683fd98f9df70dae52b5b55b58302 [file] [log] [blame]
// Copyright 2019 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/arc/metrics/stability_metrics_manager.h"
#include "base/metrics/histogram_macros.h"
#include "components/arc/arc_prefs.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
namespace arc {
namespace {
constexpr char kArcEnabledStateKey[] = "enabled_state";
constexpr char kArcNativeBridgeTypeKey[] = "native_bridge_type";
StabilityMetricsManager* g_stability_metrics_manager = nullptr;
} // namespace
// static
void StabilityMetricsManager::Initialize(PrefService* local_state) {
DCHECK(!g_stability_metrics_manager);
g_stability_metrics_manager = new StabilityMetricsManager(local_state);
}
// static
void StabilityMetricsManager::Shutdown() {
DCHECK(g_stability_metrics_manager);
delete g_stability_metrics_manager;
g_stability_metrics_manager = nullptr;
}
// static
StabilityMetricsManager* StabilityMetricsManager::Get() {
return g_stability_metrics_manager;
}
StabilityMetricsManager::StabilityMetricsManager(PrefService* local_state)
: local_state_(local_state) {}
StabilityMetricsManager::~StabilityMetricsManager() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
void StabilityMetricsManager::RecordMetricsToUMA() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// GetDictionary() should never return null, but since this may be called
// early on browser startup, be paranoid here to prevent going into a crash
// loop.
if (!local_state_->GetDictionary(prefs::kStabilityMetrics)) {
NOTREACHED() << "Local state unavailable, not recording stabiltiy metrics.";
return;
}
const base::Optional<bool> enabled_state = GetArcEnabledState();
if (enabled_state)
UMA_STABILITY_HISTOGRAM_ENUMERATION("Arc.State", *enabled_state ? 1 : 0, 2);
const base::Optional<NativeBridgeType> native_bridge_type =
GetArcNativeBridgeType();
if (native_bridge_type) {
UMA_STABILITY_HISTOGRAM_ENUMERATION(
"Arc.NativeBridge", *native_bridge_type,
static_cast<int>(NativeBridgeType::kMaxValue) + 1);
}
}
void StabilityMetricsManager::ResetMetrics() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DictionaryPrefUpdate update(local_state_, prefs::kStabilityMetrics);
update->Clear();
}
base::Optional<bool> StabilityMetricsManager::GetArcEnabledState() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const base::DictionaryValue* dict =
local_state_->GetDictionary(prefs::kStabilityMetrics);
return dict->FindBoolKey(kArcEnabledStateKey);
}
void StabilityMetricsManager::SetArcEnabledState(bool enabled) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DictionaryPrefUpdate update(local_state_, prefs::kStabilityMetrics);
update->SetKey(kArcEnabledStateKey, base::Value(enabled));
}
base::Optional<NativeBridgeType>
StabilityMetricsManager::GetArcNativeBridgeType() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const base::DictionaryValue* dict =
local_state_->GetDictionary(prefs::kStabilityMetrics);
base::Optional<int> native_bridge_type =
dict->FindIntKey(kArcNativeBridgeTypeKey);
if (native_bridge_type) {
return base::make_optional(
static_cast<NativeBridgeType>(*native_bridge_type));
}
return base::nullopt;
}
void StabilityMetricsManager::SetArcNativeBridgeType(
NativeBridgeType native_bridge_type) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DictionaryPrefUpdate update(local_state_, prefs::kStabilityMetrics);
update->SetKey(kArcNativeBridgeTypeKey,
base::Value(static_cast<int>(native_bridge_type)));
}
} // namespace arc