display_error_observer_chromeos.cc revision 3551c9c881056c480085172ff9840cab31610854
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/display/display_error_observer_chromeos.h"
6
7#include "grit/ash_resources.h"
8#include "grit/ash_strings.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/message_center/message_center.h"
12#include "ui/message_center/notification.h"
13#include "ui/message_center/notification_delegate.h"
14#include "ui/message_center/notification_list.h"
15
16using message_center::Notification;
17
18namespace ash {
19namespace internal {
20namespace {
21
22const char kDisplayErrorNotificationId[] = "chrome://settings/display/error";
23
24class DisplayErrorNotificationDelegate
25    : public message_center::NotificationDelegate {
26 public:
27  DisplayErrorNotificationDelegate() {}
28
29  // message_center::NotificationDelegate overrides:
30  virtual void Display() OVERRIDE {}
31  virtual void Error() OVERRIDE {}
32  virtual void Close(bool by_user) OVERRIDE {}
33  virtual bool HasClickedListener() OVERRIDE { return false; }
34  virtual void Click() OVERRIDE { }
35
36 protected:
37  virtual ~DisplayErrorNotificationDelegate() {}
38
39 private:
40  DISALLOW_COPY_AND_ASSIGN(DisplayErrorNotificationDelegate);
41};
42
43}  // namespace
44
45DisplayErrorObserver::DisplayErrorObserver() {
46}
47
48DisplayErrorObserver::~DisplayErrorObserver() {
49}
50
51void DisplayErrorObserver::OnDisplayModeChangeFailed(
52    chromeos::OutputState new_state) {
53  // Always remove the notification to make sure the notification appears
54  // as a popup in any situation.
55  message_center::MessageCenter::Get()->RemoveNotification(
56      kDisplayErrorNotificationId, false /* by_user */);
57
58  int message_id = (new_state == chromeos::STATE_DUAL_MIRROR) ?
59      IDS_ASH_DISPLAY_FAILURE_ON_MIRRORING :
60      IDS_ASH_DISPLAY_FAILURE_ON_NON_MIRRORING;
61
62  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
63  scoped_ptr<Notification> notification(new Notification(
64      message_center::NOTIFICATION_TYPE_SIMPLE,
65      kDisplayErrorNotificationId,
66      l10n_util::GetStringUTF16(message_id),
67      base::string16(),  // message
68      bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY),
69      base::string16(),  // display_source
70      std::string(),  // extension_id
71      message_center::RichNotificationData(),
72      new DisplayErrorNotificationDelegate()));
73  message_center::MessageCenter::Get()->AddNotification(notification.Pass());
74}
75
76string16 DisplayErrorObserver::GetTitleOfDisplayErrorNotificationForTest() {
77  message_center::NotificationList::Notifications notifications =
78      message_center::MessageCenter::Get()->GetNotifications();
79  for (message_center::NotificationList::Notifications::const_iterator iter =
80           notifications.begin(); iter != notifications.end(); ++iter) {
81    if ((*iter)->id() == kDisplayErrorNotificationId)
82      return (*iter)->title();
83  }
84
85  return base::string16();
86}
87
88}  // namespace internal
89}  // namespace ash
90