• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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