immersive_mode_controller_ash.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_ASH_H_
6#define CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_ASH_H_
7
8#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
9
10#include "ash/wm/immersive_fullscreen_controller.h"
11#include "ash/wm/window_state_observer.h"
12#include "base/memory/scoped_ptr.h"
13#include "content/public/browser/notification_observer.h"
14#include "content/public/browser/notification_registrar.h"
15#include "ui/gfx/rect.h"
16
17namespace aura {
18class Window;
19}
20
21class ImmersiveModeControllerAsh
22    : public ImmersiveModeController,
23      public ash::ImmersiveFullscreenController::Delegate,
24      public ash::wm::WindowStateObserver,
25      public content::NotificationObserver {
26 public:
27  ImmersiveModeControllerAsh();
28  virtual ~ImmersiveModeControllerAsh();
29
30  // ImmersiveModeController overrides:
31  virtual void Init(BrowserView* browser_view) OVERRIDE;
32  virtual void SetEnabled(bool enabled) OVERRIDE;
33  virtual bool IsEnabled() const OVERRIDE;
34  virtual bool ShouldHideTabIndicators() const OVERRIDE;
35  virtual bool ShouldHideTopViews() const OVERRIDE;
36  virtual bool IsRevealed() const OVERRIDE;
37  virtual int GetTopContainerVerticalOffset(
38      const gfx::Size& top_container_size) const OVERRIDE;
39  virtual ImmersiveRevealedLock* GetRevealedLock(
40      AnimateReveal animate_reveal) OVERRIDE WARN_UNUSED_RESULT;
41  virtual void OnFindBarVisibleBoundsChanged(
42      const gfx::Rect& new_visible_bounds_in_screen) OVERRIDE;
43  virtual void SetupForTest() OVERRIDE;
44
45 private:
46  // Enables or disables observers for window restore and entering / exiting
47  // tab fullscreen.
48  void EnableWindowObservers(bool enable);
49
50  // Updates the browser root view's layout including window caption controls.
51  void LayoutBrowserRootView();
52
53  // Shrinks or expands the touch hit test by updating insets for the render
54  // window depending on if top_inset is positive or negative respectively.
55  // Used to ensure that touch events at the top of the screen go to the top
56  // container so a slide gesture can be generated when the content window is
57  // consuming all touch events sent to it.
58  void SetRenderWindowTopInsetsForTouch(int top_inset);
59
60  // Updates whether the tab strip is painted in a short "light bar" style.
61  // Returns true if the visibility of the tab indicators has changed.
62  bool UpdateTabIndicators();
63
64  // ImmersiveFullscreenController::Delegate overrides:
65  virtual void OnImmersiveRevealStarted() OVERRIDE;
66  virtual void OnImmersiveRevealEnded() OVERRIDE;
67  virtual void OnImmersiveFullscreenExited() OVERRIDE;
68  virtual void SetVisibleFraction(double visible_fraction) OVERRIDE;
69  virtual std::vector<gfx::Rect> GetVisibleBoundsInScreen() const OVERRIDE;
70
71  // ash::wm::WindowStateObserver override:
72  virtual void OnWindowShowTypeChanged(
73      ash::wm::WindowState* window_state,
74      ash::wm::WindowShowType old_type) OVERRIDE;
75
76  // content::NotificationObserver override:
77  virtual void Observe(int type,
78                       const content::NotificationSource& source,
79                       const content::NotificationDetails& details) OVERRIDE;
80
81  scoped_ptr<ash::ImmersiveFullscreenController> controller_;
82
83  // Not owned.
84  BrowserView* browser_view_;
85  aura::Window* native_window_;
86
87  // True if the observers for window restore and entering / exiting tab
88  // fullscreen are enabled.
89  bool observers_enabled_;
90
91  // Whether a short "light bar" version of the tab strip should be painted when
92  // the top-of-window views are closed. If |use_tab_indicators_| is false, the
93  // tab strip is not painted at all when the top-of-window views are closed.
94  bool use_tab_indicators_;
95
96  // The current visible bounds of the find bar, in screen coordinates. This is
97  // an empty rect if the find bar is not visible.
98  gfx::Rect find_bar_visible_bounds_in_screen_;
99
100  // The fraction of the TopContainerView's height which is visible. Zero when
101  // the top-of-window views are not revealed regardless of
102  // |use_tab_indicators_|.
103  double visible_fraction_;
104
105  content::NotificationRegistrar registrar_;
106
107  DISALLOW_COPY_AND_ASSIGN(ImmersiveModeControllerAsh);
108};
109
110#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_ASH_H_
111