resolution_notification_controller.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2013 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 ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
6#define ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
7
8#include "ash/ash_export.h"
9#include "ash/display/display_controller.h"
10#include "base/callback.h"
11#include "base/gtest_prod_util.h"
12#include "base/timer/timer.h"
13#include "ui/gfx/display_observer.h"
14#include "ui/gfx/size.h"
15
16namespace chromeos {
17FORWARD_DECLARE_TEST(DisplayPreferencesTest, PreventStore);
18}  // namespace chromeos
19
20namespace views {
21class Label;
22class Widget;
23}  // namespace views
24
25namespace ash {
26
27// A class which manages the notification of display resolution change and
28// also manages the timeout in case the new resolution is unusable.
29class ASH_EXPORT ResolutionNotificationController
30    : public gfx::DisplayObserver,
31      public DisplayController::Observer {
32 public:
33  ResolutionNotificationController();
34  virtual ~ResolutionNotificationController();
35
36  // Updates the display resolution for |display_id| to |new_resolution| and
37  // creates a notification for this change which offers a button to revert the
38  // change in case something goes wrong. The notification times out if there's
39  // only one display connected and the user is trying to modify its resolution.
40  // In that case, the timeout has to be set since the user cannot make any
41  // changes if something goes wrong.
42  void SetDisplayResolutionAndNotify(
43      int64 display_id,
44      const gfx::Size& old_resolution,
45      const gfx::Size& new_resolution,
46      const base::Closure& accept_callback);
47
48  // Returns true if the notification is visible or scheduled to be visible and
49  // the notification times out.
50  bool DoesNotificationTimeout();
51
52  // Called by the notification delegate when the user accepts the display
53  // resolution change. Set |close_notification| to true when the notification
54  // should be removed.
55  void AcceptResolutionChange(bool close_notification);
56
57  // Called by the notification delegate when the user wants to revert the
58  // display resolution change.
59  void RevertResolutionChange();
60
61 private:
62  friend class ResolutionNotificationControllerTest;
63  FRIEND_TEST_ALL_PREFIXES(ResolutionNotificationControllerTest, Timeout);
64  FRIEND_TEST_ALL_PREFIXES(chromeos::DisplayPreferencesTest, PreventStore);
65
66  // A struct to bundle the data for a single resolution change.
67  struct ResolutionChangeInfo;
68
69  static const int kTimeoutInSec;
70  static const char kNotificationId[];
71
72  // Create a new notification, or update its content if it already exists.
73  // |enable_spoken_feedback| is set to false when the notification is updated
74  // during the countdown so the update isn't necessarily read by the spoken
75  // feedback.
76  void CreateOrUpdateNotification(bool enable_spoken_feedback);
77
78  // Called every second for timeout.
79  void OnTimerTick();
80
81  // gfx::DisplayObserver overrides:
82  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE;
83  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE;
84  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
85                                       uint32_t metrics) OVERRIDE;
86
87  // DisplayController::Observer overrides:
88  virtual void OnDisplayConfigurationChanged() OVERRIDE;
89
90  static void SuppressTimerForTest();
91
92  scoped_ptr<ResolutionChangeInfo> change_info_;
93
94  DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationController);
95};
96
97}  // namespace ash
98
99#endif  // ASH_DISPLAY_RESOLUTION_NOTIFICATION_CONTROLLER_H_
100