| Index: ash/system/tray_accessibility.cc
|
| diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc
|
| index 7ea654d5a24ac744362d5406fd322997410589c2..5474e4eaa1892c287eea180f6beb747be5df6a2e 100644
|
| --- a/ash/system/tray_accessibility.cc
|
| +++ b/ash/system/tray_accessibility.cc
|
| @@ -6,10 +6,16 @@
|
|
|
| #include "ash/shell.h"
|
| #include "ash/shell_delegate.h"
|
| +#include "ash/system/tray/system_tray.h"
|
| +#include "ash/system/tray/system_tray_delegate.h"
|
| #include "ash/system/tray/tray_constants.h"
|
| +#include "ash/system/tray/tray_details_view.h"
|
| +#include "ash/system/tray/tray_item_more.h"
|
| +#include "ash/system/tray/tray_notification_view.h"
|
| #include "ash/system/tray/tray_views.h"
|
| #include "grit/ash_resources.h"
|
| #include "grit/ash_strings.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "ui/gfx/image/image.h"
|
| #include "ui/views/controls/image_view.h"
|
| @@ -20,82 +26,254 @@
|
| namespace ash {
|
| namespace internal {
|
|
|
| -class DefaultAccessibilityView : public ActionableView {
|
| - public:
|
| - DefaultAccessibilityView() {
|
| - SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
|
| - kTrayPopupPaddingHorizontal,
|
| - 0,
|
| - kTrayPopupPaddingBetweenItems));
|
| +namespace {
|
| +const int kPaddingAroundBottomRow = 5;
|
| +
|
| +bool IsAnyAccessibilityFeatureEnabled() {
|
| + ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
|
| + return shell_delegate &&
|
| + (shell_delegate->IsSpokenFeedbackEnabled() ||
|
| + shell_delegate->IsHighContrastEnabled() ||
|
| + shell_delegate->GetMagnifierType() != ash::MAGNIFIER_OFF);
|
| +}
|
| +
|
| +user::LoginStatus GetCurrentLoginStatus() {
|
| + return Shell::GetInstance()->tray_delegate()->GetUserLoginStatus();
|
| +}
|
|
|
| +} // namespace
|
| +
|
| +namespace tray {
|
| +
|
| +class DefaultAccessibilityView : public TrayItemMore {
|
| + public:
|
| + explicit DefaultAccessibilityView(SystemTrayItem* owner)
|
| + : TrayItemMore(owner, true) {
|
| ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
| - FixedSizedImageView* image =
|
| - new FixedSizedImageView(0, kTrayPopupItemHeight);
|
| - image->SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
|
| + SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
|
| ToImageSkia());
|
| -
|
| - AddChildView(image);
|
| string16 label = bundle.GetLocalizedString(
|
| - IDS_ASH_STATUS_TRAY_DISABLE_SPOKEN_FEEDBACK);
|
| - AddChildView(new views::Label(label));
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
|
| + SetLabel(label);
|
| SetAccessibleName(label);
|
| }
|
|
|
| - virtual ~DefaultAccessibilityView() {}
|
| + virtual ~DefaultAccessibilityView() {
|
| + }
|
|
|
| - protected:
|
| - // Overridden from ActionableView.
|
| - virtual bool PerformAction(const ui::Event& event) OVERRIDE {
|
| - if (Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled())
|
| - Shell::GetInstance()->delegate()->ToggleSpokenFeedback();
|
| - GetWidget()->Close();
|
| - return true;
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
|
| +};
|
| +
|
| +class AccessibilityDetailedView : public TrayDetailsView,
|
| + public ViewClickListener,
|
| + public views::ButtonListener,
|
| + public ShellObserver {
|
| + public:
|
| + explicit AccessibilityDetailedView(SystemTrayItem* owner,
|
| + user::LoginStatus login) :
|
| + TrayDetailsView(owner),
|
| + spoken_feedback_view_(NULL),
|
| + high_contrast_view_(NULL),
|
| + screen_magnifier_view_(NULL),
|
| + help_view_(NULL),
|
| + login_(login) {
|
| +
|
| + Reset();
|
| +
|
| + AppendAccessibilityList();
|
| + AppendHelpEntries();
|
| + CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this);
|
| +
|
| + Layout();
|
| + }
|
| +
|
| + virtual ~AccessibilityDetailedView() {
|
| }
|
|
|
| private:
|
| + // Add the accessibility feature list.
|
| + void AppendAccessibilityList() {
|
| + CreateScrollableList();
|
| + ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
|
| + ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
|
| + bool spoken_feedback_enabled = shell_delegate->IsSpokenFeedbackEnabled();
|
| + spoken_feedback_view_ = AddScrollListItem(
|
| + bundle.GetLocalizedString(
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK),
|
| + spoken_feedback_enabled ? gfx::Font::BOLD : gfx::Font::NORMAL,
|
| + spoken_feedback_enabled);
|
| + bool high_contrast_mode_enabled = shell_delegate->IsHighContrastEnabled();
|
| + high_contrast_view_ = AddScrollListItem(
|
| + bundle.GetLocalizedString(
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE),
|
| + high_contrast_mode_enabled ? gfx::Font::BOLD : gfx::Font::NORMAL,
|
| + high_contrast_mode_enabled);
|
| + bool screen_magnifier_enabled =
|
| + shell_delegate->GetMagnifierType() == ash::MAGNIFIER_FULL;
|
| + screen_magnifier_view_ = AddScrollListItem(
|
| + bundle.GetLocalizedString(
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER),
|
| + screen_magnifier_enabled ? gfx::Font::BOLD : gfx::Font::NORMAL,
|
| + screen_magnifier_enabled);
|
| + }
|
| +
|
| + // Add help entries.
|
| + void AppendHelpEntries() {
|
| + // Currently the help page requires a browser window.
|
| + // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286
|
| + if (login_ == user::LOGGED_IN_NONE ||
|
| + login_ == user::LOGGED_IN_LOCKED)
|
| + return;
|
| +
|
| + views::View* bottom_row = new View();
|
| + views::BoxLayout* layout = new
|
| + views::BoxLayout(views::BoxLayout::kHorizontal,
|
| + kTrayMenuBottomRowPadding,
|
| + kTrayMenuBottomRowPadding,
|
| + kTrayMenuBottomRowPaddingBetweenItems);
|
| + layout->set_spread_blank_space(true);
|
| + bottom_row->SetLayoutManager(layout);
|
| +
|
| + ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
| +
|
| + TrayPopupLabelButton* help = new TrayPopupLabelButton(
|
| + this,
|
| + bundle.GetLocalizedString(
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE));
|
| + bottom_row->AddChildView(help);
|
| + help_view_ = help;
|
| +
|
| + // TODO(yoshiki): Add "Customize accessibility" button when the customize is
|
| + // available. crbug.com/158281
|
| +
|
| + AddChildView(bottom_row);
|
| + }
|
| +
|
| + HoverHighlightView* AddScrollListItem(const string16& text,
|
| + gfx::Font::FontStyle style,
|
| + bool checked) {
|
| + HoverHighlightView* container = new HoverHighlightView(this);
|
| + container->set_fixed_height(kTrayPopupItemHeight);
|
| + container->AddCheckableLabel(text, style, checked);
|
| + scroll_content()->AddChildView(container);
|
| + return container;
|
| + }
|
| +
|
| + // Overridden from ViewClickListener.
|
| + virtual void ClickedOn(views::View* sender) OVERRIDE {
|
| + ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
|
| + if (sender == footer()->content()) {
|
| + owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
|
| + } else if (sender == spoken_feedback_view_) {
|
| + shell_delegate->ToggleSpokenFeedback();
|
| + } else if (sender == high_contrast_view_) {
|
| + shell_delegate->ToggleHighContrast();
|
| + } else if (sender == screen_magnifier_view_) {
|
| + bool screen_magnifier_enabled =
|
| + shell_delegate->GetMagnifierType() == ash::MAGNIFIER_FULL;
|
| + shell_delegate->SetMagnifier(
|
| + screen_magnifier_enabled ? ash::MAGNIFIER_OFF : ash::MAGNIFIER_FULL);
|
| + }
|
| + }
|
| +
|
| + // Overridden from ButtonListener.
|
| + virtual void ButtonPressed(views::Button* sender,
|
| + const ui::Event& event) OVERRIDE {
|
| + SystemTrayDelegate* tray_delegate = Shell::GetInstance()->tray_delegate();
|
| + if (sender == help_view_)
|
| + tray_delegate->ShowAccessibilityHelp();
|
| + }
|
| +
|
| + views::View* spoken_feedback_view_;
|
| + views::View* high_contrast_view_;
|
| + views::View* screen_magnifier_view_;;
|
| + views::View* help_view_;
|
| + user::LoginStatus login_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AccessibilityDetailedView);
|
| };
|
|
|
| +class AccessibilityPopupView : public TrayNotificationView {
|
| + public:
|
| + AccessibilityPopupView(SystemTrayItem* owner)
|
| + : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) {
|
| + InitView(GetLabel());
|
| + }
|
| +
|
| + private:
|
| + views::Label* GetLabel() {
|
| + views::Label* label = new views::Label(
|
| + l10n_util::GetStringUTF16(
|
| + IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TURNED_ON_BUBBLE));
|
| + label->SetMultiLine(true);
|
| + label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + return label;
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
|
| +};
|
| +
|
| +} // namespace tray
|
| +
|
| +
|
| TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
|
| : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
|
| default_(NULL),
|
| - detailed_(NULL) {
|
| + detailed_(NULL),
|
| + request_popup_view_(false),
|
| + accessibility_previously_enabled_(IsAnyAccessibilityFeatureEnabled()),
|
| + login_(GetCurrentLoginStatus()) {
|
| + DCHECK(Shell::GetInstance()->delegate());
|
| + DCHECK(system_tray);
|
| +
|
| + Shell::GetInstance()->AddShellObserver(this);
|
| }
|
|
|
| -TrayAccessibility::~TrayAccessibility() {}
|
| +TrayAccessibility::~TrayAccessibility() {
|
| + Shell::GetInstance()->RemoveShellObserver(this);
|
| +}
|
|
|
| bool TrayAccessibility::GetInitialVisibility() {
|
| - return Shell::GetInstance()->delegate() &&
|
| - Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled();
|
| + ShellDelegate* delegate = Shell::GetInstance()->delegate();
|
| + // Always shows this on the login screen.
|
| + if (login_ == user::LOGGED_IN_NONE)
|
| + return true;
|
| +
|
| + if (delegate->ShouldAlwaysShowAccessibilityMenu() ||
|
| + IsAnyAccessibilityFeatureEnabled()) {
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) {
|
| - if (!Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled())
|
| + CHECK(default_ == NULL);
|
| +
|
| + login_ = status;
|
| +
|
| + if (!GetInitialVisibility())
|
| return NULL;
|
|
|
| CHECK(default_ == NULL);
|
| - default_ = new DefaultAccessibilityView();
|
| + default_ = new tray::DefaultAccessibilityView(this);
|
|
|
| return default_;
|
| }
|
|
|
| views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
|
| CHECK(detailed_ == NULL);
|
| - detailed_ = new views::View;
|
| -
|
| - detailed_->SetLayoutManager(new
|
| - views::BoxLayout(views::BoxLayout::kHorizontal,
|
| - kTrayPopupPaddingHorizontal, 10, kTrayPopupPaddingBetweenItems));
|
|
|
| - ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
|
| - views::ImageView* image = new views::ImageView;
|
| - image->SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
|
| - ToImageSkia());
|
| + login_ = status;
|
|
|
| - detailed_->AddChildView(image);
|
| - detailed_->AddChildView(new views::Label(bundle.GetLocalizedString(
|
| - IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TURNED_ON_BUBBLE)));
|
| + if (request_popup_view_) {
|
| + detailed_ = new tray::AccessibilityPopupView(this);
|
| + request_popup_view_ = false;
|
| + } else {
|
| + detailed_ = new tray::AccessibilityDetailedView(this, status);
|
| + }
|
|
|
| return detailed_;
|
| }
|
| @@ -108,15 +286,29 @@ void TrayAccessibility::DestroyDetailedView() {
|
| detailed_ = NULL;
|
| }
|
|
|
| -void TrayAccessibility::OnAccessibilityModeChanged(bool enabled) {
|
| +void TrayAccessibility::OnLoginStateChanged(user::LoginStatus status) {
|
| + login_ = status;
|
| +
|
| + if (tray_view())
|
| + tray_view()->SetVisible(GetInitialVisibility());
|
| +}
|
| +
|
| +void TrayAccessibility::OnAccessibilityModeChanged() {
|
| if (tray_view())
|
| - tray_view()->SetVisible(enabled);
|
| + tray_view()->SetVisible(GetInitialVisibility());
|
|
|
| - if (enabled) {
|
| + bool accessibility_enabled = IsAnyAccessibilityFeatureEnabled();
|
| + if (!accessibility_previously_enabled_ && accessibility_enabled &&
|
| + login_ != user::LOGGED_IN_NONE) {
|
| + // Shows popup if the accessibilty status is being changed to true from
|
| + // false.
|
| + request_popup_view_ = true;
|
| PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
|
| } else if (detailed_) {
|
| detailed_->GetWidget()->Close();
|
| }
|
| +
|
| + accessibility_previously_enabled_ = accessibility_enabled;
|
| }
|
|
|
| } // namespace internal
|
|
|