blob: 979d291bcb744a07696fc309622bf595bf7712ac [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.
#ifndef CHROME_BROWSER_CHROMEOS_POWER_AUTO_SCREEN_BRIGHTNESS_METRICS_REPORTER_H_
#define CHROME_BROWSER_CHROMEOS_POWER_AUTO_SCREEN_BRIGHTNESS_METRICS_REPORTER_H_
#include <array>
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "base/timer/timer.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "components/metrics/daily_event.h"
class PrefRegistrySimple;
class PrefService;
namespace chromeos {
namespace power {
namespace auto_screen_brightness {
// MetricsReport logs daily user screen brightness adjustments to UMA.
class MetricsReporter : public PowerManagerClient::Observer {
public:
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class DeviceClass {
kNoAls = 0,
kSupportedAls = 1,
kUnsupportedAls = 2,
kAtlas = 3,
kEve = 4,
kNocturne = 5,
kKohaku = 6,
kMaxValue = kKohaku
};
static constexpr int kNumberDeviceClasses =
static_cast<int>(DeviceClass::kMaxValue) + 1;
// A histogram recorded in UMA, showing reasons why daily metrics are
// reported.
static constexpr char kDailyEventIntervalName[] =
"AutoScreenBrightness.MetricsDailyEventInterval";
// Histogram names of daily counts.
static constexpr char kNoAlsUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.NoAls";
static constexpr char kSupportedAlsUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.SupportedAls";
static constexpr char kUnsupportedAlsUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.UnsupportedAls";
static constexpr char kAtlasUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.Atlas";
static constexpr char kEveUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.Eve";
static constexpr char kNocturneUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.Nocturne";
static constexpr char kKohakuUserAdjustmentName[] =
"AutoScreenBrightness.DailyUserAdjustment.Kohaku";
// Registers prefs used by MetricsReporter in |registry|.
static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
// RegisterLocalStatePrefs() must be called before instantiating this class.
MetricsReporter(PowerManagerClient* power_manager_client,
PrefService* local_state_pref_service);
~MetricsReporter() override;
// PowerManagerClient::Observer:
void SuspendDone(base::TimeDelta duration) override;
// Sets |device_class_|. Should only be called once after adapter is
// initialized.
void SetDeviceClass(DeviceClass device_class);
// Increments number of adjustments for |device_class_|. Should only
// be called after |SetDeviceClass| is called.
void OnUserBrightnessChangeRequested();
// Calls ReportDailyMetrics directly.
void ReportDailyMetricsForTesting(metrics::DailyEvent::IntervalType type);
private:
class DailyEventObserver;
// Called by DailyEventObserver whenever a day has elapsed according to
// |daily_event_|.
void ReportDailyMetrics(metrics::DailyEvent::IntervalType type);
// Used as an index into |daily_counts_| for counting adjustments.
// Set once and then never changed during the Chrome session.
base::Optional<DeviceClass> device_class_;
ScopedObserver<PowerManagerClient, PowerManagerClient::Observer>
power_manager_client_observer_;
PrefService* pref_service_; // Not owned.
std::unique_ptr<metrics::DailyEvent> daily_event_;
// Instructs |daily_event_| to check if a day has passed.
base::RepeatingTimer timer_;
// Daily count for each DeviceClass. Ordered by DeviceClass values.
// Initial values will be loaded from prefs service.
std::array<int, kNumberDeviceClasses> daily_counts_;
DISALLOW_COPY_AND_ASSIGN(MetricsReporter);
};
} // namespace auto_screen_brightness
} // namespace power
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_POWER_AUTO_SCREEN_BRIGHTNESS_METRICS_REPORTER_H_