1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "avcontroller_item.h"
17 #include "ipc_skeleton.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "avsession_pixel_map_adapter.h"
21 #include "avsession_trace.h"
22 #include "command_send_limit.h"
23 #include "avsession_utils.h"
24 #include "permission_checker.h"
25 #include "avsession_sysevent.h"
26 #include "want_params.h"
27
28 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
29 #include <malloc.h>
30 #endif
31
32 namespace OHOS::AVSession {
AVControllerItem(pid_t pid,const sptr<AVSessionItem> & session,int32_t userId)33 AVControllerItem::AVControllerItem(pid_t pid, const sptr<AVSessionItem>& session, int32_t userId)
34 : pid_(pid), session_(session), userId_(userId)
35 {
36 std::lock_guard sessionLockGuard(sessionMutex_);
37 if (session_ != nullptr) {
38 sessionId_ = session_->GetSessionId();
39 }
40 }
41
~AVControllerItem()42 AVControllerItem::~AVControllerItem()
43 {
44 }
45
GetUserId() const46 int32_t AVControllerItem::GetUserId() const
47 {
48 return userId_;
49 }
50
RegisterCallbackInner(const sptr<IRemoteObject> & callback)51 int32_t AVControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
52 {
53 std::lock_guard lockGuard(callbackMutex_);
54 SLOGD("do register callback for controller %{public}d", static_cast<int>(pid_));
55 callback_ = iface_cast<AVControllerCallbackProxy>(callback);
56 CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
57 return AVSESSION_SUCCESS;
58 }
59
RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> & callback)60 int32_t AVControllerItem::RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> &callback)
61 {
62 std::lock_guard lockGuard(callbackMutex_);
63 innerCallback_ = callback;
64 CHECK_AND_RETURN_RET_LOG(innerCallback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
65 return AVSESSION_SUCCESS;
66 }
67
UnregisterAVControllerCallback()68 int32_t AVControllerItem::UnregisterAVControllerCallback()
69 {
70 std::lock_guard lockGuard(callbackMutex_);
71 SLOGI("UnregisterAVControllerCallback pid:%{public}d", static_cast<int>(pid_));
72 innerCallback_ = nullptr;
73 return AVSESSION_SUCCESS;
74 }
75
RegisterMigrateAVSessionProxyCallback(const std::function<int32_t (const std::string &,AAFwk::WantParams &)> & callback)76 int32_t AVControllerItem::RegisterMigrateAVSessionProxyCallback(
77 const std::function<int32_t(const std::string&, AAFwk::WantParams&)>& callback)
78 {
79 migrateProxyCallback_ = callback;
80 CHECK_AND_RETURN_RET_LOG(migrateProxyCallback_ != nullptr, AVSESSION_ERROR,
81 "RegisterMigrateAVSessionProxyCallback migrateProxyCallback_ is nullptr");
82 return AVSESSION_SUCCESS;
83 }
84
GetAVCallMetaData(AVCallMetaData & avCallMetaData)85 int32_t AVControllerItem::GetAVCallMetaData(AVCallMetaData& avCallMetaData)
86 {
87 std::lock_guard lockGuard(sessionMutex_);
88 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
89 avCallMetaData = session_->GetAVCallMetaData();
90 return AVSESSION_SUCCESS;
91 }
92
GetAVCallState(AVCallState & avCallState)93 int32_t AVControllerItem::GetAVCallState(AVCallState& avCallState)
94 {
95 std::lock_guard lockGuard(sessionMutex_);
96 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
97 avCallState = session_->GetAVCallState();
98 return AVSESSION_SUCCESS;
99 }
100
101 // LCOV_EXCL_START
GetAVPlaybackState(AVPlaybackState & state)102 int32_t AVControllerItem::GetAVPlaybackState(AVPlaybackState& state)
103 {
104 std::lock_guard lockGuard(sessionMutex_);
105 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
106 state = session_->GetPlaybackState();
107 return AVSESSION_SUCCESS;
108 }
109 // LCOV_EXCL_STOP
110
SetImgForMetaData(AVMetaData & data)111 int32_t AVControllerItem::SetImgForMetaData(AVMetaData& data)
112 {
113 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
114 std::string fileName = sessionId_ + AVSessionUtils::GetFileSuffix();
115 std::shared_ptr<AVSessionPixelMap> mediaPixelMap = std::make_shared<AVSessionPixelMap>();
116 data.SetMediaImage(mediaPixelMap);
117 AVSessionUtils::ReadImageFromFile(mediaPixelMap, fileDir, fileName);
118
119 std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
120 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "SetImgForMetaData session not exist");
121 std::string avQueueFileName =
122 session_->GetBundleName() + "_" + data.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
123 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = data.GetAVQueueImage();
124 AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
125 return AVSESSION_SUCCESS;
126 }
127
GetAVMetaData(AVMetaData & data)128 int32_t AVControllerItem::GetAVMetaData(AVMetaData& data)
129 {
130 std::lock_guard lockGuard(sessionMutex_);
131 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
132 data = session_->GetMetaDataWithoutImg();
133 int32_t ret = SetImgForMetaData(data);
134 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetImgForMetaData with ret:%{public}d", ret);
135 if (data.GetMediaImage() != nullptr && !data.GetMediaImageUri().empty()) {
136 SLOGD("isFromSession %{public}d in metaGet", isFromSession_);
137 if (isFromSession_) {
138 data.GetMediaImage()->Clear();
139 } else {
140 return ERR_INVALID_PARAM;
141 }
142 }
143 return AVSESSION_SUCCESS;
144 }
145
DoMetadataImgClean(AVMetaData & data)146 void AVControllerItem::DoMetadataImgClean(AVMetaData& data)
147 {
148 std::lock_guard metaMaskLockGuard(metaMaskMutex_);
149 SLOGD("still clear media img in DoMetadataImgClean");
150 std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = data.GetAVQueueImage();
151 AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerQueuePixelMap);
152 std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = data.GetMediaImage();
153 AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerMediaPixelMap);
154 }
155
156 // LCOV_EXCL_START
GetAVQueueItems(std::vector<AVQueueItem> & items)157 int32_t AVControllerItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
158 {
159 std::lock_guard lockGuard(sessionMutex_);
160 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
161 items = session_->GetQueueItems();
162 return AVSESSION_SUCCESS;
163 }
164
GetAVQueueTitle(std::string & title)165 int32_t AVControllerItem::GetAVQueueTitle(std::string& title)
166 {
167 std::lock_guard lockGuard(sessionMutex_);
168 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
169 title = session_->GetQueueTitle();
170 return AVSESSION_SUCCESS;
171 }
172
SkipToQueueItem(int32_t & itemId)173 int32_t AVControllerItem::SkipToQueueItem(int32_t& itemId)
174 {
175 std::lock_guard lockGuard(sessionMutex_);
176 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
177 session_->HandleSkipToQueueItem(itemId);
178 return AVSESSION_SUCCESS;
179 }
180
GetExtras(AAFwk::WantParams & extras)181 int32_t AVControllerItem::GetExtras(AAFwk::WantParams& extras)
182 {
183 std::lock_guard lockGuard(sessionMutex_);
184 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
185 CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
186 ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
187 extras = session_->GetExtras();
188 return AVSESSION_SUCCESS;
189 }
190
GetExtrasWithEvent(const std::string & extraEvent,AAFwk::WantParams & extras)191 int32_t AVControllerItem::GetExtrasWithEvent(const std::string& extraEvent, AAFwk::WantParams& extras)
192 {
193 if (migrateProxyCallback_ != nullptr) {
194 int32_t ret = migrateProxyCallback_(extraEvent, extras);
195 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
196 } else {
197 SLOGI("migrateProxyCallback_ function is nullptr");
198 }
199
200 std::lock_guard lockGuard(sessionMutex_);
201 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
202
203 return AVSESSION_SUCCESS;
204 }
205
SendAVKeyEvent(const MMI::KeyEvent & keyEvent)206 int32_t AVControllerItem::SendAVKeyEvent(const MMI::KeyEvent& keyEvent)
207 {
208 std::lock_guard lockGuard(sessionMutex_);
209 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
210 session_->HandleMediaKeyEvent(keyEvent);
211 return AVSESSION_SUCCESS;
212 }
213
GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent & ability)214 int32_t AVControllerItem::GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent& ability)
215 {
216 std::lock_guard lockGuard(sessionMutex_);
217 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
218 ability = session_->GetLaunchAbility();
219 return AVSESSION_SUCCESS;
220 }
221
GetValidCommands(std::vector<int32_t> & cmds)222 int32_t AVControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
223 {
224 std::lock_guard lockGuard(sessionMutex_);
225 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
226 cmds = session_->GetSupportCommand();
227 return AVSESSION_SUCCESS;
228 }
229 // LCOV_EXCL_STOP
230
IsSessionActive(bool & isActive)231 int32_t AVControllerItem::IsSessionActive(bool& isActive)
232 {
233 std::lock_guard lockGuard(sessionMutex_);
234 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
235 isActive = session_->IsActive();
236 return AVSESSION_SUCCESS;
237 }
238
239 // LCOV_EXCL_START
SendControlCommand(const AVControlCommand & cmd)240 int32_t AVControllerItem::SendControlCommand(const AVControlCommand& cmd)
241 {
242 std::lock_guard lockGuard(sessionMutex_);
243 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
244 std::vector<int32_t> cmds = session_->GetSupportCommand();
245 if (std::find(cmds.begin(), cmds.end(), cmd.GetCommand()) == cmds.end()) {
246 SLOGE("The command that needs to be sent is not supported.");
247 return ERR_COMMAND_NOT_SUPPORT;
248 }
249 CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
250 ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
251 session_->ExecuteControllerCommand(cmd);
252 return AVSESSION_SUCCESS;
253 }
254 // LCOV_EXCL_STOP
255
SendCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)256 int32_t AVControllerItem::SendCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
257 {
258 if (migrateProxyCallback_ != nullptr) {
259 int32_t ret = migrateProxyCallback_(commonCommand, const_cast<AAFwk::WantParams&>(commandArgs));
260 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
261 } else {
262 SLOGI("migrateProxyCallback_ function is nullptr");
263 }
264
265 std::lock_guard lockGuard(sessionMutex_);
266 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "Session not exist");
267 CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
268 ERR_COMMAND_SEND_EXCEED_MAX, "common command send number exceed max");
269 session_->ExecueCommonCommand(commonCommand, commandArgs);
270 return AVSESSION_SUCCESS;
271 }
272
273 // LCOV_EXCL_START
SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType & filter)274 int32_t AVControllerItem::SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType& filter)
275 {
276 std::lock_guard lockGuard(avCallMetaMaskMutex_);
277 avCallMetaMask_ = filter;
278 return AVSESSION_SUCCESS;
279 }
280
SetAVCallStateFilter(const AVCallState::AVCallStateMaskType & filter)281 int32_t AVControllerItem::SetAVCallStateFilter(const AVCallState::AVCallStateMaskType& filter)
282 {
283 std::lock_guard lockGuard(avCallStateMaskMutex_);
284 avCallStateMask_ = filter;
285 return AVSESSION_SUCCESS;
286 }
287
SetMetaFilter(const AVMetaData::MetaMaskType & filter)288 int32_t AVControllerItem::SetMetaFilter(const AVMetaData::MetaMaskType& filter)
289 {
290 std::lock_guard lockGuard(metaMaskMutex_);
291 metaMask_ = filter;
292 return AVSESSION_SUCCESS;
293 }
294
SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType & filter)295 int32_t AVControllerItem::SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
296 {
297 std::lock_guard lockGuard(playbackMaskMutex_);
298 playbackMask_ = filter;
299 return AVSESSION_SUCCESS;
300 }
301 // LCOV_EXCL_STOP
302
Destroy()303 int32_t AVControllerItem::Destroy()
304 {
305 if (sessionId_ == "DEFAULT") {
306 SLOGE("controller create inside can not be destroy from outside");
307 return AVSESSION_SUCCESS;
308 }
309 SLOGI("controller destroyed for pid %{public}d", static_cast<int>(pid_));
310 {
311 std::lock_guard callbackLockGuard(callbackMutex_);
312 callback_ = nullptr;
313 innerCallback_ = nullptr;
314 }
315
316 {
317 std::lock_guard serviceCallbacklockGuard(serviceCallbackMutex_);
318 if (serviceCallback_) {
319 serviceCallback_(*this);
320 }
321 }
322
323 {
324 std::lock_guard sessionLockGuard(sessionMutex_);
325 if (session_ != nullptr) {
326 session_->HandleControllerRelease(pid_);
327 session_ = nullptr;
328 sessionId_.clear();
329 }
330 }
331
332 return AVSESSION_SUCCESS;
333 }
334
DestroyWithoutReply()335 int32_t AVControllerItem::DestroyWithoutReply()
336 {
337 SLOGI("do controller DestroyWithoutReply for pid %{public}d", static_cast<int>(pid_));
338 {
339 std::lock_guard callbackLockGuard(callbackMutex_);
340 innerCallback_ = nullptr;
341 callback_ = nullptr;
342 }
343 {
344 std::lock_guard sessionLockGuard(sessionMutex_);
345 if (session_ != nullptr) {
346 session_->HandleControllerRelease(pid_);
347 sessionId_.clear();
348 session_ = nullptr;
349 }
350 }
351 return AVSESSION_SUCCESS;
352 }
353
354 // LCOV_EXCL_START
GetSessionId()355 std::string AVControllerItem::GetSessionId()
356 {
357 std::lock_guard sessionLockGuard(sessionMutex_);
358 return sessionId_;
359 }
360 // LCOV_EXCL_STOP
361
GetElementOfSession()362 AppExecFwk::ElementName AVControllerItem::GetElementOfSession()
363 {
364 std::lock_guard sessionLockGuard(sessionMutex_);
365 AppExecFwk::ElementName elementOfSession;
366 CHECK_AND_RETURN_RET_LOG(session_ != nullptr, elementOfSession, "session not exist");
367 elementOfSession.SetBundleName(session_->GetBundleName());
368 elementOfSession.SetAbilityName(session_->GetAbilityName());
369 return elementOfSession;
370 }
371
HandleSessionDestroy()372 void AVControllerItem::HandleSessionDestroy()
373 {
374 {
375 std::lock_guard callbackLockGuard(callbackMutex_);
376 if (callback_ != nullptr) {
377 callback_->OnSessionDestroy();
378 }
379 if (innerCallback_ != nullptr) {
380 innerCallback_->OnSessionDestroy();
381 }
382 }
383 std::lock_guard sessionLockGuard(sessionMutex_);
384 session_ = nullptr;
385 sessionId_.clear();
386 }
387
388 // LCOV_EXCL_START
HandleAVCallStateChange(const AVCallState & avCallState)389 void AVControllerItem::HandleAVCallStateChange(const AVCallState& avCallState)
390 {
391 std::lock_guard callbackLockGuard(callbackMutex_);
392 AVCallState stateOut;
393 std::lock_guard avCallStateLockGuard(avCallStateMaskMutex_);
394 if (avCallState.CopyToByMask(avCallStateMask_, stateOut)) {
395 SLOGI("update avcall state");
396 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallStateChange");
397 if (callback_ != nullptr) {
398 callback_->OnAVCallStateChange(stateOut);
399 }
400 if (innerCallback_ != nullptr) {
401 innerCallback_->OnAVCallStateChange(stateOut);
402 }
403 }
404 }
405
HandleAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)406 void AVControllerItem::HandleAVCallMetaDataChange(const AVCallMetaData& avCallMetaData)
407 {
408 std::lock_guard callbackLockGuard(callbackMutex_);
409 AVCallMetaData metaOut;
410 std::lock_guard avCallMetaDataMaskLockGuard(avCallMetaMaskMutex_);
411 if (avCallMetaData.CopyToByMask(avCallMetaMask_, metaOut)) {
412 if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_MEDIA_IMAGE)) {
413 std::shared_ptr<AVSessionPixelMap> innerPixelMap = nullptr;
414 if (metaOut.GetMediaImage() != nullptr) {
415 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
416 std::string fileName = sessionId_ + AVSessionUtils::GetFileSuffix();
417 innerPixelMap = metaOut.GetMediaImage();
418 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
419 }
420 metaOut.SetMediaImage(innerPixelMap);
421 }
422
423 if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_NAME)) {
424 metaOut.SetName(avCallMetaData.GetName());
425 }
426
427 if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_PHONE_NUMBER)) {
428 metaOut.SetPhoneNumber(avCallMetaData.GetPhoneNumber());
429 }
430 SLOGI("update avcall meta data");
431 }
432
433 if (callback_ != nullptr) {
434 callback_->OnAVCallMetaDataChange(metaOut);
435 }
436 if (innerCallback_ != nullptr) {
437 innerCallback_->OnAVCallMetaDataChange(metaOut);
438 }
439 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallMetaDataChange");
440 }
441
HandlePlaybackStateChange(const AVPlaybackState & state)442 void AVControllerItem::HandlePlaybackStateChange(const AVPlaybackState& state)
443 {
444 std::lock_guard callbackLockGuard(callbackMutex_);
445 AVPlaybackState stateOut;
446 std::lock_guard playbackLockGuard(playbackMaskMutex_);
447 if (state.CopyToByMask(playbackMask_, stateOut)) {
448 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnPlaybackStateChange");
449 if (callback_ != nullptr) {
450 callback_->OnPlaybackStateChange(stateOut);
451 }
452 if (innerCallback_ != nullptr) {
453 innerCallback_->OnPlaybackStateChange(stateOut);
454 }
455 }
456 }
457
HandleMetaDataChange(const AVMetaData & data)458 void AVControllerItem::HandleMetaDataChange(const AVMetaData& data)
459 {
460 std::lock_guard callbackLockGuard(callbackMutex_);
461 AVMetaData metaOut;
462 std::lock_guard metaMaskLockGuard(metaMaskMutex_);
463 if (data.CopyToByMask(metaMask_, metaOut)) {
464 if ((metaMask_.test(AVMetaData::META_KEY_MEDIA_IMAGE)) && (metaOut.GetMediaImage() != nullptr)) {
465 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
466 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaOut.GetMediaImage();
467 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, sessionId_ + AVSessionUtils::GetFileSuffix());
468 metaOut.SetMediaImage(innerPixelMap);
469 }
470 if ((metaMask_.test(AVMetaData::META_KEY_AVQUEUE_IMAGE)) && (metaOut.GetAVQueueImage() != nullptr)) {
471 std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
472 CHECK_AND_RETURN_LOG(session_ != nullptr, "Session not exist");
473 std::string avQueueFileName =
474 session_->GetBundleName() + "_" + metaOut.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
475 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaOut.GetAVQueueImage();
476 AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
477 metaOut.SetAVQueueImage(avQueuePixelMap);
478 }
479 if (!metaMask_.test(AVMetaData::META_KEY_ASSET_ID)) {
480 metaOut.SetAssetId(data.GetAssetId());
481 }
482 SLOGI("update metaData pid %{public}d, title %{public}s", static_cast<int>(pid_), metaOut.GetTitle().c_str());
483 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnMetaDataChange");
484 if (metaOut.GetMediaImage() != nullptr && !metaOut.GetMediaImageUri().empty()) {
485 SLOGI("isFromSession %{public}d in metaChange", isFromSession_);
486 if (isFromSession_) {
487 metaOut.GetMediaImage()->Clear();
488 } else {
489 metaOut.SetMediaImageUri("");
490 }
491 }
492 if (callback_ != nullptr) {
493 callback_->OnMetaDataChange(metaOut);
494 }
495 if (innerCallback_ != nullptr) {
496 innerCallback_->OnMetaDataChange(metaOut);
497 }
498 }
499 std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = metaOut.GetAVQueueImage();
500 if (innerQueuePixelMap != nullptr) {
501 innerQueuePixelMap->Clear();
502 }
503 std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = metaOut.GetMediaImage();
504 if (innerMediaPixelMap != nullptr) {
505 innerMediaPixelMap->Clear();
506 }
507 }
508
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)509 void AVControllerItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
510 {
511 std::lock_guard lockGuard(callbackMutex_);
512 if (callback_ != nullptr) {
513 callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
514 }
515 }
516 // LCOV_EXCL_STOP
517
HandleActiveStateChange(bool isActive)518 void AVControllerItem::HandleActiveStateChange(bool isActive)
519 {
520 std::lock_guard lockGuard(callbackMutex_);
521 if (callback_ != nullptr) {
522 callback_->OnActiveStateChange(isActive);
523 }
524 }
525
526 // LCOV_EXCL_START
HandleValidCommandChange(const std::vector<int32_t> & cmds)527 void AVControllerItem::HandleValidCommandChange(const std::vector<int32_t>& cmds)
528 {
529 std::lock_guard lockGuard(callbackMutex_);
530 SLOGD("do OnValidCommandChange with pid %{public}d cmd list size %{public}d",
531 static_cast<int>(pid_), static_cast<int>(cmds.size()));
532 if (callback_ != nullptr) {
533 callback_->OnValidCommandChange(cmds);
534 }
535 if (innerCallback_ != nullptr) {
536 innerCallback_->OnValidCommandChange(cmds);
537 }
538 }
539 // LCOV_EXCL_STOP
540
HandleSetSessionEvent(const std::string & event,const AAFwk::WantParams & args)541 void AVControllerItem::HandleSetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
542 {
543 std::lock_guard lockGuard(callbackMutex_);
544 if (callback_ != nullptr) {
545 callback_->OnSessionEventChange(event, args);
546 }
547 }
548
549 // LCOV_EXCL_START
HandleQueueItemsChange(const std::vector<AVQueueItem> & items)550 void AVControllerItem::HandleQueueItemsChange(const std::vector<AVQueueItem>& items)
551 {
552 std::lock_guard lockGuard(callbackMutex_);
553 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueItemsChange");
554 if (callback_ != nullptr) {
555 callback_->OnQueueItemsChange(items);
556 }
557 }
558
HandleQueueTitleChange(const std::string & title)559 void AVControllerItem::HandleQueueTitleChange(const std::string& title)
560 {
561 std::lock_guard lockGuard(callbackMutex_);
562 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueTitleChange");
563 if (callback_ != nullptr) {
564 callback_->OnQueueTitleChange(title);
565 }
566 }
567
HandleExtrasChange(const AAFwk::WantParams & extras)568 void AVControllerItem::HandleExtrasChange(const AAFwk::WantParams& extras)
569 {
570 std::lock_guard lockGuard(callbackMutex_);
571 AVSESSION_TRACE_SYNC_START("AVControllerItem::OnSetExtras");
572 if (callback_ != nullptr) {
573 callback_->OnExtrasChange(extras);
574 }
575 }
576 // LCOV_EXCL_STOP
577
GetPid() const578 pid_t AVControllerItem::GetPid() const
579 {
580 return pid_;
581 }
582
HasSession(const std::string & sessionId)583 bool AVControllerItem::HasSession(const std::string& sessionId)
584 {
585 std::lock_guard sessionLockGuard(sessionMutex_);
586 return sessionId_ == sessionId;
587 }
588
SetServiceCallbackForRelease(const std::function<void (AVControllerItem &)> & callback)589 void AVControllerItem::SetServiceCallbackForRelease(const std::function<void(AVControllerItem&)>& callback)
590 {
591 std::lock_guard lockGuard(serviceCallbackMutex_);
592 serviceCallback_ = callback;
593 }
594 } // namespace OHOS::AVSession
595