diff options
Diffstat (limited to 'ash')
15 files changed, 708 insertions, 361 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 61d3041..37440d5 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -233,9 +233,14 @@ 'system/chromeos/power/power_status_view.h', 'system/chromeos/power/tray_power.cc', 'system/chromeos/power/tray_power.h', - 'system/chromeos/screen_capture/screen_capture_observer.h', - 'system/chromeos/screen_capture/tray_screen_capture.cc', - 'system/chromeos/screen_capture/tray_screen_capture.h', + 'system/chromeos/screen_security/screen_capture_observer.h', + 'system/chromeos/screen_security/screen_capture_tray_item.cc', + 'system/chromeos/screen_security/screen_capture_tray_item.h', + 'system/chromeos/screen_security/screen_share_observer.h', + 'system/chromeos/screen_security/screen_share_tray_item.cc', + 'system/chromeos/screen_security/screen_share_tray_item.h', + 'system/chromeos/screen_security/screen_tray_item.cc', + 'system/chromeos/screen_security/screen_tray_item.h', 'system/chromeos/settings/tray_settings.cc', 'system/chromeos/settings/tray_settings.h', 'system/chromeos/tray_display.cc', diff --git a/ash/ash_chromeos_strings.grdp b/ash/ash_chromeos_strings.grdp index ba59e49..95e34fa 100644 --- a/ash/ash_chromeos_strings.grdp +++ b/ash/ash_chromeos_strings.grdp @@ -234,9 +234,20 @@ Server message: <ph name="server_msg">$3<ex>Incorrect password</ex></ph> Unrecognized error </message> - <!-- Status Tray ScreenCapture strings --> - <message name="IDS_CHROMEOS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_STOP" desc="label used for screen sharing stop button"> + <!-- Status tray screen capture strings. --> + <message name="IDS_ASH_STATUS_TRAY_SCREEN_CAPTURE_STOP" desc="label used for screen capture stop button"> Stop </message> + <!-- Status tray screen share strings. --> + <message name="IDS_ASH_STATUS_TRAY_SCREEN_SHARE_STOP" desc="label used for screen sharing stop button"> + Stop + </message> + <message name="IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED" desc="label for screen sharing notification"> + You are being helped + </message> + <message name="IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED_NAME" desc="label for screen sharing notification with name"> + You are being helped by <ph name="HELPER_NAME">$1<ex>Walder Frey</ex></ph> + </message> + </grit-part> diff --git a/ash/system/chromeos/screen_capture/tray_screen_capture.cc b/ash/system/chromeos/screen_capture/tray_screen_capture.cc deleted file mode 100644 index 660199c..0000000 --- a/ash/system/chromeos/screen_capture/tray_screen_capture.cc +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/system/chromeos/screen_capture/tray_screen_capture.h" - -#include "ash/shell.h" -#include "ash/system/tray/fixed_sized_image_view.h" -#include "ash/system/tray/system_tray.h" -#include "ash/system/tray/system_tray_notifier.h" -#include "ash/system/tray/tray_constants.h" -#include "ash/system/tray/tray_item_view.h" -#include "ash/system/tray/tray_notification_view.h" -#include "ash/system/tray/tray_popup_label_button.h" -#include "grit/ash_resources.h" -#include "grit/ash_strings.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/views/controls/button/button.h" -#include "ui/views/controls/image_view.h" -#include "ui/views/controls/label.h" -#include "ui/views/layout/box_layout.h" - -namespace { -const int kStopButtonRightPaddingDefaultView = 18; -const int kStopButtonRightPaddingNotificationView = 0; -const int kStopButtonLeftPaddingNotificationView = 4; -const int kVerticalPaddingScreenCaptureNotitification = 12; -} // namespace - -namespace ash { -namespace internal { - -namespace tray { - -class ScreenCaptureTrayView : public TrayItemView { - public: - explicit ScreenCaptureTrayView(TrayScreenCapture* tray_screen_capture) - : TrayItemView(tray_screen_capture), - tray_screen_capture_(tray_screen_capture) { - CreateImageView(); - image_view()->SetImage(ui::ResourceBundle::GetSharedInstance(). - GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY_LIGHT).ToImageSkia()); - - Update(); - } - virtual ~ScreenCaptureTrayView() { - } - - void Update() { - SetVisible(tray_screen_capture_->screen_capture_on()); - } - - private: - TrayScreenCapture* tray_screen_capture_; - - DISALLOW_COPY_AND_ASSIGN(ScreenCaptureTrayView); -}; - -class ScreenCaptureStatusView : public views::View, - public views::ButtonListener { - public: - enum ViewType { - VIEW_DEFAULT, - VIEW_NOTIFICATION - }; - - explicit ScreenCaptureStatusView(TrayScreenCapture* tray_screen_capture, - ViewType view_type) - : icon_(NULL), - label_(NULL), - stop_button_(NULL), - tray_screen_capture_(tray_screen_capture), - view_type_(view_type) { - CreateItems(); - Update(); - } - - virtual ~ScreenCaptureStatusView() { - } - - // Overridden from views::View. - virtual void Layout() OVERRIDE { - views::View::Layout(); - - int stop_button_right_padding = - view_type_ == VIEW_DEFAULT ? - kStopButtonRightPaddingDefaultView : - kStopButtonRightPaddingNotificationView; - int stop_button_left_padding = - view_type_ == VIEW_DEFAULT ? - kTrayPopupPaddingBetweenItems : - kStopButtonLeftPaddingNotificationView; - // Give the stop button the space it requests. - gfx::Size stop_size = stop_button_->GetPreferredSize(); - gfx::Rect stop_bounds(stop_size); - stop_bounds.set_x(width() - stop_size.width() - stop_button_right_padding); - stop_bounds.set_y((height() - stop_size.height()) / 2); - stop_button_->SetBoundsRect(stop_bounds); - - // Adjust the label's bounds in case it got cut off by |stop_button_|. - if (label_->bounds().Intersects(stop_button_->bounds())) { - gfx::Rect label_bounds = label_->bounds(); - label_bounds.set_width( - stop_button_->x() - stop_button_left_padding - label_->x()); - label_->SetBoundsRect(label_bounds); - } - } - - // Overridden from views::ButtonListener. - virtual void ButtonPressed(views::Button* sender, - const ui::Event& event) OVERRIDE { - DCHECK(sender == stop_button_); - tray_screen_capture_->StopScreenCapture(); - } - - void CreateItems() { - set_background(views::Background::CreateSolidBackground(kBackgroundColor)); - ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); - if (view_type_ == VIEW_DEFAULT) { - SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, - kTrayPopupPaddingHorizontal, - 0, - kTrayPopupPaddingBetweenItems)); - icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight); - icon_->SetImage( - bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY).ToImageSkia()); - AddChildView(icon_); - } else { - SetLayoutManager( - new views::BoxLayout(views::BoxLayout::kHorizontal, - 0, - kVerticalPaddingScreenCaptureNotitification, - 0)); - } - - label_ = new views::Label; - label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - label_->SetMultiLine(true); - label_->SetText(tray_screen_capture_->screen_capture_status()); - AddChildView(label_); - - stop_button_ = new TrayPopupLabelButton( - this, - bundle.GetLocalizedString( - IDS_CHROMEOS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_STOP)); - AddChildView(stop_button_); - } - - void Update() { - if (view_type_ == VIEW_DEFAULT) { - // Hide the notification bubble when the ash tray bubble opens. - tray_screen_capture_->HideNotificationView(); - SetVisible(tray_screen_capture_->screen_capture_on()); - } - } - - private: - views::ImageView* icon_; - views::Label* label_; - TrayPopupLabelButton* stop_button_; - TrayScreenCapture* tray_screen_capture_; - ViewType view_type_; - - DISALLOW_COPY_AND_ASSIGN(ScreenCaptureStatusView); -}; - -class ScreenCaptureNotificationView : public TrayNotificationView { - public: - explicit ScreenCaptureNotificationView(TrayScreenCapture* tray_screen_capture) - : TrayNotificationView(tray_screen_capture, IDR_AURA_UBER_TRAY_DISPLAY), - tray_screen_capture_(tray_screen_capture) { - screen_capture_status_view_ = - new ScreenCaptureStatusView( - tray_screen_capture, ScreenCaptureStatusView::VIEW_NOTIFICATION); - InitView(screen_capture_status_view_); - } - - virtual ~ScreenCaptureNotificationView() { - } - - void Update() { - if (tray_screen_capture_->screen_capture_on()) - screen_capture_status_view_->Update(); - else - tray_screen_capture_->HideNotificationView(); - } - - private: - TrayScreenCapture* tray_screen_capture_; - ScreenCaptureStatusView* screen_capture_status_view_; - - DISALLOW_COPY_AND_ASSIGN(ScreenCaptureNotificationView); -}; - -} // namespace tray - -TrayScreenCapture::TrayScreenCapture(SystemTray* system_tray) - : SystemTrayItem(system_tray), - tray_(NULL), - default_(NULL), - notification_(NULL), - screen_capture_on_(false), - stop_callback_(base::Bind(&base::DoNothing)) { - Shell::GetInstance()->system_tray_notifier()-> - AddScreenCaptureObserver(this); -} - -TrayScreenCapture::~TrayScreenCapture() { - Shell::GetInstance()->system_tray_notifier()-> - RemoveScreenCaptureObserver(this); -} - -void TrayScreenCapture::Update() { - if (tray_) - tray_->Update(); - if (default_) - default_->Update(); - if (notification_) - notification_->Update(); -} - -views::View* TrayScreenCapture::CreateTrayView(user::LoginStatus status) { - tray_ = new tray::ScreenCaptureTrayView(this); - return tray_; -} - -views::View* TrayScreenCapture::CreateDefaultView(user::LoginStatus status) { - default_ = new tray::ScreenCaptureStatusView( - this, tray::ScreenCaptureStatusView::VIEW_DEFAULT); - return default_; -} - -views::View* TrayScreenCapture::CreateNotificationView( - user::LoginStatus status) { - notification_ = new tray::ScreenCaptureNotificationView(this); - return notification_; -} - -void TrayScreenCapture::DestroyTrayView() { - tray_ = NULL; -} - -void TrayScreenCapture::DestroyDefaultView() { - default_ = NULL; -} - -void TrayScreenCapture::DestroyNotificationView() { - notification_ = NULL; -} - -void TrayScreenCapture::OnScreenCaptureStart( - const base::Closure& stop_callback, - const base::string16& screen_capture_status) { - stop_callback_ = stop_callback; - screen_capture_status_ = screen_capture_status; - set_screen_capture_on(true); - - if (tray_) - tray_->Update(); - - if (default_) - default_->Update(); - - if (!system_tray()->HasSystemBubbleType( - SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { - ShowNotificationView(); - } -} - -void TrayScreenCapture::OnScreenCaptureStop() { - set_screen_capture_on(false); - Update(); -} - -void TrayScreenCapture::StopScreenCapture() { - if (stop_callback_.is_null()) - return; - - base::Closure callback = stop_callback_; - stop_callback_.Reset(); - callback.Run(); -} - -} // namespace internal -} // namespace ash diff --git a/ash/system/chromeos/screen_capture/tray_screen_capture.h b/ash/system/chromeos/screen_capture/tray_screen_capture.h deleted file mode 100644 index 3fc0b2f2..0000000 --- a/ash/system/chromeos/screen_capture/tray_screen_capture.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_TRAY_SCREEN_CAPTURE_H_ -#define ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_TRAY_SCREEN_CAPTURE_H_ - -#include "ash/system/chromeos/screen_capture/screen_capture_observer.h" -#include "ash/system/tray/system_tray_item.h" - -namespace views { -class View; -} - -namespace ash { -namespace internal { - -namespace tray{ -class ScreenCaptureTrayView; -class ScreenCaptureStatusView; -class ScreenCaptureNotificationView; -} // namespace tray - -class TrayScreenCapture : public SystemTrayItem, - public ScreenCaptureObserver { - public: - explicit TrayScreenCapture(SystemTray* system_tray); - virtual ~TrayScreenCapture(); - - void Update(); - bool screen_capture_on() const { return screen_capture_on_; } - void set_screen_capture_on(bool value) { screen_capture_on_ = value; } - const base::string16& screen_capture_status() const { - return screen_capture_status_; - } - void StopScreenCapture(); - - private: - // Overridden from SystemTrayItem. - virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE; - virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE; - virtual views::View* CreateNotificationView( - user::LoginStatus status) OVERRIDE; - virtual void DestroyTrayView() OVERRIDE; - virtual void DestroyDefaultView() OVERRIDE; - virtual void DestroyNotificationView() OVERRIDE; - - // Overridden from ScreenCaptureObserver. - virtual void OnScreenCaptureStart( - const base::Closure& stop_callback, - const base::string16& screen_capture_status) OVERRIDE; - virtual void OnScreenCaptureStop() OVERRIDE; - - tray::ScreenCaptureTrayView* tray_; - tray::ScreenCaptureStatusView* default_; - tray::ScreenCaptureNotificationView* notification_; - base::string16 screen_capture_status_; - bool screen_capture_on_; - base::Closure stop_callback_; - - DISALLOW_COPY_AND_ASSIGN(TrayScreenCapture); -}; - -} // namespace internal -} // namespace ash - -#endif // ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_TRAY_SCREEN_CAPTURE_H_ diff --git a/ash/system/chromeos/screen_capture/screen_capture_observer.h b/ash/system/chromeos/screen_security/screen_capture_observer.h index 9d1efd3..f6e4d6d 100644 --- a/ash/system/chromeos/screen_capture/screen_capture_observer.h +++ b/ash/system/chromeos/screen_security/screen_capture_observer.h @@ -1,4 +1,4 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,6 +16,7 @@ class ScreenCaptureObserver { virtual void OnScreenCaptureStart( const base::Closure& stop_callback, const base::string16& screen_capture_status) = 0; + // Called when screen capture is stopped. virtual void OnScreenCaptureStop() = 0; diff --git a/ash/system/chromeos/screen_security/screen_capture_tray_item.cc b/ash/system/chromeos/screen_security/screen_capture_tray_item.cc new file mode 100644 index 0000000..f375bf7 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_capture_tray_item.cc @@ -0,0 +1,70 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/chromeos/screen_security/screen_capture_tray_item.h" + +#include "ash/shell.h" +#include "grit/ash_resources.h" +#include "grit/ash_strings.h" +#include "ui/base/l10n/l10n_util.h" + +namespace ash { +namespace internal { + +ScreenCaptureTrayItem::ScreenCaptureTrayItem(SystemTray* system_tray) + : ScreenTrayItem(system_tray) { + Shell::GetInstance()->system_tray_notifier()-> + AddScreenCaptureObserver(this); +} + +ScreenCaptureTrayItem::~ScreenCaptureTrayItem() { + Shell::GetInstance()->system_tray_notifier()-> + RemoveScreenCaptureObserver(this); +} + +views::View* ScreenCaptureTrayItem::CreateTrayView(user::LoginStatus status) { + set_tray_view( + new tray::ScreenTrayView(this, IDR_AURA_UBER_TRAY_DISPLAY_LIGHT)); + return tray_view(); +} + +views::View* ScreenCaptureTrayItem::CreateDefaultView( + user::LoginStatus status) { + set_default_view(new tray::ScreenStatusView( + this, + tray::ScreenStatusView::VIEW_DEFAULT, + IDR_AURA_UBER_TRAY_DISPLAY, + screen_capture_status_, + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_CAPTURE_STOP))); + return default_view(); +} + +views::View* ScreenCaptureTrayItem::CreateNotificationView( + user::LoginStatus status) { + set_notification_view(new tray::ScreenNotificationView( + this, + IDR_AURA_UBER_TRAY_DISPLAY, + screen_capture_status_, + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_CAPTURE_STOP))); + return notification_view(); +} + +void ScreenCaptureTrayItem::OnScreenCaptureStart( + const base::Closure& stop_callback, + const base::string16& screen_capture_status) { + screen_capture_status_ = screen_capture_status; + Start(stop_callback); +} + +void ScreenCaptureTrayItem::OnScreenCaptureStop() { + // We do not need to run the stop callback when + // screen capture is stopped externally. + set_is_started(false); + Update(); +} + +} // namespace internal +} // namespace ash diff --git a/ash/system/chromeos/screen_security/screen_capture_tray_item.h b/ash/system/chromeos/screen_security/screen_capture_tray_item.h new file mode 100644 index 0000000..a756416 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_capture_tray_item.h @@ -0,0 +1,45 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_SCREEN_CAPTURE_TRAY_ITEM_H_ +#define ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_SCREEN_CAPTURE_TRAY_ITEM_H_ + +#include "ash/system/chromeos/screen_security/screen_capture_observer.h" +#include "ash/system/chromeos/screen_security/screen_tray_item.h" + +namespace views { +class View; +} + +namespace ash { +namespace internal { + +class ScreenCaptureTrayItem : public ScreenTrayItem, + public ScreenCaptureObserver { + public: + explicit ScreenCaptureTrayItem(SystemTray* system_tray); + virtual ~ScreenCaptureTrayItem(); + + private: + // Overridden from ScreenTrayItem. + virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE; + virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE; + virtual views::View* CreateNotificationView( + user::LoginStatus status) OVERRIDE; + + // Overridden from ScreenCaptureObserver. + virtual void OnScreenCaptureStart( + const base::Closure& stop_callback, + const base::string16& screen_capture_status) OVERRIDE; + virtual void OnScreenCaptureStop() OVERRIDE; + + base::string16 screen_capture_status_; + + DISALLOW_COPY_AND_ASSIGN(ScreenCaptureTrayItem); +}; + +} // namespace internal +} // namespace ash + +#endif // ASH_SYSTEM_CHROMEOS_SCREEN_CAPTURE_SCREEN_CAPTURE_TRAY_ITEM_H_ diff --git a/ash/system/chromeos/screen_security/screen_share_observer.h b/ash/system/chromeos/screen_security/screen_share_observer.h new file mode 100644 index 0000000..23fdcd4 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_share_observer.h @@ -0,0 +1,29 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_OBSERVER_H_ +#define ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_OBSERVER_H_ + +#include "base/callback.h" +#include "base/string16.h" + +namespace ash { + +class ScreenShareObserver { + public: + // Called when screen share is started. + virtual void OnScreenShareStart( + const base::Closure& stop_callback, + const base::string16& helper_name) = 0; + + // Called when screen share is stopped. + virtual void OnScreenShareStop() = 0; + + protected: + virtual ~ScreenShareObserver() {} +}; + +} // namespace ash + +#endif // ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_OBSERVER_H_ diff --git a/ash/system/chromeos/screen_security/screen_share_tray_item.cc b/ash/system/chromeos/screen_security/screen_share_tray_item.cc new file mode 100644 index 0000000..c1971e2 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_share_tray_item.cc @@ -0,0 +1,80 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/chromeos/screen_security/screen_share_tray_item.h" + +#include "ash/shell.h" +#include "grit/ash_resources.h" +#include "grit/ash_strings.h" +#include "ui/base/l10n/l10n_util.h" + +namespace ash { +namespace internal { + +ScreenShareTrayItem::ScreenShareTrayItem(SystemTray* system_tray) + : ScreenTrayItem(system_tray) { + Shell::GetInstance()->system_tray_notifier()-> + AddScreenShareObserver(this); +} + +ScreenShareTrayItem::~ScreenShareTrayItem() { + Shell::GetInstance()->system_tray_notifier()-> + RemoveScreenShareObserver(this); +} + +views::View* ScreenShareTrayItem::CreateTrayView(user::LoginStatus status) { + set_tray_view( + new tray::ScreenTrayView(this, IDR_AURA_UBER_TRAY_SCREEN_SHARE_LIGHT)); + return tray_view(); +} + +views::View* ScreenShareTrayItem::CreateDefaultView(user::LoginStatus status) { + set_default_view(new tray::ScreenStatusView( + this, + tray::ScreenStatusView::VIEW_DEFAULT, + IDR_AURA_UBER_TRAY_SCREEN_SHARE_DARK, + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED), + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_SHARE_STOP))); + return default_view(); +} + +views::View* ScreenShareTrayItem::CreateNotificationView( + user::LoginStatus status) { + base::string16 help_label_text; + if (!helper_name_.empty()) { + help_label_text = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED_NAME, + helper_name_); + } else { + help_label_text = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_SHARE_BEING_HELPED); + } + + set_notification_view(new tray::ScreenNotificationView( + this, + IDR_AURA_UBER_TRAY_SCREEN_SHARE_DARK, + help_label_text, + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_SCREEN_SHARE_STOP))); + return notification_view(); +} + +void ScreenShareTrayItem::OnScreenShareStart( + const base::Closure& stop_callback, + const base::string16& helper_name) { + helper_name_ = helper_name; + Start(stop_callback); +} + +void ScreenShareTrayItem::OnScreenShareStop() { + // We do not need to run the stop callback + // when screening is stopped externally. + set_is_started(false); + Update(); +} + +} // namespace internal +} // namespace ash diff --git a/ash/system/chromeos/screen_security/screen_share_tray_item.h b/ash/system/chromeos/screen_security/screen_share_tray_item.h new file mode 100644 index 0000000..84a29d0 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_share_tray_item.h @@ -0,0 +1,45 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_TRAY_ITEM_H_ +#define ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_TRAY_ITEM_H_ + +#include "ash/system/chromeos/screen_security/screen_share_observer.h" +#include "ash/system/chromeos/screen_security/screen_tray_item.h" + +namespace views { +class View; +} + +namespace ash { +namespace internal { + +class ScreenShareTrayItem : public ScreenTrayItem, + public ScreenShareObserver { + public: + explicit ScreenShareTrayItem(SystemTray* system_tray); + virtual ~ScreenShareTrayItem(); + + private: + // Overridden from SystemTrayItem. + virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE; + virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE; + virtual views::View* CreateNotificationView( + user::LoginStatus status) OVERRIDE; + + // Overridden from ScreenShareObserver. + virtual void OnScreenShareStart( + const base::Closure& stop_callback, + const base::string16& helper_name) OVERRIDE; + virtual void OnScreenShareStop() OVERRIDE; + + base::string16 helper_name_; + + DISALLOW_COPY_AND_ASSIGN(ScreenShareTrayItem); +}; + +} // namespace internal +} // namespace ash + +#endif // ASH_SYSTEM_CHROMEOS_SCREEN_SHARE_SCREEN_SHARE_TRAY_ITEM_H_ diff --git a/ash/system/chromeos/screen_security/screen_tray_item.cc b/ash/system/chromeos/screen_security/screen_tray_item.cc new file mode 100644 index 0000000..8c845e7 --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_tray_item.cc @@ -0,0 +1,228 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/chromeos/screen_security/screen_tray_item.h" + +#include "ash/system/tray/fixed_sized_image_view.h" +#include "ash/system/tray/tray_constants.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/box_layout.h" + +namespace { +const int kStopButtonRightPaddingDefaultView = 18; +const int kStopButtonRightPaddingNotificationView = 0; +const int kStopButtonLeftPaddingNotificationView = 4; +const int kVerticalPaddingScreenCaptureNotitification = 12; +} // namespace + +namespace ash { +namespace internal { + +namespace tray { + +// ScreenTrayView implementations. +ScreenTrayView::ScreenTrayView(ScreenTrayItem* screen_tray_item, int icon_id) + : TrayItemView(screen_tray_item), + screen_tray_item_(screen_tray_item) { + CreateImageView(); + image_view()->SetImage(ui::ResourceBundle::GetSharedInstance() + .GetImageNamed(icon_id).ToImageSkia()); + + Update(); +} + +ScreenTrayView::~ScreenTrayView() { +} + +void ScreenTrayView::Update() { + SetVisible(screen_tray_item_->is_started()); +} + + +// ScreenStatusView implementations. +ScreenStatusView::ScreenStatusView(ScreenTrayItem* screen_tray_item, + ViewType view_type, + int icon_id, + const base::string16& label_text, + const base::string16& stop_button_text) + : screen_tray_item_(screen_tray_item), + icon_(NULL), + label_(NULL), + stop_button_(NULL), + view_type_(view_type), + icon_id_(icon_id), + label_text_(label_text), + stop_button_text_(stop_button_text) { + CreateItems(); + Update(); +} + +ScreenStatusView::~ScreenStatusView() { +} + +void ScreenStatusView::Layout() { + views::View::Layout(); + + int stop_button_right_padding = + view_type_ == VIEW_DEFAULT ? + kStopButtonRightPaddingDefaultView : + kStopButtonRightPaddingNotificationView; + int stop_button_left_padding = + view_type_ == VIEW_DEFAULT ? + kTrayPopupPaddingBetweenItems : + kStopButtonLeftPaddingNotificationView; + // Give the stop button the space it requests. + gfx::Size stop_size = stop_button_->GetPreferredSize(); + gfx::Rect stop_bounds(stop_size); + stop_bounds.set_x(width() - stop_size.width() - stop_button_right_padding); + stop_bounds.set_y((height() - stop_size.height()) / 2); + stop_button_->SetBoundsRect(stop_bounds); + + // Adjust the label's bounds in case it got cut off by |stop_button_|. + if (label_->bounds().Intersects(stop_button_->bounds())) { + gfx::Rect label_bounds = label_->bounds(); + label_bounds.set_width( + stop_button_->x() - stop_button_left_padding - label_->x()); + label_->SetBoundsRect(label_bounds); + } +} + +void ScreenStatusView::ButtonPressed( + views::Button* sender, + const ui::Event& event) { + DCHECK(sender == stop_button_); + screen_tray_item_->Stop(); +} + +void ScreenStatusView::CreateItems() { + set_background(views::Background::CreateSolidBackground(kBackgroundColor)); + ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); + if (view_type_ == VIEW_DEFAULT) { + SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, + kTrayPopupPaddingHorizontal, + 0, + kTrayPopupPaddingBetweenItems)); + icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight); + icon_->SetImage(bundle.GetImageNamed(icon_id_).ToImageSkia()); + AddChildView(icon_); + } else { + SetLayoutManager( + new views::BoxLayout(views::BoxLayout::kHorizontal, + 0, + kVerticalPaddingScreenCaptureNotitification, + 0)); + } + + label_ = new views::Label; + label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + label_->SetMultiLine(true); + label_->SetText(label_text_); + AddChildView(label_); + + stop_button_ = new TrayPopupLabelButton(this, stop_button_text_); + AddChildView(stop_button_); +} + +void ScreenStatusView::Update() { + if (view_type_ == VIEW_DEFAULT) { + // Hide the notification bubble when the ash tray bubble opens. + screen_tray_item_->HideNotificationView(); + SetVisible(screen_tray_item_->is_started()); + } +} + + +// ScreenNotificationView implementations. +ScreenNotificationView::ScreenNotificationView( + ScreenTrayItem* screen_tray_item, + int icon_id, + const base::string16& label_text, + const base::string16& stop_button_text) + : TrayNotificationView(screen_tray_item, icon_id), + screen_tray_item_(screen_tray_item) { + screen_status_view_ = new ScreenStatusView( + screen_tray_item, + ScreenStatusView::VIEW_NOTIFICATION, + icon_id, + label_text, + stop_button_text); + InitView(screen_status_view_); + Update(); +} + +ScreenNotificationView::~ScreenNotificationView() { +} + +void ScreenNotificationView::Update() { + if (screen_tray_item_->is_started()) + screen_status_view_->Update(); + else + screen_tray_item_->HideNotificationView(); +} + +} // namespace tray + +ScreenTrayItem::ScreenTrayItem(SystemTray* system_tray) + : SystemTrayItem(system_tray), + tray_view_(NULL), + default_view_(NULL), + notification_view_(NULL), + is_started_(false), + stop_callback_(base::Bind(&base::DoNothing)) { +} + +ScreenTrayItem::~ScreenTrayItem() {} + +void ScreenTrayItem::Update() { + if (tray_view_) + tray_view_->Update(); + if (default_view_) + default_view_->Update(); + if (notification_view_) + notification_view_->Update(); +} + +void ScreenTrayItem::Start(const base::Closure& stop_callback) { + stop_callback_ = stop_callback; + is_started_ = true; + + if (tray_view_) + tray_view_->Update(); + + if (default_view_) + default_view_->Update(); + + if (!system_tray()->HasSystemBubbleType( + SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { + ShowNotificationView(); + } +} + +void ScreenTrayItem::Stop() { + is_started_ = false; + Update(); + + if (stop_callback_.is_null()) + return; + + base::Closure callback = stop_callback_; + stop_callback_.Reset(); + callback.Run(); +} + +void ScreenTrayItem::DestroyTrayView() { + tray_view_ = NULL; +} + +void ScreenTrayItem::DestroyDefaultView() { + default_view_ = NULL; +} + +void ScreenTrayItem::DestroyNotificationView() { + notification_view_ = NULL; +} + +} // namespace internal +} // namespace ash diff --git a/ash/system/chromeos/screen_security/screen_tray_item.h b/ash/system/chromeos/screen_security/screen_tray_item.h new file mode 100644 index 0000000..ff7e1bb --- /dev/null +++ b/ash/system/chromeos/screen_security/screen_tray_item.h @@ -0,0 +1,154 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_CHROMEOS_SCREEN_TRAY_ITEM_H_ +#define ASH_SYSTEM_CHROMEOS_SCREEN_TRAY_ITEM_H_ + +#include "ash/system/tray/system_tray.h" +#include "ash/system/tray/system_tray_item.h" +#include "ash/system/tray/system_tray_notifier.h" +#include "ash/system/tray/tray_item_view.h" +#include "ash/system/tray/tray_notification_view.h" +#include "ash/system/tray/tray_popup_label_button.h" +#include "ui/views/controls/button/button.h" +#include "ui/views/controls/image_view.h" + +namespace views { +class View; +} + +namespace ash { +namespace internal { + +class ScreenTrayItem; + +namespace tray { + +class ScreenTrayView : public TrayItemView { + public: + ScreenTrayView(ScreenTrayItem* screen_tray_item, int icon_id); + virtual ~ScreenTrayView(); + + void Update(); + + private: + ScreenTrayItem* screen_tray_item_; + + DISALLOW_COPY_AND_ASSIGN(ScreenTrayView); +}; + +class ScreenStatusView : public views::View, + public views::ButtonListener { + public: + enum ViewType { + VIEW_DEFAULT, + VIEW_NOTIFICATION + }; + + ScreenStatusView(ScreenTrayItem* screen_tray_item, + ViewType view_type, + int icon_id, + const base::string16& label_text, + const base::string16& stop_button_text); + virtual ~ScreenStatusView(); + + // Overridden from views::View. + virtual void Layout() OVERRIDE; + + // Overridden from views::ButtonListener. + virtual void ButtonPressed(views::Button* sender, + const ui::Event& event) OVERRIDE; + + void CreateItems(); + void Update(); + + private: + ScreenTrayItem* screen_tray_item_; + views::ImageView* icon_; + views::Label* label_; + TrayPopupLabelButton* stop_button_; + ViewType view_type_; + int icon_id_; + base::string16 label_text_; + base::string16 stop_button_text_; + + DISALLOW_COPY_AND_ASSIGN(ScreenStatusView); +}; + +class ScreenNotificationView : public TrayNotificationView { + public: + ScreenNotificationView(ScreenTrayItem* screen_tray_item, + int icon_id, + const base::string16& label_text, + const base::string16& stop_button_text); + virtual ~ScreenNotificationView(); + + void Update(); + + private: + ScreenTrayItem* screen_tray_item_; + ScreenStatusView* screen_status_view_; + + DISALLOW_COPY_AND_ASSIGN(ScreenNotificationView); +}; + +} // namespace tray + + +// The base tray item for screen capture and screen sharing. The +// Start method brings up a notification and a tray item, and the user +// can stop the screen capture/sharing by pressing the stop button. +class ScreenTrayItem : public SystemTrayItem { + public: + explicit ScreenTrayItem(SystemTray* system_tray); + virtual ~ScreenTrayItem(); + + tray::ScreenTrayView* tray_view() { return tray_view_; } + void set_tray_view(tray::ScreenTrayView* tray_view) { + tray_view_ = tray_view; + } + + tray::ScreenStatusView* default_view() { return default_view_; } + void set_default_view(tray::ScreenStatusView* default_view) { + default_view_ = default_view; + } + + tray::ScreenNotificationView* notification_view() { + return notification_view_; + } + void set_notification_view(tray::ScreenNotificationView* notification_view) { + notification_view_ = notification_view; + } + + bool is_started() const { return is_started_; } + void set_is_started(bool is_started) { is_started_ = is_started; } + + void Update(); + void Start(const base::Closure& stop_callback); + void Stop(); + + // Overridden from SystemTrayItem. + virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE = 0; + virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE = 0; + virtual views::View* CreateNotificationView( + user::LoginStatus status) OVERRIDE = 0; + + virtual void DestroyTrayView() OVERRIDE; + virtual void DestroyDefaultView() OVERRIDE; + virtual void DestroyNotificationView() OVERRIDE; + + private: + tray::ScreenTrayView* tray_view_; + tray::ScreenStatusView* default_view_; + tray::ScreenNotificationView* notification_view_; + bool is_started_; + base::Closure stop_callback_; + + DISALLOW_COPY_AND_ASSIGN(ScreenTrayItem); +}; + +} // namespace internal +} // namespace ash + +#endif // ASH_SYSTEM_CHROMEOS_SCREEN_TRAY_ITEM_H_ diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc index e4caaad..f75a307 100644 --- a/ash/system/tray/system_tray.cc +++ b/ash/system/tray/system_tray.cc @@ -54,7 +54,8 @@ #include "ash/system/chromeos/network/tray_sms.h" #include "ash/system/chromeos/network/tray_vpn.h" #include "ash/system/chromeos/power/tray_power.h" -#include "ash/system/chromeos/screen_capture/tray_screen_capture.h" +#include "ash/system/chromeos/screen_security/screen_capture_tray_item.h" +#include "ash/system/chromeos/screen_security/screen_share_tray_item.h" #include "ash/system/chromeos/settings/tray_settings.h" #include "ash/system/chromeos/tray_display.h" #endif @@ -172,7 +173,8 @@ void SystemTray::CreateItems(SystemTrayDelegate* delegate) { AddTrayItem(new internal::TrayLocale(this)); #if defined(OS_CHROMEOS) AddTrayItem(new internal::TrayDisplay(this)); - AddTrayItem(new internal::TrayScreenCapture(this)); + AddTrayItem(new internal::ScreenCaptureTrayItem(this)); + AddTrayItem(new internal::ScreenShareTrayItem(this)); AddTrayItem(new internal::TrayAudio(this)); #endif #if !defined(OS_WIN) diff --git a/ash/system/tray/system_tray_notifier.cc b/ash/system/tray/system_tray_notifier.cc index f2ec569..448b43f 100644 --- a/ash/system/tray/system_tray_notifier.cc +++ b/ash/system/tray/system_tray_notifier.cc @@ -168,6 +168,15 @@ void SystemTrayNotifier::RemoveScreenCaptureObserver( screen_capture_observers_.RemoveObserver(observer); } +void SystemTrayNotifier::AddScreenShareObserver( + ScreenShareObserver* observer) { + screen_share_observers_.AddObserver(observer); +} + +void SystemTrayNotifier::RemoveScreenShareObserver( + ScreenShareObserver* observer) { + screen_share_observers_.RemoveObserver(observer); +} #endif void SystemTrayNotifier::NotifyAccessibilityModeChanged( @@ -344,6 +353,18 @@ void SystemTrayNotifier::NotifyScreenCaptureStop() { OnScreenCaptureStop()); } +void SystemTrayNotifier::NotifyScreenShareStart( + const base::Closure& stop_callback, + const base::string16& helper_name) { + FOR_EACH_OBSERVER(ScreenShareObserver, screen_share_observers_, + OnScreenShareStart(stop_callback, helper_name)); +} + +void SystemTrayNotifier::NotifyScreenShareStop() { + FOR_EACH_OBSERVER(ScreenShareObserver, screen_share_observers_, + OnScreenShareStop()); +} + #endif // OS_CHROMEOS } // namespace ash diff --git a/ash/system/tray/system_tray_notifier.h b/ash/system/tray/system_tray_notifier.h index a438096..67bb6ef 100644 --- a/ash/system/tray/system_tray_notifier.h +++ b/ash/system/tray/system_tray_notifier.h @@ -30,7 +30,8 @@ #include "ash/system/chromeos/audio/audio_observer.h" #include "ash/system/chromeos/network/network_observer.h" #include "ash/system/chromeos/network/sms_observer.h" -#include "ash/system/chromeos/screen_capture/screen_capture_observer.h" +#include "ash/system/chromeos/screen_security/screen_capture_observer.h" +#include "ash/system/chromeos/screen_security/screen_share_observer.h" #endif namespace ash { @@ -95,6 +96,9 @@ public: void AddScreenCaptureObserver(ScreenCaptureObserver* observer); void RemoveScreenCaptureObserver(ScreenCaptureObserver* observer); + + void AddScreenShareObserver(ScreenShareObserver* observer); + void RemoveScreenShareObserver(ScreenShareObserver* observer); #endif void NotifyAccessibilityModeChanged( @@ -133,6 +137,9 @@ public: void NotifyScreenCaptureStart(const base::Closure& stop_callback, const base::string16& sharing_app_name); void NotifyScreenCaptureStop(); + void NotifyScreenShareStart(const base::Closure& stop_callback, + const base::string16& helper_name); + void NotifyScreenShareStop(); NetworkStateNotifier* network_state_notifier() { return network_state_notifier_.get(); @@ -158,6 +165,7 @@ public: ObserverList<SmsObserver> sms_observers_; ObserverList<EnterpriseDomainObserver> enterprise_domain_observers_; ObserverList<ScreenCaptureObserver> screen_capture_observers_; + ObserverList<ScreenShareObserver> screen_share_observers_; scoped_ptr<NetworkStateNotifier> network_state_notifier_; #endif |