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