12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_TABS_TAB_AUDIO_INDICATOR_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_UI_TABS_TAB_AUDIO_INDICATOR_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/animation/animation_delegate.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Canvas;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Rect;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Animation;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AnimationContainer;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LinearAnimation;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is used to draw an animating tab audio indicator.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TabAudioIndicator : public ui::AnimationDelegate {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Delegate {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void ScheduleAudioIndicatorPaint() = 0;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   protected:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Delegate() {}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TabAudioIndicator(Delegate* delegate);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TabAudioIndicator();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_favicon(const gfx::ImageSkia& favicon) { favicon_ = favicon; }
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetAnimationContainer(ui::AnimationContainer* animation_container);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetIsPlayingAudio(bool is_playing_audio);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsAnimating();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Paint(gfx::Canvas* canvas, const gfx::Rect& rect);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum State {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_NOT_ANIMATING,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_ANIMATING,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_ANIMATION_ENDING,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(TabAudioIndicatorTest, AnimationState);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(TabAudioIndicatorTest, SchedulePaint);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // AnimationDelegate:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the equalizer levels for all 3 columns. The values are tweened between
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current and target frame.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> GetCurrentEqualizerLevels() const;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Delegate* delegate_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::LinearAnimation> animation_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ui::AnimationContainer> animation_container_;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::ImageSkia favicon_;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The equalizer frame that's currently being displayed.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t frame_index_;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The equalizer levels that were last displayed. This is used to prevent
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unnecessary drawing when animation progress doesn't result in equalizer
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // levels changing.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> last_displayed_equalizer_levels_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  State state_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TabAudioIndicator);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_TABS_TAB_AUDIO_INDICATOR_H_
86