Files
brave-core/components/speedreader/speedreader_service.cc
T
Pavel Beloborodov ee8ca100fe Added Font, FontSize & ContentStyle APIs. (#15316)
* Added Font, FontSize & ContentStyle APIs.
2022-10-11 08:59:13 +07:00

228 lines
7.1 KiB
C++

/* Copyright (c) 2020 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/components/speedreader/speedreader_service.h"
#include <string>
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h"
#include "brave/components/speedreader/common/features.h"
#include "brave/components/speedreader/common/speedreader_panel.mojom-shared.h"
#include "brave/components/speedreader/speedreader_pref_names.h"
#include "brave/components/time_period_storage/weekly_storage.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
namespace speedreader {
namespace {
// Note: append-only array! Never remove any existing values, as this array
// is used to bucket a UMA histogram, and removing values breaks that.
constexpr std::array<uint64_t, 5> kSpeedReaderToggleBuckets{
0, // 0
5, // >0-5
10, // 6-10
20, // 11-20
30, // 21-30
// 30+ => bucket 5
};
// Note: append-only enumeration! Never remove any existing values, as this enum
// is used to bucket a UMA histogram, and removing values breaks that.
enum class EnabledStatus {
kUnused,
kEverEnabled,
kRecentlyUsed,
kMaxValue = kRecentlyUsed
};
constexpr char kSpeedreaderToggleUMAHistogramName[] =
"Brave.SpeedReader.ToggleCount";
constexpr char kSpeedreaderEnabledUMAHistogramName[] =
"Brave.SpeedReader.Enabled";
void StoreTogglesHistogram(uint64_t toggles) {
int bucket = 0;
for (const auto& bucket_upper_bound : kSpeedReaderToggleBuckets) {
if (toggles > bucket_upper_bound)
bucket = bucket + 1;
}
UMA_HISTOGRAM_EXACT_LINEAR(kSpeedreaderToggleUMAHistogramName, bucket, 5);
}
void RecordHistograms(PrefService* prefs, bool toggled, bool enabled_now) {
WeeklyStorage weekly_toggles(prefs, kSpeedreaderPrefToggleCount);
if (toggled)
weekly_toggles.AddDelta(1);
const uint64_t toggle_count = weekly_toggles.GetWeeklySum();
StoreTogglesHistogram(toggle_count);
// Has been "recently" enabled if currently enabled,
// or got disabled this week.
EnabledStatus status = EnabledStatus::kUnused;
if (enabled_now || toggle_count > 0) {
status = EnabledStatus::kRecentlyUsed;
} else if (prefs->GetBoolean(kSpeedreaderPrefEverEnabled)) {
status = EnabledStatus::kEverEnabled;
}
UMA_HISTOGRAM_ENUMERATION(kSpeedreaderEnabledUMAHistogramName, status);
}
} // namespace
SpeedreaderService::SpeedreaderService(PrefService* prefs) : prefs_(prefs) {}
SpeedreaderService::~SpeedreaderService() = default;
// static
void SpeedreaderService::RegisterProfilePrefs(PrefRegistrySimple* registry) {
bool enabled_by_deault = false;
#if DCHECK_IS_ON()
// Enable speedreader by default if the data collector command line key is
// specified.
constexpr const char kCollectSwitch[] = "speedreader-collect-test-data";
enabled_by_deault =
base::CommandLine::ForCurrentProcess()->HasSwitch(kCollectSwitch);
#endif
registry->RegisterBooleanPref(kSpeedreaderPrefEnabled, enabled_by_deault);
registry->RegisterBooleanPref(kSpeedreaderPrefEverEnabled, false);
registry->RegisterListPref(kSpeedreaderPrefToggleCount);
registry->RegisterIntegerPref(kSpeedreaderPrefPromptCount, 0);
registry->RegisterIntegerPref(kSpeedreaderPrefTheme,
static_cast<int>(Theme::kNone));
registry->RegisterIntegerPref(kSpeedreaderPrefFontSize,
static_cast<int>(FontSize::k100));
registry->RegisterIntegerPref(kSpeedreaderPrefFontFamily,
static_cast<int>(FontFamily::kSans));
registry->RegisterIntegerPref(kSpeedreaderPrefContentStyle,
static_cast<int>(ContentStyle::kDefault));
}
void SpeedreaderService::ToggleSpeedreader() {
const bool toggled_value = !prefs_->GetBoolean(kSpeedreaderPrefEnabled);
prefs_->SetBoolean(kSpeedreaderPrefEnabled, toggled_value);
if (toggled_value)
prefs_->SetBoolean(kSpeedreaderPrefEverEnabled, true);
RecordHistograms(prefs_, true, toggled_value);
}
void SpeedreaderService::DisableSpeedreaderForTest() {
prefs_->SetBoolean(kSpeedreaderPrefEnabled, false);
prefs_->SetBoolean(kSpeedreaderPrefEverEnabled, false);
prefs_->SetInteger(kSpeedreaderPrefPromptCount, 0);
}
bool SpeedreaderService::IsEnabled() {
if (!base::FeatureList::IsEnabled(kSpeedreaderFeature)) {
return false;
}
const bool enabled = prefs_->GetBoolean(kSpeedreaderPrefEnabled);
RecordHistograms(prefs_, false, enabled);
return enabled;
}
bool SpeedreaderService::ShouldPromptUserToEnable() const {
constexpr int max_speedreader_prompts = 2;
if (prefs_->GetBoolean(kSpeedreaderPrefEverEnabled) ||
prefs_->GetInteger(kSpeedreaderPrefPromptCount) >
max_speedreader_prompts) {
return false;
}
return true;
}
void SpeedreaderService::IncrementPromptCount() {
const int count = prefs_->GetInteger(kSpeedreaderPrefPromptCount);
prefs_->SetInteger(kSpeedreaderPrefPromptCount, count + 1);
}
void SpeedreaderService::SetTheme(Theme theme) {
prefs_->SetInteger(kSpeedreaderPrefTheme, static_cast<int>(theme));
}
Theme SpeedreaderService::GetTheme() const {
return static_cast<Theme>(prefs_->GetInteger(kSpeedreaderPrefTheme));
}
std::string SpeedreaderService::GetThemeName() const {
switch (GetTheme()) {
default:
return {};
case Theme::kNone:
return {};
case Theme::kLight:
return "light";
case Theme::kSepia:
return "sepia";
case Theme::kDark:
return "dark";
}
}
void SpeedreaderService::SetFontSize(FontSize size) {
prefs_->SetInteger(kSpeedreaderPrefFontSize, static_cast<int>(size));
}
FontSize SpeedreaderService::GetFontSize() const {
return static_cast<FontSize>(prefs_->GetInteger(kSpeedreaderPrefFontSize));
}
std::string SpeedreaderService::GetFontSizeName() const {
return std::to_string(static_cast<int>(GetFontSize()));
}
void SpeedreaderService::SetFontFamily(FontFamily font) {
prefs_->SetInteger(kSpeedreaderPrefFontFamily, static_cast<int>(font));
}
FontFamily SpeedreaderService::GetFontFamily() const {
return static_cast<FontFamily>(
prefs_->GetInteger(kSpeedreaderPrefFontFamily));
}
std::string SpeedreaderService::GetFontFamilyName() const {
switch (GetFontFamily()) {
case FontFamily::kSans:
return "sans";
case FontFamily::kSerif:
return "serif";
case FontFamily::kMono:
return "mono";
case FontFamily::kDyslexic:
return "dyslexic";
}
}
void SpeedreaderService::SetContentStyle(ContentStyle style) {
prefs_->SetInteger(kSpeedreaderPrefContentStyle, static_cast<int>(style));
}
ContentStyle SpeedreaderService::GetContentStyle() const {
return static_cast<ContentStyle>(
prefs_->GetInteger(kSpeedreaderPrefContentStyle));
}
std::string SpeedreaderService::GetContentStyleName() const {
switch (GetContentStyle()) {
case ContentStyle::kDefault:
return base::EmptyString();
case ContentStyle::kTextOnly:
return "text-only";
}
}
} // namespace speedreader