| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/system/session_length_limit/tray_session_length_limit.h" | 5 #include "ash/system/session_length_limit/tray_session_length_limit.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ash/shelf/shelf_types.h" | 9 #include "ash/shelf/shelf_types.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 // If the remaining session time falls below this threshold, the user should be | 44 // If the remaining session time falls below this threshold, the user should be |
| 45 // informed that the session is about to expire. | 45 // informed that the session is about to expire. |
| 46 const int kExpiringSoonThresholdInSeconds = 5 * 60; // 5 minutes. | 46 const int kExpiringSoonThresholdInSeconds = 5 * 60; // 5 minutes. |
| 47 | 47 |
| 48 // Color in which the remaining session time is normally shown. | 48 // Color in which the remaining session time is normally shown. |
| 49 const SkColor kRemainingTimeColor = SK_ColorWHITE; | 49 const SkColor kRemainingTimeColor = SK_ColorWHITE; |
| 50 // Color in which the remaining session time is shown when it is expiring soon. | 50 // Color in which the remaining session time is shown when it is expiring soon. |
| 51 const SkColor kRemainingTimeExpiringSoonColor = SK_ColorRED; | 51 const SkColor kRemainingTimeExpiringSoonColor = SK_ColorRED; |
| 52 | 52 |
| 53 const char kSessionLengthTimeoutNotificationId[] = "chrome://session/timeout"; | |
| 54 | |
| 55 views::Label* CreateAndSetupLabel() { | 53 views::Label* CreateAndSetupLabel() { |
| 56 views::Label* label = new views::Label; | 54 views::Label* label = new views::Label; |
| 57 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 55 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 58 SetupLabelForTray(label); | 56 SetupLabelForTray(label); |
| 59 gfx::Font font = label->font(); | 57 gfx::Font font = label->font(); |
| 60 label->SetFont(font.DeriveFont(0, font.GetStyle() & ~gfx::Font::BOLD)); | 58 label->SetFont(font.DeriveFont(0, font.GetStyle() & ~gfx::Font::BOLD)); |
| 61 return label; | 59 return label; |
| 62 } | 60 } |
| 63 | 61 |
| 64 base::string16 IntToTwoDigitString(int value) { | 62 base::string16 IntToTwoDigitString(int value) { |
| 65 DCHECK_GE(value, 0); | 63 DCHECK_GE(value, 0); |
| 66 DCHECK_LE(value, 99); | 64 DCHECK_LE(value, 99); |
| 67 if (value < 10) | 65 if (value < 10) |
| 68 return ASCIIToUTF16("0") + base::IntToString16(value); | 66 return ASCIIToUTF16("0") + base::IntToString16(value); |
| 69 return base::IntToString16(value); | 67 return base::IntToString16(value); |
| 70 } | 68 } |
| 71 | 69 |
| 72 base::string16 FormatRemainingSessionTimeNotification( | 70 base::string16 FormatRemainingSessionTimeNotification( |
| 73 const base::TimeDelta& remaining_session_time) { | 71 const base::TimeDelta& remaining_session_time) { |
| 74 return l10n_util::GetStringFUTF16( | 72 return l10n_util::GetStringFUTF16( |
| 75 IDS_ASH_STATUS_TRAY_REMAINING_SESSION_TIME_NOTIFICATION, | 73 IDS_ASH_STATUS_TRAY_REMAINING_SESSION_TIME_NOTIFICATION, |
| 76 ui::TimeFormat::TimeDurationLong(remaining_session_time)); | 74 ui::TimeFormat::TimeDurationLong(remaining_session_time)); |
| 77 } | 75 } |
| 78 | 76 |
| 79 // Creates, or updates the notification for session length timeout with | 77 // Creates, or updates the notification for session length timeout with |
| 80 // |remaining_time|. |state_changed| is true when its internal state has been | 78 // |remaining_time|. |state_changed| is true when its internal state has been |
| 81 // changed from another. | 79 // changed from another. |
| 82 void CreateOrUpdateNotification(const base::TimeDelta& remaining_time, | 80 void CreateOrUpdateNotification(const std::string& notification_id, |
| 81 const base::TimeDelta& remaining_time, |
| 83 bool state_changed) { | 82 bool state_changed) { |
| 84 message_center::MessageCenter* message_center = | 83 message_center::MessageCenter* message_center = |
| 85 message_center::MessageCenter::Get(); | 84 message_center::MessageCenter::Get(); |
| 86 | 85 |
| 87 // Do not create a new notification if no state has changed. It may happen | 86 // Do not create a new notification if no state has changed. It may happen |
| 88 // when the notification is already closed by the user, see crbug.com/285941. | 87 // when the notification is already closed by the user, see crbug.com/285941. |
| 89 if (!state_changed && | 88 if (!state_changed && !message_center->HasNotification(notification_id)) |
| 90 !message_center->HasNotification(kSessionLengthTimeoutNotificationId)) { | |
| 91 return; | 89 return; |
| 92 } | |
| 93 | 90 |
| 94 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | 91 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
| 95 message_center::RichNotificationData data; | 92 message_center::RichNotificationData data; |
| 96 // Makes the spoken feedback only when the state has been changed. | 93 // Makes the spoken feedback only when the state has been changed. |
| 97 data.should_make_spoken_feedback_for_popup_updates = state_changed; | 94 data.should_make_spoken_feedback_for_popup_updates = state_changed; |
| 98 scoped_ptr<Notification> notification(new Notification( | 95 scoped_ptr<Notification> notification(new Notification( |
| 99 message_center::NOTIFICATION_TYPE_SIMPLE, | 96 message_center::NOTIFICATION_TYPE_SIMPLE, |
| 100 kSessionLengthTimeoutNotificationId, | 97 notification_id, |
| 101 FormatRemainingSessionTimeNotification(remaining_time), | 98 FormatRemainingSessionTimeNotification(remaining_time), |
| 102 base::string16() /* message */, | 99 base::string16() /* message */, |
| 103 bundle.GetImageNamed(IDR_AURA_UBER_TRAY_SESSION_LENGTH_LIMIT_TIMER), | 100 bundle.GetImageNamed(IDR_AURA_UBER_TRAY_SESSION_LENGTH_LIMIT_TIMER), |
| 104 base::string16() /* display_source */, | 101 base::string16() /* display_source */, |
| 105 message_center::NotifierId( | 102 message_center::NotifierId( |
| 106 message_center::NotifierId::SYSTEM_COMPONENT, | 103 message_center::NotifierId::SYSTEM_COMPONENT, |
| 107 system_notifier::kNotifierSessionLengthTimeout), | 104 system_notifier::kNotifierSessionLengthTimeout), |
| 108 data, | 105 data, |
| 109 NULL /* delegate */)); | 106 NULL /* delegate */)); |
| 110 notification->SetSystemPriority(); | 107 notification->SetSystemPriority(); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 set_border(views::Border::CreateEmptyBorder( | 268 set_border(views::Border::CreateEmptyBorder( |
| 272 0, kTrayLabelItemHorizontalPaddingBottomAlignment, | 269 0, kTrayLabelItemHorizontalPaddingBottomAlignment, |
| 273 0, kTrayLabelItemHorizontalPaddingBottomAlignment)); | 270 0, kTrayLabelItemHorizontalPaddingBottomAlignment)); |
| 274 } else { | 271 } else { |
| 275 set_border(NULL); | 272 set_border(NULL); |
| 276 } | 273 } |
| 277 } | 274 } |
| 278 | 275 |
| 279 } // namespace tray | 276 } // namespace tray |
| 280 | 277 |
| 278 // static |
| 279 const char TraySessionLengthLimit::kNotificationId[] = |
| 280 "chrome://session/timeout"; |
| 281 |
| 281 TraySessionLengthLimit::TraySessionLengthLimit(SystemTray* system_tray) | 282 TraySessionLengthLimit::TraySessionLengthLimit(SystemTray* system_tray) |
| 282 : SystemTrayItem(system_tray), | 283 : SystemTrayItem(system_tray), |
| 283 tray_view_(NULL), | 284 tray_view_(NULL), |
| 284 limit_state_(LIMIT_NONE) { | 285 limit_state_(LIMIT_NONE) { |
| 285 Shell::GetInstance()->system_tray_notifier()-> | 286 Shell::GetInstance()->system_tray_notifier()-> |
| 286 AddSessionLengthLimitObserver(this); | 287 AddSessionLengthLimitObserver(this); |
| 287 Update(); | 288 Update(); |
| 288 } | 289 } |
| 289 | 290 |
| 290 TraySessionLengthLimit::~TraySessionLengthLimit() { | 291 TraySessionLengthLimit::~TraySessionLengthLimit() { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 timer_->Start(FROM_HERE, | 348 timer_->Start(FROM_HERE, |
| 348 base::TimeDelta::FromSeconds(1), | 349 base::TimeDelta::FromSeconds(1), |
| 349 this, | 350 this, |
| 350 &TraySessionLengthLimit::Update); | 351 &TraySessionLengthLimit::Update); |
| 351 } | 352 } |
| 352 } | 353 } |
| 353 | 354 |
| 354 switch (limit_state_) { | 355 switch (limit_state_) { |
| 355 case LIMIT_NONE: | 356 case LIMIT_NONE: |
| 356 message_center::MessageCenter::Get()->RemoveNotification( | 357 message_center::MessageCenter::Get()->RemoveNotification( |
| 357 kSessionLengthTimeoutNotificationId, false /* by_user */); | 358 kNotificationId, false /* by_user */); |
| 358 break; | 359 break; |
| 359 case LIMIT_SET: | 360 case LIMIT_SET: |
| 360 CreateOrUpdateNotification( | 361 CreateOrUpdateNotification( |
| 362 kNotificationId, |
| 361 remaining_session_time_, | 363 remaining_session_time_, |
| 362 previous_limit_state == LIMIT_NONE); | 364 previous_limit_state == LIMIT_NONE); |
| 363 break; | 365 break; |
| 364 case LIMIT_EXPIRING_SOON: | 366 case LIMIT_EXPIRING_SOON: |
| 365 CreateOrUpdateNotification( | 367 CreateOrUpdateNotification( |
| 368 kNotificationId, |
| 366 remaining_session_time_, | 369 remaining_session_time_, |
| 367 previous_limit_state == LIMIT_NONE || | 370 previous_limit_state == LIMIT_NONE || |
| 368 previous_limit_state == LIMIT_SET); | 371 previous_limit_state == LIMIT_SET); |
| 369 break; | 372 break; |
| 370 } | 373 } |
| 371 | 374 |
| 372 // Update the tray view last so that it can check whether the notification | 375 // Update the tray view last so that it can check whether the notification |
| 373 // view is currently visible or not. | 376 // view is currently visible or not. |
| 374 if (tray_view_) | 377 if (tray_view_) |
| 375 tray_view_->Update(); | 378 tray_view_->Update(); |
| 376 } | 379 } |
| 377 | 380 |
| 381 bool TraySessionLengthLimit::IsTrayViewVisibleForTest() { |
| 382 return tray_view_ && tray_view_->visible(); |
| 383 } |
| 384 |
| 378 } // namespace internal | 385 } // namespace internal |
| 379 } // namespace ash | 386 } // namespace ash |
| OLD | NEW |