Chromium Code Reviews| Index: ash/system/user/user_card_view.cc |
| diff --git a/ash/system/user/user_card_view.cc b/ash/system/user/user_card_view.cc |
| index af568aea427a25b8e4960531b90b5e5ed0426789..2de524abc78b5e3ea4d03b73073ea730f543f58e 100644 |
| --- a/ash/system/user/user_card_view.cc |
| +++ b/ash/system/user/user_card_view.cc |
| @@ -11,6 +11,7 @@ |
| #include "ash/session/user_info.h" |
| #include "ash/shell.h" |
| #include "ash/system/tray/system_tray_delegate.h" |
| +#include "ash/system/tray/system_tray_notifier.h" |
| #include "ash/system/tray/tray_constants.h" |
| #include "ash/system/user/config.h" |
| #include "ash/system/user/rounded_image_view.h" |
| @@ -35,6 +36,14 @@ |
| #include "ui/views/controls/link_listener.h" |
| #include "ui/views/layout/box_layout.h" |
| +#if defined(OS_CHROMEOS) |
| +#include "ash/ash_view_ids.h" |
| +#include "ash/media_delegate.h" |
| +#include "ash/system/tray/media_security/media_capture_observer.h" |
| +#include "ui/views/controls/image_view.h" |
| +#include "ui/views/layout/fill_layout.h" |
| +#endif |
| + |
| namespace ash { |
| namespace tray { |
| @@ -46,6 +55,70 @@ const int kUserDetailsVerticalPadding = 5; |
| // and end of the user's display name in the public account user card's text. |
| const base::char16 kDisplayNameMark[] = {0x2060, 0}; |
| +#if defined(OS_CHROMEOS) |
| +class MediaIndicator : public views::View, public MediaCaptureObserver { |
| + public: |
| + explicit MediaIndicator(MultiProfileIndex index) |
| + : index_(index), label_(new views::Label) { |
| + SetLayoutManager(new views::FillLayout); |
| + views::ImageView* icon = new views::ImageView; |
| + icon->SetImage(ui::ResourceBundle::GetSharedInstance() |
| + .GetImageNamed(IDR_AURA_UBER_TRAY_RECORDING_RED) |
| + .ToImageSkia()); |
| + AddChildView(icon); |
| + label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + label_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
| + ui::ResourceBundle::SmallFont)); |
| + OnMediaCaptureChanged(); |
| + Shell::GetInstance()->system_tray_notifier()->AddMediaCaptureObserver(this); |
| + set_id(VIEW_ID_USER_VIEW_MEDIA_INDICATOR); |
| + } |
| + |
| + virtual ~MediaIndicator() { |
| + Shell::GetInstance()->system_tray_notifier()->RemoveMediaCaptureObserver( |
| + this); |
| + } |
| + |
|
Mr4D (OOO till 08-26)
2014/04/30 18:24:36
// MediaCaptureObserver overrides:
|
| + virtual void OnMediaCaptureChanged() OVERRIDE { |
| + Shell* shell = Shell::GetInstance(); |
| + content::BrowserContext* context = |
| + shell->session_state_delegate()->GetBrowserContextByIndex(index_); |
| + MediaCaptureState state = |
| + Shell::GetInstance()->media_delegate()->GetBackgroundMediaCaptureState( |
| + context); |
|
Mr4D (OOO till 08-26)
2014/04/30 18:24:36
Same here: Don't we care about visiting windows?
oshima
2014/04/30 20:40:31
MediaDelegate implementation takes care of it.
|
| + int res_id = 0; |
| + switch (state) { |
| + case MEDIA_CAPTURE_AUDIO_VIDEO: |
| + res_id = IDS_ASH_STATUS_TRAY_MEDIA_RECORDING_AUDIO_VIDEO; |
| + break; |
| + case MEDIA_CAPTURE_AUDIO: |
| + res_id = IDS_ASH_STATUS_TRAY_MEDIA_RECORDING_AUDIO; |
| + break; |
| + case MEDIA_CAPTURE_VIDEO: |
| + res_id = IDS_ASH_STATUS_TRAY_MEDIA_RECORDING_VIDEO; |
| + break; |
| + case MEDIA_CAPTURE_NONE: |
| + break; |
| + } |
| + SetMessage(res_id ? l10n_util::GetStringUTF16(res_id) : base::string16()); |
| + } |
| + |
| + views::View* GetMessageView() { return label_; } |
| + |
| + void SetMessage(const base::string16& message) { |
| + SetVisible(!message.empty()); |
| + label_->SetText(message); |
| + label_->SetVisible(!message.empty()); |
| + } |
| + |
| + private: |
| + MultiProfileIndex index_; |
| + views::Label* label_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(MediaIndicator); |
| +}; |
| +#endif |
| + |
| // The user details shown in public account mode. This is essentially a label |
| // but with custom painting code as the text is styled with multiple colors and |
| // contains a link. |
| @@ -301,7 +374,7 @@ void UserCardView::AddUserContent(user::LoginStatus login_status, |
| int multiprofile_index) { |
| views::View* icon = CreateIcon(login_status, multiprofile_index); |
| AddChildView(icon); |
| - views::Label* username = NULL; |
| + views::Label* user_name = NULL; |
| SessionStateDelegate* delegate = |
| Shell::GetInstance()->session_state_delegate(); |
| if (!multiprofile_index) { |
| @@ -313,12 +386,12 @@ void UserCardView::AddUserContent(user::LoginStatus login_status, |
| user_name_string = base::ASCIIToUTF16( |
| delegate->GetUserInfo(multiprofile_index)->GetEmail()); |
| if (!user_name_string.empty()) { |
| - username = new views::Label(user_name_string); |
| - username->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + user_name = new views::Label(user_name_string); |
| + user_name->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| } |
| } |
| - views::Label* additional = NULL; |
| + views::Label* user_email = NULL; |
| if (login_status != user::LOGGED_IN_GUEST && |
| (multiprofile_index || !IsMultiAccountSupportedAndUserActive())) { |
| base::string16 user_email_string = |
| @@ -328,37 +401,55 @@ void UserCardView::AddUserContent(user::LoginStatus login_status, |
| : base::UTF8ToUTF16( |
| delegate->GetUserInfo(multiprofile_index)->GetEmail()); |
| if (!user_email_string.empty()) { |
| - additional = new views::Label(user_email_string); |
| - additional->SetFontList( |
| + user_email = new views::Label(user_email_string); |
| + user_email->SetFontList( |
| ui::ResourceBundle::GetSharedInstance().GetFontList( |
| ui::ResourceBundle::SmallFont)); |
| - additional->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + user_email->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| } |
| } |
| // Adjust text properties dependent on if it is an active or inactive user. |
| if (multiprofile_index) { |
| // Fade the text of non active users to 50%. |
| - SkColor text_color = additional->enabled_color(); |
| + SkColor text_color = user_email->enabled_color(); |
| text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2); |
| - if (additional) |
| - additional->SetDisabledColor(text_color); |
| - if (username) |
| - username->SetDisabledColor(text_color); |
| + if (user_email) |
| + user_email->SetDisabledColor(text_color); |
| + if (user_name) |
| + user_name->SetDisabledColor(text_color); |
| } |
| - if (additional && username) { |
| + if (user_email && user_name) { |
| views::View* details = new views::View; |
| details->SetLayoutManager(new views::BoxLayout( |
| views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0)); |
| - details->AddChildView(username); |
| - details->AddChildView(additional); |
| + details->AddChildView(user_name); |
| + details->AddChildView(user_email); |
| AddChildView(details); |
| } else { |
| - if (username) |
| - AddChildView(username); |
| - if (additional) |
| - AddChildView(additional); |
| + if (user_name) |
| + AddChildView(user_name); |
| + if (user_email) { |
| +#if defined(OS_CHROMEOS) |
| + // Only non active user can have a media indicator. |
| + MediaIndicator* media_indicator = new MediaIndicator(multiprofile_index); |
| + views::View* email_indicator_view = new views::View; |
| + email_indicator_view->SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems)); |
| + email_indicator_view->AddChildView(user_email); |
| + email_indicator_view->AddChildView(media_indicator); |
| + |
| + views::View* details = new views::View; |
| + details->SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0)); |
| + details->AddChildView(email_indicator_view); |
| + details->AddChildView(media_indicator->GetMessageView()); |
| + AddChildView(details); |
| +#else |
| + AddChildView(user_email); |
| +#endif |
| + } |
| } |
| } |