// Copyright 2017 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 CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_
#define CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_

#include <vector>

#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/aura/client/focus_change_observer.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/window_observer.h"
#include "ui/wm/public/activation_client.h"

namespace aura {
class Window;
}

namespace chromecast {

class CastFocusClientAura : public aura::WindowObserver,
                            public aura::client::FocusClient,
                            public wm::ActivationClient {
 public:
  CastFocusClientAura();
  ~CastFocusClientAura() override;

  // aura::client::FocusClient implementation:
  void AddObserver(aura::client::FocusChangeObserver* observer) override;
  void RemoveObserver(aura::client::FocusChangeObserver* observer) override;
  void FocusWindow(aura::Window* window) override;
  void ResetFocusWithinActiveWindow(aura::Window* window) override;
  aura::Window* GetFocusedWindow() override;

  // Overridden from wm::ActivationClient:
  void AddObserver(wm::ActivationChangeObserver* observer) override;
  void RemoveObserver(wm::ActivationChangeObserver* observer) override;
  void ActivateWindow(aura::Window* window) override;
  void DeactivateWindow(aura::Window* window) override;
  const aura::Window* GetActiveWindow() const override;
  aura::Window* GetActivatableWindow(aura::Window* window) const override;
  const aura::Window* GetToplevelWindow(
      const aura::Window* window) const override;
  bool CanActivateWindow(const aura::Window* window) const override;

 private:
  // aura::WindowObserver implementation:
  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
  void OnWindowDestroying(aura::Window* window) override;
  void OnWindowHierarchyChanging(const HierarchyChangeParams& params) override;

  // Change the focused window and notify focus observers.
  void UpdateWindowFocus();
  // Get the window that should be focused.
  aura::Window* GetWindowToFocus();
  // Get the top-most window in a window's hierarchy to determine z order.
  // This is the window directly under the root window (a child window of the
  // root window).
  aura::Window* GetZOrderWindow(aura::Window* window) const {
    return const_cast<aura::Window*>(
        GetZOrderWindow(const_cast<const aura::Window*>(window)));
  }
  const aura::Window* GetZOrderWindow(const aura::Window* window) const;

  base::ObserverList<aura::client::FocusChangeObserver>::Unchecked
      focus_observers_;

  // Track the currently focused window, which isn't necessarily a top-level
  // window.
  aura::Window* focused_window_;
  // Track the windows that we've focused in the past, so that we can restore
  // focus to them.  We assume that this is a small list so that we can perform
  // linear ops on it.
  std::vector<aura::Window*> focusable_windows_;

  DISALLOW_COPY_AND_ASSIGN(CastFocusClientAura);
};

}  // namespace chromecast

#endif  // CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_
