1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77

ash / system / input_device_settings / settings_updated_metrics_info.h [blame]

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_SYSTEM_INPUT_DEVICE_SETTINGS_SETTINGS_UPDATED_METRICS_INFO_H_
#define ASH_SYSTEM_INPUT_DEVICE_SETTINGS_SETTINGS_UPDATED_METRICS_INFO_H_

#include <array>
#include <cstdint>

#include "ash/ash_export.h"
#include "base/time/time.h"
#include "base/values.h"

namespace ash {

// SettingsUpdatedMetricsInfo is in charge of keeping track of settings updated
// metrics info as well as serializing/deserializing to/from `base::Value`
// objects.
class ASH_EXPORT SettingsUpdatedMetricsInfo {
 public:
  enum class TimePeriod : uint8_t {
    kOneHour,
    kThreeHours,
    kOneDay,
    kThreeDays,
    kOneWeek,
    kMinValue = kOneHour,
    kMaxValue = kOneWeek
  };

  enum class Category {
    kFirstEver = 0,
    kDefault = 1,
    kSynced = 2,
    kMinValue = kFirstEver,
    kMaxValue = kSynced,
  };

  SettingsUpdatedMetricsInfo(Category category,
                             base::Time initial_connection_time);
  ~SettingsUpdatedMetricsInfo();
  SettingsUpdatedMetricsInfo(const SettingsUpdatedMetricsInfo&);

  // Serializes a `SettingsUpdatedMetricsInfo` object from a
  // `base::Value::Dict`.
  // Returns `std::nullopt` if any necessary fields are missing.
  static std::optional<SettingsUpdatedMetricsInfo> FromDict(
      const base::Value::Dict& dict);

  // Converts the object to a `base::Value::Dict` to be stored in prefs.
  base::Value::Dict ToDict() const;

  // Records that an update happened at the given time. Returns the `TimePeriod`
  // that corresponds to the time given. Returns `std::nullopt` if the
  // `update_time` is greater than the longest period we track.
  std::optional<TimePeriod> RecordSettingsUpdate(base::Time update_time);

  // Returns the current count for the given `TimePeriod`.
  int GetCount(TimePeriod) const;

  Category category() const { return category_; }

  base::Time initial_connection_time() const {
    return initial_connection_time_;
  }

 private:
  Category category_;
  base::Time initial_connection_time_;
  std::array<int, static_cast<size_t>(TimePeriod::kMaxValue) + 1>
      time_period_counts_;
};

}  // namespace ash

#endif  // ASH_SYSTEM_INPUT_DEVICE_SETTINGS_SETTINGS_UPDATED_METRICS_INFO_H_