Index: ash/accelerators/accelerator_controller.cc |
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc |
index 6eb68a3921409ddb09a7388551f83661ff71e866..e5113674d88a5c37e45b4d6ac6a8a41b38ef19f3 100644 |
--- a/ash/accelerators/accelerator_controller.cc |
+++ b/ash/accelerators/accelerator_controller.cc |
@@ -38,6 +38,7 @@ |
#include "ash/system/brightness_control_delegate.h" |
#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h" |
#include "ash/system/status_area_widget.h" |
+#include "ash/system/system_notifier.h" |
#include "ash/system/tray/system_tray.h" |
#include "ash/system/tray/system_tray_delegate.h" |
#include "ash/system/tray/system_tray_notifier.h" |
@@ -55,16 +56,21 @@ |
#include "ash/wm/wm_event.h" |
#include "base/bind.h" |
#include "base/command_line.h" |
+#include "base/metrics/histogram_macros.h" |
#include "base/metrics/user_metrics.h" |
#include "ui/aura/env.h" |
#include "ui/base/accelerators/accelerator.h" |
#include "ui/base/accelerators/accelerator_manager.h" |
+#include "ui/base/l10n/l10n_util.h" |
#include "ui/compositor/layer.h" |
#include "ui/compositor/layer_animation_sequence.h" |
#include "ui/compositor/layer_animator.h" |
#include "ui/events/event.h" |
#include "ui/events/keycodes/keyboard_codes.h" |
#include "ui/gfx/screen.h" |
+#include "ui/message_center/message_center.h" |
+#include "ui/message_center/notification.h" |
+#include "ui/message_center/notifier_settings.h" |
#include "ui/views/controls/webview/webview.h" |
#if defined(OS_CHROMEOS) |
@@ -79,6 +85,37 @@ namespace { |
using base::UserMetricsAction; |
+inline ui::Accelerator CreateAccelerator(ui::KeyboardCode keycode, |
+ int modifiers, |
+ bool trigger_on_press) { |
+ ui::Accelerator accelerator(keycode, modifiers); |
+ accelerator.set_type(trigger_on_press ? ui::ET_KEY_PRESSED |
+ : ui::ET_KEY_RELEASED); |
+ return accelerator; |
+} |
+ |
+void ShowDeprecatedAcceleratorNotification(int message_id) { |
+ const base::string16 message = l10n_util::GetStringUTF16(message_id); |
+ scoped_ptr<message_center::Notification> notification( |
+ new message_center::Notification( |
+ message_center::NOTIFICATION_TYPE_SIMPLE, |
+ kDeprecatedAcceleratorNotificationId, base::string16(), message, |
+ gfx::Image(), base::string16(), |
+ message_center::NotifierId( |
+ message_center::NotifierId::SYSTEM_COMPONENT, |
+ system_notifier::kNotifierAcceleratorController), |
+ message_center::RichNotificationData(), nullptr)); |
+ message_center::MessageCenter::Get()->AddNotification(notification.Pass()); |
+} |
+ |
+void RecordUmaHistogram(const char* histogram_name, |
+ DeprecatedAcceleratorUsage sample) { |
+ auto histogram = base::LinearHistogram::FactoryGet( |
+ histogram_name, 1, DEPRECATED_USAGE_COUNT, DEPRECATED_USAGE_COUNT + 1, |
+ base::HistogramBase::kUmaTargetedHistogramFlag); |
+ histogram->Add(sample); |
+} |
+ |
bool CanHandleAccessibleFocusCycle() { |
if (!Shell::GetInstance()->accessibility_delegate()-> |
IsSpokenFeedbackEnabled()) { |
@@ -758,6 +795,11 @@ bool AcceleratorController::IsReserved( |
return reserved_actions_.find(iter->second) != reserved_actions_.end(); |
} |
+bool AcceleratorController::IsDeprecated( |
+ const ui::Accelerator& accelerator) const { |
+ return deprecated_accelerators_.count(accelerator) != 0; |
+} |
+ |
bool AcceleratorController::PerformActionIfEnabled(AcceleratorAction action) { |
if (CanPerformAction(action, ui::Accelerator())) { |
PerformAction(action, ui::Accelerator()); |
@@ -833,6 +875,9 @@ void AcceleratorController::Init() { |
RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength); |
+ RegisterDeprecatedAccelerators(kDeprecatedAccelerators, |
+ kDeprecatedAcceleratorsLength); |
+ |
if (debug::DebugAcceleratorsEnabled()) { |
RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength); |
// All debug accelerators are reserved. |
@@ -850,16 +895,33 @@ void AcceleratorController::RegisterAccelerators( |
const AcceleratorData accelerators[], |
size_t accelerators_length) { |
for (size_t i = 0; i < accelerators_length; ++i) { |
- ui::Accelerator accelerator(accelerators[i].keycode, |
- accelerators[i].modifiers); |
- accelerator.set_type(accelerators[i].trigger_on_press ? |
- ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED); |
+ ui::Accelerator accelerator = |
+ CreateAccelerator(accelerators[i].keycode, accelerators[i].modifiers, |
+ accelerators[i].trigger_on_press); |
Register(accelerator, this); |
accelerators_.insert( |
std::make_pair(accelerator, accelerators[i].action)); |
} |
} |
+void AcceleratorController::RegisterDeprecatedAccelerators( |
+ const DeprecatedAcceleratorData deprecated_accelerators[], |
+ size_t length) { |
+ for (size_t i = 0; i < length; ++i) { |
+ const DeprecatedAcceleratorData* data = &deprecated_accelerators[i]; |
+ const AcceleratorAction action = data->deprecated_accelerator.action; |
+ const ui::Accelerator deprecated_accelerator = |
+ CreateAccelerator(data->deprecated_accelerator.keycode, |
+ data->deprecated_accelerator.modifiers, |
+ data->deprecated_accelerator.trigger_on_press); |
+ |
+ Register(deprecated_accelerator, this); |
+ actions_with_deprecations_[action] = data; |
+ accelerators_[deprecated_accelerator] = action; |
+ deprecated_accelerators_.insert(deprecated_accelerator); |
+ } |
+} |
+ |
bool AcceleratorController::CanPerformAction( |
AcceleratorAction action, |
const ui::Accelerator& accelerator) { |
@@ -868,6 +930,29 @@ bool AcceleratorController::CanPerformAction( |
return false; |
} |
+ // Handling the deprecated accelerators. |
+ auto itr = actions_with_deprecations_.find(action); |
+ if (itr != actions_with_deprecations_.end()) { |
+ const DeprecatedAcceleratorData* data = itr->second; |
+ if (deprecated_accelerators_.count(accelerator)) { |
+ // This accelerator has been deprecated and should be treated according |
+ // to its |DeprecatedAcceleratorData|. |
+ |
+ // Record UMA stats. |
+ RecordUmaHistogram(data->uma_histogram_name, DEPRECATED_USED); |
+ |
+ // We always display the notification as long as this entry exists. |
+ ShowDeprecatedAcceleratorNotification(data->notification_message_id); |
+ |
+ if (!data->deprecated_enabled) |
+ return false; |
+ } else { |
+ // This is a new accelerator replacing the old deprecated one. |
+ // Record UMA stats and proceed normally. |
+ RecordUmaHistogram(data->uma_histogram_name, NEW_USED); |
+ } |
+ } |
+ |
AcceleratorProcessingRestriction restriction = |
GetAcceleratorProcessingRestriction(action); |
if (restriction != RESTRICTION_NONE) |