summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
Diffstat (limited to 'ash')
-rw-r--r--ash/ash.gyp11
-rw-r--r--ash/ash_chromeos_strings.grdp15
-rw-r--r--ash/system/chromeos/screen_capture/tray_screen_capture.cc285
-rw-r--r--ash/system/chromeos/screen_capture/tray_screen_capture.h67
-rw-r--r--ash/system/chromeos/screen_security/screen_capture_observer.h (renamed from ash/system/chromeos/screen_capture/screen_capture_observer.h)3
-rw-r--r--ash/system/chromeos/screen_security/screen_capture_tray_item.cc70
-rw-r--r--ash/system/chromeos/screen_security/screen_capture_tray_item.h45
-rw-r--r--ash/system/chromeos/screen_security/screen_share_observer.h29
-rw-r--r--ash/system/chromeos/screen_security/screen_share_tray_item.cc80
-rw-r--r--ash/system/chromeos/screen_security/screen_share_tray_item.h45
-rw-r--r--ash/system/chromeos/screen_security/screen_tray_item.cc228
-rw-r--r--ash/system/chromeos/screen_security/screen_tray_item.h154
-rw-r--r--ash/system/tray/system_tray.cc6
-rw-r--r--ash/system/tray/system_tray_notifier.cc21
-rw-r--r--ash/system/tray/system_tray_notifier.h10
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