Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Side by Side Diff: extensions/browser/api/media_perception_private/media_perception_api_manager.cc

Issue 2858353002: MediaPerceptionPrivate API impl and testing. (Closed)
Patch Set: Implemented CallbackStatus enum, AnalyticsProcessState enum, and addressed Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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.
4
5 #include "extensions/browser/api/media_perception_private/media_perception_api_m anager.h"
6
7 #include "base/lazy_instance.h"
8 #include "chromeos/dbus/dbus_thread_manager.h"
9 #include "chromeos/dbus/media_analytics_client.h"
10 #include "chromeos/dbus/upstart_client.h"
11 #include "extensions/browser/api/media_perception_private/conversion_utils.h"
12 #include "extensions/browser/event_router.h"
13 #include "extensions/browser/extension_function.h"
14
15 namespace media_perception = extensions::api::media_perception_private;
16
17 namespace extensions {
18
19 // static
20 MediaPerceptionAPIManager* MediaPerceptionAPIManager::Get(
21 content::BrowserContext* context) {
22 return GetFactoryInstance()->Get(context);
23 }
24
25 static base::LazyInstance<
26 BrowserContextKeyedAPIFactory<MediaPerceptionAPIManager>>::Leaky g_factory =
27 LAZY_INSTANCE_INITIALIZER;
28
29 // static
30 BrowserContextKeyedAPIFactory<MediaPerceptionAPIManager>*
31 MediaPerceptionAPIManager::GetFactoryInstance() {
32 return g_factory.Pointer();
33 }
34
35 MediaPerceptionAPIManager::MediaPerceptionAPIManager(
36 content::BrowserContext* context)
37 : browser_context_(context),
38 analytics_process_state_(AnalyticsProcessState::IDLE),
39 weak_ptr_factory_(this) {
40 chromeos::MediaAnalyticsClient* dbus_client =
41 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
42 dbus_client->SetMediaPerceptionSignalHandler(
43 base::Bind(&MediaPerceptionAPIManager::MediaPerceptionSignalHandler,
44 weak_ptr_factory_.GetWeakPtr()));
45 }
46
47 MediaPerceptionAPIManager::~MediaPerceptionAPIManager() {
48 chromeos::MediaAnalyticsClient* dbus_client =
49 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
50 dbus_client->ClearMediaPerceptionSignalHandler();
51 // Stop the separate media analytics process.
52 chromeos::UpstartClient* upstart_client =
53 chromeos::DBusThreadManager::Get()->GetUpstartClient();
54 upstart_client->StopMediaAnalytics();
55 }
56
57 void MediaPerceptionAPIManager::GetState(const APIStateCallback& callback) {
58 if (analytics_process_state_ == AnalyticsProcessState::RUNNING) {
59 chromeos::MediaAnalyticsClient* dbus_client =
60 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
61 dbus_client->GetState(base::Bind(&MediaPerceptionAPIManager::StateCallback,
62 weak_ptr_factory_.GetWeakPtr(), callback));
63 return;
64 }
65
66 if (analytics_process_state_ == AnalyticsProcessState::LAUNCHING) {
67 callback.Run(CallbackStatus::PROCESS_LAUNCHING, media_perception::State());
68 return;
69 }
70
71 // Calling getState with process not running returns State UNINITIALIZED.
72 media_perception::State state_unitialized;
73 state_unitialized.status = media_perception::STATUS_UNINITIALIZED;
74 callback.Run(CallbackStatus::SUCCESS, std::move(state_unitialized));
75 }
76
77 void MediaPerceptionAPIManager::SetState(const media_perception::State& state,
78 const APIStateCallback& callback) {
79 mri::State state_proto = StateIdlToProto(state);
80 DCHECK(state_proto.status() == mri::State::RUNNING ||
81 state_proto.status() == mri::State::SUSPENDED)
82 << "Cannot set state to something other than RUNNING or SUSPENDED.";
83 if (analytics_process_state_ == AnalyticsProcessState::RUNNING) {
84 SetStateInternal(callback, state_proto);
85 return;
86 }
87
88 if (analytics_process_state_ == AnalyticsProcessState::LAUNCHING) {
89 callback.Run(CallbackStatus::PROCESS_LAUNCHING, media_perception::State());
90 return;
91 }
92
93 // Analytics process is in state IDLE.
94 if (state_proto.status() == mri::State::RUNNING) {
95 chromeos::UpstartClient* dbus_client =
96 chromeos::DBusThreadManager::Get()->GetUpstartClient();
97 dbus_client->StartMediaAnalytics(
98 base::Bind(&MediaPerceptionAPIManager::UpstartCallback,
99 weak_ptr_factory_.GetWeakPtr(), callback, state_proto));
100 analytics_process_state_ = AnalyticsProcessState::LAUNCHING;
101 return;
102 }
103
104 callback.Run(CallbackStatus::PROCESS_IDLE, media_perception::State());
105 }
106
107 void MediaPerceptionAPIManager::SetStateInternal(
108 const APIStateCallback& callback,
109 const mri::State& state) {
110 chromeos::MediaAnalyticsClient* dbus_client =
111 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
112 dbus_client->SetState(state,
113 base::Bind(&MediaPerceptionAPIManager::StateCallback,
114 weak_ptr_factory_.GetWeakPtr(), callback));
115 }
116
117 void MediaPerceptionAPIManager::GetDiagnostics(
118 const APIGetDiagnosticsCallback& callback) {
119 chromeos::MediaAnalyticsClient* dbus_client =
120 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
121 dbus_client->GetDiagnostics(
122 base::Bind(&MediaPerceptionAPIManager::GetDiagnosticsCallback,
123 weak_ptr_factory_.GetWeakPtr(), callback));
124 }
125
126 void MediaPerceptionAPIManager::UpstartCallback(
127 const APIStateCallback& callback,
128 const mri::State& state,
129 bool succeeded) {
130 if (!succeeded) {
131 analytics_process_state_ = AnalyticsProcessState::IDLE;
132 LOG(ERROR) << "Failed to start media analytics process via Upstart.";
133 callback.Run(CallbackStatus::PROCESS_IDLE, media_perception::State());
134 return;
135 }
136 analytics_process_state_ = AnalyticsProcessState::RUNNING;
137 SetStateInternal(callback, state);
138 }
139
140 void MediaPerceptionAPIManager::StateCallback(const APIStateCallback& callback,
141 bool succeeded,
142 const mri::State& state_proto) {
143 media_perception::State state;
144 if (!succeeded) {
145 callback.Run(CallbackStatus::DBUS_ERROR, media_perception::State());
146 return;
147 }
148 callback.Run(CallbackStatus::SUCCESS, StateProtoToIdl(state_proto));
149 }
150
151 void MediaPerceptionAPIManager::GetDiagnosticsCallback(
152 const APIGetDiagnosticsCallback& callback,
153 bool succeeded,
154 const mri::Diagnostics& diagnostics_proto) {
155 if (!succeeded) {
156 callback.Run(CallbackStatus::DBUS_ERROR, media_perception::Diagnostics());
157 return;
158 }
159 callback.Run(CallbackStatus::SUCCESS,
160 DiagnosticsProtoToIdl(diagnostics_proto));
161 }
162
163 void MediaPerceptionAPIManager::MediaPerceptionSignalHandler(
164 const mri::MediaPerception& media_perception_proto) {
165 EventRouter* router = EventRouter::Get(browser_context_);
166 DCHECK(router) << "EventRouter is null.";
167
168 media_perception::MediaPerception media_perception =
169 MediaPerceptionProtoToIdl(media_perception_proto);
170 std::unique_ptr<Event> event(
171 new Event(events::MEDIA_PERCEPTION_PRIVATE_ON_MEDIA_PERCEPTION,
172 media_perception::OnMediaPerception::kEventName,
173 media_perception::OnMediaPerception::Create(media_perception)));
174 router->BroadcastEvent(std::move(event));
175 }
176
177 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698