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