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

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: Removing enums.xml from this change. 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_running_(false),
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 // Return uninitialized state if the media analytics process isn't running.
59 if (!analytics_process_running_) {
60 media_perception::State state_unitialized;
61 state_unitialized.status = media_perception::STATUS_UNINITIALIZED;
62 callback.Run(true, std::move(state_unitialized));
63 return;
64 }
65 chromeos::MediaAnalyticsClient* dbus_client =
66 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
67 dbus_client->GetState(base::Bind(&MediaPerceptionAPIManager::StateCallback,
68 weak_ptr_factory_.GetWeakPtr(), callback));
69 }
70
71 void MediaPerceptionAPIManager::SetState(const media_perception::State& state,
72 const APIStateCallback& callback) {
73 mri::State state_proto = StateIdlToProto(state);
74 DCHECK(state_proto.status() == mri::State::RUNNING ||
75 state_proto.status() == mri::State::SUSPENDED)
76 << "Cannot set state to something other than RUNNING or SUSPENDED.";
77 if (analytics_process_running_) {
78 SetStateInternal(callback, state_proto);
79 return;
80 }
81
82 if (state_proto.status() == mri::State::RUNNING) {
83 chromeos::UpstartClient* dbus_client =
84 chromeos::DBusThreadManager::Get()->GetUpstartClient();
85 dbus_client->StartMediaAnalytics(
86 base::Bind(&MediaPerceptionAPIManager::UpstartCallback,
87 weak_ptr_factory_.GetWeakPtr(), callback, state_proto));
88 return;
89 }
90
91 media_perception::State return_state;
92 return_state.status = media_perception::STATUS_UNINITIALIZED;
93 callback.Run(false, std::move(return_state));
94 }
95
96 void MediaPerceptionAPIManager::SetStateInternal(
97 const APIStateCallback& callback,
98 const mri::State& state) {
99 chromeos::MediaAnalyticsClient* dbus_client =
100 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
101 dbus_client->SetState(state,
102 base::Bind(&MediaPerceptionAPIManager::StateCallback,
103 weak_ptr_factory_.GetWeakPtr(), callback));
104 }
105
106 void MediaPerceptionAPIManager::GetDiagnostics(
107 const APIGetDiagnosticsCallback& callback) {
108 chromeos::MediaAnalyticsClient* dbus_client =
109 chromeos::DBusThreadManager::Get()->GetMediaAnalyticsClient();
110 dbus_client->GetDiagnostics(
111 base::Bind(&MediaPerceptionAPIManager::GetDiagnosticsCallback,
112 weak_ptr_factory_.GetWeakPtr(), callback));
113 }
114
115 void MediaPerceptionAPIManager::UpstartCallback(
116 const APIStateCallback& callback,
117 const mri::State& state,
118 bool succeeded) {
119 if (!succeeded) {
120 LOG(ERROR) << "Failed to start media analytics process via Upstart.";
121 media_perception::State state;
122 state.status = media_perception::STATUS_UNINITIALIZED;
123 callback.Run(false, std::move(state));
124 return;
125 }
126 analytics_process_running_ = true;
127 SetStateInternal(callback, state);
128 }
129
130 void MediaPerceptionAPIManager::StateCallback(const APIStateCallback& callback,
131 bool succeeded,
132 const mri::State& state_proto) {
133 media_perception::State state;
134 if (!succeeded) {
135 state.status = media_perception::STATUS_TIMEOUT;
136 callback.Run(false, std::move(state));
137 return;
138 }
139 callback.Run(true, StateProtoToIdl(state_proto));
140 }
141
142 void MediaPerceptionAPIManager::GetDiagnosticsCallback(
143 const APIGetDiagnosticsCallback& callback,
144 bool succeeded,
145 const mri::Diagnostics& diagnostics_proto) {
146 if (!succeeded) {
147 callback.Run(false, media_perception::Diagnostics());
148 return;
149 }
150 callback.Run(true, DiagnosticsProtoToIdl(diagnostics_proto));
151 }
152
153 void MediaPerceptionAPIManager::MediaPerceptionSignalHandler(
154 const mri::MediaPerception& media_perception_proto) {
155 EventRouter* router = EventRouter::Get(browser_context_);
156 DCHECK(router) << "EventRouter is null.";
157
158 media_perception::MediaPerception media_perception =
159 MediaPerceptionProtoToIdl(media_perception_proto);
160 std::unique_ptr<Event> event(
161 new Event(events::MEDIA_PERCEPTION_PRIVATE_ON_MEDIA_PERCEPTION,
162 media_perception::OnMediaPerception::kEventName,
163 media_perception::OnMediaPerception::Create(media_perception)));
164 router->BroadcastEvent(std::move(event));
165 }
166
167 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698