Add a button on status bar to indicate that accessibility is enabled.

BUG=chromium-os:18937
TEST=Press Ctrl+Alt+Z on login screen to enable accessibility, ensure that a hand icon with an orange background appears.


Review URL: http://codereview.chromium.org/7753029

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98788 0039d316-1c4b-4281-b951-d872f2087c98
parent 0d717603
......@@ -12164,6 +12164,12 @@ Keep your key file in a safe place. You will need it to create new versions of y
desc="The label for the Chrome OS configuration dialog">
fast
</message>
<message name="IDS_STATUSBAR_ACCESSIBILITY_ENABLED" desc="The tooltip for the status bar button to indicate that accessibility is enabled.">
Accessibility features are enabled.
</message>
<message name="IDS_STATUSBAR_DISABLE_SPOKEN_FEEDBACK" desc="The menu option to disable spoken feedback accessibility feature.">
Disable Spoken Feedback
</message>
<message name="IDS_STATUSBAR_NETWORK_LOCKED" desc="Message displayed while access to network devices is temporarily locked due to mobile network activation">
Please wait while we set up your mobile network.
</message>
......
// Copyright (c) 2011 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 "chrome/browser/chromeos/status/accessibility_menu_button.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/accessibility_util.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "views/widget/widget.h"
#include "views/controls/menu/menu_runner.h"
#include "views/controls/menu/menu_item_view.h"
namespace {
enum MenuItemID {
MENU_ITEM_DISABLE_SPOKEN_FEEDBACK,
};
}
namespace chromeos {
////////////////////////////////////////////////////////////////////////////////
// AccessibilityMenuButton
AccessibilityMenuButton::AccessibilityMenuButton(StatusAreaHost* host)
: StatusAreaButton(host, this) {
accessibility_enabled_.Init(prefs::kAccessibilityEnabled,
g_browser_process->local_state(), this);
SetIcon(*ResourceBundle::GetSharedInstance().GetBitmapNamed(
IDR_STATUSBAR_ACCESSIBILITY));
Update();
}
AccessibilityMenuButton::~AccessibilityMenuButton() {
}
////////////////////////////////////////////////////////////////////////////////
// views::ViewMenuDelegate implementation:
void AccessibilityMenuButton::RunMenu(views::View* source,
const gfx::Point& pt) {
PrepareMenu();
gfx::Point screen_location;
views::View::ConvertPointToScreen(source, &screen_location);
gfx::Rect bounds(screen_location, source->size());
CHECK(menu_runner_->RunMenuAt(source->GetWidget()->GetTopLevelWidget(),
this, bounds, views::MenuItemView::TOPRIGHT,
0) ==
views::MenuRunner::NORMAL_EXIT);
}
////////////////////////////////////////////////////////////////////////////////
// views::MenuDelegate implementation
void AccessibilityMenuButton::ExecuteCommand(int id) {
switch (id) {
case MENU_ITEM_DISABLE_SPOKEN_FEEDBACK:
accessibility::EnableAccessibility(false, NULL);
break;
default:
NOTREACHED();
}
}
////////////////////////////////////////////////////////////////////////////////
// NotificationObserver implementation
void AccessibilityMenuButton::Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) {
if (type == chrome::NOTIFICATION_PREF_CHANGED)
Update();
}
void AccessibilityMenuButton::Update() {
// Update tooltip and accessibile name.
string16 message =
l10n_util::GetStringUTF16(IDS_STATUSBAR_ACCESSIBILITY_ENABLED);
SetTooltipText(UTF16ToWide(message));
SetAccessibleName(message);
// Update visibility.
SetVisible(accessibility_enabled_.GetValue());
}
void AccessibilityMenuButton::PrepareMenu() {
views::MenuItemView* menu = new views::MenuItemView(this);
if (accessibility_enabled_.GetValue())
menu->AppendMenuItemWithLabel(MENU_ITEM_DISABLE_SPOKEN_FEEDBACK,
UTF16ToWide(l10n_util::GetStringUTF16(
IDS_STATUSBAR_DISABLE_SPOKEN_FEEDBACK)));
// |menu_runner_| takes the ownership of |menu|
menu_runner_.reset(new views::MenuRunner(menu));
}
} // namespace chromeos
// Copyright (c) 2011 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 CHROME_BROWSER_CHROMEOS_STATUS_ACCESSIBILITY_MENU_BUTTON_H_
#define CHROME_BROWSER_CHROMEOS_STATUS_ACCESSIBILITY_MENU_BUTTON_H_
#pragma once
#include "chrome/browser/chromeos/status/status_area_button.h"
#include "chrome/browser/prefs/pref_member.h"
#include "content/common/notification_observer.h"
#include "views/controls/menu/view_menu_delegate.h"
#include "views/controls/menu/menu_delegate.h"
namespace views {
class MenuRunner;
}
namespace chromeos {
class StatusAreaHost;
// A class for the button in the status area which alerts the user when
// accessibility features are enabled.
class AccessibilityMenuButton : public StatusAreaButton,
public views::ViewMenuDelegate,
public views::MenuDelegate,
public NotificationObserver {
public:
explicit AccessibilityMenuButton(StatusAreaHost* host);
virtual ~AccessibilityMenuButton();
// views::ViewMenuDelegate implementation
virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE;
// views::MenuDelegate implementation
virtual void ExecuteCommand(int id) OVERRIDE;
// NotificationObserver implementation
virtual void Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) OVERRIDE;
private:
// Updates the state along with the preferences.
void Update();
// Prepares menu before showing it.
void PrepareMenu();
// An object synced to the preference, representing if accessibility feature
// is enabled or not.
BooleanPrefMember accessibility_enabled_;
// An object to show menu.
scoped_ptr<views::MenuRunner> menu_runner_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityMenuButton);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_STATUS_ACCESSIBILITY_MENU_BUTTON_H_
// Copyright (c) 2011 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 "chrome/browser/chromeos/status/accessibility_menu_button.h"
#include "chrome/browser/chromeos/accessibility_util.h"
#include "chrome/browser/chromeos/frame/browser_view.h"
#include "chrome/browser/chromeos/status/status_area_view.h"
#include "chrome/browser/chromeos/view_ids.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
namespace chromeos {
class AccessibilityMenuButtonTest : public InProcessBrowserTest {
protected:
AccessibilityMenuButtonTest() : InProcessBrowserTest() {
}
AccessibilityMenuButton* GetAccessibilityMenuButton() {
BrowserView* view = static_cast<BrowserView*>(browser()->window());
return static_cast<StatusAreaView*>(view->
GetViewByID(VIEW_ID_STATUS_AREA))->accessibility_view();
}
};
IN_PROC_BROWSER_TEST_F(AccessibilityMenuButtonTest,
VisibilityIsSyncedWithPreference) {
AccessibilityMenuButton* button = GetAccessibilityMenuButton();
ASSERT_TRUE(button != NULL);
accessibility::EnableAccessibility(true, NULL);
EXPECT_TRUE(button->IsVisible());
accessibility::EnableAccessibility(false, NULL);
EXPECT_FALSE(button->IsVisible());
}
} // namespace chromeos
......@@ -7,6 +7,7 @@
#include <algorithm>
#include "base/command_line.h"
#include "chrome/browser/chromeos/status/accessibility_menu_button.h"
#include "chrome/browser/chromeos/status/caps_lock_menu_button.h"
#include "chrome/browser/chromeos/status/clock_menu_button.h"
#include "chrome/browser/chromeos/status/input_method_menu_button.h"
......@@ -32,6 +33,7 @@ const int kSeparation = 5;
StatusAreaView::StatusAreaView(StatusAreaHost* host)
: host_(host),
accessibility_view_(NULL),
caps_lock_view_(NULL),
clock_view_(NULL),
input_method_view_(NULL),
......@@ -46,6 +48,10 @@ void StatusAreaView::Init() {
AddChildView(memory_view_);
}
accessibility_view_ = new AccessibilityMenuButton(host_);
accessibility_view_->set_border(views::Border::CreateEmptyBorder(0, 1, 0, 0));
AddChildView(accessibility_view_);
caps_lock_view_ = new CapsLockMenuButton(host_);
caps_lock_view_->set_border(views::Border::CreateEmptyBorder(0, 1, 0, 0));
AddChildView(caps_lock_view_);
......
......@@ -12,6 +12,7 @@
namespace chromeos {
class AccessibilityMenuButton;
class CapsLockMenuButton;
class ClockMenuButton;
class InputMethodMenuButton;
......@@ -36,6 +37,7 @@ class StatusAreaView : public AccessiblePaneView {
virtual void Layout();
virtual void ChildPreferredSizeChanged(View* child);
AccessibilityMenuButton* accessibility_view() { return accessibility_view_; }
CapsLockMenuButton* caps_lock_view() { return caps_lock_view_; }
ClockMenuButton* clock_view() { return clock_view_; }
InputMethodMenuButton* input_method_view() { return input_method_view_; }
......@@ -45,6 +47,7 @@ class StatusAreaView : public AccessiblePaneView {
private:
StatusAreaHost* host_;
AccessibilityMenuButton* accessibility_view_;
CapsLockMenuButton* caps_lock_view_;
ClockMenuButton* clock_view_;
InputMethodMenuButton* input_method_view_;
......
......@@ -711,6 +711,8 @@
'browser/chromeos/sim_dialog_delegate.h',
'browser/chromeos/sms_observer.cc',
'browser/chromeos/sms_observer.h',
'browser/chromeos/status/accessibility_menu_button.cc',
'browser/chromeos/status/accessibility_menu_button.h',
'browser/chromeos/status/caps_lock_menu_button.cc',
'browser/chromeos/status/caps_lock_menu_button.h',
'browser/chromeos/status/clock_menu_button.cc',
......
......@@ -2414,6 +2414,7 @@
'browser/chromeos/network_state_notifier_browsertest.cc',
'browser/chromeos/notifications/notification_browsertest.cc',
'browser/chromeos/panels/panel_browsertest.cc',
'browser/chromeos/status/accessibility_menu_button_browsertest.cc',
'browser/chromeos/status/caps_lock_menu_button_browsertest.cc',
'browser/chromeos/status/clock_menu_button_browsertest.cc',
'browser/chromeos/status/input_method_menu_button_browsertest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment