// 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_MULTI_USER_USER_SWITCH_ANIMATOR_H_
#define ASH_MULTI_USER_USER_SWITCH_ANIMATOR_H_

#include <map>
#include <memory>
#include <string>

#include "ash/ash_export.h"
#include "ash/public/interfaces/wallpaper.mojom.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "components/account_id/account_id.h"
#include "ui/aura/window.h"

namespace ash {

class MultiUserWindowManager;

// A class which performs transitions animations between users. Upon creation,
// the animation gets started and upon destruction the animation gets finished
// if not done yet.
// Specifying |animation_disabled| upon creation will perform the transition
// without visible animations.
class ASH_EXPORT UserSwitchAnimator {
 public:
  // The animation step for the user change animation.
  enum AnimationStep {
    ANIMATION_STEP_HIDE_OLD_USER,  // Hiding the old user (and shelf).
    ANIMATION_STEP_SHOW_NEW_USER,  // Show the shelf of the new user.
    ANIMATION_STEP_FINALIZE,       // All animations are done - final cleanup.
    ANIMATION_STEP_ENDED           // The animation has ended.
  };

  // Creates a UserSwitchAnimator to animate between the current user and
  // |user_info|.
  UserSwitchAnimator(MultiUserWindowManager* owner,
                     mojom::WallpaperUserInfoPtr user_info,
                     base::TimeDelta animation_speed);
  ~UserSwitchAnimator();

  // Check if a window is covering the entire work area of the screen it is on.
  static bool CoversScreen(aura::Window* window);

  bool IsAnimationFinished() { return animation_step_ == ANIMATION_STEP_ENDED; }

  // Returns the user id for which the wallpaper is currently shown.
  // If a wallpaper is transitioning to B it will be returned as "->B".
  const std::string& wallpaper_user_id_for_test() {
    return wallpaper_user_id_for_test_;
  }

  // Advances the user switch animation to the next step. It reads the current
  // step from |animation_step_| and increments it thereafter. When
  // |ANIMATION_STEP_FINALIZE| gets executed, the animation is finished and the
  // timer (if one exists) will get destroyed.
  void AdvanceUserTransitionAnimation();

  // When the system is shutting down, the animation can be stopped without
  // ending it.
  void CancelAnimation();

 private:
  // The window configuration of screen covering windows before an animation.
  enum TransitioningScreenCover {
    NO_USER_COVERS_SCREEN,   // No window covers the entire screen.
    OLD_USER_COVERS_SCREEN,  // The current user has at least one window
                             // covering the entire screen.
    NEW_USER_COVERS_SCREEN,  // The user which becomes active has at least one
                             // window covering the entire screen.
    BOTH_USERS_COVER_SCREEN  // Both users have at least one window each
                             // covering the entire screen.
  };

  // Finalizes the animation and ends the timer (if there is one).
  void FinalizeAnimation();

  // Execute the user wallpaper animations for |animation_step|.
  void TransitionWallpaper(AnimationStep animtion_step);

  // Update the shelf for |animation_step|.
  void TransitionUserShelf(AnimationStep animtion_step);

  // Execute the window animations for |animation_step|.
  void TransitionWindows(AnimationStep animation_step);

  // Check if a window is maximized / fullscreen / covering the entire screen.
  // If a |root_window| is given, the screen coverage of that root_window is
  // tested, otherwise all screens.
  TransitioningScreenCover GetScreenCover(aura::Window* root_window);

  // Builds the map that a user ID to the list of windows that should be shown
  // for this user. This operation happens once upon the construction of this
  // animation.
  void BuildUserToWindowsListMap();

  // The owning window manager.
  MultiUserWindowManager* owner_;

  // Contains the wallpaper configuration for the user switching to. This is
  // passed to the WallpaperController at the right time.
  mojom::WallpaperUserInfoPtr wallpaper_user_info_;

  // The new user to set.
  AccountId new_account_id_;

  // The animation speed in ms. If 0, animations are disabled.
  base::TimeDelta animation_speed_;

  // The next animation step for AdvanceUserTransitionAnimation().
  AnimationStep animation_step_;

  // The screen cover status before the animation has started.
  const TransitioningScreenCover screen_cover_;

  // Mapping users IDs to the list of windows to show for these users.
  typedef std::map<AccountId, aura::Window::Windows> UserToWindowsMap;
  UserToWindowsMap windows_by_account_id_;

  // A timer which watches to executes the second part of a "user changed"
  // animation. Note that this timer exists only during such an animation.
  std::unique_ptr<base::RepeatingTimer> user_changed_animation_timer_;

  // For unit tests: Check which wallpaper was set.
  std::string wallpaper_user_id_for_test_;

  DISALLOW_COPY_AND_ASSIGN(UserSwitchAnimator);
};

}  // namespace ash

#endif  // ASH_MULTI_USER_USER_SWITCH_ANIMATOR_H_
