chromium/ash/public/cpp/feature_discovery_duration_reporter.h

// Copyright 2022 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_PUBLIC_CPP_FEATURE_DISCOVERY_DURATION_REPORTER_H_
#define ASH_PUBLIC_CPP_FEATURE_DISCOVERY_DURATION_REPORTER_H_

#include "ash/public/cpp/ash_public_export.h"
#include "base/observer_list_types.h"

namespace ash {

namespace feature_discovery {
enum class TrackableFeature;
}  // namespace feature_discovery

// A singleton class that records feature discovery duration when the following
// conditions are met:
// 1. the current session state is active; and
// 2. the current profile is the primary one; and
// 3. the target feature's discovery duration has never been recorded for the
// current user on the current device.
//
// Only the discovery duration under an active session is counted. Also, the
// time duration when the device is suspended is not counted into the feature
// discovery time. The time spent in a different account from the one where the
// feature usage observation starts is excluded from the total duration. For
// example, if the user:
// 1. spends A time in the primary user session,
// 2. switches to a secondary user session for B time,
// 3. switches back to the primary user session,
// 4. discovers the new feature after C time.
// In this case, the feature discovery time duration should be A + C.
class ASH_PUBLIC_EXPORT FeatureDiscoveryDurationReporter {
 public:
  class ReporterObserver : public base::CheckedObserver {
   public:
    // Called when the reporter is ready to use.
    virtual void OnReporterActivated() = 0;
  };

  FeatureDiscoveryDurationReporter();
  FeatureDiscoveryDurationReporter(const FeatureDiscoveryDurationReporter&) =
      delete;
  FeatureDiscoveryDurationReporter& operator=(
      const FeatureDiscoveryDurationReporter&) = delete;
  virtual ~FeatureDiscoveryDurationReporter();

  static FeatureDiscoveryDurationReporter* GetInstance();

  // Activates the observation if the restrictions, which are introduced in the
  // class comment, are met.
  virtual void MaybeActivateObservation(
      feature_discovery::TrackableFeature feature) = 0;

  // Finishes the observation on the specified feature only when the observation
  // on this feature is in progress.
  virtual void MaybeFinishObservation(
      feature_discovery::TrackableFeature feature) = 0;

  virtual void AddObserver(ReporterObserver* observer) = 0;
  virtual void RemoveObserver(ReporterObserver* observer) = 0;
};

}  // namespace ash

#endif  // ASH_PUBLIC_CPP_FEATURE_DISCOVERY_DURATION_REPORTER_H_