1 /*
2 * Copyright (c) 2022-2025 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 "av_router.h"
17 #include "avsession_service.h"
18 #include "avcontroller_item.h"
19 #include "avsession_log.h"
20 #include "avsession_errors.h"
21 #include "avsession_descriptor.h"
22 #include "avsession_trace.h"
23 #include "avsession_sysevent.h"
24 #include "avsession_utils.h"
25 #include "remote_session_sink.h"
26 #include "remote_session_source.h"
27 #include "remote_session_source_proxy.h"
28 #include "remote_session_sink_proxy.h"
29 #include "permission_checker.h"
30 #include "session_xcollie.h"
31 #include "avsession_item.h"
32 #include "avsession_radar.h"
33 #include "avsession_event_handler.h"
34 #include "bundle_status_adapter.h"
35 #include "array_wrapper.h"
36 #include "bool_wrapper.h"
37 #include "string_wrapper.h"
38 #include "int_wrapper.h"
39 #include "avsession_hianalytics_report.h"
40 #include "want_agent_helper.h"
41
42 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
43 #include "avcast_controller_proxy.h"
44 #include "avcast_controller_item.h"
45 #include "collaboration_manager.h"
46 #endif
47
48 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
49 #include <malloc.h>
50 #include <string>
51 #include <openssl/crypto.h>
52 #endif
53
54 using namespace OHOS::AudioStandard;
55
56 namespace OHOS::AVSession {
57
58 const std::map<int32_t, std::string> sessionTypeMap_ = {
59 {AVSession::SESSION_TYPE_VIDEO, "video"},
60 {AVSession::SESSION_TYPE_VOICE_CALL, "voice_call"},
61 {AVSession::SESSION_TYPE_VIDEO_CALL, "video_call"},
62 };
63
64 const std::map<int32_t, int32_t> g_cmdToOffsetMap = {
65 {AVControlCommand::SESSION_CMD_SET_TARGET_LOOP_MODE, 9},
66 {AVControlCommand::SESSION_CMD_PLAY, 8},
67 {AVControlCommand::SESSION_CMD_PAUSE, 7},
68 {AVControlCommand::SESSION_CMD_PLAY_NEXT, 6},
69 {AVControlCommand::SESSION_CMD_PLAY_PREVIOUS, 5},
70 {AVControlCommand::SESSION_CMD_FAST_FORWARD, 4},
71 {AVControlCommand::SESSION_CMD_REWIND, 3},
72 {AVControlCommand::SESSION_CMD_SEEK, 2},
73 {AVControlCommand::SESSION_CMD_SET_LOOP_MODE, 1},
74 {AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE, 0}
75 };
76
77 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
78 static const int32_t CONTROL_COLD_START = 2;
79 #endif
80
AVSessionItem(const AVSessionDescriptor & descriptor,int32_t userId)81 AVSessionItem::AVSessionItem(const AVSessionDescriptor& descriptor, int32_t userId)
82 : descriptor_(descriptor), userId_(userId)
83 {
84 SLOGI("constructor session id=%{public}s, userId=%{public}d",
85 AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str(), userId_);
86 {
87 std::lock_guard aliveLockGuard(isAliveLock_);
88 isAlivePtr_ = std::make_shared<bool>(true);
89 }
90 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
91 cssListener_ = std::make_shared<CssListener>(this);
92 #endif
93 }
94
~AVSessionItem()95 AVSessionItem::~AVSessionItem()
96 {
97 SLOGI("destroy with aliveLock session id=%{public}s, userId=%{public}d",
98 AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str(), userId_);
99 if (IsActive()) {
100 Deactivate();
101 }
102 {
103 std::lock_guard callbackForCastCapLockGuard(callbackForCastCapLock_);
104 if (castControllerProxy_ != nullptr) {
105 castControllerProxy_->SetSessionCallbackForCastCap(nullptr);
106 }
107 }
108 {
109 std::lock_guard aliveLockGuard(isAliveLock_);
110 if (isAlivePtr_ != nullptr) {
111 *isAlivePtr_ = false;
112 }
113 }
114 }
115
116 // LCOV_EXCL_START
GetSessionId()117 std::string AVSessionItem::GetSessionId()
118 {
119 return descriptor_.sessionId_;
120 }
121
GetSessionType()122 std::string AVSessionItem::GetSessionType()
123 {
124 auto iter = sessionTypeMap_.find(descriptor_.sessionType_);
125 if (iter != sessionTypeMap_.end()) {
126 return iter->second;
127 } else {
128 return "audio";
129 }
130 }
131 // LCOV_EXCL_STOP
132
UpdateSessionElement(const AppExecFwk::ElementName & elementName)133 void AVSessionItem::UpdateSessionElement(const AppExecFwk::ElementName& elementName)
134 {
135 descriptor_.elementName_ = elementName;
136 }
137
Destroy()138 int32_t AVSessionItem::Destroy()
139 {
140 SLOGI("AVSessionItem %{public}d check service destroy event with service, check serviceCallback exist",
141 static_cast<int>(GetPid()));
142 {
143 std::lock_guard lockGuard(destroyLock_);
144 if (isDestroyed_) {
145 SLOGE("AVSessionItem Destroy process but check already destroyed");
146 return AVSESSION_SUCCESS;
147 }
148 }
149 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
150 "API_NAME", "Destroy", "BUNDLE_NAME", GetBundleName(),
151 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
152 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
153 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
154 if (serviceCallback_) {
155 SLOGI("AVSessionItem send service destroy event to service");
156 serviceCallback_(*this);
157 }
158 return AVSESSION_SUCCESS;
159 }
160
DelRecommend()161 void AVSessionItem::DelRecommend()
162 {
163 CHECK_AND_RETURN_LOG(descriptor_.sessionTag_ != "RemoteCast", "remote cast session, return");
164 if (isRecommend_) {
165 AVSessionHiAnalyticsReport::PublishRecommendInfo(GetBundleName(), "", "", "", -1);
166 isRecommend_ = false;
167 }
168 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
169 CHECK_AND_RETURN_LOG(castHandle_ > 0, "delete recommend without casthandler");
170 PublishAVCastHa(disconnectStateFromCast_, GetDescriptor().outputDeviceInfo_.deviceInfos_[0]);
171 #endif
172 }
173
DestroyTask(bool continuePlay)174 int32_t AVSessionItem::DestroyTask(bool continuePlay)
175 {
176 {
177 std::lock_guard lockGuard(destroyLock_);
178 if (isDestroyed_) {
179 SLOGI("session is already destroyed");
180 return AVSESSION_SUCCESS;
181 }
182 isDestroyed_ = true;
183 }
184
185 std::string sessionId = descriptor_.sessionId_;
186 std::string fileName = AVSessionUtils::GetCachePathName(userId_) + sessionId + AVSessionUtils::GetFileSuffix();
187 AVSessionUtils::DeleteFile(fileName);
188 DelRecommend();
189 std::list<sptr<AVControllerItem>> controllerList;
190 {
191 std::lock_guard controllerLockGuard(controllersLock_);
192 for (auto it = controllers_.begin(); it != controllers_.end();) {
193 if (it->second) {
194 controllerList.push_back(it->second);
195 }
196 it = controllers_.erase(it);
197 }
198 }
199 for (auto& controller : controllerList) {
200 controller->HandleSessionDestroy();
201 }
202 {
203 std::lock_guard lockGuard(callbackLock_);
204 if (callback_) {
205 callback_.clear();
206 }
207 }
208
209 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
210 SLOGI("Session destroy with castHandle: %{public}lld", (long long)castHandle_);
211 if (descriptor_.sessionTag_ != "RemoteCast" && castHandle_ > 0) {
212 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedDeviceId_.c_str(),
213 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
214 if (!collaborationNeedNetworkId_.empty()) {
215 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
216 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
217 }
218 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
219 ReleaseCast(continuePlay);
220 StopCastSession();
221 }
222 ReleaseAVCastControllerInner();
223 StopCastDisplayListener();
224 #endif
225 return AVSESSION_SUCCESS;
226 }
227
SetAVCallMetaData(const AVCallMetaData & avCallMetaData)228 int32_t AVSessionItem::SetAVCallMetaData(const AVCallMetaData& avCallMetaData)
229 {
230 std::lock_guard lockGuard(avsessionItemLock_);
231 CHECK_AND_RETURN_RET_LOG(avCallMetaData_.CopyFrom(avCallMetaData), AVSESSION_ERROR, "AVCallMetaData set error");
232 {
233 std::unique_lock<std::shared_mutex> lock(writeAndReadImgLock_);
234 std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
235 if (innerPixelMap != nullptr) {
236 std::string sessionId = GetSessionId();
237 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
238 AVSessionUtils::WriteImageToFile(innerPixelMap, fileDir, sessionId + AVSessionUtils::GetFileSuffix());
239 innerPixelMap->Clear();
240 avCallMetaData_.SetMediaImage(innerPixelMap);
241 }
242 }
243
244 {
245 std::lock_guard controllerLockGuard(controllersLock_);
246 for (const auto& [pid, controller] : controllers_) {
247 if (controller != nullptr) {
248 controller->HandleAVCallMetaDataChange(avCallMetaData);
249 }
250 }
251 }
252 return AVSESSION_SUCCESS;
253 }
254
255 // LCOV_EXCL_START
SetAVCallState(const AVCallState & avCallState)256 int32_t AVSessionItem::SetAVCallState(const AVCallState& avCallState)
257 {
258 {
259 std::lock_guard lockGuard(avsessionItemLock_);
260 CHECK_AND_RETURN_RET_LOG(avCallState_.CopyFrom(avCallState), AVSESSION_ERROR, "AVCallState set error");
261 }
262
263 {
264 std::lock_guard controllerLockGuard(controllersLock_);
265 for (const auto& [pid, controller] : controllers_) {
266 if (controller != nullptr) {
267 controller->HandleAVCallStateChange(avCallState);
268 }
269 }
270 }
271 return AVSESSION_SUCCESS;
272 }
273 // LCOV_EXCL_STOP
274
GetAVMetaData(AVMetaData & meta)275 int32_t AVSessionItem::GetAVMetaData(AVMetaData& meta)
276 {
277 std::lock_guard lockGuard(avsessionItemLock_);
278 SessionXCollie sessionXCollie("avsession::GetAVMetaData");
279 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
280 ReadMetaDataImg(innerPixelMap);
281
282 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
283 ReadMetaDataAVQueueImg(avQueuePixelMap);
284
285 meta = metaData_;
286 return AVSESSION_SUCCESS;
287 }
288
289 // LCOV_EXCL_START
ProcessFrontSession(const std::string & source)290 int32_t AVSessionItem::ProcessFrontSession(const std::string& source)
291 {
292 SLOGI("ProcessFrontSession with directly handle %{public}s ", source.c_str());
293 HandleFrontSession();
294 return AVSESSION_SUCCESS;
295 }
296
UpdateRecommendInfo(bool needRecommend)297 void AVSessionItem::UpdateRecommendInfo(bool needRecommend)
298 {
299 if (descriptor_.sessionTag_ == "RemoteCast") {
300 return;
301 }
302 AVMetaData meta;
303 AAFwk::WantParams extra;
304 {
305 std::lock_guard lockGuard(avsessionItemLock_);
306 meta = metaData_;
307 extra = extras_;
308 }
309 SLOGI("assetChange:%{public}d AddFront:%{public}d supportCast:%{public}d filter:%{public}d duration:%{public}d",
310 isAssetChange_, isFirstAddToFront_, extra.HasParam("requireAbilityList"), meta.GetFilter(),
311 static_cast<int>(meta.GetDuration()));
312 if (needRecommend) {
313 if (isAssetChange_ && !isFirstAddToFront_ && extra.HasParam("requireAbilityList") &&
314 meta.GetFilter() !=0 && meta.GetDuration() != 0) {
315 isAssetChange_ = false;
316 isRecommend_ = true;
317 AVSessionHiAnalyticsReport::PublishRecommendInfo(GetBundleName(), GetSessionId(),
318 GetSessionType(), meta.GetAssetId(), meta.GetDuration());
319 }
320 } else {
321 if (isRecommend_) {
322 isAssetChange_ = true;
323 AVSessionHiAnalyticsReport::PublishRecommendInfo(GetBundleName(), GetSessionId(), GetSessionType(),
324 metaData_.GetAssetId(), -1);
325 }
326 }
327
328 }
329
HandleFrontSession()330 void AVSessionItem::HandleFrontSession()
331 {
332 bool isMetaEmpty;
333 bool isCastMetaEmpty;
334 {
335 std::lock_guard lockGuard(avsessionItemLock_);
336 isMetaEmpty = (metaData_.GetTitle().empty() && metaData_.GetMediaImage() == nullptr);
337 AVQueueItem item;
338 GetCurrentCastItem(item);
339 isCastMetaEmpty = (item.GetDescription() == nullptr ||
340 (item.GetDescription()->GetTitle().empty() && item.GetDescription()->GetIconUri().empty()));
341 SLOGI("frontSession bundle=%{public}s isMetaEmpty=%{public}d isCastMetaEmpty=%{public}d Cmd=%{public}d "
342 "castCmd=%{public}d firstAdd=%{public}d",
343 GetBundleName().c_str(), isMetaEmpty, isCastMetaEmpty, static_cast<int32_t>(supportedCmd_.size()),
344 static_cast<int32_t>(supportedCastCmds_.size()), isFirstAddToFront_);
345 }
346 if ((isMetaEmpty && isCastMetaEmpty) || (supportedCmd_.size() == 0 && supportedCastCmds_.size() == 0)) {
347 if (!isFirstAddToFront_ && serviceCallbackForUpdateSession_) {
348 serviceCallbackForUpdateSession_(GetSessionId(), false);
349 isFirstAddToFront_ = true;
350 UpdateRecommendInfo(false);
351 }
352 } else {
353 if (isFirstAddToFront_ && serviceCallbackForUpdateSession_) {
354 serviceCallbackForUpdateSession_(GetSessionId(), true);
355 isFirstAddToFront_ = false;
356 UpdateRecommendInfo(true);
357 }
358 }
359 }
360
HasAvQueueInfo()361 bool AVSessionItem::HasAvQueueInfo()
362 {
363 std::lock_guard lockGuard(avsessionItemLock_);
364 if (metaData_.GetAVQueueName().empty() || metaData_.GetAVQueueId().empty()) {
365 SLOGD("avqueuename or avqueueid is empty");
366 return false;
367 }
368 if (metaData_.GetAVQueueImage() == nullptr && metaData_.GetAVQueueImageUri().empty()) {
369 SLOGD("avqueue img is empty");
370 return false;
371 }
372 if (playbackState_.GetState() != AVPlaybackState::PLAYBACK_STATE_PLAY) {
373 SLOGD("current avqueueinfo is not playing");
374 return false;
375 }
376
377 return true;
378 }
379
ReportSetAVMetaDataInfo(const AVMetaData & meta)380 void AVSessionItem::ReportSetAVMetaDataInfo(const AVMetaData& meta)
381 {
382 std::string mediaImage = "false";
383 std::string avQueueImage = "false";
384 if (meta.GetMediaImage() != nullptr || !(meta.GetMediaImageUri().empty())) {
385 mediaImage = "true";
386 }
387 if (meta.GetAVQueueImage() != nullptr || !(meta.GetAVQueueImageUri().empty())) {
388 avQueueImage = "true";
389 }
390 std::string apiParamString = "assetId: " + meta.GetAssetId() + ", "
391 + "artist: " + meta.GetArtist() + ", "
392 + "title: " + meta.GetTitle() + ", "
393 + "subtitle: " + meta.GetSubTitle() + ", "
394 + "avQueueId: " + meta.GetAVQueueId() + ", "
395 + "duration: " + std::to_string(meta.GetDuration()) + ", "
396 + "avQueueName: " + meta.GetAVQueueName() + ", "
397 + "mediaImage: " + mediaImage + ", "
398 + "avqueueImage: " + avQueueImage;
399 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR", "API_NAME", "SetAVMetaData",
400 "BUNDLE_NAME", GetBundleName(), "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
401 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
402 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
403 }
404
CheckTitleChange(const AVMetaData & meta)405 bool AVSessionItem::CheckTitleChange(const AVMetaData& meta)
406 {
407 bool isTitleChange = metaData_.GetTitle() != meta.GetTitle();
408 bool isAncoTitleLyric = GetUid() == audioBrokerUid && meta.GetArtist().find("-") != std::string::npos;
409 bool isTitleLyric = ((GetBundleName() == defaultBundleName) && !meta.GetDescription().empty()) || isAncoTitleLyric;
410 SLOGI("CheckTitleChange isTitleLyric:%{public}d isAncoTitleLyric:%{public}d isTitleChange:%{public}d",
411 isTitleLyric, isAncoTitleLyric, isTitleChange);
412 return isTitleChange && !isTitleLyric;
413 }
414
CheckUseAVMetaData(const AVMetaData & meta)415 void AVSessionItem::CheckUseAVMetaData(const AVMetaData& meta)
416 {
417 bool hasPixelMap = (meta.GetMediaImage() != nullptr);
418 SLOGI("MediaCapsule addLocalCapsule hasImage_:%{public}d isMediaChange_:%{public}d", hasPixelMap, isMediaChange_);
419 if (serviceCallbackForNtf_ && hasPixelMap && isMediaChange_) {
420 serviceCallbackForNtf_(GetSessionId(), isMediaChange_);
421 isMediaChange_ = false;
422 }
423 ProcessFrontSession("SetAVMetaData");
424 if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
425 serviceCallbackForAddAVQueueInfo_(*this);
426 }
427
428 UpdateRecommendInfo(true);
429 }
430
UpdateAVQueueInfo(const AVQueueInfo & info)431 int32_t AVSessionItem::UpdateAVQueueInfo(const AVQueueInfo& info)
432 {
433 std::shared_ptr<AVSessionPixelMap> innerPixelMap = info.GetAVQueueImage();
434 if (innerPixelMap != nullptr) {
435 std::string fileDir = AVSessionUtils::GetFixedPathName(userId_);
436 std::string fileName = GetBundleName() + "_" + info.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
437 SLOGI("write image to file for %{public}s", info.GetAVQueueId().c_str());
438 AVSessionUtils::WriteImageToFile(innerPixelMap, fileDir, fileName);
439 innerPixelMap->Clear();
440 }
441 return AVSESSION_SUCCESS;
442 }
443
SetAVMetaData(const AVMetaData & meta)444 int32_t AVSessionItem::SetAVMetaData(const AVMetaData& meta)
445 {
446 {
447 std::lock_guard lockGuard(avsessionItemLock_);
448 SessionXCollie sessionXCollie("avsession::SetAVMetaData");
449 ReportSetAVMetaDataInfo(meta);
450 if ((metaData_.GetAssetId() != meta.GetAssetId()) || CheckTitleChange(meta)) {
451 isMediaChange_ = true;
452 isAssetChange_ = true;
453 }
454 CHECK_AND_RETURN_RET_LOG(metaData_.CopyFrom(meta), AVSESSION_ERROR, "AVMetaData set error");
455 std::unique_lock<std::shared_mutex> lock(writeAndReadImgLock_);
456 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
457 if (innerPixelMap != nullptr) {
458 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
459 AVSessionUtils::WriteImageToFile(innerPixelMap, fileDir, GetSessionId() + AVSessionUtils::GetFileSuffix());
460 innerPixelMap->Clear();
461 metaData_.SetMediaImage(innerPixelMap);
462 }
463 }
464 CheckUseAVMetaData(meta);
465 SLOGI("send metadata change event to controllers with title %{public}s from pid:%{public}d, isAlive:%{public}d",
466 meta.GetTitle().c_str(), static_cast<int>(GetPid()), (isAlivePtr_ == nullptr) ? -1 : *isAlivePtr_);
467 AVSessionEventHandler::GetInstance().AVSessionPostTask([this, meta, isAlivePtr = isAlivePtr_]() {
468 std::lock_guard aliveLockGuard(isAliveLock_);
469 CHECK_AND_RETURN_LOG(isAlivePtr != nullptr && *isAlivePtr, "handle metadatachange with session gone, return");
470 SLOGI("HandleMetaDataChange in postTask with title %{public}s and size %{public}d",
471 meta.GetTitle().c_str(), static_cast<int>(controllers_.size()));
472 std::lock_guard controllerLockGuard(controllersLock_);
473 CHECK_AND_RETURN_LOG(controllers_.size() > 0, "handle with no controller, return");
474 for (const auto& [pid, controller] : controllers_) {
475 if (controller != nullptr) {
476 controller->HandleMetaDataChange(meta);
477 }
478 }
479 }, "HandleMetaDataChange", 0);
480
481 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
482 if (remoteSource_ != nullptr) {
483 SLOGI("set remote AVMetaData");
484 auto ret = remoteSource_->SetAVMetaData(meta);
485 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
486 }
487 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
488 ReportMetadataChange(meta);
489 #endif
490 return AVSESSION_SUCCESS;
491 }
492
GetAVQueueItems(std::vector<AVQueueItem> & items)493 int32_t AVSessionItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
494 {
495 std::lock_guard lock_guard(avsessionItemLock_);
496 items = queueItems_;
497 return AVSESSION_SUCCESS;
498 }
499
SetAVQueueItems(const std::vector<AVQueueItem> & items)500 int32_t AVSessionItem::SetAVQueueItems(const std::vector<AVQueueItem>& items)
501 {
502 {
503 std::lock_guard lock_guard(avsessionItemLock_);
504 queueItems_ = items;
505 }
506
507 {
508 std::lock_guard controllerLockGuard(controllersLock_);
509 for (const auto& [pid, controller] : controllers_) {
510 if (controller != nullptr) {
511 controller->HandleQueueItemsChange(items);
512 }
513 }
514 }
515
516 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
517 if (remoteSource_ != nullptr) {
518 auto ret = remoteSource_->SetAVQueueItems(items);
519 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueItems failed");
520 }
521 return AVSESSION_SUCCESS;
522 }
523
GetAVQueueTitle(std::string & title)524 int32_t AVSessionItem::GetAVQueueTitle(std::string& title)
525 {
526 std::lock_guard lockGuard(avsessionItemLock_);
527 title = queueTitle_;
528 return AVSESSION_SUCCESS;
529 }
530
SetAVQueueTitle(const std::string & title)531 int32_t AVSessionItem::SetAVQueueTitle(const std::string& title)
532 {
533 {
534 std::lock_guard lockGuard(avsessionItemLock_);
535 queueTitle_ = title;
536 }
537
538 {
539 std::lock_guard controllerLockGuard(controllersLock_);
540 for (const auto& [pid, controller] : controllers_) {
541 if (controller != nullptr) {
542 controller->HandleQueueTitleChange(title);
543 }
544 }
545 }
546 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
547 if (remoteSource_ != nullptr) {
548 auto ret = remoteSource_->SetAVQueueTitle(title);
549 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueTitle failed");
550 }
551 return AVSESSION_SUCCESS;
552 }
553
SendCustomDataInner(const AAFwk::WantParams & data)554 void AVSessionItem::SendCustomDataInner(const AAFwk::WantParams& data)
555 {
556 std::lock_guard controllerLockGuard(controllersLock_);
557
558 if (controllers_.size() > 0) {
559 for (const auto& [pid, controller] : controllers_) {
560 if (controller != nullptr) {
561 controller->HandleCustomData(data);
562 }
563 }
564 }
565 }
566
SendCustomData(const AAFwk::WantParams & data)567 int32_t AVSessionItem::SendCustomData(const AAFwk::WantParams& data)
568 {
569 CHECK_AND_RETURN_RET_LOG(data.HasParam("customData"), AVSESSION_ERROR, "Params don't have customData");
570 auto value = data.GetParam("customData");
571 AAFwk::IString* stringValue = AAFwk::IString::Query(value);
572 CHECK_AND_RETURN_RET_LOG(stringValue != nullptr, AVSESSION_ERROR, "customData is an invalid string");
573 SendCustomDataInner(data);
574 return AVSESSION_SUCCESS;
575 }
576
CheckIfSendCapsule(const AVPlaybackState & state)577 void AVSessionItem::CheckIfSendCapsule(const AVPlaybackState& state)
578 {
579 CHECK_AND_RETURN_LOG(GetUid() == audioBrokerUid, "not audio broker");
580 if (state.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY && (!isPlayingState_ || isMediaChange_)) {
581 isPlayingState_ = true;
582 {
583 std::lock_guard mediaSessionLockGuard(mediaSessionCallbackLock_);
584 if (serviceCallbackForMediaSession_) {
585 SLOGI("anco capsule add for %{public}s", GetBundleName().c_str());
586 serviceCallbackForMediaSession_(GetSessionId(), true, isMediaChange_);
587 }
588 }
589 } else if (state.GetState() == AVPlaybackState::PLAYBACK_STATE_PAUSE ||
590 state.GetState() == AVPlaybackState::PLAYBACK_STATE_STOP) {
591 isPlayingState_ = false;
592 AVSessionEventHandler::GetInstance().AVSessionRemoveTask("CancelAncoMediaCapsule");
593 AVSessionEventHandler::GetInstance().AVSessionPostTask(
594 [this]() {
595 std::lock_guard mediaSessionLockGuard(mediaSessionCallbackLock_);
596 if (serviceCallbackForMediaSession_ && !isPlayingState_) {
597 SLOGI("anco capsule del for %{public}s", GetBundleName().c_str());
598 serviceCallbackForMediaSession_(GetSessionId(), false, false);
599 }
600 }, "CancelAncoMediaCapsule", cancelTimeout);
601 }
602 }
603
SetAVPlaybackState(const AVPlaybackState & state)604 int32_t AVSessionItem::SetAVPlaybackState(const AVPlaybackState& state)
605 {
606 {
607 std::lock_guard lockGuard(avsessionItemLock_);
608 CHECK_AND_RETURN_RET_LOG(playbackState_.CopyFrom(state), AVSESSION_ERROR, "AVPlaybackState set error");
609 }
610 if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
611 serviceCallbackForAddAVQueueInfo_(*this);
612 }
613 CheckIfSendCapsule(state);
614 {
615 std::lock_guard controllerLockGuard(controllersLock_);
616 SLOGD("send HandlePlaybackStateChange in postTask with state %{public}d and controller size %{public}d",
617 state.GetState(), static_cast<int>(controllers_.size()));
618 if (controllers_.size() > 0) {
619 for (const auto& [pid, controller] : controllers_) {
620 if (controller != nullptr) {
621 controller->HandlePlaybackStateChange(state);
622 }
623 }
624 }
625 }
626
627 std::string isFavor = state.GetFavorite()? "true" : "false";
628 std::string apiParamString = "state: " + std::to_string(state.GetState()) + ", "
629 + "elapsedTime: " + std::to_string(state.GetPosition().elapsedTime_) + ", "
630 + "updateTime: " + std::to_string(state.GetPosition().updateTime_) + ", "
631 + "loopMode: " + std::to_string(state.GetLoopMode()) + ", "
632 + "isFavorite: " + isFavor;
633 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
634 "API_NAME", "SetAVPlaybackState", "BUNDLE_NAME", GetBundleName(),
635 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
636 "SESSION_TAG", descriptor_.sessionTag_,
637 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
638 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
639 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
640 if (remoteSource_ != nullptr) {
641 remoteSource_->SetAVPlaybackState(state);
642 }
643 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
644 ReportPlaybackState(state);
645 #endif
646 return AVSESSION_SUCCESS;
647 }
648
GetAVPlaybackState(AVPlaybackState & state)649 int32_t AVSessionItem::GetAVPlaybackState(AVPlaybackState& state)
650 {
651 std::lock_guard lockGuard(avsessionItemLock_);
652 state = playbackState_;
653 return AVSESSION_SUCCESS;
654 }
655 // LCOV_EXCL_STOP
656
SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent & ability)657 int32_t AVSessionItem::SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability)
658 {
659 launchAbility_ = ability;
660 std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
661 std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> launWantAgent =
662 std::make_shared<AbilityRuntime::WantAgent::WantAgent>(ability);
663 int res = AVSESSION_SUCCESS;
664 if (want != nullptr && launWantAgent != nullptr) {
665 res = AbilityRuntime::WantAgent::WantAgentHelper::GetWant(launWantAgent, want);
666 }
667 std::string errMsg = "Get want failed.";
668 std::string bundleName = "";
669 std::string abilityName = "";
670 std::string moduleName = "";
671 if (res == AVSESSION_SUCCESS) {
672 bundleName = want->GetElement().GetBundleName().c_str();
673 abilityName = want->GetElement().GetAbilityName().c_str();
674 moduleName = want->GetElement().GetModuleName().c_str();
675 errMsg = "SUCCESS";
676 }
677 std::string apiParamString = "bundleName: " + bundleName + ", " +
678 "moduleName: " + moduleName + ", " + "abilityName: " + abilityName;
679 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
680 "API_NAME", "SetLaunchAbility", "BUNDLE_NAME", GetBundleName(),
681 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
682 "SESSION_TAG", descriptor_.sessionTag_,
683 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
684 "ERROR_CODE", res, "ERROR_MSG", errMsg);
685 return AVSESSION_SUCCESS;
686 }
687
688 // LCOV_EXCL_START
GetExtras(AAFwk::WantParams & extras)689 int32_t AVSessionItem::GetExtras(AAFwk::WantParams& extras)
690 {
691 std::lock_guard lockGuard(avsessionItemLock_);
692 extras = extras_;
693 return AVSESSION_SUCCESS;
694 }
695
SetExtras(const AAFwk::WantParams & extras)696 int32_t AVSessionItem::SetExtras(const AAFwk::WantParams& extras)
697 {
698 {
699 std::lock_guard lockGuard(avsessionItemLock_);
700 extras_ = extras;
701 }
702 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
703 if (extras.HasParam("requireAbilityList")) {
704 auto value = extras.GetParam("requireAbilityList");
705 AAFwk::IArray* list = AAFwk::IArray::Query(value);
706 if (list != nullptr && AAFwk::Array::IsStringArray(list)) {
707 SetExtrasInner(list);
708 }
709 }
710 SetSpid(extras);
711 #endif
712 if (extras.HasParam("hw_live_view_hidden_when_keyguard")) {
713 auto value = extras.GetParam("hw_live_view_hidden_when_keyguard");
714 AAFwk::IArray* list = AAFwk::IArray::Query(value);
715 if (list != nullptr && AAFwk::Array::IsBooleanArray(list)) {
716 NotificationExtras(list);
717 }
718 }
719 if (extras.HasParam("support-keyevent")) {
720 auto value = extras.GetParam("support-keyevent");
721 AAFwk::IArray* list = AAFwk::IArray::Query(value);
722 if (list != nullptr && AAFwk::Array::IsBooleanArray(list)) {
723 KeyEventExtras(list);
724 }
725 }
726 {
727 std::lock_guard controllerLockGuard(controllersLock_);
728 for (const auto& [pid, controller] : controllers_) {
729 if (controller != nullptr) {
730 controller->HandleExtrasChange(extras);
731 }
732 }
733 }
734 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
735 if (remoteSource_ != nullptr) {
736 auto ret = remoteSource_->SetExtrasRemote(extras);
737 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetRemoteExtras failed");
738 }
739 return AVSESSION_SUCCESS;
740 }
741
GetControllerInner()742 sptr<IRemoteObject> AVSessionItem::GetControllerInner()
743 {
744 std::lock_guard controllerLockGuard(controllersLock_);
745 auto iter = controllers_.find(GetPid());
746 if (iter != controllers_.end()) {
747 return iter->second;
748 }
749
750 sptr<AVSessionItem> session(this);
751 sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(GetPid(), session, userId_);
752 CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "malloc controller failed");
753 result->isFromSession_ = true;
754 SLOGI("New controller from sessionItem when get controller.");
755 controllers_.insert({GetPid(), result});
756 return result;
757 }
758
759 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
InitAVCastControllerProxy()760 void AVSessionItem::InitAVCastControllerProxy()
761 {
762 if (castControllerProxy_ == nullptr) {
763 SLOGI("CastControllerProxy is null, start get new proxy");
764 {
765 std::lock_guard lockGuard(castLock_);
766 castControllerProxy_ = AVRouter::GetInstance().GetRemoteController(castHandle_);
767 }
768 }
769 }
770
ReportAVCastControllerInfo()771 void AVSessionItem::ReportAVCastControllerInfo()
772 {
773 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
774 "API_NAME", "getAVCastController", "BUNDLE_NAME", GetBundleName(),
775 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
776 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
777 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
778 }
779
dealValidCallback(int32_t cmd,std::vector<int32_t> & supportedCastCmds)780 void AVSessionItem::dealValidCallback(int32_t cmd, std::vector<int32_t>& supportedCastCmds)
781 {
782 {
783 std::lock_guard lockGuard(avsessionItemLock_);
784 SLOGI("process cast valid cmd: %{public}d", cmd);
785 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_INVALID) {
786 supportedCastCmds_.clear();
787 supportedCastCmds = supportedCastCmds_;
788 HandleCastValidCommandChange(supportedCastCmds_);
789 return;
790 }
791 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
792 supportedCastCmds = supportedCastCmds_;
793 return;
794 }
795 if (descriptor_.sessionTag_ == "RemoteCast") {
796 SLOGI("sink session should not modify valid cmds");
797 supportedCastCmds = {};
798 return;
799 }
800 }
801 if (cmd > removeCmdStep_) {
802 DeleteSupportCastCommand(cmd - removeCmdStep_);
803 } else {
804 AddSupportCastCommand(cmd);
805 }
806 supportedCastCmds = supportedCastCmds_;
807 return;
808 }
809
GetAVCastControllerInner()810 sptr<IRemoteObject> AVSessionItem::GetAVCastControllerInner()
811 {
812 InitAVCastControllerProxy();
813 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, nullptr,
814 "castControllerProxy_ is null when get avCastController");
815 sptr<AVCastControllerItem> castController = new (std::nothrow) AVCastControllerItem();
816 CHECK_AND_RETURN_RET_LOG(castController != nullptr, nullptr, "malloc avCastController failed");
817 std::shared_ptr<AVCastControllerItem> sharedPtr = std::shared_ptr<AVCastControllerItem>(castController.GetRefPtr(),
818 [holder = castController](const auto*) {});
819 CHECK_AND_RETURN_RET_LOG(sharedPtr != nullptr, nullptr, "malloc AVCastControllerItem failed");
820 ReportAVCastControllerInfo();
821
822 auto validCallback = [this](int32_t cmd, std::vector<int32_t>& supportedCastCmds) {
823 dealValidCallback(cmd, supportedCastCmds);
824 };
825 auto preparecallback = [this]() {
826 if (AVRouter::GetInstance().GetMirrorCastHandle() != -1 && isFirstCallback_) {
827 isFirstCallback_ = false;
828 AVRouter::GetInstance().DisconnectOtherSession(GetSessionId(),
829 GetDescriptor().outputDeviceInfo_.deviceInfos_[0]);
830 }
831 };
832 sharedPtr->Init(castControllerProxy_, validCallback, preparecallback);
833 {
834 std::lock_guard lockGuard(castControllersLock_);
835 castControllers_.emplace_back(sharedPtr);
836 }
837 sptr<IRemoteObject> remoteObject = castController;
838 sharedPtr->SetSessionTag(descriptor_.sessionTag_);
839 sharedPtr->SetSessionId(descriptor_.sessionId_);
840 sharedPtr->SetUserId(userId_);
841 if (descriptor_.sessionTag_ != "RemoteCast") {
842 std::lock_guard callbackForCastCapLockGuard(callbackForCastCapLock_);
843 castControllerProxy_->SetSessionCallbackForCastCap([this](bool isPlaying, bool isMediaChange) {
844 std::thread([this, isPlaying, isMediaChange]() {
845 CHECK_AND_RETURN_LOG(serviceCallbackForCastNtf_ != nullptr, "serviceCallbackForCastNtf_ is empty");
846 SLOGI("MediaCapsule CastCapsule for service isPlaying %{public}d, isMediaChange %{public}d",
847 isPlaying, isMediaChange);
848 serviceCallbackForCastNtf_(descriptor_.sessionId_, isPlaying, isMediaChange);
849 }).detach();
850 });
851 }
852
853 InitializeCastCommands();
854 if (SearchSpidInCapability(castHandleDeviceId_)) {
855 if (castControllerProxy_ != nullptr) {
856 castControllerProxy_->SetSpid(GetSpid());
857 }
858 }
859 return remoteObject;
860 }
861
ReleaseAVCastControllerInner()862 void AVSessionItem::ReleaseAVCastControllerInner()
863 {
864 SLOGI("Release AVCastControllerInner");
865 std::lock_guard lockGuard(castControllersLock_);
866 for (auto controller : castControllers_) {
867 if (controller != nullptr) {
868 controller->Destroy();
869 }
870 }
871 castControllerProxy_ = nullptr;
872 isFirstCallback_ = true;
873 }
874 #endif
875
RegisterAVSessionCallback(std::shared_ptr<AVSessionCallback> callbackOfMigrate)876 void AVSessionItem::RegisterAVSessionCallback(std::shared_ptr<AVSessionCallback> callbackOfMigrate)
877 {
878 std::lock_guard callbackLockGuard(callbackLock_);
879 callbackForMigrate_ = callbackOfMigrate;
880 }
881
RegisterCallbackInner(const sptr<IAVSessionCallback> & callback)882 int32_t AVSessionItem::RegisterCallbackInner(const sptr<IAVSessionCallback>& callback)
883 {
884 std::lock_guard callbackLockGuard(callbackLock_);
885 callback_ = callback;
886 return AVSESSION_SUCCESS;
887 }
888 // LCOV_EXCL_STOP
889
Activate()890 int32_t AVSessionItem::Activate()
891 {
892 descriptor_.isActive_ = true;
893 std::lock_guard controllerLockGuard(controllersLock_);
894 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
895 "API_NAME", "Activate", "BUNDLE_NAME", GetBundleName(),
896 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
897 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
898 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
899 for (const auto& [pid, controller] : controllers_) {
900 if (controller != nullptr) {
901 controller->HandleActiveStateChange(true);
902 }
903 }
904 if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL ||
905 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO_CALL) {
906 SLOGI("set audio scene for voip start");
907 AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
908 AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_START;
909 if (audioManager != nullptr) {
910 audioManager->SetAudioScene(audioScene);
911 }
912 }
913
914 return AVSESSION_SUCCESS;
915 }
916
917 // LCOV_EXCL_START
Deactivate()918 int32_t AVSessionItem::Deactivate()
919 {
920 descriptor_.isActive_ = false;
921 std::lock_guard controllerLockGuard(controllersLock_);
922 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
923 "API_NAME", "Deactivate", "BUNDLE_NAME", GetBundleName(),
924 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
925 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
926 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
927 for (const auto& [pid, controller] : controllers_) {
928 if (controller != nullptr) {
929 controller->HandleActiveStateChange(false);
930 }
931 }
932 if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL ||
933 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO_CALL) {
934 SLOGI("set audio scene for voip end");
935 AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
936 AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_END;
937 if (audioManager != nullptr) {
938 audioManager->SetAudioScene(audioScene);
939 }
940 }
941
942 return AVSESSION_SUCCESS;
943 }
944 // LCOV_EXCL_STOP
945
IsActive()946 bool AVSessionItem::IsActive()
947 {
948 return descriptor_.isActive_ || GetSessionId() == "DEFAULT";
949 }
950
951 // LCOV_EXCL_START
AddSupportCommand(int32_t cmd)952 int32_t AVSessionItem::AddSupportCommand(int32_t cmd)
953 {
954 CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
955 CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
956 SLOGI("AddSupportCommand=%{public}d", cmd);
957 if (cmd == AVControlCommand::SESSION_CMD_MEDIA_KEY_SUPPORT) {
958 SLOGI("enable media key event listen");
959 isMediaKeySupport = true;
960 return AVSESSION_SUCCESS;
961 }
962 auto iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), cmd);
963 CHECK_AND_RETURN_RET_LOG(iter == supportedCmd_.end(), AVSESSION_SUCCESS, "cmd already been added");
964 {
965 std::lock_guard lockGuard(avsessionItemLock_);
966 supportedCmd_.push_back(cmd);
967 }
968 std::string apiParamString = "cmd :" + std::to_string(cmd);
969 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
970 "API_NAME", "OnEvent", "BUNDLE_NAME", GetBundleName(),
971 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
972 "SESSION_TAG", descriptor_.sessionTag_,
973 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
974 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
975 ProcessFrontSession("AddSupportCommand");
976
977 {
978 std::lock_guard controllerLockGuard(controllersLock_);
979 SLOGI("send add command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
980 for (const auto& [pid, controller] : controllers_) {
981 if (controller != nullptr) {
982 controller->HandleValidCommandChange(supportedCmd_);
983 }
984 }
985 }
986
987 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
988 AddSessionCommandToCast(cmd);
989 #endif
990
991 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
992 ReportCommandChange();
993 #endif
994 return AVSESSION_SUCCESS;
995 }
996
DeleteSupportCommand(int32_t cmd)997 int32_t AVSessionItem::DeleteSupportCommand(int32_t cmd)
998 {
999 CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
1000 CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
1001 SLOGI("DeleteSupportCommand=%{public}d", cmd);
1002 if (cmd == AVControlCommand::SESSION_CMD_MEDIA_KEY_SUPPORT) {
1003 SLOGI("disable media key event listen");
1004 isMediaKeySupport = false;
1005 return AVSESSION_SUCCESS;
1006 }
1007 auto iter = std::remove(supportedCmd_.begin(), supportedCmd_.end(), cmd);
1008 {
1009 std::lock_guard lockGuard(avsessionItemLock_);
1010 supportedCmd_.erase(iter, supportedCmd_.end());
1011 }
1012 std::string apiParamString = "cmd :" + std::to_string(cmd);
1013 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1014 "API_NAME", "OffEvent",
1015 "BUNDLE_NAME", GetBundleName(),
1016 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1017 "SESSION_TAG", descriptor_.sessionTag_,
1018 "SESSION_TYPE", GetSessionType(),
1019 "API_PARAM", apiParamString,
1020 "ERROR_CODE", AVSESSION_SUCCESS,
1021 "ERROR_MSG", "SUCCESS");
1022 ProcessFrontSession("DeleteSupportCommand");
1023
1024 {
1025 SLOGI("send delete command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
1026 std::lock_guard controllerLockGuard(controllersLock_);
1027 for (const auto& [pid, controller] : controllers_) {
1028 if (controller != nullptr) {
1029 controller->HandleValidCommandChange(supportedCmd_);
1030 }
1031 }
1032 }
1033
1034 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
1035 RemoveSessionCommandFromCast(cmd);
1036 #endif
1037
1038 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
1039 ReportCommandChange();
1040 #endif
1041 return AVSESSION_SUCCESS;
1042 }
1043 // LCOV_EXCL_STOP
1044
SetSessionEvent(const std::string & event,const AAFwk::WantParams & args)1045 int32_t AVSessionItem::SetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
1046 {
1047 {
1048 std::lock_guard controllerLockGuard(controllersLock_);
1049 for (const auto& [pid, controller] : controllers_) {
1050 if (controller != nullptr) {
1051 controller->HandleSetSessionEvent(event, args);
1052 }
1053 }
1054 }
1055 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
1056 if (remoteSource_ != nullptr) {
1057 auto ret = remoteSource_->SetSessionEventRemote(event, args);
1058 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetSessionEvent failed");
1059 }
1060 return AVSESSION_SUCCESS;
1061 }
1062
GetAnonymousDeviceId(std::string deviceId)1063 std::string AVSessionItem::GetAnonymousDeviceId(std::string deviceId)
1064 {
1065 if (deviceId.empty() || deviceId.length() < DEVICE_ID_MIN_LEN) {
1066 return "unknown";
1067 }
1068 const uint32_t half = DEVICE_ID_MIN_LEN / 2;
1069 return deviceId.substr(0, half) + "**" + deviceId.substr(deviceId.length() - half);
1070 }
1071
1072 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
RegisterListenerStreamToCast(const std::pair<std::string,std::string> & serviceNameStatePair,DeviceInfo deviceInfo)1073 int32_t AVSessionItem::RegisterListenerStreamToCast(const std::pair<std::string, std::string>& serviceNameStatePair,
1074 DeviceInfo deviceInfo)
1075 {
1076 if (castHandle_ > 0) {
1077 return AVSESSION_ERROR;
1078 }
1079 {
1080 std::lock_guard displayListenerLockGuard(mirrorToStreamLock_);
1081 mirrorToStreamFlag_ = true;
1082 }
1083 std::lock_guard lockGuard(castLock_);
1084 castServiceNameStatePair_ = serviceNameStatePair;
1085 OutputDeviceInfo outputDeviceInfo;
1086 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
1087 if (AVRouter::GetInstance().GetMirrorCastHandle() == -1) {
1088 SetCastHandle(AVRouter::GetInstance().StartCast(outputDeviceInfo, castServiceNameStatePair_, GetSessionId()));
1089 CHECK_AND_RETURN_RET_LOG(castHandle_ != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
1090 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), deviceInfo);
1091 AVRouter::GetInstance().GetRemoteDrmCapabilities(castHandle_, deviceInfo.deviceId_,
1092 deviceInfo.supportedDrmCapabilities_);
1093 AVRouter::GetInstance().SetServiceAllConnectState(castHandle_, deviceInfo);
1094 InitAVCastControllerProxy();
1095 } else {
1096 SetCastHandle(AVRouter::GetInstance().GetMirrorCastHandle());
1097 InitAVCastControllerProxy();
1098 if (AVRouter::GetInstance().IsInMirrorToStreamState()) {
1099 SetCastHandle(-1);
1100 castControllerProxy_ = nullptr;
1101 return AVSESSION_ERROR;
1102 }
1103 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), deviceInfo);
1104 }
1105 castHandleDeviceId_ = deviceInfo.deviceId_;
1106 SLOGI("RegisterListenerStreamToCast check handle set to %{public}lld", (long long)castHandle_);
1107 UpdateCastDeviceMap(deviceInfo);
1108 DoContinuousTaskRegister();
1109 HISYSEVENT_BEHAVIOR("SESSION_CAST_CONTROL",
1110 "CONTROL_TYPE", "MirrorTostreamCast",
1111 "PEER_DEVICE_ID", GetAnonymousDeviceId(deviceInfo.deviceId_),
1112 "PEER_DEVICE_NAME", deviceInfo.deviceName_,
1113 "PEER_DEVICE_TYPE", deviceInfo.deviceType_,
1114 "PEER_NETWORK_ID", GetAnonymousDeviceId(deviceInfo.networkId_),
1115 "PEER_SUPPORTED_PROTOCOL", deviceInfo.supportedProtocols_,
1116 "BUNDLE_NAME", GetBundleName());
1117 return AVSESSION_SUCCESS;
1118 }
1119
1120 // LCOV_EXCL_START
InitializeCastCommands()1121 void AVSessionItem::InitializeCastCommands()
1122 {
1123 std::lock_guard lockGuard(avsessionItemLock_);
1124 // always support setVolume command
1125 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
1126 AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME);
1127 if (iter == supportedCastCmds_.end()) {
1128 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME);
1129 }
1130
1131 iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
1132 AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED);
1133 if (iter == supportedCastCmds_.end()) {
1134 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED);
1135 }
1136
1137 iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
1138 AVCastControlCommand::CAST_CONTROL_CMD_SEEK);
1139 if (iter == supportedCastCmds_.end()) {
1140 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SEEK);
1141 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
1142 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
1143 }
1144
1145 iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
1146 if (iter != supportedCmd_.end()) {
1147 AddSessionCommandToCast(AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
1148 }
1149 }
1150
SessionCommandToCastCommand(int32_t cmd)1151 int32_t AVSessionItem::SessionCommandToCastCommand(int32_t cmd)
1152 {
1153 if (cmd == AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
1154 return AVCastControlCommand::CAST_CONTROL_CMD_SET_LOOP_MODE;
1155 }
1156 return AVCastControlCommand::CAST_CONTROL_CMD_INVALID;
1157 }
1158
AddSessionCommandToCast(int32_t cmd)1159 void AVSessionItem::AddSessionCommandToCast(int32_t cmd)
1160 {
1161 if (cmd != AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
1162 return;
1163 }
1164
1165 if (castControllerProxy_ != nullptr) {
1166 int32_t castCmd = SessionCommandToCastCommand(cmd);
1167 std::lock_guard lockGuard(avsessionItemLock_);
1168 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), castCmd);
1169 if (iter != supportedCastCmds_.end()) {
1170 SLOGI("castCmd have already been added, cmd:%{public}d", castCmd);
1171 return;
1172 }
1173 supportedCastCmds_.push_back(castCmd);
1174 HandleCastValidCommandChange(supportedCastCmds_);
1175 }
1176 }
1177
RemoveSessionCommandFromCast(int32_t cmd)1178 void AVSessionItem::RemoveSessionCommandFromCast(int32_t cmd)
1179 {
1180 if (cmd != AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
1181 return;
1182 }
1183
1184 if (castControllerProxy_ != nullptr) {
1185 int32_t castCmd = SessionCommandToCastCommand(cmd);
1186 std::lock_guard lockGuard(avsessionItemLock_);
1187 SLOGI("remove castcmd:%{public}d", castCmd);
1188 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), castCmd);
1189 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1190 HandleCastValidCommandChange(supportedCastCmds_);
1191 }
1192 }
1193
AddSupportCastCommand(int32_t cmd)1194 int32_t AVSessionItem::AddSupportCastCommand(int32_t cmd)
1195 {
1196 if (cmd <= AVCastControlCommand::CAST_CONTROL_CMD_INVALID ||
1197 cmd >= AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
1198 SLOGI("add invalid cmd: %{public}d", cmd);
1199 return AVSESSION_ERROR;
1200 }
1201 {
1202 std::lock_guard lockGuard(avsessionItemLock_);
1203 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_PLAY_STATE_CHANGE) {
1204 auto iter = std::find(
1205 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1206 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1207 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1208 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_PAUSE);
1209 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1210 } else if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_SEEK) {
1211 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1212 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1213 supportedCastCmds_.push_back(cmd);
1214 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
1215 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
1216 } else {
1217 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1218 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1219 supportedCastCmds_.push_back(cmd);
1220 }
1221 }
1222 ProcessFrontSession("AddSupportCastCommand");
1223 HandleCastValidCommandChange(supportedCastCmds_);
1224 return AVSESSION_SUCCESS;
1225 }
1226
DeleteSupportCastCommand(int32_t cmd)1227 int32_t AVSessionItem::DeleteSupportCastCommand(int32_t cmd)
1228 {
1229 if (cmd <= AVCastControlCommand::CAST_CONTROL_CMD_INVALID ||
1230 cmd >= AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
1231 SLOGI("delete invalid cmd: %{public}d", cmd);
1232 return AVSESSION_ERROR;
1233 }
1234 {
1235 std::lock_guard lockGuard(avsessionItemLock_);
1236 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_PLAY_STATE_CHANGE) {
1237 auto iter = std::remove(
1238 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1239 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1240
1241 iter = std::remove(
1242 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PAUSE);
1243 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1244
1245 iter = std::remove(
1246 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1247 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1248 } else if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_SEEK) {
1249 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1250 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1251
1252 iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(),
1253 AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
1254 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1255
1256 iter = std::remove(
1257 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
1258 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1259 } else {
1260 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1261 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1262 }
1263 }
1264 ProcessFrontSession("DeleteSupportCastCommand");
1265 HandleCastValidCommandChange(supportedCastCmds_);
1266 return AVSESSION_SUCCESS;
1267 }
1268
HandleCastValidCommandChange(const std::vector<int32_t> & cmds)1269 void AVSessionItem::HandleCastValidCommandChange(const std::vector<int32_t> &cmds)
1270 {
1271 std::lock_guard lockGuard(castControllersLock_);
1272 SLOGI("send command change event to controller, controller size: %{public}d, cmds size is: %{public}d,",
1273 static_cast<int>(castControllers_.size()), static_cast<int>(cmds.size()));
1274 for (auto controller : castControllers_) {
1275 if (controller != nullptr) {
1276 controller->HandleCastValidCommandChange(cmds);
1277 }
1278 }
1279 }
1280
ReleaseCast(bool continuePlay)1281 int32_t AVSessionItem::ReleaseCast(bool continuePlay)
1282 {
1283 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1284 "API_NAME", "StopCasting",
1285 "BUNDLE_NAME", GetBundleName(),
1286 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1287 "SESSION_TAG", descriptor_.sessionTag_,
1288 "SESSION_TYPE", GetSessionType(),
1289 "ERROR_CODE", AVSESSION_SUCCESS,
1290 "ERROR_MSG", "SUCCESS");
1291 return StopCast(continuePlay);
1292 }
1293
CastAddToCollaboration(const OutputDeviceInfo & outputDeviceInfo)1294 int32_t AVSessionItem::CastAddToCollaboration(const OutputDeviceInfo& outputDeviceInfo)
1295 {
1296 SLOGI("enter CastAddToCollaboration");
1297 if (castDeviceInfoMap_.count(outputDeviceInfo.deviceInfos_[0].deviceId_) != 1) {
1298 SLOGE("deviceId map deviceinfo is not exit");
1299 return AVSESSION_ERROR;
1300 }
1301 ListenCollaborationApplyResult();
1302 DeviceInfo deviceInfo = castDeviceInfoMap_[outputDeviceInfo.deviceInfos_[0].deviceId_];
1303 CHECK_AND_RETURN_RET_LOG(deviceInfo.deviceId_ != "", AVSESSION_ERROR, "deviceid is empty");
1304 CollaborationManager::GetInstance().ApplyAdvancedResource(deviceInfo.deviceId_.c_str());
1305 //wait collaboration callback 10s
1306 std::unique_lock <std::mutex> applyResultLock(collaborationApplyResultMutex_);
1307 bool flag = connectWaitCallbackCond_.wait_for(applyResultLock, std::chrono::seconds(collaborationCallbackTimeOut_),
1308 [this]() {
1309 return applyResultFlag_;
1310 });
1311 //wait user decision collaboration callback 60s
1312 if (waitUserDecisionFlag_) {
1313 flag = connectWaitCallbackCond_.wait_for(applyResultLock,
1314 std::chrono::seconds(collaborationUserCallbackTimeOut_),
1315 [this]() {
1316 return applyUserResultFlag_;
1317 });
1318 }
1319 applyResultFlag_ = false;
1320 applyUserResultFlag_ = false;
1321 waitUserDecisionFlag_ = false;
1322 CHECK_AND_RETURN_RET_LOG(flag, ERR_WAIT_ALLCONNECT_TIMEOUT, "collaboration callback timeout");
1323 if (collaborationRejectFlag_) {
1324 collaborationRejectFlag_ = false;
1325 SLOGE("collaboration callback reject");
1326 return ERR_ALLCONNECT_CAST_REJECT;
1327 }
1328 return AVSESSION_SUCCESS;
1329 }
1330
StartCast(const OutputDeviceInfo & outputDeviceInfo)1331 int32_t AVSessionItem::StartCast(const OutputDeviceInfo& outputDeviceInfo)
1332 {
1333 std::lock_guard lockGuard(castLock_);
1334
1335 if (AVRouter::GetInstance().GetMirrorCastHandle() != -1 && castHandle_ <= 0 &&
1336 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO) {
1337 SetCastHandle(AVRouter::GetInstance().GetMirrorCastHandle());
1338 InitAVCastControllerProxy();
1339 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_,
1340 GetSessionId(), outputDeviceInfo.deviceInfos_[0]);
1341 castHandleDeviceId_ = outputDeviceInfo.deviceInfos_[0].deviceId_;
1342 DoContinuousTaskRegister();
1343 SLOGI("RegisterListenerStreamToCast check handle set to %{public}lld", (long long)castHandle_);
1344 return AVSESSION_SUCCESS;
1345 }
1346
1347 // unregister pre castSession callback to avoid previous session timeout disconnect influence current session
1348 if (castHandle_ > 0) {
1349 if (castHandleDeviceId_ == outputDeviceInfo.deviceInfos_[0].deviceId_) {
1350 SLOGI("repeat startcast %{public}lld", (long long)castHandle_);
1351 return ERR_REPEAT_CAST;
1352 } else {
1353 SLOGI("cast check with pre cast alive %{public}lld, unregister callback", (long long)castHandle_);
1354 isSwitchNewDevice_ = true;
1355 newOutputDeviceInfo_ = outputDeviceInfo;
1356 StopCast();
1357 int32_t flag = CastAddToCollaboration(outputDeviceInfo);
1358 CHECK_AND_RETURN_RET_LOG(flag == AVSESSION_SUCCESS, flag, "collaboration to start cast fail");
1359 return AVSESSION_SUCCESS;
1360 }
1361 } else {
1362 if (AVRouter::GetInstance().IsRemoteCasting()) {
1363 return SubStartCast(outputDeviceInfo);
1364 }
1365 int32_t flag = CastAddToCollaboration(outputDeviceInfo);
1366 CHECK_AND_RETURN_RET_LOG(flag == AVSESSION_SUCCESS, flag, "collaboration to start cast fail");
1367 }
1368 return SubStartCast(outputDeviceInfo);
1369 }
1370
SubStartCast(const OutputDeviceInfo & outputDeviceInfo)1371 int32_t AVSessionItem::SubStartCast(const OutputDeviceInfo& outputDeviceInfo)
1372 {
1373 int64_t castHandle = AVRouter::GetInstance().StartCast(outputDeviceInfo, castServiceNameStatePair_, GetSessionId());
1374 CHECK_AND_RETURN_RET_LOG(castHandle != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
1375
1376 SetCastHandle(castHandle);
1377 SLOGI("start cast check handle set to %{public}lld", (long long)castHandle_);
1378 int32_t ret = AddDevice(static_cast<int32_t>(castHandle), outputDeviceInfo, GetSpid());
1379 if (ret == AVSESSION_SUCCESS) {
1380 castHandleDeviceId_ = outputDeviceInfo.deviceInfos_[0].deviceId_;
1381 }
1382 DoContinuousTaskRegister();
1383 return ret;
1384 }
1385
AddDevice(const int64_t castHandle,const OutputDeviceInfo & outputDeviceInfo,uint32_t spid)1386 int32_t AVSessionItem::AddDevice(const int64_t castHandle, const OutputDeviceInfo& outputDeviceInfo, uint32_t spid)
1387 {
1388 SLOGI("Add device process");
1389 std::lock_guard lockGuard(castLock_);
1390 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_,
1391 GetSessionId(), outputDeviceInfo.deviceInfos_[0]);
1392 int32_t castId = static_cast<int32_t>(castHandle_);
1393 int32_t ret = AVRouter::GetInstance().AddDevice(castId, outputDeviceInfo, spid);
1394 SLOGI("Add device process with ret %{public}d", ret);
1395 return ret;
1396 }
1397
DealDisconnect(DeviceInfo deviceInfo,bool isNeedRemove)1398 void AVSessionItem::DealDisconnect(DeviceInfo deviceInfo, bool isNeedRemove)
1399 {
1400 SLOGI("Is remotecast, received disconnect event for castHandle_: %{public}lld", (long long)castHandle_);
1401 if (isNeedRemove) {
1402 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1403 AVRouter::GetInstance().StopCastSession(castHandle_);
1404 DoContinuousTaskUnregister();
1405 } else {
1406 // clear pre session cast info in streamplayer to avoid flash when cast compete
1407 if (castControllerProxy_ != nullptr) {
1408 castControllerProxy_->RefreshCurrentAVQueueItem(AVQueueItem {});
1409 }
1410 }
1411 SetCastHandle(-1);
1412 castHandleDeviceId_ = "-100";
1413 castControllerProxy_ = nullptr;
1414 isFirstCallback_ = true;
1415 if (!isSwitchNewDevice_) {
1416 {
1417 std::lock_guard lockGuard(avsessionItemLock_);
1418 supportedCastCmds_.clear();
1419 }
1420 ProcessFrontSession("Disconnect");
1421 }
1422 SaveLocalDeviceInfo();
1423 if (serviceCallbackForCastNtf_) {
1424 serviceCallbackForCastNtf_(GetSessionId(), false, false);
1425 }
1426 ReportStopCastFinish("AVSessionItem::OnCastStateChange", deviceInfo);
1427 }
1428
DealCollaborationPublishState(int32_t castState,DeviceInfo deviceInfo)1429 void AVSessionItem::DealCollaborationPublishState(int32_t castState, DeviceInfo deviceInfo)
1430 {
1431 SLOGI("enter DealCollaborationPublishState");
1432 {
1433 std::lock_guard displayListenerLockGuard(mirrorToStreamLock_);
1434 if (mirrorToStreamFlag_) {
1435 mirrorToStreamFlag_ = false;
1436 SLOGI("cast not add to collaboration when mirror to stream cast");
1437 return;
1438 }
1439 }
1440 collaborationNeedDeviceId_ = deviceInfo.deviceId_;
1441 if (castState == authingStateFromCast_) {
1442 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedDeviceId_.c_str(),
1443 ServiceCollaborationManagerBussinessStatus::SCM_CONNECTING);
1444 }
1445 if (castState == connectStateFromCast_) { // 6 is connected status (stream)
1446 AVRouter::GetInstance().GetRemoteNetWorkId(
1447 castHandle_, deviceInfo.deviceId_, collaborationNeedNetworkId_);
1448 if (collaborationNeedNetworkId_.empty()) {
1449 SLOGI("networkId is empty, try use deviceId:%{public}s", deviceInfo.deviceId_.c_str());
1450 collaborationNeedNetworkId_ = deviceInfo.deviceId_;
1451 }
1452 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1453 ServiceCollaborationManagerBussinessStatus::SCM_CONNECTED);
1454 }
1455 if (castState == disconnectStateFromCast_) { // 5 is disconnected status
1456 if (collaborationNeedNetworkId_.empty()) {
1457 SLOGI("networkId is empty, try use deviceId:%{public}s", deviceInfo.deviceId_.c_str());
1458 collaborationNeedNetworkId_ = deviceInfo.deviceId_;
1459 }
1460 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedDeviceId_.c_str(),
1461 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1462 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1463 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1464 }
1465 }
1466
DealLocalState(int32_t castState)1467 void AVSessionItem::DealLocalState(int32_t castState)
1468 {
1469 if (castState == static_cast<int32_t>(ConnectionState::STATE_DISCONNECTED)) {
1470 if (!isSwitchNewDevice_) {
1471 OutputDeviceInfo outputDeviceInfo;
1472 DeviceInfo deviceInfo;
1473 deviceInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
1474 deviceInfo.deviceId_ = "0";
1475 deviceInfo.deviceName_ = "LocalDevice";
1476 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
1477 SetOutputDevice(outputDeviceInfo);
1478 } else {
1479 if (newOutputDeviceInfo_.deviceInfos_.size() > 0) {
1480 std::this_thread::sleep_for(std::chrono::milliseconds(SWITCH_WAIT_TIME));
1481 SubStartCast(newOutputDeviceInfo_);
1482 }
1483 isSwitchNewDevice_ = false;
1484 }
1485 }
1486 }
1487
1488
ListenCollaborationOnStop()1489 void AVSessionItem::ListenCollaborationOnStop()
1490 {
1491 SLOGI("enter ListenCollaborationOnStop");
1492 CollaborationManager::GetInstance().SendCollaborationOnStop([this](void) {
1493 if (newCastState == connectStateFromCast_) {
1494 if (descriptor_.sessionTag_ == "RemoteCast") {
1495 SLOGI("notify controller avplayer cancle cast when pc recive onstop callback");
1496 AVRouter::GetInstance().StopCastSession(castHandle_);
1497 } else {
1498 StopCast();
1499 }
1500 }
1501 });
1502 }
1503
PublishAVCastHa(int32_t castState,DeviceInfo deviceInfo)1504 void AVSessionItem::PublishAVCastHa(int32_t castState, DeviceInfo deviceInfo)
1505 {
1506 CHECK_AND_RETURN_LOG(descriptor_.sessionTag_ != "RemoteCast", "remote cast session, return");
1507 if (castState == connectStateFromCast_) {
1508 AVSessionHiAnalyticsReport::PublishCastEvent(GetBundleName(), connectStateFromCast_,
1509 castDeviceInfoMap_[deviceInfo.deviceId_]);
1510 } else if (castState == disconnectStateFromCast_) {
1511 AVSessionHiAnalyticsReport::PublishCastEvent(GetBundleName(), disconnectStateFromCast_,
1512 castDeviceInfoMap_[deviceInfo.deviceId_]);
1513 AVSessionHiAnalyticsReport::PublishCastRecord(GetBundleName(), castDeviceInfoMap_[deviceInfo.deviceId_]);
1514 }
1515 }
1516
OnCastStateChange(int32_t castState,DeviceInfo deviceInfo,bool isNeedRemove)1517 void AVSessionItem::OnCastStateChange(int32_t castState, DeviceInfo deviceInfo, bool isNeedRemove)
1518 {
1519 SLOGI("OnCastStateChange in with state: %{public}d | id: %{public}s", static_cast<int32_t>(castState),
1520 deviceInfo.deviceId_.c_str());
1521 if (deviceInfo.deviceId_ == "-1") { //cast_engine_service abnormal terminated, update deviceId in item
1522 deviceInfo = GetDescriptor().outputDeviceInfo_.deviceInfos_[0];
1523 }
1524 if (isNeedRemove) { //same device cast exchange no publish when hostpot scene
1525 DealCollaborationPublishState(castState, deviceInfo);
1526 }
1527
1528 if (SearchSpidInCapability(deviceInfo.deviceId_)) {
1529 deviceInfo.supportedPullClients_.clear();
1530 deviceInfo.supportedPullClients_.push_back(GetSpid());
1531 SLOGI("OnCastStateChange add pull client: %{public}u", GetSpid());
1532 }
1533 newCastState = castState;
1534 ListenCollaborationOnStop();
1535 OutputDeviceInfo outputDeviceInfo;
1536 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
1537 if (static_cast<uint32_t>(castDeviceInfoMap_[deviceInfo.deviceId_].supportedProtocols_) &
1538 ProtocolType::TYPE_CAST_PLUS_AUDIO) {
1539 castDeviceInfoMap_[deviceInfo.deviceId_].audioCapabilities_ = deviceInfo.audioCapabilities_;
1540 }
1541 outputDeviceInfo.deviceInfos_.emplace_back(castDeviceInfoMap_[deviceInfo.deviceId_]);
1542 } else {
1543 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
1544 }
1545 PublishAVCastHa(castState, deviceInfo);
1546 if (castState == connectStateFromCast_) { // 6 is connected status (stream)
1547 castState = 1; // 1 is connected status (local)
1548 descriptor_.outputDeviceInfo_ = outputDeviceInfo;
1549 ReportConnectFinish("AVSessionItem::OnCastStateChange", deviceInfo);
1550 if (callStartCallback_ && isNeedRemove && descriptor_.sessionTag_ == "RemoteCast") {
1551 SLOGI("AVSessionItem send callStart event to service for connected");
1552 callStartCallback_(*this);
1553 }
1554 }
1555 if (castState == disconnectStateFromCast_) { // 5 is disconnected status
1556 castState = 6; // 6 is disconnected status of AVSession
1557 DealDisconnect(deviceInfo, isNeedRemove);
1558 }
1559 {
1560 std::lock_guard aliveLockGuard(isAliveLock_);
1561 if (isAlivePtr_ != nullptr && *isAlivePtr_) {
1562 HandleOutputDeviceChange(castState, outputDeviceInfo);
1563 std::lock_guard controllersLockGuard(controllersLock_);
1564 for (const auto& controller : controllers_) {
1565 if (!controllers_.empty() && controller.second != nullptr) {
1566 controller.second->HandleOutputDeviceChange(castState, outputDeviceInfo);
1567 }
1568 }
1569 }
1570 }
1571 if (castState == ConnectionState::STATE_DISCONNECTED && descriptor_.sessionTag_ == "RemoteCast") {
1572 SLOGI("Sink cast session is disconnected, avsession item need be destroyed.");
1573 Destroy();
1574 } else {
1575 AVSessionEventHandler::GetInstance().AVSessionPostTask([this, castState]() {
1576 DealLocalState(castState);
1577 }, "DealLocalState", 0);
1578 }
1579 }
1580
OnCastEventRecv(int32_t errorCode,std::string & errorMsg)1581 void AVSessionItem::OnCastEventRecv(int32_t errorCode, std::string& errorMsg)
1582 {
1583 SLOGI("OnCastEventRecv in with code and msg %{public}dm %{public}s", errorCode, errorMsg.c_str());
1584 std::lock_guard lockGuard(castControllersLock_);
1585 for (auto controller : castControllers_) {
1586 controller->OnPlayerError(errorCode, errorMsg);
1587 }
1588 }
1589
ListenCollaborationApplyResult()1590 void AVSessionItem::ListenCollaborationApplyResult()
1591 {
1592 SLOGI("enter ListenCollaborationApplyResult");
1593 CollaborationManager::GetInstance().SendCollaborationApplyResult([this](const int32_t code) {
1594 std::unique_lock <std::mutex> applyResultLock(collaborationApplyResultMutex_);
1595 if (code == ServiceCollaborationManagerResultCode::PASS) {
1596 SLOGI("ApplyResult can cast");
1597 applyResultFlag_ = true;
1598 applyUserResultFlag_ = true;
1599 connectWaitCallbackCond_.notify_one();
1600 }
1601 if (code == ServiceCollaborationManagerResultCode::REJECT) {
1602 SLOGI("ApplyResult can not cast");
1603 collaborationRejectFlag_ = true;
1604 applyResultFlag_ = true;
1605 applyUserResultFlag_ = true;
1606 connectWaitCallbackCond_.notify_one();
1607 }
1608 if (code == ServiceCollaborationManagerResultCode::USERTIP) {
1609 SLOGI("ApplyResult user tip");
1610 applyResultFlag_ = true;
1611 waitUserDecisionFlag_ = true;
1612 connectWaitCallbackCond_.notify_one();
1613 }
1614 if (code == ServiceCollaborationManagerResultCode::USERAGREE) {
1615 SLOGI("ApplyResult user agree cast");
1616 }
1617 });
1618 }
1619
StopCast(bool continuePlay)1620 int32_t AVSessionItem::StopCast(bool continuePlay)
1621 {
1622 std::lock_guard lockGuard(castLock_);
1623 if (descriptor_.sessionTag_ == "RemoteCast") {
1624 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedDeviceId_.c_str(),
1625 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1626 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1627 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1628 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1629 int32_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
1630 SetCastHandle(-1);
1631 castHandleDeviceId_ = "-100";
1632 SLOGI("Unregister and Stop cast process for sink with ret %{public}d", ret);
1633 return ret;
1634 }
1635 {
1636 CHECK_AND_RETURN_RET_LOG(castHandle_ != 0 && castHandle_ != -1, AVSESSION_SUCCESS, "Not cast session, return");
1637 std::string callingBundleName = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid());
1638 bool isMediaOrSceneBoard = (callingBundleName == MEDIA_CONTROL_BUNDLENAME) ||
1639 (callingBundleName == SCENE_BOARD_BUNDLENAME);
1640 SLOGI("Stop cast process %{public}lld with rm device %{public}d", (long long)castHandle_, isMediaOrSceneBoard);
1641 if ((castHandle_ == AVRouter::GetInstance().GetMirrorCastHandle()) && !isMediaOrSceneBoard) {
1642 if (castControllerProxy_ != nullptr) {
1643 AVCastControlCommand cmd;
1644 cmd.SetCommand(AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1645 castControllerProxy_->SendControlCommand(cmd);
1646 }
1647 } else {
1648 AVSessionRadarInfo info("AVSessionItem::StopCast");
1649 AVSessionRadar::GetInstance().StopCastBegin(descriptor_.outputDeviceInfo_, info);
1650 int64_t ret = AVRouter::GetInstance().StopCast(castHandle_, continuePlay);
1651 AVSessionRadar::GetInstance().StopCastEnd(descriptor_.outputDeviceInfo_, info);
1652 SLOGI("StopCast with unchange castHandle is %{public}lld", (long long)castHandle_);
1653 CHECK_AND_RETURN_RET_LOG(ret != AVSESSION_ERROR, AVSESSION_ERROR, "StopCast failed");
1654 }
1655 }
1656 return AVSESSION_SUCCESS;
1657 }
1658
SetCastHandle(const int64_t castHandle)1659 void AVSessionItem::SetCastHandle(const int64_t castHandle)
1660 {
1661 castHandle_ = castHandle;
1662 if (serviceCallbackForUpdateSession_) {
1663 serviceCallbackForUpdateSession_(sessionCastState_, IsCasting());
1664 }
1665 }
1666
RegisterDeviceStateCallback()1667 void AVSessionItem::RegisterDeviceStateCallback()
1668 {
1669 OutputDeviceInfo localDevice;
1670 DeviceInfo localInfo;
1671 localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
1672 localInfo.deviceId_ = "0";
1673 localInfo.deviceName_ = "LocalDevice";
1674 localDevice.deviceInfos_.emplace_back(localInfo);
1675 descriptor_.outputDeviceInfo_ = localDevice;
1676 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), localInfo);
1677 SLOGI("register callback for device state change done");
1678 }
1679
UnRegisterDeviceStateCallback()1680 void AVSessionItem::UnRegisterDeviceStateCallback()
1681 {
1682 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1683 }
1684
StopCastSession()1685 void AVSessionItem::StopCastSession()
1686 {
1687 SLOGI("Stop cast session process with castHandle: %{public}lld", (long long)castHandle_);
1688 int64_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
1689 DoContinuousTaskUnregister();
1690 if (ret != AVSESSION_ERROR) {
1691 SetCastHandle(-1);
1692 castHandleDeviceId_ = "-100";
1693 } else {
1694 SLOGE("Stop cast session process error");
1695 }
1696 }
1697
StartCastDisplayListener()1698 int32_t AVSessionItem::StartCastDisplayListener()
1699 {
1700 SLOGI("StartCastDisplayListener in");
1701 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1702 "API_NAME", "onCastDisplayChange",
1703 "BUNDLE_NAME", GetBundleName(),
1704 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1705 "SESSION_TAG", descriptor_.sessionTag_,
1706 "SESSION_TYPE", GetSessionType(),
1707 "ERROR_CODE", AVSESSION_SUCCESS,
1708 "ERROR_MSG", "SUCCESS");
1709 sptr<IAVSessionCallback> callback;
1710 {
1711 std::lock_guard callbackLockGuard(callbackLock_);
1712 CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
1713 callback = callback_;
1714 }
1715 GetDisplayListener(callback);
1716 return AVSESSION_SUCCESS;
1717 }
1718
StopCastDisplayListener()1719 int32_t AVSessionItem::StopCastDisplayListener()
1720 {
1721 SLOGI("StopCastDisplayListener in");
1722 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1723 "API_NAME", "offCastDisplayChange",
1724 "BUNDLE_NAME", GetBundleName(),
1725 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1726 "SESSION_TAG", descriptor_.sessionTag_,
1727 "SESSION_TYPE", GetSessionType(),
1728 "ERROR_CODE", AVSESSION_SUCCESS,
1729 "ERROR_MSG", "SUCCESS");
1730 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1731 CHECK_AND_RETURN_RET_LOG(displayListener_ != nullptr, AVSESSION_ERROR, "displayListener_ is nullptr");
1732 Rosen::DMError ret = Rosen::ScreenManagerLite::GetInstance().UnregisterScreenListener(displayListener_);
1733 if (ret != Rosen::DMError::DM_OK) {
1734 SLOGE("UnregisterScreenListener failed, ret: %{public}d.", ret);
1735 }
1736 displayListener_ = nullptr;
1737 return AVSESSION_SUCCESS;
1738 }
1739
GetDisplayListener(sptr<IAVSessionCallback> callback)1740 void AVSessionItem::GetDisplayListener(sptr<IAVSessionCallback> callback)
1741 {
1742 SLOGI("GetDisplayListener in");
1743 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1744 if (displayListener_ == nullptr) {
1745 SLOGI("displayListener_ is null, try to create new listener");
1746 displayListener_ = new HwCastDisplayListener(callback);
1747 CHECK_AND_RETURN_LOG(displayListener_ != nullptr, "Create displayListener failed");
1748 SLOGI("Start to register display listener");
1749 Rosen::DMError ret = Rosen::ScreenManagerLite::GetInstance().RegisterScreenListener(displayListener_);
1750 if (ret != Rosen::DMError::DM_OK) {
1751 SLOGE("UnregisterScreenListener failed, ret: %{public}d.", ret);
1752 }
1753 }
1754 return;
1755 }
1756
GetAllCastDisplays(std::vector<CastDisplayInfo> & castDisplays)1757 int32_t AVSessionItem::GetAllCastDisplays(std::vector<CastDisplayInfo>& castDisplays)
1758 {
1759 SLOGI("GetAllCastDisplays in");
1760 std::vector<Rosen::DisplayId> allDisplayIds = Rosen::DisplayManagerLite::GetInstance().GetAllDisplayIds();
1761 std::vector<CastDisplayInfo> displays;
1762 for (auto &displayId : allDisplayIds) {
1763 sptr<Rosen::DisplayLite> display = Rosen::DisplayManagerLite::GetInstance().GetDisplayById(displayId);
1764 CHECK_AND_RETURN_RET_LOG(display != nullptr, AVSESSION_ERROR, "display is nullptr");
1765 auto displayInfo = display->GetDisplayInfo();
1766 SLOGI("GetAllCastDisplays name: %{public}s, id: %{public}llu",
1767 displayInfo->GetName().c_str(), (unsigned long long)displayInfo->GetDisplayId());
1768 if (displayInfo->GetName() == "HwCast_AppModeDisplay") {
1769 displays.clear();
1770 SLOGI("GetAllCastDisplays AppCast");
1771 if (displayListener_ != nullptr) {
1772 displayListener_->SetAppCastDisplayId(displayInfo->GetDisplayId());
1773 }
1774 break;
1775 }
1776 auto flag = Rosen::DisplayManagerLite::GetInstance().GetVirtualScreenFlag(displayInfo->GetDisplayId());
1777 if (flag == Rosen::VirtualScreenFlag::CAST) {
1778 SLOGI("ReportCastDisplay start in");
1779 CastDisplayInfo castDisplayInfo;
1780 castDisplayInfo.displayState = CastDisplayState::STATE_ON;
1781 castDisplayInfo.displayId = displayInfo->GetDisplayId();
1782 castDisplayInfo.name = displayInfo->GetName();
1783 castDisplayInfo.width = static_cast<int32_t>(displayInfo->GetWidth());
1784 castDisplayInfo.height = static_cast<int32_t>(displayInfo->GetHeight());
1785 displays.push_back(castDisplayInfo);
1786 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1787 if (displayListener_ != nullptr) {
1788 displayListener_->SetDisplayInfo(displayInfo);
1789 }
1790 }
1791 }
1792 castDisplays = displays;
1793 SLOGI("GetAllCastDisplays out");
1794 return AVSESSION_SUCCESS;
1795 }
1796
SetSpid(const AAFwk::WantParams & extras)1797 void AVSessionItem::SetSpid(const AAFwk::WantParams& extras)
1798 {
1799 std::unique_lock <std::mutex> lock(spidMutex_);
1800 if (extras.HasParam("request-tv-client")) {
1801 auto value = extras.GetParam("request-tv-client");
1802 AAFwk::IInteger* intValue = AAFwk::IInteger::Query(value);
1803 if (intValue != nullptr && AAFwk::Integer::Unbox(intValue) > 0) {
1804 spid_ = static_cast<uint32_t>(AAFwk::Integer::Unbox(intValue));
1805 SLOGI("AVSessionItem SetSpid %{public}u", spid_);
1806 } else {
1807 SLOGE("AVSessionItem SetSpid failed");
1808 }
1809 }
1810 }
1811
GetSpid()1812 uint32_t AVSessionItem::GetSpid()
1813 {
1814 std::unique_lock <std::mutex> lock(spidMutex_);
1815 return spid_;
1816 }
1817
SearchSpidInCapability(const std::string & deviceId)1818 bool AVSessionItem::SearchSpidInCapability(const std::string& deviceId)
1819 {
1820 std::unique_lock <std::mutex> lock(spidMutex_);
1821 auto iter = castDeviceInfoMap_.find(deviceId);
1822 if (iter == castDeviceInfoMap_.end()) {
1823 SLOGE("deviceId map deviceinfo is not exit");
1824 return false;
1825 }
1826 for (uint32_t cap : iter->second.supportedPullClients_) {
1827 if (cap == spid_) {
1828 return true;
1829 }
1830 }
1831 return false;
1832 }
1833
SetExtrasInner(AAFwk::IArray * list)1834 void AVSessionItem::SetExtrasInner(AAFwk::IArray* list)
1835 {
1836 auto func = [this](AAFwk::IInterface* object) {
1837 if (object != nullptr) {
1838 AAFwk::IString* stringValue = AAFwk::IString::Query(object);
1839 if (stringValue != nullptr && AAFwk::String::Unbox(stringValue) == "url-cast" &&
1840 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO && serviceCallbackForStream_) {
1841 SLOGI("AVSessionItem send mirrortostream event to service");
1842 serviceCallbackForStream_(GetSessionId());
1843 }
1844 }
1845 };
1846 AAFwk::Array::ForEach(list, func);
1847 }
1848
SetServiceCallbackForStream(const std::function<void (std::string)> & callback)1849 void AVSessionItem::SetServiceCallbackForStream(const std::function<void(std::string)>& callback)
1850 {
1851 SLOGI("SetServiceCallbackForStream in");
1852 serviceCallbackForStream_ = callback;
1853 }
1854
SetServiceCallbackForCastNtfCapsule(const std::function<void (std::string,bool,bool)> & callback)1855 void AVSessionItem::SetServiceCallbackForCastNtfCapsule(const std::function<void(std::string, bool, bool)>& callback)
1856 {
1857 SLOGI("SetServiceCallbackForCastNtfCapsule in");
1858 serviceCallbackForCastNtf_ = callback;
1859 }
1860 #endif
1861
SetServiceCallbackForUpdateExtras(const std::function<void (std::string)> & callback)1862 void AVSessionItem::SetServiceCallbackForUpdateExtras(const std::function<void(std::string)>& callback)
1863 {
1864 SLOGI("SetServiceCallbackForUpdateExtras in");
1865 updateExtrasCallback_ = callback;
1866 }
1867
GetDescriptor()1868 AVSessionDescriptor AVSessionItem::GetDescriptor()
1869 {
1870 return descriptor_;
1871 }
1872
GetAVCallState()1873 AVCallState AVSessionItem::GetAVCallState()
1874 {
1875 std::lock_guard lockGuard(avsessionItemLock_);
1876 return avCallState_;
1877 }
1878
GetAVCallMetaData()1879 AVCallMetaData AVSessionItem::GetAVCallMetaData()
1880 {
1881 std::lock_guard lockGuard(avsessionItemLock_);
1882 std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
1883 ReadMetaDataImg(innerPixelMap);
1884 return avCallMetaData_;
1885 }
1886
1887
GetPlaybackState()1888 AVPlaybackState AVSessionItem::GetPlaybackState()
1889 {
1890 std::lock_guard lockGuard(avsessionItemLock_);
1891 return playbackState_;
1892 }
1893
GetMetaDataWithoutImg()1894 AVMetaData AVSessionItem::GetMetaDataWithoutImg()
1895 {
1896 std::lock_guard lockGuard(avsessionItemLock_);
1897 return metaData_;
1898 }
1899
GetMetaData()1900 AVMetaData AVSessionItem::GetMetaData()
1901 {
1902 std::lock_guard lockGuard(avsessionItemLock_);
1903 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
1904 ReadMetaDataImg(innerPixelMap);
1905
1906 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
1907 ReadMetaDataAVQueueImg(avQueuePixelMap);
1908 return metaData_;
1909 }
1910
ReadMetaDataImg(std::shared_ptr<AVSessionPixelMap> & innerPixelMap)1911 void AVSessionItem::ReadMetaDataImg(std::shared_ptr<AVSessionPixelMap>& innerPixelMap)
1912 {
1913 std::shared_lock<std::shared_mutex> lock(writeAndReadImgLock_);
1914 std::string sessionId = GetSessionId();
1915 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
1916 std::string fileName = sessionId + AVSessionUtils::GetFileSuffix();
1917 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
1918 }
1919
ReadMetaDataAVQueueImg(std::shared_ptr<AVSessionPixelMap> & avQueuePixelMap)1920 void AVSessionItem::ReadMetaDataAVQueueImg(std::shared_ptr<AVSessionPixelMap>& avQueuePixelMap)
1921 {
1922 std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
1923 std::string avQueueFileName = GetBundleName() + "_" + metaData_.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
1924 AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
1925 }
1926
GetQueueItems()1927 std::vector<AVQueueItem> AVSessionItem::GetQueueItems()
1928 {
1929 std::lock_guard lock_guard(avsessionItemLock_);
1930 return queueItems_;
1931 }
1932
GetQueueTitle()1933 std::string AVSessionItem::GetQueueTitle()
1934 {
1935 std::lock_guard lockGuard(avsessionItemLock_);
1936 return queueTitle_;
1937 }
1938
GetSupportCommand()1939 std::vector<int32_t> AVSessionItem::GetSupportCommand()
1940 {
1941 std::lock_guard lockGuard(avsessionItemLock_);
1942 if (descriptor_.elementName_.GetBundleName() == "castBundleName"
1943 && descriptor_.elementName_.GetAbilityName() == "castAbilityName") {
1944 std::vector<int32_t> supportedCmdForCastSession {
1945 AVControlCommand::SESSION_CMD_PLAY,
1946 AVControlCommand::SESSION_CMD_PAUSE,
1947 AVControlCommand::SESSION_CMD_STOP,
1948 AVControlCommand::SESSION_CMD_PLAY_NEXT,
1949 AVControlCommand::SESSION_CMD_PLAY_PREVIOUS,
1950 AVControlCommand::SESSION_CMD_SEEK
1951 };
1952 return supportedCmdForCastSession;
1953 }
1954 return supportedCmd_;
1955 }
1956
SetSupportCommand(std::vector<int32_t> cmds)1957 void AVSessionItem::SetSupportCommand(std::vector<int32_t> cmds)
1958 {
1959 {
1960 std::lock_guard lockGuard(avsessionItemLock_);
1961 supportedCmd_ = cmds;
1962 }
1963 std::string apiParamString = "cmd num:" + std::to_string(cmds.size());
1964 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1965 "API_NAME", "SetSupportCommand",
1966 "BUNDLE_NAME", GetBundleName(),
1967 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1968 "SESSION_TAG", descriptor_.sessionTag_,
1969 "SESSION_TYPE", GetSessionType(),
1970 "API_PARAM", apiParamString,
1971 "ERROR_CODE", AVSESSION_SUCCESS,
1972 "ERROR_MSG", "SUCCESS");
1973 ProcessFrontSession("SetSupportCommand");
1974
1975 {
1976 std::lock_guard controllerLockGuard(controllersLock_);
1977 SLOGI("send add command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
1978 for (const auto& [pid, controller] : controllers_) {
1979 if (controller != nullptr) {
1980 controller->HandleValidCommandChange(supportedCmd_);
1981 }
1982 }
1983 }
1984 }
1985
GetLaunchAbility()1986 AbilityRuntime::WantAgent::WantAgent AVSessionItem::GetLaunchAbility()
1987 {
1988 return launchAbility_;
1989 }
1990
GetExtras()1991 AAFwk::WantParams AVSessionItem::GetExtras()
1992 {
1993 std::lock_guard lockGuard(avsessionItemLock_);
1994 return extras_;
1995 }
1996
NotificationExtras(AAFwk::IArray * list)1997 void AVSessionItem::NotificationExtras(AAFwk::IArray* list)
1998 {
1999 auto func = [this](AAFwk::IInterface* object) {
2000 if (object != nullptr) {
2001 AAFwk::IBoolean* booleanValue = AAFwk::IBoolean::Query(object);
2002 if (booleanValue != nullptr && AAFwk::Boolean ::Unbox(booleanValue)) {
2003 isNotShowNotification_ = true;
2004 } else {
2005 isNotShowNotification_ = false;
2006 }
2007 }
2008 };
2009 AAFwk::Array::ForEach(list, func);
2010 if (updateExtrasCallback_) {
2011 updateExtrasCallback_(GetSessionId());
2012 }
2013 }
2014
KeyEventExtras(AAFwk::IArray * list)2015 void AVSessionItem::KeyEventExtras(AAFwk::IArray* list)
2016 {
2017 auto func = [this](AAFwk::IInterface* object) {
2018 if (object != nullptr) {
2019 AAFwk::IBoolean* booleanValue = AAFwk::IBoolean::Query(object);
2020 if (booleanValue != nullptr && AAFwk::Boolean::Unbox(booleanValue) &&
2021 serviceCallbackForKeyEvent_) {
2022 SLOGI("AVSessionItem send addkeyeventsession event to service");
2023 serviceCallbackForKeyEvent_(GetSessionId());
2024 }
2025 }
2026 };
2027 AAFwk::Array::ForEach(list, func);
2028 }
2029
IsNotShowNotification()2030 bool AVSessionItem::IsNotShowNotification()
2031 {
2032 return isNotShowNotification_;
2033 }
2034
HandleMediaKeyEvent(const MMI::KeyEvent & keyEvent)2035 void AVSessionItem::HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent)
2036 {
2037 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnMediaKeyEvent");
2038 CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactive");
2039 SLOGI("HandleMediaKeyEvent check isMediaKeySupport %{public}d for %{public}d",
2040 static_cast<int>(isMediaKeySupport), static_cast<int>(keyEvent.GetKeyCode()));
2041 if (!isMediaKeySupport && keyEventCaller_.count(keyEvent.GetKeyCode()) > 0) {
2042 AVControlCommand cmd;
2043 cmd.SetRewindTime(metaData_.GetSkipIntervals());
2044 cmd.SetForwardTime(metaData_.GetSkipIntervals());
2045 keyEventCaller_[keyEvent.GetKeyCode()](cmd);
2046 } else {
2047 std::lock_guard callbackLockGuard(callbackLock_);
2048 if (callback_ != nullptr) {
2049 callback_->OnMediaKeyEvent(keyEvent);
2050 }
2051 }
2052 }
2053
ExecuteControllerCommand(const AVControlCommand & cmd)2054 void AVSessionItem::ExecuteControllerCommand(const AVControlCommand& cmd)
2055 {
2056 HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_ALL_CTRL_COMMAND);
2057 int32_t code = cmd.GetCommand();
2058 if (code < 0 || code >= SESSION_CMD_MAX) {
2059 SLOGE("controlCommand invalid");
2060 return;
2061 }
2062 SLOGI("ExecuteControllerCommand code %{public}d from pid %{public}d to pid %{public}d",
2063 code, static_cast<int>(GetCallingPid()), static_cast<int>(GetPid()));
2064 {
2065 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2066 if (remoteSink_ != nullptr) {
2067 SLOGI("set remote ControlCommand");
2068 CHECK_AND_RETURN_LOG(remoteSink_->SetControlCommand(cmd) == AVSESSION_SUCCESS, "SetControlCommand failed");
2069 }
2070 }
2071 CHECK_AND_RETURN_LOG(callback_ != nullptr || callbackForMigrate_ != nullptr,
2072 "callback_ or callbackForMigrate_ is nullptr");
2073 CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactivate");
2074
2075 HISYSEVENT_ADD_OPERATION_COUNT(static_cast<Operation>(cmd.GetCommand()));
2076 HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_SUCCESS_CTRL_COMMAND);
2077 HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(descriptor_.elementName_.GetBundleName(), GetPid(),
2078 cmd.GetCommand(), descriptor_.sessionType_);
2079 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
2080 ReportSessionControl(descriptor_.elementName_.GetBundleName(), cmd.GetCommand());
2081 #endif
2082 return cmdHandlers[code](cmd);
2083
2084 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", code,
2085 "ERROR_INFO", "avsessionitem executecontrollercommand, invaild command");
2086 }
2087 // LCOV_EXCL_STOP
2088
ExecueCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)2089 void AVSessionItem::ExecueCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
2090 {
2091 AVSESSION_TRACE_SYNC_START("AVSessionItem::ExecueCommonCommand");
2092 {
2093 std::lock_guard callbackLockGuard(callbackLock_);
2094 if (callbackForMigrate_) {
2095 callbackForMigrate_->OnCommonCommand(commonCommand, commandArgs);
2096 }
2097 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2098 callback_->OnCommonCommand(commonCommand, commandArgs);
2099 }
2100
2101 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2102 if (remoteSink_ != nullptr) {
2103 CHECK_AND_RETURN_LOG(remoteSink_->SetCommonCommand(commonCommand, commandArgs) == AVSESSION_SUCCESS,
2104 "SetCommonCommand failed");
2105 }
2106 }
2107
ExecuteCustomData(const AAFwk::WantParams & data)2108 void AVSessionItem::ExecuteCustomData(const AAFwk::WantParams& data)
2109 {
2110 AVSESSION_TRACE_SYNC_START("AVSessionItem::ExecuteCustomData");
2111 {
2112 std::lock_guard callbackLockGuard(callbackLock_);
2113 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2114 callback_->OnCustomData(data);
2115 }
2116 }
2117
2118 // LCOV_EXCL_START
HandleSkipToQueueItem(const int32_t & itemId)2119 void AVSessionItem::HandleSkipToQueueItem(const int32_t& itemId)
2120 {
2121 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSkipToQueueItem");
2122 std::lock_guard callbackLockGuard(callbackLock_);
2123 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2124 callback_->OnSkipToQueueItem(itemId);
2125 }
2126
HandleOnAVCallAnswer(const AVControlCommand & cmd)2127 void AVSessionItem::HandleOnAVCallAnswer(const AVControlCommand& cmd)
2128 {
2129 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallAnswer");
2130 std::lock_guard callbackLockGuard(callbackLock_);
2131 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2132 callback_->OnAVCallAnswer();
2133 }
2134
HandleOnAVCallHangUp(const AVControlCommand & cmd)2135 void AVSessionItem::HandleOnAVCallHangUp(const AVControlCommand& cmd)
2136 {
2137 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallHangUp");
2138 std::lock_guard callbackLockGuard(callbackLock_);
2139 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2140 callback_->OnAVCallHangUp();
2141 }
2142
HandleOnAVCallToggleCallMute(const AVControlCommand & cmd)2143 void AVSessionItem::HandleOnAVCallToggleCallMute(const AVControlCommand& cmd)
2144 {
2145 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallToggleCallMute");
2146 std::lock_guard callbackLockGuard(callbackLock_);
2147 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2148 callback_->OnAVCallToggleCallMute();
2149 }
2150
HandleOnPlay(const AVControlCommand & cmd)2151 void AVSessionItem::HandleOnPlay(const AVControlCommand& cmd)
2152 {
2153 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlay");
2154 std::lock_guard callbackLockGuard(callbackLock_);
2155 if (callbackForMigrate_) {
2156 callbackForMigrate_->OnPlay();
2157 }
2158 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2159 callback_->OnPlay();
2160 }
2161
HandleOnPause(const AVControlCommand & cmd)2162 void AVSessionItem::HandleOnPause(const AVControlCommand& cmd)
2163 {
2164 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPause");
2165 std::lock_guard callbackLockGuard(callbackLock_);
2166 if (callbackForMigrate_) {
2167 callbackForMigrate_->OnPause();
2168 }
2169 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2170 callback_->OnPause();
2171 }
2172
HandleOnPlayOrPause(const AVControlCommand & cmd)2173 void AVSessionItem::HandleOnPlayOrPause(const AVControlCommand& cmd)
2174 {
2175 std::lock_guard lockGuard(avsessionItemLock_);
2176 SLOGI("check current playstate : %{public}d", playbackState_.GetState());
2177 if (playbackState_.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY) {
2178 HandleOnPause(cmd);
2179 } else {
2180 HandleOnPlay(cmd);
2181 }
2182 }
2183
HandleOnStop(const AVControlCommand & cmd)2184 void AVSessionItem::HandleOnStop(const AVControlCommand& cmd)
2185 {
2186 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnStop");
2187 std::lock_guard callbackLockGuard(callbackLock_);
2188 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2189 callback_->OnStop();
2190 }
2191
HandleOnPlayNext(const AVControlCommand & cmd)2192 void AVSessionItem::HandleOnPlayNext(const AVControlCommand& cmd)
2193 {
2194 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayNext");
2195 std::lock_guard callbackLockGuard(callbackLock_);
2196 if (callbackForMigrate_) {
2197 callbackForMigrate_->OnPlayNext();
2198 }
2199 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2200 callback_->OnPlayNext();
2201 }
2202
HandleOnPlayPrevious(const AVControlCommand & cmd)2203 void AVSessionItem::HandleOnPlayPrevious(const AVControlCommand& cmd)
2204 {
2205 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayPrevious");
2206 std::lock_guard callbackLockGuard(callbackLock_);
2207 if (callbackForMigrate_) {
2208 callbackForMigrate_->OnPlayPrevious();
2209 }
2210 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2211 callback_->OnPlayPrevious();
2212 }
2213
HandleOnFastForward(const AVControlCommand & cmd)2214 void AVSessionItem::HandleOnFastForward(const AVControlCommand& cmd)
2215 {
2216 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnFastForward");
2217 std::lock_guard callbackLockGuard(callbackLock_);
2218 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2219 int64_t time = 0;
2220 CHECK_AND_RETURN_LOG(cmd.GetForwardTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
2221 callback_->OnFastForward(time);
2222 }
2223
HandleOnRewind(const AVControlCommand & cmd)2224 void AVSessionItem::HandleOnRewind(const AVControlCommand& cmd)
2225 {
2226 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnRewind");
2227 std::lock_guard callbackLockGuard(callbackLock_);
2228 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2229 int64_t time = 0;
2230 CHECK_AND_RETURN_LOG(cmd.GetRewindTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
2231 callback_->OnRewind(time);
2232 }
2233
HandleOnSeek(const AVControlCommand & cmd)2234 void AVSessionItem::HandleOnSeek(const AVControlCommand& cmd)
2235 {
2236 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSeek");
2237 std::lock_guard callbackLockGuard(callbackLock_);
2238 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2239 int64_t time = 0;
2240 CHECK_AND_RETURN_LOG(cmd.GetSeekTime(time) == AVSESSION_SUCCESS, "GetSeekTime failed");
2241 callback_->OnSeek(time);
2242 }
2243
HandleOnSetSpeed(const AVControlCommand & cmd)2244 void AVSessionItem::HandleOnSetSpeed(const AVControlCommand& cmd)
2245 {
2246 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetSpeed");
2247 std::lock_guard callbackLockGuard(callbackLock_);
2248 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2249 double speed = 0.0;
2250 CHECK_AND_RETURN_LOG(cmd.GetSpeed(speed) == AVSESSION_SUCCESS, "GetSpeed failed");
2251 callback_->OnSetSpeed(speed);
2252 }
2253
HandleOnSetLoopMode(const AVControlCommand & cmd)2254 void AVSessionItem::HandleOnSetLoopMode(const AVControlCommand& cmd)
2255 {
2256 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetLoopMode");
2257 std::lock_guard callbackLockGuard(callbackLock_);
2258 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2259 int32_t loopMode = AVSESSION_ERROR;
2260 CHECK_AND_RETURN_LOG(cmd.GetLoopMode(loopMode) == AVSESSION_SUCCESS, "GetLoopMode failed");
2261 callback_->OnSetLoopMode(loopMode);
2262 }
2263
HandleOnSetTargetLoopMode(const AVControlCommand & cmd)2264 void AVSessionItem::HandleOnSetTargetLoopMode(const AVControlCommand& cmd)
2265 {
2266 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetTargetLoopMode");
2267 std::lock_guard callbackLockGuard(callbackLock_);
2268 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2269 int32_t targetLoopMode = AVSESSION_ERROR;
2270 CHECK_AND_RETURN_LOG(cmd.GetTargetLoopMode(targetLoopMode) == AVSESSION_SUCCESS, "GetTargetLoopMode failed");
2271 callback_->OnSetTargetLoopMode(targetLoopMode);
2272 }
2273
HandleOnToggleFavorite(const AVControlCommand & cmd)2274 void AVSessionItem::HandleOnToggleFavorite(const AVControlCommand& cmd)
2275 {
2276 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnToggleFavorite");
2277 std::lock_guard callbackLockGuard(callbackLock_);
2278 std::string assetId;
2279 CHECK_AND_RETURN_LOG(cmd.GetAssetId(assetId) == AVSESSION_SUCCESS, "GetMediaId failed");
2280 if (callbackForMigrate_) {
2281 callbackForMigrate_->OnToggleFavorite(assetId);
2282 }
2283 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2284 callback_->OnToggleFavorite(assetId);
2285 }
2286
HandleOnPlayFromAssetId(const AVControlCommand & cmd)2287 void AVSessionItem::HandleOnPlayFromAssetId(const AVControlCommand& cmd)
2288 {
2289 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayFromAssetId");
2290 std::lock_guard callbackLockGuard(callbackLock_);
2291 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2292 int64_t assetId = 0;
2293 CHECK_AND_RETURN_LOG(cmd.GetPlayFromAssetId(assetId) == AVSESSION_SUCCESS, "Get playFromAssetId failed");
2294 callback_->OnPlayFromAssetId(assetId);
2295 }
2296
HandleOnPlayWithAssetId(const AVControlCommand & cmd)2297 void AVSessionItem::HandleOnPlayWithAssetId(const AVControlCommand& cmd)
2298 {
2299 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayWithAssetId");
2300 std::lock_guard callbackLockGuard(callbackLock_);
2301 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2302 std::string assetId;
2303 CHECK_AND_RETURN_LOG(cmd.GetPlayWithAssetId(assetId) == AVSESSION_SUCCESS, "Get playWithAssetId failed");
2304 CHECK_AND_RETURN_LOG(!assetId.empty(), "assetId is empty");
2305 callback_->OnPlayWithAssetId(assetId);
2306 }
2307 // LCOV_EXCL_STOP
2308
AddController(pid_t pid,sptr<AVControllerItem> & controller)2309 int32_t AVSessionItem::AddController(pid_t pid, sptr<AVControllerItem>& controller)
2310 {
2311 std::lock_guard controllersLockGuard(controllersLock_);
2312 SLOGI("handle controller newup for pid: %{public}d", static_cast<int>(pid));
2313 controllers_.insert({pid, controller});
2314 return AVSESSION_SUCCESS;
2315 }
2316
SetPid(pid_t pid)2317 void AVSessionItem::SetPid(pid_t pid)
2318 {
2319 descriptor_.pid_ = pid;
2320 }
2321
SetUid(pid_t uid)2322 void AVSessionItem::SetUid(pid_t uid)
2323 {
2324 descriptor_.uid_ = uid;
2325 }
2326
GetPid() const2327 pid_t AVSessionItem::GetPid() const
2328 {
2329 return descriptor_.pid_;
2330 }
2331
GetUid() const2332 pid_t AVSessionItem::GetUid() const
2333 {
2334 return descriptor_.uid_;
2335 }
2336
GetUserId() const2337 int32_t AVSessionItem::GetUserId() const
2338 {
2339 return userId_;
2340 }
2341
GetAbilityName() const2342 std::string AVSessionItem::GetAbilityName() const
2343 {
2344 return descriptor_.elementName_.GetAbilityName();
2345 }
2346
2347 // LCOV_EXCL_START
GetBundleName() const2348 std::string AVSessionItem::GetBundleName() const
2349 {
2350 return descriptor_.elementName_.GetBundleName();
2351 }
2352 // LCOV_EXCL_STOP
2353
SetTop(bool top)2354 void AVSessionItem::SetTop(bool top)
2355 {
2356 descriptor_.isTopSession_ = top;
2357 }
2358
GetRemoteSource()2359 std::shared_ptr<RemoteSessionSource> AVSessionItem::GetRemoteSource()
2360 {
2361 return remoteSource_;
2362 }
2363
SetPlayingTime(int64_t playingTime)2364 void AVSessionItem::SetPlayingTime(int64_t playingTime)
2365 {
2366 playingTime_ = playingTime;
2367 }
2368
GetPlayingTime() const2369 int64_t AVSessionItem::GetPlayingTime() const
2370 {
2371 return playingTime_;
2372 }
2373
HandleControllerRelease(pid_t pid)2374 void AVSessionItem::HandleControllerRelease(pid_t pid)
2375 {
2376 std::lock_guard controllersLockGuard(controllersLock_);
2377 SLOGI("handle controller release for pid: %{public}d", static_cast<int>(pid));
2378 controllers_.erase(pid);
2379 }
2380
SetServiceCallbackForRelease(const std::function<void (AVSessionItem &)> & callback)2381 void AVSessionItem::SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback)
2382 {
2383 SLOGI("SetServiceCallbackForRelease in");
2384 serviceCallback_ = callback;
2385 }
2386
SetServiceCallbackForAVQueueInfo(const std::function<void (AVSessionItem &)> & callback)2387 void AVSessionItem::SetServiceCallbackForAVQueueInfo(const std::function<void(AVSessionItem&)>& callback)
2388 {
2389 SLOGI("SetServiceCallbackForAVQueueInfo in");
2390 serviceCallbackForAddAVQueueInfo_ = callback;
2391 }
2392
SetServiceCallbackForCallStart(const std::function<void (AVSessionItem &)> & callback)2393 void AVSessionItem::SetServiceCallbackForCallStart(const std::function<void(AVSessionItem&)>& callback)
2394 {
2395 SLOGI("SetServiceCallbackForCallStart in");
2396 callStartCallback_ = callback;
2397 }
2398
SetServiceCallbackForUpdateSession(const std::function<void (std::string,bool)> & callback)2399 void AVSessionItem::SetServiceCallbackForUpdateSession(const std::function<void(std::string, bool)>& callback)
2400 {
2401 SLOGI("SetServiceCallbackForUpdateSession in");
2402 serviceCallbackForUpdateSession_ = callback;
2403 }
2404
SetServiceCallbackForMediaSession(const std::function<void (std::string,bool,bool)> & callback)2405 void AVSessionItem::SetServiceCallbackForMediaSession(const std::function<void(std::string, bool, bool)>& callback)
2406 {
2407 SLOGI("SetServiceCallbackForUpdateSession in");
2408 std::lock_guard mediaSessionLockGuard(mediaSessionCallbackLock_);
2409 serviceCallbackForMediaSession_ = callback;
2410 }
2411
SetServiceCallbackForKeyEvent(const std::function<void (std::string)> & callback)2412 void AVSessionItem::SetServiceCallbackForKeyEvent(const std::function<void(std::string)>& callback)
2413 {
2414 SLOGI("SetServiceCallbackForKeyEvent in");
2415 serviceCallbackForKeyEvent_ = callback;
2416 }
2417
SetServiceCallbackForNtfCapsule(const std::function<void (std::string,bool)> & callback)2418 void AVSessionItem::SetServiceCallbackForNtfCapsule(const std::function<void(std::string, bool)>& callback)
2419 {
2420 SLOGI("SetServiceCallbackForNtfCapsule in");
2421 serviceCallbackForNtf_ = callback;
2422 }
2423
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)2424 void AVSessionItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
2425 {
2426 SLOGI("output device change, connection state is %{public}d", connectionState);
2427 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnOutputDeviceChange");
2428 std::lock_guard callbackLockGuard(callbackLock_);
2429 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2430 callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
2431 }
2432
SetOutputDevice(const OutputDeviceInfo & info)2433 void AVSessionItem::SetOutputDevice(const OutputDeviceInfo& info)
2434 {
2435 descriptor_.outputDeviceInfo_ = info;
2436 int32_t connectionStateConnected = 1;
2437 HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
2438 std::lock_guard controllersLockGuard(controllersLock_);
2439 CHECK_AND_RETURN_LOG(controllers_.size() > 0, "handle with no controller, return");
2440 for (const auto& controller : controllers_) {
2441 if (controller.second != nullptr) {
2442 (controller.second)->HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
2443 }
2444 }
2445 SLOGI("OutputDeviceInfo device size is %{public}d", static_cast<int32_t>(info.deviceInfos_.size()));
2446 }
2447
2448 // LCOV_EXCL_START
GetOutputDevice(OutputDeviceInfo & info)2449 void AVSessionItem::GetOutputDevice(OutputDeviceInfo& info)
2450 {
2451 info = GetDescriptor().outputDeviceInfo_;
2452 }
2453
CastAudioToRemote(const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)2454 int32_t AVSessionItem::CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice,
2455 const std::string& sinkCapability)
2456 {
2457 SLOGI("start cast audio to remote");
2458 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
2459 remoteSource_ = std::make_shared<RemoteSessionSourceProxy>();
2460 CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
2461 int32_t ret = remoteSource_->CastSessionToRemote(this, sourceDevice, sinkDevice, sinkCapability);
2462 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionToRemote failed");
2463 ret = remoteSource_->SetAVMetaData(GetMetaData());
2464 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
2465 ret = remoteSource_->SetAVPlaybackState(GetPlaybackState());
2466 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVPlaybackState failed");
2467 return AVSESSION_SUCCESS;
2468 }
2469
SourceCancelCastAudio(const std::string & sinkDevice)2470 int32_t AVSessionItem::SourceCancelCastAudio(const std::string& sinkDevice)
2471 {
2472 SLOGI("start cancel cast audio");
2473 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
2474 CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
2475 int32_t ret = remoteSource_->CancelCastAudio(sinkDevice);
2476 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToLocal failed");
2477 return AVSESSION_SUCCESS;
2478 }
2479
CastAudioFromRemote(const std::string & sourceSessionId,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sourceCapability)2480 int32_t AVSessionItem::CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice,
2481 const std::string& sinkDevice, const std::string& sourceCapability)
2482 {
2483 SLOGI("start cast audio from remote");
2484 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2485 remoteSink_ = std::make_shared<RemoteSessionSinkProxy>();
2486 CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
2487 int32_t ret = remoteSink_->CastSessionFromRemote(this, sourceSessionId, sourceDevice, sinkDevice,
2488 sourceCapability);
2489 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionFromRemote failed");
2490
2491 OutputDeviceInfo outputDeviceInfo;
2492 GetOutputDevice(outputDeviceInfo);
2493 int32_t castCategoryStreaming = ProtocolType::TYPE_CAST_PLUS_STREAM;
2494 for (size_t i = 0; i < outputDeviceInfo.deviceInfos_.size(); i++) {
2495 outputDeviceInfo.deviceInfos_[i].castCategory_ = castCategoryStreaming;
2496 }
2497 SetOutputDevice(outputDeviceInfo);
2498
2499 CHECK_AND_RETURN_RET_LOG(Activate() == AVSESSION_SUCCESS, AVSESSION_ERROR, "Activate failed");
2500
2501 std::vector<std::vector<int32_t>> value(SESSION_DATA_CATEGORY_MAX);
2502 ret = JsonUtils::GetVectorCapability(sourceCapability, value);
2503 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetVectorCapability error");
2504 for (auto cmd : value[SESSION_DATA_CONTROL_COMMAND]) {
2505 ret = AddSupportCommand(cmd);
2506 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "AddSupportCommand failed");
2507 }
2508 return AVSESSION_SUCCESS;
2509 }
2510
SinkCancelCastAudio()2511 int32_t AVSessionItem::SinkCancelCastAudio()
2512 {
2513 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2514 CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
2515 int32_t ret = remoteSink_->CancelCastSession();
2516 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastSession failed");
2517 GetDescriptor().outputDeviceInfo_.deviceInfos_.clear();
2518 DeviceInfo deviceInfo;
2519 GetDescriptor().outputDeviceInfo_.deviceInfos_.emplace_back(deviceInfo);
2520 SLOGI("SinkCancelCastAudio");
2521 return AVSESSION_SUCCESS;
2522 }
2523
2524 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
UpdateCastDeviceMap(DeviceInfo deviceInfo)2525 void AVSessionItem::UpdateCastDeviceMap(DeviceInfo deviceInfo)
2526 {
2527 SLOGI("UpdateCastDeviceMap with id: %{public}s", deviceInfo.deviceId_.c_str());
2528 castDeviceInfoMap_[deviceInfo.deviceId_] = deviceInfo;
2529
2530 if (descriptor_.outputDeviceInfo_.deviceInfos_.size() > 0 &&
2531 descriptor_.outputDeviceInfo_.deviceInfos_[0].deviceId_ == deviceInfo.deviceId_) {
2532 OutputDeviceInfo outputDeviceInfo;
2533 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
2534 descriptor_.outputDeviceInfo_ = outputDeviceInfo;
2535 }
2536 }
2537
2538 #endif
2539
ReportConnectFinish(const std::string func,const DeviceInfo & deviceInfo)2540 void AVSessionItem::ReportConnectFinish(const std::string func, const DeviceInfo &deviceInfo)
2541 {
2542 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2543 AVSessionRadarInfo info(func);
2544 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
2545 DeviceInfo cacheDeviceInfo = castDeviceInfoMap_[deviceInfo.deviceId_];
2546 AVSessionRadar::GetInstance().ConnectFinish(cacheDeviceInfo, info);
2547 } else {
2548 AVSessionRadar::GetInstance().ConnectFinish(deviceInfo, info);
2549 }
2550 #endif
2551 }
2552
ReportStopCastFinish(const std::string func,const DeviceInfo & deviceInfo)2553 void AVSessionItem::ReportStopCastFinish(const std::string func, const DeviceInfo &deviceInfo)
2554 {
2555 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2556 AVSessionRadarInfo info(func);
2557 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
2558 DeviceInfo cacheDeviceInfo = castDeviceInfoMap_[deviceInfo.deviceId_];
2559 AVSessionRadar::GetInstance().StopCastFinish(cacheDeviceInfo, info);
2560 } else {
2561 AVSessionRadar::GetInstance().StopCastFinish(deviceInfo, info);
2562 }
2563 #endif
2564 }
2565
SaveLocalDeviceInfo()2566 void AVSessionItem::SaveLocalDeviceInfo()
2567 {
2568 OutputDeviceInfo localDevice;
2569 DeviceInfo localInfo;
2570 localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
2571 localInfo.deviceId_ = "0";
2572 localInfo.deviceName_ = "LocalDevice";
2573 localDevice.deviceInfos_.emplace_back(localInfo);
2574 descriptor_.outputDeviceInfo_ = localDevice;
2575 }
2576
DoContinuousTaskRegister()2577 int32_t AVSessionItem::DoContinuousTaskRegister()
2578 {
2579 #ifdef EFFICIENCY_MANAGER_ENABLE
2580 if (descriptor_.sessionTag_ == "RemoteCast") {
2581 SLOGI("sink session no need to register continuousTask");
2582 return AVSESSION_SUCCESS;
2583 }
2584 int32_t uid = GetUid();
2585 int32_t pid = GetPid();
2586 std::string bundleName = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
2587 CHECK_AND_RETURN_RET_LOG(bundleName != "", AVSESSION_ERROR, "GetBundleNameFromUid failed");
2588
2589 void *handle_ = dlopen("libsuspend_manager_client.z.so", RTLD_NOW);
2590 if (handle_ == nullptr) {
2591 SLOGE("failed to open library libsuspend_manager_client reaseon %{public}s", dlerror());
2592 return AVSESSION_ERROR;
2593 }
2594 typedef ErrCode (*handler) (int32_t eventType, int32_t uid, int32_t pid,
2595 const std::string bundleName, int32_t taskState, int32_t serviceId);
2596 handler reportContinuousTaskEventEx = reinterpret_cast<handler>(dlsym(handle_, "ReportContinuousTaskEventEx"));
2597 ErrCode errCode = reportContinuousTaskEventEx(0, uid, pid, bundleName, 1, AVSESSION_SERVICE_ID);
2598 SLOGI("reportContinuousTaskEventEx done, result: %{public}d", errCode);
2599 #ifndef TEST_COVERAGE
2600 if (handle_ != nullptr) {
2601 OPENSSL_thread_stop();
2602 }
2603 dlclose(handle_);
2604 #endif
2605 #endif
2606 return AVSESSION_SUCCESS;
2607 }
2608
DoContinuousTaskUnregister()2609 int32_t AVSessionItem::DoContinuousTaskUnregister()
2610 {
2611 #ifdef EFFICIENCY_MANAGER_ENABLE
2612 if (descriptor_.sessionTag_ == "RemoteCast") {
2613 SLOGI("sink session should not unregister ContinuousTask");
2614 return AVSESSION_SUCCESS;
2615 }
2616 int32_t uid = GetUid();
2617 int32_t pid = GetPid();
2618 std::string bundleName = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
2619 CHECK_AND_RETURN_RET_LOG(bundleName != "", AVSESSION_ERROR, "GetBundleNameFromUid failed");
2620
2621 void *handle_ = dlopen("libsuspend_manager_client.z.so", RTLD_NOW);
2622 if (handle_ == nullptr) {
2623 SLOGE("failed to open library libsuspend_manager_client when stop cast, reaseon %{public}s", dlerror());
2624 return AVSESSION_ERROR;
2625 }
2626 typedef ErrCode (*handler) (int32_t eventType, int32_t uid, int32_t pid,
2627 const std::string bundleName, int32_t taskState, int32_t serviceId);
2628 handler reportContinuousTaskEventEx = reinterpret_cast<handler>(dlsym(handle_, "ReportContinuousTaskEventEx"));
2629 ErrCode errCode = reportContinuousTaskEventEx(0, uid, pid, bundleName, 2, AVSESSION_SERVICE_ID);
2630 SLOGI("reportContinuousTaskEventEx done when stop cast, result: %{public}d", errCode);
2631 #ifndef TEST_COVERAGE
2632 if (handle_ != nullptr) {
2633 OPENSSL_thread_stop();
2634 }
2635 dlclose(handle_);
2636 #endif
2637 #endif
2638 return AVSESSION_SUCCESS;
2639 }
2640
IsCasting()2641 bool AVSessionItem::IsCasting()
2642 {
2643 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2644 if (descriptor_.sessionTag_ != "RemoteCast" && castHandle_ > 0) {
2645 return true;
2646 }
2647 #endif
2648 return false;
2649 }
2650
GetCurrentCastItem(AVQueueItem & currentItem)2651 void AVSessionItem::GetCurrentCastItem(AVQueueItem& currentItem)
2652 {
2653 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2654 CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "cast controller proxy is nullptr");
2655 currentItem = castControllerProxy_->GetCurrentItem();
2656 #endif
2657 return;
2658 }
2659
GetCastAVPlaybackState()2660 AVPlaybackState AVSessionItem::GetCastAVPlaybackState()
2661 {
2662 AVPlaybackState playbackState;
2663 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2664 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, playbackState, "cast controller proxy is nullptr");
2665 auto ret = castControllerProxy_->GetCastAVPlaybackState(playbackState);
2666 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, playbackState, "getstate error");
2667 #endif
2668 return playbackState;
2669 }
2670
SendControlCommandToCast(AVCastControlCommand cmd)2671 void AVSessionItem::SendControlCommandToCast(AVCastControlCommand cmd)
2672 {
2673 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2674 CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "cast controller proxy is nullptr");
2675 castControllerProxy_->SendControlCommand(cmd);
2676 #endif
2677 }
2678
2679 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
ReportPlaybackState(const AVPlaybackState & state)2680 void AVSessionItem::ReportPlaybackState(const AVPlaybackState& state)
2681 {
2682 if (state.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY ||
2683 state.GetState() == AVPlaybackState::PLAYBACK_STATE_PAUSE) {
2684 AVSessionSysEvent::GetInstance().UpdatePlaybackState(GetBundleName(),
2685 static_cast<uint8_t>(state.GetState()));
2686 }
2687 }
2688
ReportMetadataChange(const AVMetaData & metadata)2689 void AVSessionItem::ReportMetadataChange(const AVMetaData& metadata)
2690 {
2691 if ((metadata.GetTitle().compare(lastMetaData_.GetTitle()) != 0) ||
2692 (metadata.GetMediaImageUri().compare(lastMetaData_.GetMediaImageUri()) != 0)) {
2693 lastMetaData_ = metadata;
2694 bool hasTitle = !metadata.GetTitle().empty();
2695 bool hasImage = metadata.GetMediaImage() != nullptr || !metadata.GetMediaImageUri().empty();
2696 MetadataQuality metadataQuality;
2697 if (!hasTitle && !hasImage) {
2698 metadataQuality = MetadataQuality::METADATA_QUALITY_NONE;
2699 } else if (hasTitle && hasImage) {
2700 metadataQuality = MetadataQuality::METADATA_QUALITY_BOTH;
2701 } else if (hasImage) {
2702 metadataQuality = MetadataQuality::METADATA_QUALITY_IMG;
2703 } else {
2704 metadataQuality = MetadataQuality::METADATA_QUALITY_TITLE;
2705 }
2706 AVSessionSysEvent::GetInstance().UpdateMetaQuality(GetBundleName(), metadataQuality);
2707 }
2708 }
2709
ReportCommandChange()2710 void AVSessionItem::ReportCommandChange()
2711 {
2712 int32_t commandQuality = 0;
2713 for (auto cmd : GetSupportCommand()) {
2714 auto it = g_cmdToOffsetMap.find(cmd);
2715 if (it != g_cmdToOffsetMap.end()) {
2716 commandQuality += (1 << it->second);
2717 }
2718 }
2719 AVSessionSysEvent::GetInstance().UpdateCommandQuality(GetBundleName(), commandQuality);
2720 }
2721
ReportSessionControl(const std::string & bundleName,int32_t cmd)2722 void AVSessionItem::ReportSessionControl(const std::string& bundleName, int32_t cmd)
2723 {
2724 if (cmd == AVControlCommand::SESSION_CMD_PLAY ||
2725 cmd == AVControlCommand::SESSION_CMD_PAUSE ||
2726 cmd == CONTROL_COLD_START) {
2727 AVSessionSysEvent::GetInstance().UpdateControl(bundleName, cmd,
2728 BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()));
2729 }
2730 }
2731 #endif
2732 // LCOV_EXCL_STOP
2733 } // namespace OHOS::AVSession
2734