Index: chrome/browser/ui/views/message_center/web_notification_tray.cc |
diff --git a/chrome/browser/ui/views/message_center/web_notification_tray.cc b/chrome/browser/ui/views/message_center/web_notification_tray.cc |
index 300680784dd89223e9f9ba28d8f75ddd9b36060b..0e7a396be18a3e3f3ac9b29f293e02a1f488957e 100644 |
--- a/chrome/browser/ui/views/message_center/web_notification_tray.cc |
+++ b/chrome/browser/ui/views/message_center/web_notification_tray.cc |
@@ -4,176 +4,26 @@ |
#include "chrome/browser/ui/views/message_center/web_notification_tray.h" |
-#include "base/i18n/number_formatting.h" |
-#include "base/location.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/thread_task_runner_handle.h" |
#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/status_icons/status_icon.h" |
-#include "chrome/browser/status_icons/status_icon_menu_model.h" |
-#include "chrome/browser/status_icons/status_tray.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/grit/chromium_strings.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "content/public/browser/notification_service.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/canvas.h" |
-#include "ui/gfx/geometry/rect.h" |
-#include "ui/gfx/geometry/size.h" |
-#include "ui/gfx/image/image_skia_operations.h" |
#include "ui/gfx/screen.h" |
#include "ui/message_center/message_center_tray.h" |
#include "ui/message_center/message_center_tray_delegate.h" |
#include "ui/message_center/views/desktop_popup_alignment_delegate.h" |
#include "ui/message_center/views/message_popup_collection.h" |
-#include "ui/strings/grit/ui_strings.h" |
-#include "ui/views/widget/widget.h" |
- |
-#if defined(OS_LINUX) |
-#include "base/environment.h" |
-#include "base/nix/xdg_util.h" |
-#endif |
- |
-namespace { |
- |
-// Tray constants |
-const int kScreenEdgePadding = 2; |
- |
-// Number of pixels the message center is offset from the mouse. |
-const int kMouseOffset = 5; |
- |
-// Menu commands |
-const int kToggleQuietMode = 0; |
-const int kEnableQuietModeHour = 1; |
-const int kEnableQuietModeDay = 2; |
- |
-gfx::ImageSkia* GetIcon(int unread_count, bool is_quiet_mode) { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- int resource_id = IDR_NOTIFICATION_TRAY_EMPTY; |
- |
- if (unread_count) { |
- if (is_quiet_mode) |
- resource_id = IDR_NOTIFICATION_TRAY_DO_NOT_DISTURB_ATTENTION; |
- else |
- resource_id = IDR_NOTIFICATION_TRAY_ATTENTION; |
- } else if (is_quiet_mode) { |
- resource_id = IDR_NOTIFICATION_TRAY_DO_NOT_DISTURB_EMPTY; |
- } |
- |
- return rb.GetImageSkiaNamed(resource_id); |
-} |
- |
-bool CanDestroyStatusIcon() { |
-#if defined(OS_LINUX) |
- // Avoid creating multiple system tray icons on KDE4 and newer versions of KDE |
- // because the OS does not support removing system tray icons. |
- // TODO(pkotwicz): This is a hack for the sake of M40. Fix this properly. |
- scoped_ptr<base::Environment> env(base::Environment::Create()); |
- base::nix::DesktopEnvironment desktop_environment = |
- base::nix::GetDesktopEnvironment(env.get()); |
- return desktop_environment != base::nix::DESKTOP_ENVIRONMENT_KDE4; |
-#else |
- return true; |
-#endif |
-} |
- |
-} // namespace |
namespace message_center { |
-namespace internal { |
- |
-// Gets the position of the taskbar from the work area bounds. Returns |
-// ALIGNMENT_NONE if position cannot be found. |
-Alignment GetTaskbarAlignment() { |
- gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
- // TODO(dewittj): It's possible GetPrimaryDisplay is wrong. |
- gfx::Rect screen_bounds = screen->GetPrimaryDisplay().bounds(); |
- gfx::Rect work_area = screen->GetPrimaryDisplay().work_area(); |
- work_area.Inset(kScreenEdgePadding, kScreenEdgePadding); |
- |
- // Comparing the work area to the screen bounds gives us the location of the |
- // taskbar. If the work area is exactly the same as the screen bounds, |
- // we are unable to locate the taskbar so we say we don't know it's alignment. |
- if (work_area.height() < screen_bounds.height()) { |
- if (work_area.y() > screen_bounds.y()) |
- return ALIGNMENT_TOP; |
- return ALIGNMENT_BOTTOM; |
- } |
- if (work_area.width() < screen_bounds.width()) { |
- if (work_area.x() > screen_bounds.x()) |
- return ALIGNMENT_LEFT; |
- return ALIGNMENT_RIGHT; |
- } |
- |
- return ALIGNMENT_NONE; |
-} |
- |
-gfx::Point GetClosestCorner(const gfx::Rect& rect, const gfx::Point& query) { |
- gfx::Point center_point = rect.CenterPoint(); |
- gfx::Point rv; |
- |
- if (query.x() > center_point.x()) |
- rv.set_x(rect.right()); |
- else |
- rv.set_x(rect.x()); |
- |
- if (query.y() > center_point.y()) |
- rv.set_y(rect.bottom()); |
- else |
- rv.set_y(rect.y()); |
- |
- return rv; |
-} |
- |
-// Gets the corner of the screen where the message center should pop up. |
-Alignment GetAnchorAlignment(const gfx::Rect& work_area, gfx::Point corner) { |
- gfx::Point center = work_area.CenterPoint(); |
- |
- Alignment anchor_alignment = |
- center.y() > corner.y() ? ALIGNMENT_TOP : ALIGNMENT_BOTTOM; |
- anchor_alignment = |
- (Alignment)(anchor_alignment | |
- (center.x() > corner.x() ? ALIGNMENT_LEFT : ALIGNMENT_RIGHT)); |
- |
- return anchor_alignment; |
-} |
- |
-} // namespace internal |
- |
MessageCenterTrayDelegate* CreateMessageCenterTray() { |
- return new WebNotificationTray(g_browser_process->local_state()); |
+ return new WebNotificationTray(); |
} |
-WebNotificationTray::WebNotificationTray(PrefService* local_state) |
- : message_center_delegate_(NULL), |
- status_icon_(NULL), |
- status_icon_menu_(NULL), |
- should_update_tray_content_(true) { |
+WebNotificationTray::WebNotificationTray() { |
message_center_tray_.reset( |
new MessageCenterTray(this, g_browser_process->message_center())); |
- last_quiet_mode_state_ = message_center()->IsQuietMode(); |
alignment_delegate_.reset(new message_center::DesktopPopupAlignmentDelegate); |
popup_collection_.reset(new message_center::MessagePopupCollection( |
NULL, message_center(), message_center_tray_.get(), |
alignment_delegate_.get())); |
- |
-#if defined(OS_WIN) |
- // |local_state| can be NULL in tests. |
- if (local_state) { |
- did_force_tray_visible_.reset(new BooleanPrefMember()); |
- did_force_tray_visible_->Init(prefs::kMessageCenterForcedOnTaskbar, |
- local_state); |
- } |
-#endif |
- title_ = l10n_util::GetStringFUTF16( |
- IDS_MESSAGE_CENTER_FOOTER_WITH_PRODUCT_TITLE, |
- l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); |
} |
WebNotificationTray::~WebNotificationTray() { |
@@ -181,7 +31,6 @@ WebNotificationTray::~WebNotificationTray() { |
// problems. |
popup_collection_.reset(); |
message_center_tray_.reset(); |
- DestroyStatusIcon(); |
} |
message_center::MessageCenter* WebNotificationTray::message_center() { |
@@ -200,37 +49,16 @@ void WebNotificationTray::HidePopups() { |
} |
bool WebNotificationTray::ShowMessageCenter() { |
- message_center_delegate_ = |
- new MessageCenterWidgetDelegate(this, |
- message_center_tray_.get(), |
- false, // settings initally invisible |
- GetPositionInfo(), |
- title_); |
- |
- return true; |
+ // Message center not available on Windows/Linux. |
+ return false; |
} |
void WebNotificationTray::HideMessageCenter() { |
- if (message_center_delegate_) { |
- views::Widget* widget = message_center_delegate_->GetWidget(); |
- if (widget) |
- widget->Close(); |
- } |
} |
bool WebNotificationTray::ShowNotifierSettings() { |
- if (message_center_delegate_) { |
- message_center_delegate_->SetSettingsVisible(true); |
- return true; |
- } |
- message_center_delegate_ = |
- new MessageCenterWidgetDelegate(this, |
- message_center_tray_.get(), |
- true, // settings initally visible |
- GetPositionInfo(), |
- title_); |
- |
- return true; |
+ // Message center settings not available on Windows/Linux. |
+ return false; |
} |
bool WebNotificationTray::IsContextMenuEnabled() const { |
@@ -240,192 +68,10 @@ bool WebNotificationTray::IsContextMenuEnabled() const { |
} |
void WebNotificationTray::OnMessageCenterTrayChanged() { |
- if (status_icon_) { |
- bool quiet_mode_state = message_center()->IsQuietMode(); |
- if (last_quiet_mode_state_ != quiet_mode_state) { |
- last_quiet_mode_state_ = quiet_mode_state; |
- |
- // Quiet mode has changed, update the quiet mode menu. |
- status_icon_menu_->SetCommandIdChecked(kToggleQuietMode, |
- quiet_mode_state); |
- } |
- } else if (message_center()->NotificationCount() == 0) { |
- // If there's no existing status icon and we still don't have any |
- // notifications to display, nothing needs to be done. |
- return; |
- } |
- |
- // See the comments in ash/system/web_notification/web_notification_tray.cc |
- // for why PostTask. |
- should_update_tray_content_ = true; |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(&WebNotificationTray::UpdateStatusIcon, AsWeakPtr())); |
-} |
- |
-void WebNotificationTray::OnStatusIconClicked() { |
- // TODO(dewittj): It's possible GetNativeScreen is wrong for win-aura. |
- gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
- mouse_click_point_ = screen->GetCursorScreenPoint(); |
- message_center_tray_->ToggleMessageCenterBubble(); |
-} |
- |
-void WebNotificationTray::ExecuteCommand(int command_id, int event_flags) { |
- if (command_id == kToggleQuietMode) { |
- bool in_quiet_mode = message_center()->IsQuietMode(); |
- message_center()->SetQuietMode(!in_quiet_mode); |
- return; |
- } |
- base::TimeDelta expires_in = command_id == kEnableQuietModeDay |
- ? base::TimeDelta::FromDays(1) |
- : base::TimeDelta::FromHours(1); |
- message_center()->EnterQuietModeWithExpire(expires_in); |
-} |
- |
-void WebNotificationTray::UpdateStatusIcon() { |
- if (!should_update_tray_content_) |
- return; |
- should_update_tray_content_ = false; |
- |
- int unread_notifications = message_center()->UnreadNotificationCount(); |
- |
- base::string16 tool_tip; |
- if (unread_notifications > 0) { |
- base::string16 str_unread_count = base::FormatNumber(unread_notifications); |
- tool_tip = l10n_util::GetStringFUTF16(IDS_MESSAGE_CENTER_TOOLTIP_UNREAD, |
- str_unread_count); |
- } else { |
- tool_tip = l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_TOOLTIP); |
- } |
- |
- if (message_center()->GetVisibleNotifications().empty() && |
- CanDestroyStatusIcon()) { |
- DestroyStatusIcon(); |
- return; |
- } |
- |
- gfx::ImageSkia* icon_image = GetIcon( |
- unread_notifications, |
- message_center()->IsQuietMode()); |
- |
- if (status_icon_) { |
- status_icon_->SetImage(*icon_image); |
- status_icon_->SetToolTip(tool_tip); |
- return; |
- } |
- |
- CreateStatusIcon(*icon_image, tool_tip); |
-} |
- |
-void WebNotificationTray::SendHideMessageCenter() { |
- message_center_tray_->HideMessageCenterBubble(); |
-} |
- |
-void WebNotificationTray::MarkMessageCenterHidden() { |
- if (message_center_delegate_) { |
- message_center_tray_->MarkMessageCenterHidden(); |
- message_center_delegate_ = NULL; |
- } |
-} |
- |
-PositionInfo WebNotificationTray::GetPositionInfo() { |
- PositionInfo pos_info; |
- |
- gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
- gfx::Rect work_area = screen->GetPrimaryDisplay().work_area(); |
- work_area.Inset(kScreenEdgePadding, kScreenEdgePadding); |
- |
- gfx::Point corner = internal::GetClosestCorner(work_area, mouse_click_point_); |
- |
- pos_info.taskbar_alignment = internal::GetTaskbarAlignment(); |
- |
- // We assume the taskbar is either at the top or at the bottom if we are not |
- // able to find it. |
- if (pos_info.taskbar_alignment == ALIGNMENT_NONE) { |
- if (mouse_click_point_.y() > corner.y()) |
- pos_info.taskbar_alignment = ALIGNMENT_TOP; |
- else |
- pos_info.taskbar_alignment = ALIGNMENT_BOTTOM; |
- } |
- |
- pos_info.message_center_alignment = |
- internal::GetAnchorAlignment(work_area, corner); |
- |
- pos_info.inital_anchor_point = corner; |
- pos_info.max_height = work_area.height(); |
- |
- if (work_area.Contains(mouse_click_point_)) { |
- // Message center is in the work area. So position it few pixels above the |
- // mouse click point if alignemnt is towards bottom and few pixels below if |
- // alignment is towards top. |
- pos_info.inital_anchor_point.set_y( |
- mouse_click_point_.y() + |
- (pos_info.message_center_alignment & ALIGNMENT_BOTTOM ? -kMouseOffset |
- : kMouseOffset)); |
- |
- // Subtract the distance between mouse click point and the closest |
- // (insetted) edge from the max height to show the message center within the |
- // (insetted) work area bounds. Also subtract the offset from the mouse |
- // click point we added earlier. |
- pos_info.max_height -= |
- std::abs(mouse_click_point_.y() - corner.y()) + kMouseOffset; |
- } |
- return pos_info; |
} |
MessageCenterTray* WebNotificationTray::GetMessageCenterTray() { |
return message_center_tray_.get(); |
} |
-void WebNotificationTray::CreateStatusIcon(const gfx::ImageSkia& image, |
- const base::string16& tool_tip) { |
- if (status_icon_) |
- return; |
- |
- StatusTray* status_tray = g_browser_process->status_tray(); |
- if (!status_tray) |
- return; |
- |
- status_icon_ = status_tray->CreateStatusIcon( |
- StatusTray::NOTIFICATION_TRAY_ICON, image, tool_tip); |
- if (!status_icon_) |
- return; |
- |
- status_icon_->AddObserver(this); |
- AddQuietModeMenu(status_icon_); |
-} |
- |
-void WebNotificationTray::DestroyStatusIcon() { |
- if (!status_icon_) |
- return; |
- |
- status_icon_->RemoveObserver(this); |
- StatusTray* status_tray = g_browser_process->status_tray(); |
- if (status_tray) |
- status_tray->RemoveStatusIcon(status_icon_); |
- status_icon_menu_ = NULL; |
- status_icon_ = NULL; |
-} |
- |
-void WebNotificationTray::AddQuietModeMenu(StatusIcon* status_icon) { |
- DCHECK(status_icon); |
- |
- scoped_ptr<StatusIconMenuModel> menu(new StatusIconMenuModel(this)); |
- menu->AddCheckItem(kToggleQuietMode, |
- l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE)); |
- menu->SetCommandIdChecked(kToggleQuietMode, message_center()->IsQuietMode()); |
- menu->AddItem(kEnableQuietModeHour, |
- l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE_1HOUR)); |
- menu->AddItem(kEnableQuietModeDay, |
- l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE_1DAY)); |
- |
- status_icon_menu_ = menu.get(); |
- status_icon->SetContextMenu(menu.Pass()); |
-} |
- |
-MessageCenterWidgetDelegate* |
-WebNotificationTray::GetMessageCenterWidgetDelegateForTest() { |
- return message_center_delegate_; |
-} |
- |
} // namespace message_center |