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