Index: ash/system/tray/system_tray.cc |
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc |
index d70727663590a55f6bbc90df1ca170a5f821fa37..f26ba46f4cec30ec904b46672f4bdf5788b2a099 100644 |
--- a/ash/system/tray/system_tray.cc |
+++ b/ash/system/tray/system_tray.cc |
@@ -20,6 +20,7 @@ |
#include "ash/system/power/power_supply_status.h" |
#include "ash/system/power/tray_power.h" |
#include "ash/system/settings/tray_settings.h" |
+#include "ash/system/status_area_widget.h" |
#include "ash/system/tray/system_tray_bubble.h" |
#include "ash/system/tray/system_tray_delegate.h" |
#include "ash/system/tray/system_tray_item.h" |
@@ -48,70 +49,10 @@ |
#include "ui/views/layout/fill_layout.h" |
#include "ui/views/view.h" |
-namespace { |
- |
-// Adjust the size of SystemTrayContainer with additional padding. |
-const int kTrayContainerVerticalPaddingBottomAlignment = 1; |
-const int kTrayContainerHorizontalPaddingBottomAlignment = 1; |
-const int kTrayContainerVerticalPaddingVerticalAlignment = 1; |
-const int kTrayContainerHorizontalPaddingVerticalAlignment = 1; |
- |
-} // namespace |
- |
namespace ash { |
namespace internal { |
-// Container for all the items in the tray. The container auto-resizes the |
-// widget when necessary. |
-class SystemTrayContainer : public views::View { |
- public: |
- SystemTrayContainer() {} |
- virtual ~SystemTrayContainer() {} |
- |
- void UpdateLayout(ShelfAlignment alignment) { |
- // Adjust the size of status tray dark background by adding additional |
- // empty border. |
- if (alignment == SHELF_ALIGNMENT_BOTTOM) { |
- set_border(views::Border::CreateEmptyBorder( |
- kTrayContainerVerticalPaddingBottomAlignment, |
- kTrayContainerHorizontalPaddingBottomAlignment, |
- kTrayContainerVerticalPaddingBottomAlignment, |
- kTrayContainerHorizontalPaddingBottomAlignment)); |
- views::View::SetLayoutManager(new views::BoxLayout( |
- views::BoxLayout::kHorizontal, 0, 0, 0)); |
- } else { |
- set_border(views::Border::CreateEmptyBorder( |
- kTrayContainerVerticalPaddingVerticalAlignment, |
- kTrayContainerHorizontalPaddingVerticalAlignment, |
- kTrayContainerVerticalPaddingVerticalAlignment, |
- kTrayContainerHorizontalPaddingVerticalAlignment)); |
- views::View::SetLayoutManager(new views::BoxLayout( |
- views::BoxLayout::kVertical, 0, 0, 0)); |
- } |
- PreferredSizeChanged(); |
- } |
- |
- private: |
- // Overridden from views::View. |
- virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { |
- PreferredSizeChanged(); |
- } |
- |
- virtual void ChildVisibilityChanged(View* child) OVERRIDE { |
- PreferredSizeChanged(); |
- } |
- |
- virtual void ViewHierarchyChanged(bool is_add, |
- View* parent, |
- View* child) OVERRIDE { |
- if (parent == this) |
- PreferredSizeChanged(); |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(SystemTrayContainer); |
-}; |
- |
// Observe the tray layer animation and update the anchor when it changes. |
// TODO(stevenjb): Observe or mirror the actual animation, not just the start |
// and end points. |
@@ -145,8 +86,9 @@ using internal::SystemTrayBubble; |
using internal::SystemTrayLayerAnimationObserver; |
using internal::TrayBubbleView; |
-SystemTray::SystemTray() |
- : items_(), |
+SystemTray::SystemTray(internal::StatusAreaWidget* status_area_widget) |
+ : internal::TrayBackgroundView(status_area_widget), |
+ items_(), |
accessibility_observer_(NULL), |
audio_observer_(NULL), |
bluetooth_observer_(NULL), |
@@ -162,10 +104,6 @@ SystemTray::SystemTray() |
should_show_launcher_(false), |
default_bubble_height_(0), |
hide_notifications_(false) { |
- tray_container_ = new internal::SystemTrayContainer; |
- tray_container_->UpdateLayout(shelf_alignment()); |
- SetContents(tray_container_); |
- SetBorder(); |
} |
SystemTray::~SystemTray() { |
@@ -245,7 +183,7 @@ void SystemTray::AddTrayItem(SystemTrayItem* item) { |
ash::Shell::GetInstance()->system_tray()->shelf_alignment()); |
if (tray_item) { |
- tray_container_->AddChildViewAt(tray_item, 0); |
+ tray_container()->AddChildViewAt(tray_item, 0); |
PreferredSizeChanged(); |
tray_item_map_[item] = tray_item; |
} |
@@ -329,8 +267,12 @@ void SystemTray::SetHideNotifications(bool hide_notifications) { |
hide_notifications_ = hide_notifications; |
} |
-bool SystemTray::IsBubbleVisible() const { |
- return bubble_.get() && bubble_->IsVisible(); |
+bool SystemTray::IsAnyBubbleVisible() const { |
+ if (bubble_.get() && bubble_->IsVisible()) |
+ return true; |
+ if (notification_bubble_.get() && notification_bubble_->IsVisible()) |
+ return true; |
+ return false; |
} |
bool SystemTray::CloseBubbleForTest() const { |
@@ -413,7 +355,7 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
bubble_.reset(new SystemTrayBubble(this, items, bubble_type)); |
ash::SystemTrayDelegate* delegate = |
ash::Shell::GetInstance()->tray_delegate(); |
- views::View* anchor = tray_container_; |
+ views::View* anchor = tray_container(); |
TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY, |
shelf_alignment()); |
init_params.can_activate = can_activate; |
@@ -441,6 +383,7 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
should_show_launcher_ = true; |
UpdateNotificationBubble(); // State changed, re-create notifications. |
+ status_area_widget()->HideNonSystemNotifications(); |
} |
void SystemTray::UpdateNotificationBubble() { |
@@ -475,7 +418,7 @@ void SystemTray::UpdateNotificationBubble() { |
anchor = bubble_->bubble_view(); |
anchor_type = TrayBubbleView::ANCHOR_TYPE_BUBBLE; |
} else { |
- anchor = tray_container_; |
+ anchor = tray_container(); |
anchor_type = TrayBubbleView::ANCHOR_TYPE_TRAY; |
} |
TrayBubbleView::InitParams init_params(anchor_type, shelf_alignment()); |
@@ -486,6 +429,8 @@ void SystemTray::UpdateNotificationBubble() { |
notification_bubble_->InitView(anchor, init_params, login_status); |
if (hide_notifications_) |
notification_bubble_->SetVisible(false); |
+ else |
+ status_area_widget()->HideNonSystemNotifications(); |
} |
void SystemTray::UpdateNotificationAnchor() { |
@@ -496,32 +441,11 @@ void SystemTray::UpdateNotificationAnchor() { |
notification_bubble_->bubble_view()->GetWidget()->StackAtTop(); |
} |
-void SystemTray::SetBorder() { |
- // Change the border padding for different shelf alignment. |
- if (shelf_alignment() == SHELF_ALIGNMENT_BOTTOM) { |
- set_border(views::Border::CreateEmptyBorder(0, 0, |
- kPaddingFromBottomOfScreenBottomAlignment, |
- kPaddingFromRightEdgeOfScreenBottomAlignment)); |
- } else if (shelf_alignment() == SHELF_ALIGNMENT_LEFT) { |
- set_border(views::Border::CreateEmptyBorder(0, |
- kPaddingFromOuterEdgeOfLauncherVerticalAlignment, |
- kPaddingFromBottomOfScreenVerticalAlignment, |
- kPaddingFromInnerEdgeOfLauncherVerticalAlignment)); |
- } else { |
- set_border(views::Border::CreateEmptyBorder(0, |
- kPaddingFromInnerEdgeOfLauncherVerticalAlignment, |
- kPaddingFromBottomOfScreenVerticalAlignment, |
- kPaddingFromOuterEdgeOfLauncherVerticalAlignment)); |
- } |
-} |
- |
void SystemTray::SetShelfAlignment(ShelfAlignment alignment) { |
if (alignment == shelf_alignment()) |
return; |
internal::TrayBackgroundView::SetShelfAlignment(alignment); |
UpdateAfterShelfAlignmentChange(alignment); |
- SetBorder(); |
- tray_container_->UpdateLayout(alignment); |
// Destroy any existing bubble so that it is rebuilt correctly. |
bubble_.reset(); |
// Rebuild any notification bubble. |