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 #include "ash/system/locale/locale_notification_controller.h" 6 7 #include "ash/shell.h" 8 #include "ash/system/system_notifier.h" 9 #include "ash/system/tray/system_tray_notifier.h" 10 #include "base/strings/string16.h" 11 #include "grit/ash_resources.h" 12 #include "grit/ash_strings.h" 13 #include "ui/base/l10n/l10n_util.h" 14 #include "ui/base/resource/resource_bundle.h" 15 #include "ui/message_center/message_center.h" 16 #include "ui/message_center/notification.h" 17 #include "ui/message_center/notification_delegate.h" 18 #include "ui/message_center/notification_types.h" 19 20 using message_center::Notification; 21 22 namespace ash { 23 namespace { 24 25 const char kLocaleChangeNotificationId[] = "chrome://settings/locale"; 26 27 class LocaleNotificationDelegate : public message_center::NotificationDelegate { 28 public: 29 explicit LocaleNotificationDelegate(LocaleObserver::Delegate* delegate); 30 31 protected: 32 virtual ~LocaleNotificationDelegate(); 33 34 // message_center::NotificationDelegate overrides: 35 virtual void Display() OVERRIDE; 36 virtual void Error() OVERRIDE; 37 virtual void Close(bool by_user) OVERRIDE; 38 virtual bool HasClickedListener() OVERRIDE; 39 virtual void Click() OVERRIDE; 40 virtual void ButtonClick(int button_index) OVERRIDE; 41 42 private: 43 LocaleObserver::Delegate* delegate_; 44 45 DISALLOW_COPY_AND_ASSIGN(LocaleNotificationDelegate); 46 }; 47 48 LocaleNotificationDelegate::LocaleNotificationDelegate( 49 LocaleObserver::Delegate* delegate) 50 : delegate_(delegate) { 51 DCHECK(delegate_); 52 } 53 54 LocaleNotificationDelegate::~LocaleNotificationDelegate() { 55 } 56 57 void LocaleNotificationDelegate::Display() { 58 } 59 60 void LocaleNotificationDelegate::Error() { 61 } 62 63 void LocaleNotificationDelegate::Close(bool by_user) { 64 delegate_->AcceptLocaleChange(); 65 } 66 67 bool LocaleNotificationDelegate::HasClickedListener() { 68 return true; 69 } 70 71 void LocaleNotificationDelegate::Click() { 72 delegate_->AcceptLocaleChange(); 73 } 74 75 void LocaleNotificationDelegate::ButtonClick(int button_index) { 76 DCHECK_EQ(0, button_index); 77 delegate_->RevertLocaleChange(); 78 } 79 80 } // namespace 81 82 LocaleNotificationController::LocaleNotificationController() 83 : delegate_(NULL) { 84 Shell::GetInstance()->system_tray_notifier()->AddLocaleObserver(this); 85 } 86 87 LocaleNotificationController::~LocaleNotificationController() { 88 Shell::GetInstance()->system_tray_notifier()->RemoveLocaleObserver(this); 89 } 90 91 void LocaleNotificationController::OnLocaleChanged( 92 LocaleObserver::Delegate* delegate, 93 const std::string& cur_locale, 94 const std::string& from_locale, 95 const std::string& to_locale) { 96 if (!delegate) 97 return; 98 99 base::string16 from = l10n_util::GetDisplayNameForLocale( 100 from_locale, cur_locale, true); 101 base::string16 to = l10n_util::GetDisplayNameForLocale( 102 to_locale, cur_locale, true); 103 104 message_center::RichNotificationData optional; 105 optional.buttons.push_back(message_center::ButtonInfo( 106 l10n_util::GetStringFUTF16( 107 IDS_ASH_STATUS_TRAY_LOCALE_REVERT_MESSAGE, from))); 108 optional.never_timeout = true; 109 110 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 111 scoped_ptr<Notification> notification(new Notification( 112 message_center::NOTIFICATION_TYPE_SIMPLE, 113 kLocaleChangeNotificationId, 114 base::string16() /* title */, 115 l10n_util::GetStringFUTF16( 116 IDS_ASH_STATUS_TRAY_LOCALE_CHANGE_MESSAGE, from, to), 117 bundle.GetImageNamed(IDR_AURA_UBER_TRAY_LOCALE), 118 base::string16() /* display_source */, 119 message_center::NotifierId( 120 message_center::NotifierId::SYSTEM_COMPONENT, 121 system_notifier::kNotifierLocale), 122 optional, 123 new LocaleNotificationDelegate(delegate))); 124 message_center::MessageCenter::Get()->AddNotification(notification.Pass()); 125 } 126 127 } // namespace ash 128