text: // Copyright 2014 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef ASH_DISPLAY_DISPLAY_ANIMATOR_H_
  #define ASH_DISPLAY_DISPLAY_ANIMATOR_H_
  
  #include <map>
  #include <memory>
  
  #include "ash/ash_export.h"
  #include "ash/display/display_animator.h"
  #include "base/callback.h"
  #include "base/macros.h"
  #include "base/memory/weak_ptr.h"
  #include "base/timer/timer.h"
  #include "ui/display/manager/display_configurator.h"
  
  namespace aura {
  class Window;
  }  // namespace aura
  
  namespace ui {
  class Layer;
  }  // namespace ui
  
  namespace ash {
  
  // DisplayAnimator provides the visual effects for
  // display::DisplayConfigurator, such like fade-out/in during changing
  // the display mode.
  class ASH_EXPORT DisplayAnimator
      : public display::DisplayConfigurator::Observer {
   public:
    DisplayAnimator();
    ~DisplayAnimator() override;
  
    void StartFadeOutAnimation(base::Closure callback);
    void StartFadeInAnimation();
  
   protected:
    // display::DisplayConfigurator::Observer overrides:
    void OnDisplayModeChanged(
        const display::DisplayConfigurator::DisplayStateList& outputs) override;
    void OnDisplayModeChangeFailed(
        const display::DisplayConfigurator::DisplayStateList& displays,
        display::MultipleDisplayState failed_new_state) override;
  
   private:
    // Clears all hiding layers.  Note that in case that this method is called
    // during an animation, the method call will cancel all of the animations
    // and *not* call the registered callback.
    void ClearHidingLayers();
  
    std::map<aura::Window*, std::unique_ptr<ui::Layer>> hiding_layers_;
    std::unique_ptr<base::OneShotTimer> timer_;
    base::WeakPtrFactory<DisplayAnimator> weak_ptr_factory_;
  
    DISALLOW_COPY_AND_ASSIGN(DisplayAnimator);
  };
  
  }  // namespace ash
  
  #endif  // ASH_DISPLAY_DISPLAY_ANIMATOR_H_
  