// Copyright 2019 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_FPS_COUNTER_H_
#define ASH_PUBLIC_CPP_FPS_COUNTER_H_

#include "ash/public/cpp/ash_public_export.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/compositor/compositor_observer.h"

namespace ui {
class Compositor;
}

namespace ash {

// FpsCounter is used to measures the smoothness of animations applied in one
// operation, while AnimationMetricsRepoter measures smoothness of one
// particular animation.  For example, overview animation consists of multiple
// animations, such as wallpaper, windows and label etc. This allows us to
// measure such animations as a whole.
class ASH_PUBLIC_EXPORT FpsCounter : public ui::CompositorObserver {
 public:
  explicit FpsCounter(ui::Compositor* compositor);

  FpsCounter(const FpsCounter&) = delete;
  FpsCounter& operator=(const FpsCounter&) = delete;

  ~FpsCounter() override;

  // Comptues smoothness based on the updated frame number in compositor and the
  // duration between creation and the invocation time. Returns -1 if it cannot
  // compute the smoothness (when frame_count rolled over, or it finihed
  // immediately).
  int ComputeSmoothness();

  // ui::CompositorObserver:
  void OnCompositingShuttingDown(ui::Compositor* compositor) override;

  // Use this to update histogram even with zero animation.
  static void SetForceReportZeroAnimationForTest(bool value);

 private:
  raw_ptr<ui::Compositor, ExperimentalAsh> compositor_ = nullptr;
  int start_frame_number_ = 0;
  base::TimeTicks start_time_;
};

}  // namespace ash

#endif  // ASH_PUBLIC_CPP_FPS_COUNTER_H_