| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/display/resolution_notification_controller.h" | 5 #include "ash/display/resolution_notification_controller.h" |
| 6 | 6 |
| 7 #include "ash/display/display_controller.h" | 7 #include "ash/display/display_controller.h" |
| 8 #include "ash/display/display_info.h" |
| 8 #include "ash/display/display_manager.h" | 9 #include "ash/display/display_manager.h" |
| 9 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 10 #include "ash/system/system_notifier.h" | 11 #include "ash/system/system_notifier.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 12 #include "grit/ash_resources.h" | 13 #include "grit/ash_resources.h" |
| 13 #include "grit/ash_strings.h" | 14 #include "grit/ash_strings.h" |
| 14 #include "ui/base/l10n/l10n_util.h" | 15 #include "ui/base/l10n/l10n_util.h" |
| 15 #include "ui/base/l10n/time_format.h" | 16 #include "ui/base/l10n/time_format.h" |
| 16 #include "ui/base/resource/resource_bundle.h" | 17 #include "ui/base/resource/resource_bundle.h" |
| 17 #include "ui/gfx/display.h" | 18 #include "ui/gfx/display.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 96 |
| 96 // static | 97 // static |
| 97 const int ResolutionNotificationController::kTimeoutInSec = 15; | 98 const int ResolutionNotificationController::kTimeoutInSec = 15; |
| 98 | 99 |
| 99 // static | 100 // static |
| 100 const char ResolutionNotificationController::kNotificationId[] = | 101 const char ResolutionNotificationController::kNotificationId[] = |
| 101 "chrome://settings/display/resolution"; | 102 "chrome://settings/display/resolution"; |
| 102 | 103 |
| 103 struct ResolutionNotificationController::ResolutionChangeInfo { | 104 struct ResolutionNotificationController::ResolutionChangeInfo { |
| 104 ResolutionChangeInfo(int64 display_id, | 105 ResolutionChangeInfo(int64 display_id, |
| 105 const gfx::Size& old_resolution, | 106 const DisplayMode& old_resolution, |
| 106 const gfx::Size& new_resolution, | 107 const DisplayMode& new_resolution, |
| 107 const base::Closure& accept_callback); | 108 const base::Closure& accept_callback); |
| 108 ~ResolutionChangeInfo(); | 109 ~ResolutionChangeInfo(); |
| 109 | 110 |
| 110 // The id of the display where the resolution change happens. | 111 // The id of the display where the resolution change happens. |
| 111 int64 display_id; | 112 int64 display_id; |
| 112 | 113 |
| 113 // The resolution before the change. | 114 // The resolution before the change. |
| 114 gfx::Size old_resolution; | 115 DisplayMode old_resolution; |
| 115 | 116 |
| 116 // The requested resolution. Note that this may be different from | 117 // The requested resolution. Note that this may be different from |
| 117 // |current_resolution| which is the actual resolution set. | 118 // |current_resolution| which is the actual resolution set. |
| 118 gfx::Size new_resolution; | 119 DisplayMode new_resolution; |
| 119 | 120 |
| 120 // The actual resolution after the change. | 121 // The actual resolution after the change. |
| 121 gfx::Size current_resolution; | 122 DisplayMode current_resolution; |
| 122 | 123 |
| 123 // The callback when accept is chosen. | 124 // The callback when accept is chosen. |
| 124 base::Closure accept_callback; | 125 base::Closure accept_callback; |
| 125 | 126 |
| 126 // The remaining timeout in seconds. 0 if the change does not time out. | 127 // The remaining timeout in seconds. 0 if the change does not time out. |
| 127 uint8 timeout_count; | 128 uint8 timeout_count; |
| 128 | 129 |
| 129 // The timer to invoke OnTimerTick() every second. This cannot be | 130 // The timer to invoke OnTimerTick() every second. This cannot be |
| 130 // OneShotTimer since the message contains text "automatically closed in xx | 131 // OneShotTimer since the message contains text "automatically closed in xx |
| 131 // seconds..." which has to be updated every second. | 132 // seconds..." which has to be updated every second. |
| 132 base::RepeatingTimer<ResolutionNotificationController> timer; | 133 base::RepeatingTimer<ResolutionNotificationController> timer; |
| 133 | 134 |
| 134 private: | 135 private: |
| 135 DISALLOW_COPY_AND_ASSIGN(ResolutionChangeInfo); | 136 DISALLOW_COPY_AND_ASSIGN(ResolutionChangeInfo); |
| 136 }; | 137 }; |
| 137 | 138 |
| 138 ResolutionNotificationController::ResolutionChangeInfo::ResolutionChangeInfo( | 139 ResolutionNotificationController::ResolutionChangeInfo::ResolutionChangeInfo( |
| 139 int64 display_id, | 140 int64 display_id, |
| 140 const gfx::Size& old_resolution, | 141 const DisplayMode& old_resolution, |
| 141 const gfx::Size& new_resolution, | 142 const DisplayMode& new_resolution, |
| 142 const base::Closure& accept_callback) | 143 const base::Closure& accept_callback) |
| 143 : display_id(display_id), | 144 : display_id(display_id), |
| 144 old_resolution(old_resolution), | 145 old_resolution(old_resolution), |
| 145 new_resolution(new_resolution), | 146 new_resolution(new_resolution), |
| 146 accept_callback(accept_callback), | 147 accept_callback(accept_callback), |
| 147 timeout_count(0) { | 148 timeout_count(0) { |
| 148 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); | 149 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
| 149 if (!display_manager->HasInternalDisplay() && | 150 if (!display_manager->HasInternalDisplay() && |
| 150 display_manager->num_connected_displays() == 1u) { | 151 display_manager->num_connected_displays() == 1u) { |
| 151 timeout_count = kTimeoutInSec; | 152 timeout_count = kTimeoutInSec; |
| 152 } | 153 } |
| 153 } | 154 } |
| 154 | 155 |
| 155 ResolutionNotificationController::ResolutionChangeInfo:: | 156 ResolutionNotificationController::ResolutionChangeInfo:: |
| 156 ~ResolutionChangeInfo() { | 157 ~ResolutionChangeInfo() { |
| 157 } | 158 } |
| 158 | 159 |
| 159 ResolutionNotificationController::ResolutionNotificationController() { | 160 ResolutionNotificationController::ResolutionNotificationController() { |
| 160 Shell::GetInstance()->display_controller()->AddObserver(this); | 161 Shell::GetInstance()->display_controller()->AddObserver(this); |
| 161 Shell::GetScreen()->AddObserver(this); | 162 Shell::GetScreen()->AddObserver(this); |
| 162 } | 163 } |
| 163 | 164 |
| 164 ResolutionNotificationController::~ResolutionNotificationController() { | 165 ResolutionNotificationController::~ResolutionNotificationController() { |
| 165 Shell::GetInstance()->display_controller()->RemoveObserver(this); | 166 Shell::GetInstance()->display_controller()->RemoveObserver(this); |
| 166 Shell::GetScreen()->RemoveObserver(this); | 167 Shell::GetScreen()->RemoveObserver(this); |
| 167 } | 168 } |
| 168 | 169 |
| 169 void ResolutionNotificationController::SetDisplayResolutionAndNotify( | 170 void ResolutionNotificationController::PrepareNotification( |
| 170 int64 display_id, | 171 int64 display_id, |
| 171 const gfx::Size& old_resolution, | 172 const DisplayMode& old_resolution, |
| 172 const gfx::Size& new_resolution, | 173 const DisplayMode& new_resolution, |
| 173 const base::Closure& accept_callback) { | 174 const base::Closure& accept_callback) { |
| 174 // If multiple resolution changes are invoked for the same display, | 175 // If multiple resolution changes are invoked for the same display, |
| 175 // the original resolution for the first resolution change has to be used | 176 // the original resolution for the first resolution change has to be used |
| 176 // instead of the specified |old_resolution|. | 177 // instead of the specified |old_resolution|. |
| 177 gfx::Size original_resolution; | 178 DisplayMode original_resolution; |
| 178 if (change_info_ && change_info_->display_id == display_id) { | 179 if (change_info_ && change_info_->display_id == display_id) { |
| 179 DCHECK(change_info_->new_resolution == old_resolution); | 180 DCHECK(change_info_->new_resolution.size == old_resolution.size); |
| 180 original_resolution = change_info_->old_resolution; | 181 original_resolution = change_info_->old_resolution; |
| 181 } | 182 } |
| 182 | 183 |
| 183 change_info_.reset(new ResolutionChangeInfo( | 184 change_info_.reset(new ResolutionChangeInfo( |
| 184 display_id, old_resolution, new_resolution, accept_callback)); | 185 display_id, old_resolution, new_resolution, accept_callback)); |
| 185 if (!original_resolution.IsEmpty()) | 186 if (!original_resolution.size.IsEmpty()) |
| 186 change_info_->old_resolution = original_resolution; | 187 change_info_->old_resolution = original_resolution; |
| 187 | |
| 188 // SetDisplayResolution() causes OnConfigurationChanged() and the notification | |
| 189 // will be shown at that point. | |
| 190 Shell::GetInstance()->display_manager()->SetDisplayResolution( | |
| 191 display_id, new_resolution); | |
| 192 } | 188 } |
| 193 | 189 |
| 194 bool ResolutionNotificationController::DoesNotificationTimeout() { | 190 bool ResolutionNotificationController::DoesNotificationTimeout() { |
| 195 return change_info_ && change_info_->timeout_count > 0; | 191 return change_info_ && change_info_->timeout_count > 0; |
| 196 } | 192 } |
| 197 | 193 |
| 198 void ResolutionNotificationController::CreateOrUpdateNotification( | 194 void ResolutionNotificationController::CreateOrUpdateNotification( |
| 199 bool enable_spoken_feedback) { | 195 bool enable_spoken_feedback) { |
| 200 message_center::MessageCenter* message_center = | 196 message_center::MessageCenter* message_center = |
| 201 message_center::MessageCenter::Get(); | 197 message_center::MessageCenter::Get(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 217 } | 213 } |
| 218 data.buttons.push_back(message_center::ButtonInfo( | 214 data.buttons.push_back(message_center::ButtonInfo( |
| 219 l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_RESOLUTION_CHANGE_REVERT))); | 215 l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_RESOLUTION_CHANGE_REVERT))); |
| 220 | 216 |
| 221 data.should_make_spoken_feedback_for_popup_updates = enable_spoken_feedback; | 217 data.should_make_spoken_feedback_for_popup_updates = enable_spoken_feedback; |
| 222 | 218 |
| 223 const base::string16 display_name = base::UTF8ToUTF16( | 219 const base::string16 display_name = base::UTF8ToUTF16( |
| 224 Shell::GetInstance()->display_manager()->GetDisplayNameForId( | 220 Shell::GetInstance()->display_manager()->GetDisplayNameForId( |
| 225 change_info_->display_id)); | 221 change_info_->display_id)); |
| 226 const base::string16 message = | 222 const base::string16 message = |
| 227 (change_info_->new_resolution == change_info_->current_resolution) ? | 223 (change_info_->new_resolution.size == |
| 224 change_info_->current_resolution.size) ? |
| 228 l10n_util::GetStringFUTF16( | 225 l10n_util::GetStringFUTF16( |
| 229 IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, | 226 IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, |
| 230 display_name, | 227 display_name, |
| 231 base::UTF8ToUTF16(change_info_->new_resolution.ToString())) : | 228 base::UTF8ToUTF16(change_info_->new_resolution.size.ToString())) : |
| 232 l10n_util::GetStringFUTF16( | 229 l10n_util::GetStringFUTF16( |
| 233 IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TO_UNSUPPORTED, | 230 IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TO_UNSUPPORTED, |
| 234 display_name, | 231 display_name, |
| 235 base::UTF8ToUTF16(change_info_->new_resolution.ToString()), | 232 base::UTF8ToUTF16(change_info_->new_resolution.size.ToString()), |
| 236 base::UTF8ToUTF16(change_info_->current_resolution.ToString())); | 233 base::UTF8ToUTF16(change_info_->current_resolution.size.ToString())); |
| 237 | 234 |
| 238 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | 235 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
| 239 scoped_ptr<Notification> notification(new Notification( | 236 scoped_ptr<Notification> notification(new Notification( |
| 240 message_center::NOTIFICATION_TYPE_SIMPLE, | 237 message_center::NOTIFICATION_TYPE_SIMPLE, |
| 241 kNotificationId, | 238 kNotificationId, |
| 242 message, | 239 message, |
| 243 timeout_message, | 240 timeout_message, |
| 244 bundle.GetImageNamed(IDR_AURA_NOTIFICATION_DISPLAY), | 241 bundle.GetImageNamed(IDR_AURA_NOTIFICATION_DISPLAY), |
| 245 base::string16() /* display_source */, | 242 base::string16() /* display_source */, |
| 246 message_center::NotifierId( | 243 message_center::NotifierId( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 272 } | 269 } |
| 273 base::Closure callback = change_info_->accept_callback; | 270 base::Closure callback = change_info_->accept_callback; |
| 274 change_info_.reset(); | 271 change_info_.reset(); |
| 275 callback.Run(); | 272 callback.Run(); |
| 276 } | 273 } |
| 277 | 274 |
| 278 void ResolutionNotificationController::RevertResolutionChange() { | 275 void ResolutionNotificationController::RevertResolutionChange() { |
| 279 message_center::MessageCenter::Get()->RemoveNotification( | 276 message_center::MessageCenter::Get()->RemoveNotification( |
| 280 kNotificationId, false /* by_user */); | 277 kNotificationId, false /* by_user */); |
| 281 int64 display_id = change_info_->display_id; | 278 int64 display_id = change_info_->display_id; |
| 282 gfx::Size old_resolution = change_info_->old_resolution; | 279 DisplayMode old_resolution = change_info_->old_resolution; |
| 283 change_info_.reset(); | 280 change_info_.reset(); |
| 284 Shell::GetInstance()->display_manager()->SetDisplayResolution( | 281 Shell::GetInstance()->display_manager()->SetDisplayMode( |
| 285 display_id, old_resolution); | 282 display_id, old_resolution); |
| 286 } | 283 } |
| 287 | 284 |
| 288 void ResolutionNotificationController::OnDisplayAdded( | 285 void ResolutionNotificationController::OnDisplayAdded( |
| 289 const gfx::Display& new_display) { | 286 const gfx::Display& new_display) { |
| 290 } | 287 } |
| 291 | 288 |
| 292 void ResolutionNotificationController::OnDisplayRemoved( | 289 void ResolutionNotificationController::OnDisplayRemoved( |
| 293 const gfx::Display& old_display) { | 290 const gfx::Display& old_display) { |
| 294 if (change_info_ && change_info_->display_id == old_display.id()) | 291 if (change_info_ && change_info_->display_id == old_display.id()) |
| 295 RevertResolutionChange(); | 292 RevertResolutionChange(); |
| 296 } | 293 } |
| 297 | 294 |
| 298 void ResolutionNotificationController::OnDisplayMetricsChanged( | 295 void ResolutionNotificationController::OnDisplayMetricsChanged( |
| 299 const gfx::Display&, uint32_t) { | 296 const gfx::Display&, uint32_t) { |
| 300 } | 297 } |
| 301 | 298 |
| 302 void ResolutionNotificationController::OnDisplayConfigurationChanged() { | 299 void ResolutionNotificationController::OnDisplayConfigurationChanged() { |
| 303 if (!change_info_) | 300 if (!change_info_) |
| 304 return; | 301 return; |
| 305 | 302 |
| 306 const DisplayInfo& info = Shell::GetInstance()->display_manager()-> | 303 change_info_->current_resolution = Shell::GetInstance()->display_manager()-> |
| 307 GetDisplayInfo(change_info_->display_id); | 304 GetActiveModeForDisplayId(change_info_->display_id); |
| 308 change_info_->current_resolution = info.bounds_in_native().size(); | |
| 309 CreateOrUpdateNotification(true); | 305 CreateOrUpdateNotification(true); |
| 310 if (g_use_timer && change_info_->timeout_count > 0) { | 306 if (g_use_timer && change_info_->timeout_count > 0) { |
| 311 change_info_->timer.Start(FROM_HERE, | 307 change_info_->timer.Start(FROM_HERE, |
| 312 base::TimeDelta::FromSeconds(1), | 308 base::TimeDelta::FromSeconds(1), |
| 313 this, | 309 this, |
| 314 &ResolutionNotificationController::OnTimerTick); | 310 &ResolutionNotificationController::OnTimerTick); |
| 315 } | 311 } |
| 316 } | 312 } |
| 317 | 313 |
| 318 void ResolutionNotificationController::SuppressTimerForTest() { | 314 void ResolutionNotificationController::SuppressTimerForTest() { |
| 319 g_use_timer = false; | 315 g_use_timer = false; |
| 320 } | 316 } |
| 321 | 317 |
| 322 } // namespace ash | 318 } // namespace ash |
| OLD | NEW |