chromium/ash/assistant/ui/logo_view/logo_view_impl.h

// Copyright 2018 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_ASSISTANT_UI_LOGO_VIEW_LOGO_VIEW_IMPL_H_
#define ASH_ASSISTANT_UI_LOGO_VIEW_LOGO_VIEW_IMPL_H_

#include <cstdint>

#include "ash/assistant/ui/logo_view/logo_view.h"
#include "ash/assistant/ui/logo_view/shape/mic_part_shape.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/assistant/internal/logo_view/input_value_provider/sound_level_input_value_provider.h"
#include "chromeos/assistant/internal/logo_view/logo_model/logo.h"
#include "chromeos/assistant/internal/logo_view/state_animator.h"
#include "chromeos/assistant/internal/logo_view/state_animator_timer_delegate.h"
#include "chromeos/assistant/internal/logo_view/state_model.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/compositor/compositor_animation_observer.h"

namespace chromeos {
namespace assistant {
class Dot;
}  // namespace assistant
}  // namespace chromeos

namespace gfx {
class Canvas;
}  // namespace gfx

namespace ui {
class Compositor;
}

namespace views {
class View;
}

namespace ash {

class Shape;

// Displays the GLIF (Google Logo and Identity Family). It displays the dots and
// the google logo. It does not display the Super G.
class LogoViewImpl : public LogoView,
                     public chromeos::assistant::StateAnimatorTimerDelegate,
                     public ui::CompositorAnimationObserver {
  METADATA_HEADER(LogoViewImpl, LogoView)

 public:
  using Dot = chromeos::assistant::Dot;
  using Logo = chromeos::assistant::Logo;
  using StateAnimator = chromeos::assistant::StateAnimator;
  using StateModel = chromeos::assistant::StateModel;

  LogoViewImpl();
  LogoViewImpl(const LogoViewImpl&) = delete;
  LogoViewImpl& operator=(const LogoViewImpl&) = delete;
  ~LogoViewImpl() override;

  void SetState(State state, bool animate) override;
  void SetSpeechLevel(float speech_level) override;

  // chromeos::assistant::StateAnimatorTimerDelegate:
  int64_t StartTimer() override;
  void StopTimer() override;

 private:
  // ui::CompositorAnimationObserver:
  void OnAnimationStep(base::TimeTicks timestamp) override;
  void OnCompositingShuttingDown(ui::Compositor* compositor) override;

  void DrawDots(gfx::Canvas* canvas);
  void DrawDot(gfx::Canvas* canvas, Dot* dot);
  void DrawMicPart(gfx::Canvas* canvas, Dot* dot, float x, float y);
  void DrawShape(gfx::Canvas* canvas, Shape* shape, SkColor color);
  void DrawLine(gfx::Canvas* canvas, Dot* dot, float x, float y);
  void DrawCircle(gfx::Canvas* canvas, Dot* dot, float x, float y);

  // TODO(b/79579731): Implement the letter animation.
  void DrawLetter(gfx::Canvas* canvas, Dot* dot, float x, float y) {}

  // views::View:
  void OnPaint(gfx::Canvas* canvas) override;
  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
  void VisibilityChanged(views::View* starting_from, bool is_visible) override;

  Logo logo_;

  MicPartShape mic_part_shape_;

  StateModel state_model_;

  StateAnimator state_animator_;

  raw_ptr<ui::Compositor> animating_compositor_ = nullptr;

  float dots_scale_ = 1.0f;

  chromeos::assistant::SoundLevelInputValueProvider
      sound_level_input_value_provider_;
};

}  // namespace ash

#endif  // ASH_ASSISTANT_UI_LOGO_VIEW_LOGO_VIEW_IMPL_H_