1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/ash_export.h"
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/display_controller.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/callback.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/gtest_prod_util.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/timer/timer.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/display_observer.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/size.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace chromeos {
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochFORWARD_DECLARE_TEST(DisplayPreferencesTest, PreventStore);
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace chromeos
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace views {
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Label;
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Widget;
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace views
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace ash {
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct DisplayMode;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// A class which manages the notification of display resolution change and
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// also manages the timeout in case the new resolution is unusable.
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass ASH_EXPORT ResolutionNotificationController
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : public gfx::DisplayObserver,
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      public DisplayController::Observer {
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public:
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ResolutionNotificationController();
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual ~ResolutionNotificationController();
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Prepare a resolution change notification for |display_id| from
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |old_resolution| to |new_resolution|, which offers a button to revert the
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // change in case something goes wrong. The notification times out if there's
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // only one display connected and the user is trying to modify its resolution.
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // In that case, the timeout has to be set since the user cannot make any
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // changes if something goes wrong.
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  //
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This method does not create a notification itself. The notification will be
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // created the next OnDisplayConfigurationChanged(), which will be called
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // asynchronously after the resolution change is requested. So typically this
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // method will be combined with resolution change methods like
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // DisplayManager::SetDisplayMode().
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PrepareNotification(int64 display_id,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const DisplayMode& old_resolution,
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const DisplayMode& new_resolution,
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const base::Closure& accept_callback);
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Returns true if the notification is visible or scheduled to be visible and
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the notification times out.
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool DoesNotificationTimeout();
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Called by the notification delegate when the user accepts the display
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // resolution change. Set |close_notification| to true when the notification
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // should be removed.
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void AcceptResolutionChange(bool close_notification);
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Called by the notification delegate when the user wants to revert the
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // display resolution change.
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void RevertResolutionChange();
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private:
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  friend class ResolutionNotificationControllerTest;
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(ResolutionNotificationControllerTest, Timeout);
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(chromeos::DisplayPreferencesTest, PreventStore);
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // A struct to bundle the data for a single resolution change.
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  struct ResolutionChangeInfo;
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static const int kTimeoutInSec;
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static const char kNotificationId[];
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Create a new notification, or update its content if it already exists.
80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |enable_spoken_feedback| is set to false when the notification is updated
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // during the countdown so the update isn't necessarily read by the spoken
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // feedback.
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void CreateOrUpdateNotification(bool enable_spoken_feedback);
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Called every second for timeout.
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void OnTimerTick();
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // gfx::DisplayObserver overrides:
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE;
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       uint32_t metrics) OVERRIDE;
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // DisplayController::Observer overrides:
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayConfigurationChanged() OVERRIDE;
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static void SuppressTimerForTest();
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<ResolutionChangeInfo> change_info_;
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationController);
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch};
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace ash
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif  // ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
107