[Metrics] Make MetricsStateManager take a callback param to check if UMA is enabled.
[chromium-blink-merge.git] / chrome / browser / ui / views / frame / immersive_mode_controller.h
blob807289f20745ea54fb365a2fb01b52add82be019
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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_H_
8 #include "base/compiler_specific.h"
9 #include "base/observer_list.h"
10 #include "chrome/browser/ui/host_desktop.h"
12 #if defined(USE_ASH)
13 #include "ash/wm/immersive_revealed_lock.h"
14 #endif
16 class BrowserView;
18 namespace gfx {
19 class Rect;
20 class Size;
23 #if defined(USE_ASH)
24 typedef ash::ImmersiveRevealedLock ImmersiveRevealedLock;
25 #else
26 // Do nothing version of ash::ImmersiveRevealedLock.
27 class ImmersiveRevealedLock {
28 public:
29 ImmersiveRevealedLock() {}
30 ~ImmersiveRevealedLock() {}
32 #endif
34 // Controller for an "immersive mode" similar to MacOS presentation mode where
35 // the top-of-window views are hidden until the mouse hits the top of the
36 // screen. The tab strip is optionally painted with miniature "tab indicator"
37 // rectangles.
38 // Currently, immersive mode is only available for Chrome OS.
39 class ImmersiveModeController {
40 public:
41 enum AnimateReveal {
42 ANIMATE_REVEAL_YES,
43 ANIMATE_REVEAL_NO
46 class Observer {
47 public:
48 // Called when a reveal of the top-of-window views has been initiated.
49 virtual void OnImmersiveRevealStarted() {}
51 // Called when the immersive mode controller has been destroyed.
52 virtual void OnImmersiveModeControllerDestroyed() {}
54 protected:
55 virtual ~Observer() {}
58 ImmersiveModeController();
59 virtual ~ImmersiveModeController();
61 // Must initialize after browser view has a Widget and native window.
62 virtual void Init(BrowserView* browser_view) = 0;
64 // Enables or disables immersive mode.
65 virtual void SetEnabled(bool enabled) = 0;
66 virtual bool IsEnabled() const = 0;
68 // True if the miniature "tab indicators" should be hidden in the main browser
69 // view when immersive mode is enabled.
70 virtual bool ShouldHideTabIndicators() const = 0;
72 // True when the top views are hidden due to immersive mode.
73 virtual bool ShouldHideTopViews() const = 0;
75 // True when the top views are fully or partially visible.
76 virtual bool IsRevealed() const = 0;
78 // Returns the top container's vertical offset relative to its parent. When
79 // revealing or closing the top-of-window views, part of the top container is
80 // offscreen.
81 // This method takes in the top container's size because it is called as part
82 // of computing the new bounds for the top container in
83 // BrowserViewLayout::UpdateTopContainerBounds().
84 virtual int GetTopContainerVerticalOffset(
85 const gfx::Size& top_container_size) const = 0;
87 // Returns a lock which will keep the top-of-window views revealed for its
88 // lifetime. Several locks can be obtained. When all of the locks are
89 // destroyed, if immersive mode is enabled and there is nothing else keeping
90 // the top-of-window views revealed, the top-of-window views will be closed.
91 // This method always returns a valid lock regardless of whether immersive
92 // mode is enabled. The lock's lifetime can span immersive mode being
93 // enabled / disabled.
94 // If acquiring the lock causes a reveal, the top-of-window views will animate
95 // according to |animate_reveal|.
96 // The caller takes ownership of the returned lock.
97 virtual ImmersiveRevealedLock* GetRevealedLock(
98 AnimateReveal animate_reveal) WARN_UNUSED_RESULT = 0;
100 // Called by the find bar to indicate that its visible bounds have changed.
101 // |new_visible_bounds_in_screen| should be empty if the find bar is not
102 // visible.
103 virtual void OnFindBarVisibleBoundsChanged(
104 const gfx::Rect& new_visible_bounds_in_screen) = 0;
106 // Disables animations and moves the mouse so that it is not over the
107 // top-of-window views for the sake of testing. Must be called before
108 // enabling immersive fullscreen.
109 virtual void SetupForTest() = 0;
111 virtual void AddObserver(Observer* observer);
112 virtual void RemoveObserver(Observer* observer);
114 protected:
115 ObserverList<Observer> observers_;
117 private:
118 DISALLOW_COPY_AND_ASSIGN(ImmersiveModeController);
121 namespace chrome {
123 // Implemented in immersive_mode_controller_factory.cc.
124 ImmersiveModeController* CreateImmersiveModeController(
125 chrome::HostDesktopType host_desktop_type);
127 } // namespace chrome
129 #endif // CHROME_BROWSER_UI_VIEWS_FRAME_IMMERSIVE_MODE_CONTROLLER_H_