1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h"
7 #include "base/lazy_instance.h"
8 #include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
9 #include "chrome/browser/extensions/extension_system.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/profiles/profile_manager.h"
13 #if defined(OS_CHROMEOS)
14 #include "chrome/browser/chromeos/login/screen_locker.h"
15 #include "chrome/browser/chromeos/profiles/profile_helper.h"
18 namespace OnDisplayStateChanged =
19 extensions::api::braille_display_private::OnDisplayStateChanged;
20 namespace OnKeyEvent = extensions::api::braille_display_private::OnKeyEvent;
21 namespace WriteDots = extensions::api::braille_display_private::WriteDots;
22 using extensions::api::braille_display_private::DisplayState;
23 using extensions::api::braille_display_private::KeyEvent;
24 using extensions::api::braille_display_private::BrailleController;
26 namespace extensions {
28 class BrailleDisplayPrivateAPI::DefaultEventDelegate
29 : public BrailleDisplayPrivateAPI::EventDelegate {
31 DefaultEventDelegate(EventRouter::Observer* observer, Profile* profile);
32 virtual ~DefaultEventDelegate();
34 virtual void BroadcastEvent(scoped_ptr<Event> event) OVERRIDE;
35 virtual bool HasListener() OVERRIDE;
38 EventRouter::Observer* observer_;
42 BrailleDisplayPrivateAPI::BrailleDisplayPrivateAPI(Profile* profile)
43 : profile_(profile), scoped_observer_(this),
44 event_delegate_(new DefaultEventDelegate(this, profile_)) {
47 BrailleDisplayPrivateAPI::~BrailleDisplayPrivateAPI() {
50 void BrailleDisplayPrivateAPI::Shutdown() {
53 static base::LazyInstance<ProfileKeyedAPIFactory<BrailleDisplayPrivateAPI> >
54 g_factory = LAZY_INSTANCE_INITIALIZER;
57 ProfileKeyedAPIFactory<BrailleDisplayPrivateAPI>*
58 BrailleDisplayPrivateAPI::GetFactoryInstance() {
59 return &g_factory.Get();
62 void BrailleDisplayPrivateAPI::OnDisplayStateChanged(
63 const DisplayState& display_state) {
64 scoped_ptr<Event> event(new Event(
65 OnDisplayStateChanged::kEventName,
66 OnDisplayStateChanged::Create(display_state)));
67 event_delegate_->BroadcastEvent(event.Pass());
70 void BrailleDisplayPrivateAPI::OnKeyEvent(
71 const KeyEvent& key_event) {
72 // Key events only go to extensions of the active profile.
73 if (!IsProfileActive())
75 scoped_ptr<Event> event(new Event(
76 OnKeyEvent::kEventName, OnKeyEvent::Create(key_event)));
77 event_delegate_->BroadcastEvent(event.Pass());
80 bool BrailleDisplayPrivateAPI::IsProfileActive() {
81 #if defined(OS_CHROMEOS)
82 Profile* active_profile;
83 chromeos::ScreenLocker* screen_locker =
84 chromeos::ScreenLocker::default_screen_locker();
85 if (screen_locker && screen_locker->locked())
86 active_profile = chromeos::ProfileHelper::GetSigninProfile();
88 active_profile = ProfileManager::GetDefaultProfile();
89 return profile_->IsSameProfile(active_profile);
90 #else // !defined(OS_CHROMEOS)
95 void BrailleDisplayPrivateAPI::SetEventDelegateForTest(
96 scoped_ptr<EventDelegate> delegate) {
97 event_delegate_ = delegate.Pass();
100 void BrailleDisplayPrivateAPI::OnListenerAdded(
101 const EventListenerInfo& details) {
102 BrailleController* braille_controller = BrailleController::GetInstance();
103 if (!scoped_observer_.IsObserving(braille_controller))
104 scoped_observer_.Add(braille_controller);
107 void BrailleDisplayPrivateAPI::OnListenerRemoved(
108 const EventListenerInfo& details) {
109 BrailleController* braille_controller = BrailleController::GetInstance();
110 if (!event_delegate_->HasListener() &&
111 scoped_observer_.IsObserving(braille_controller)) {
112 scoped_observer_.Remove(braille_controller);
116 BrailleDisplayPrivateAPI::DefaultEventDelegate::DefaultEventDelegate(
117 EventRouter::Observer* observer, Profile* profile)
118 : observer_(observer), profile_(profile) {
119 EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
120 event_router->RegisterObserver(observer_, OnDisplayStateChanged::kEventName);
121 event_router->RegisterObserver(observer_, OnKeyEvent::kEventName);
124 BrailleDisplayPrivateAPI::DefaultEventDelegate::~DefaultEventDelegate() {
125 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(observer_);
128 void BrailleDisplayPrivateAPI::DefaultEventDelegate::BroadcastEvent(
129 scoped_ptr<Event> event) {
130 ExtensionSystem::Get(profile_)->event_router()->BroadcastEvent(event.Pass());
133 bool BrailleDisplayPrivateAPI::DefaultEventDelegate::HasListener() {
134 EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
135 return (event_router->HasEventListener(OnDisplayStateChanged::kEventName) ||
136 event_router->HasEventListener(OnKeyEvent::kEventName));
140 bool BrailleDisplayPrivateGetDisplayStateFunction::Prepare() {
144 void BrailleDisplayPrivateGetDisplayStateFunction::Work() {
146 BrailleController::GetInstance()->GetDisplayState()->ToValue().release());
149 bool BrailleDisplayPrivateGetDisplayStateFunction::Respond() {
153 BrailleDisplayPrivateWriteDotsFunction::
154 BrailleDisplayPrivateWriteDotsFunction() {
157 BrailleDisplayPrivateWriteDotsFunction::
158 ~BrailleDisplayPrivateWriteDotsFunction() {
161 bool BrailleDisplayPrivateWriteDotsFunction::Prepare() {
162 params_ = WriteDots::Params::Create(*args_);
163 EXTENSION_FUNCTION_VALIDATE(params_);
167 void BrailleDisplayPrivateWriteDotsFunction::Work() {
168 BrailleController::GetInstance()->WriteDots(params_->cells);
171 bool BrailleDisplayPrivateWriteDotsFunction::Respond() {
175 } // namespace extensions