• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "audio_device_manager.h"
17 #include "avsession_service.h"
18 
19 #include "migrate_avsession_manager.h"
20 
21 namespace OHOS::AVSession {
SuperLauncher(std::string deviceId,std::string serviceName,std::string extraInfo,const std::string & state)22 void AVSessionService::SuperLauncher(std::string deviceId, std::string serviceName,
23     std::string extraInfo, const std::string& state)
24 {
25     SLOGI("SuperLauncher serviceName: %{public}s, state: %{public}s", serviceName.c_str(), state.c_str());
26 
27     if (serviceName == "SuperLauncher-Dual") {
28         if (state == "IDLE") {
29             ReleaseSuperLauncher(serviceName);
30         } else if (state == "CONNECTING") {
31             ConnectSuperLauncher(deviceId, serviceName);
32         } else if (state == "CONNECT_SUCC") {
33             SucceedSuperLauncher(deviceId, extraInfo);
34         }
35     }
36 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
37     if ((serviceName == "HuaweiCast" || serviceName == "HuaweiCast-Dual") &&
38         (state == "IDLE" || state == "CONNECT_SUCC")) {
39         castserviceNameStatePair_ = std::make_pair(serviceName, state);
40         isSupportMirrorToStream_ = false;
41         castDeviceId_ = "0";
42         castDeviceName_ = " ";
43         castDeviceType_ = 0;
44         std::string info;
45         std::string::size_type beginPos = 0;
46         std::string::size_type endPos = extraInfo.find(seperator);
47         while (endPos != std::string::npos) {
48             info = extraInfo.substr(beginPos, endPos - beginPos);
49             beginPos = endPos + seperator.size();
50             endPos = extraInfo.find(seperator, beginPos);
51             SplitExtraInfo(info);
52         }
53         if (beginPos != extraInfo.length()) {
54             info = extraInfo.substr(beginPos);
55             SplitExtraInfo(info);
56         }
57         NotifyMirrorToStreamCast();
58         int32_t sessionSize = static_cast<int32_t>(GetUsersManager().GetContainerFromAll().GetAllSessions().size());
59         if ((sessionSize == 0 || (sessionSize == 1 && CheckAncoAudio())) && !is2in1_ && state == "IDLE") {
60             SLOGI("call disable cast for cast idle");
61             checkEnableCast(false);
62         }
63     }
64 #endif
65 }
66 
ReleaseSuperLauncher(std::string serviceName)67 void AVSessionService::ReleaseSuperLauncher(std::string serviceName)
68 {
69     MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(serviceName);
70     if (migrateAVSession_ != nullptr) {
71         RemoveInnerSessionListener(migrateAVSession_.get());
72         RemoveHistoricalRecordListener(migrateAVSession_.get());
73     }
74 }
75 
ConnectSuperLauncher(std::string deviceId,std::string serviceName)76 void AVSessionService::ConnectSuperLauncher(std::string deviceId, std::string serviceName)
77 {
78     if (migrateAVSession_ == nullptr) {
79         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
80     }
81     migrateAVSession_->Init(this);
82     MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(serviceName, migrateAVSession_);
83     AddInnerSessionListener(migrateAVSession_.get());
84     AddHistoricalRecordListener(migrateAVSession_.get());
85     AudioDeviceManager::GetInstance().InitAudioStateCallback(migrateAVSession_, deviceId);
86 }
87 
SucceedSuperLauncher(std::string deviceId,std::string extraInfo)88 void AVSessionService::SucceedSuperLauncher(std::string deviceId, std::string extraInfo)
89 {
90     if (migrateAVSession_ == nullptr) {
91         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
92     }
93     migrateAVSession_->ResetSupportCrossMediaPlay(extraInfo);
94     migrateAVSession_->SendRemoteHistorySessionList(deviceId);
95 }
96 
NotifyMigrateStop(const std::string & deviceId)97 void AVSessionService::NotifyMigrateStop(const std::string &deviceId)
98 {
99     if (migrateAVSession_ == nullptr) {
100         SLOGI("NotifyMigrateStop without migrate, create new");
101         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
102     }
103     std::lock_guard lockGuard(sessionServiceLock_);
104     migrateAVSession_->StopObserveControllerChanged(deviceId);
105     AudioDeviceManager::GetInstance().UnInitAudioStateCallback();
106 }
107 
108 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
SplitExtraInfo(std::string info)109 void AVSessionService::SplitExtraInfo(std::string info)
110 {
111     if (info.find("SUPPORT_MIRROR_TO_STREAM") != std::string::npos && info.find("true") != std::string::npos) {
112         isSupportMirrorToStream_ = true;
113     }
114     if (info.find("deviceId") != std::string::npos && info.find(":") != std::string::npos) {
115         std::string::size_type idBeginPos = info.find(":");
116         castDeviceId_ = info.substr(idBeginPos + beginAddPos,
117             info.length() -idBeginPos - endDecPos); // "deviceId" : "xxxx"
118     }
119     if (info.find("deviceName") != std::string::npos && info.find(":") != std::string::npos) {
120         std::string::size_type nameBeginPos = info.find(":");
121         castDeviceName_ = info.substr(nameBeginPos + beginAddPos,
122             info.length() - nameBeginPos - endDecPos); // "deviceName" : "xxxx"
123     }
124     if (info.find("deviceType") != std::string::npos && info.find(":") != std::string::npos) {
125         std::string::size_type typeBeginPos = info.find(":");
126         std::string tmpType = info.substr(typeBeginPos + typeAddPos, info.length()); // "deviceType" : xxx
127         castDeviceType_ = atoi(tmpType.c_str());
128     }
129 }
130 #endif
131 
AddInnerSessionListener(SessionListener * listener)132 void AVSessionService::AddInnerSessionListener(SessionListener *listener)
133 {
134     std::lock_guard lockGuard(sessionListenersLock_);
135     innerSessionListeners_.push_back(listener);
136 }
137 
RemoveInnerSessionListener(SessionListener * listener)138 void AVSessionService::RemoveInnerSessionListener(SessionListener *listener)
139 {
140     std::lock_guard lockGuard(sessionListenersLock_);
141     for (auto it = innerSessionListeners_.begin(); it != innerSessionListeners_.end();) {
142         if (*it == listener) {
143             SLOGI("RemoveInnerSessionListener");
144             it = innerSessionListeners_.erase(it);
145         } else {
146             it++;
147         }
148     }
149 }
150 
AddHistoricalRecordListener(HistoricalRecordListener * listener)151 void AVSessionService::AddHistoricalRecordListener(HistoricalRecordListener *listener)
152 {
153     std::lock_guard lockGuard(historicalRecordListenersLock_);
154     historicalRecordListeners_.push_back(listener);
155 }
156 
RemoveHistoricalRecordListener(HistoricalRecordListener * listener)157 void AVSessionService::RemoveHistoricalRecordListener(HistoricalRecordListener *listener)
158 {
159     std::lock_guard lockGuard(historicalRecordListenersLock_);
160     for (auto it = historicalRecordListeners_.begin(); it != historicalRecordListeners_.end();) {
161         if (*it == listener) {
162             SLOGI("RemoveHistoricalRecordListener");
163             it = historicalRecordListeners_.erase(it);
164         } else {
165             it++;
166         }
167     }
168 }
169 
NotifyHistoricalRecordChange(const std::string & bundleName,int32_t userId)170 void AVSessionService::NotifyHistoricalRecordChange(const std::string& bundleName, int32_t userId)
171 {
172     std::lock_guard lockGuard(historicalRecordListenersLock_);
173     for (const auto& listener : historicalRecordListeners_) {
174         if (listener != nullptr) {
175             listener->OnHistoricalRecordChange();
176         }
177     }
178 }
179 
180 // LCOV_EXCL_START
HandleAppStateChange(int uid,int state)181 void AVSessionService::HandleAppStateChange(int uid, int state)
182 {
183 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
184     SLOGD("uid = %{public}d, state = %{public}d", uid, state);
185     if (topSession_ != nullptr && topSession_->GetUid() == uid) {
186         if (state == appState) {
187             return;
188         }
189         if (state == static_cast<int>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND)) {
190             SLOGI("enter notifyMirrorToStreamCast by background to foreground state change, and counts = 2");
191             MirrorToStreamCast(topSession_);
192         }
193         appState = state;
194     }
195 #endif //CASTPLUS_CAST_ENGINE_ENABLE
196 }
197 // LCOV_EXCL_STOP
198 
199 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastControllerInner(const std::string & sessionId,sptr<IRemoteObject> & object)200 int32_t AVSessionService::GetAVCastControllerInner(const std::string& sessionId, sptr<IRemoteObject>& object)
201 {
202     SLOGI("Start get cast controller with pid %{public}d", static_cast<int>(GetCallingPid()));
203     auto session = GetContainer().GetSessionById(sessionId);
204     CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "StopCast: session is not exist");
205     auto result = session->GetAVCastControllerInner();
206     CHECK_AND_RETURN_RET_LOG(result != nullptr, AVSESSION_ERROR, "GetAVCastControllerInner failed");
207     object = result;
208     return AVSESSION_SUCCESS;
209 }
210 
checkEnableCast(bool enable)211 int32_t AVSessionService::checkEnableCast(bool enable)
212 {
213     std::lock_guard lockGuard(checkEnableCastLock_);
214     SLOGI("checkEnableCast enable:%{public}d, isInCast:%{public}d", enable, isInCast_);
215     if (enable == true && isInCast_ == false) {
216         isInCast_ = AVRouter::GetInstance().Init(this) == AVSESSION_SUCCESS ? true : false;
217     } else if (enable == false && isInCast_ == true) {
218         CHECK_AND_RETURN_RET_LOG(!((GetContainer().GetAllSessions().size() > 1 ||
219             (GetContainer().GetAllSessions().size() == 1 && !CheckAncoAudio())) && !is2in1_),
220             AVSESSION_SUCCESS, "can not release cast with session alive");
221         CHECK_AND_RETURN_RET_LOG(castserviceNameStatePair_.second != deviceStateConnection,
222             AVSESSION_SUCCESS, "can not release cast with casting");
223         isInCast_ = AVRouter::GetInstance().Release();
224     } else {
225         SLOGD("AVRouter Init in nothing change");
226     }
227     return AVSESSION_SUCCESS;
228 }
229 
setInCast(bool isInCast)230 void AVSessionService::setInCast(bool isInCast)
231 {
232     SLOGI("setInCast, isInCast:%{public}d", isInCast);
233     isInCast_ = isInCast;
234 }
235 
236 // LCOV_EXCL_START
ReleaseCastSession()237 void AVSessionService::ReleaseCastSession()
238 {
239     std::lock_guard lockGuard(sessionServiceLock_);
240     SLOGI("Start release cast session");
241     for (const auto& session : GetContainer().GetAllSessions()) {
242         if (session != nullptr && session->GetDescriptor().sessionTag_ == "RemoteCast") {
243             std::string sessionId = session->GetDescriptor().sessionId_;
244             SLOGI("Already has a cast session %{public}s", AVSessionUtils::GetAnonySessionId(sessionId).c_str());
245             session->UnRegisterDeviceStateCallback();
246             session->StopCastSession();
247             session->ReleaseAVCastControllerInner();
248             HandleSessionRelease(sessionId);
249         }
250     }
251 }
252 // LCOV_EXCL_STOP
253 
254 // LCOV_EXCL_START
CreateSessionByCast(const int64_t castHandle)255 void AVSessionService::CreateSessionByCast(const int64_t castHandle)
256 {
257     SLOGI("AVSessionService CreateSessionByCast in");
258     AVSessionRadarInfo info("AVSessionService::CreateSessionByCast");
259     AVSessionRadar::GetInstance().StartConnect(info);
260     AppExecFwk::ElementName elementName;
261     elementName.SetBundleName("castBundleName");
262     elementName.SetAbilityName("castAbilityName");
263     sptr<AVSessionItem> sinkSession;
264     auto res = CreateSessionInner("RemoteCast", AVSession::SESSION_TYPE_AUDIO, false, elementName, sinkSession);
265     CHECK_AND_RETURN_LOG(res == AVSESSION_SUCCESS, "CreateSession at sink failed");
266     SLOGI("Create Cast sink sessionId %{public}s",
267         AVSessionUtils::GetAnonySessionId(sinkSession->GetSessionId()).c_str());
268     sinkSession->SetCastHandle(castHandle);
269     sinkSession->RegisterDeviceStateCallback();
270 
271     {
272         std::lock_guard frontLockGuard(sessionFrontLock_);
273         std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront =
274             GetUsersManager().GetCurSessionListForFront(0);
275         CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "sessionListForFront ptr nullptr!");
276         auto it = std::find(sessionListForFront->begin(), sessionListForFront->end(), sinkSession);
277         if (it == sessionListForFront->end()) {
278             SLOGI(" front session add cast session");
279             sessionListForFront->push_front(sinkSession);
280         }
281     }
282 
283     HISYSEVENT_BEHAVIOR("SESSION_CAST",
284         "BUNDLE_NAME", "castBundleName",
285         "ABILITY_NAME", "castAbilityName",
286         "SESSION_PID", sinkSession->GetDescriptor().pid_,
287         "SESSION_UID", sinkSession->GetDescriptor().uid_,
288         "SESSION_ID", sinkSession->GetDescriptor().sessionId_,
289         "SESSION_TAG", sinkSession->GetDescriptor().sessionTag_,
290         "SESSION_TYPE", sinkSession->GetDescriptor().sessionType_,
291         "DETAILED_MSG", "session create from cast+ callback");
292 }
293 // LCOV_EXCL_STOP
294 
295 // LCOV_EXCL_START
NotifyDeviceAvailable(const OutputDeviceInfo & castOutputDeviceInfo)296 void AVSessionService::NotifyDeviceAvailable(const OutputDeviceInfo& castOutputDeviceInfo)
297 {
298     AVSessionRadarInfo info("AVSessionService::NotifyDeviceAvailable");
299     AVSessionRadar::GetInstance().CastDeviceAvailable(castOutputDeviceInfo, info);
300 
301     for (DeviceInfo deviceInfo : castOutputDeviceInfo.deviceInfos_) {
302         for (const auto& session : GetContainer().GetAllSessions()) {
303             session->UpdateCastDeviceMap(deviceInfo);
304         }
305     }
306     std::lock_guard lockGuard(sessionListenersLock_);
307     for (const auto& listener : innerSessionListeners_) {
308         listener->OnDeviceAvailable(castOutputDeviceInfo);
309     }
310     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
311     for (const auto& [pid, listener] : listenerMap) {
312         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
313         listener->OnDeviceAvailable(castOutputDeviceInfo);
314     }
315     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
316     for (const auto& [pid, listener] : listenerMapForAll) {
317         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
318         listener->OnDeviceAvailable(castOutputDeviceInfo);
319     }
320 }
321 // LCOV_EXCL_STOP
322 
NotifyDeviceLogEvent(const DeviceLogEventCode eventId,const int64_t param)323 void AVSessionService::NotifyDeviceLogEvent(const DeviceLogEventCode eventId, const int64_t param)
324 {
325     std::lock_guard lockGuard(sessionListenersLock_);
326     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
327     for (const auto& [pid, listener] : listenerMap) {
328         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
329         listener->OnDeviceLogEvent(eventId, param);
330     }
331     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
332     for (const auto& [pid, listener] : listenerMapForAll) {
333         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
334         listener->OnDeviceLogEvent(eventId, param);
335     }
336 }
337 
338 // LCOV_EXCL_START
NotifyDeviceOffline(const std::string & deviceId)339 void AVSessionService::NotifyDeviceOffline(const std::string& deviceId)
340 {
341     std::lock_guard lockGuard(sessionListenersLock_);
342     for (const auto& listener : innerSessionListeners_) {
343         listener->OnDeviceOffline(deviceId);
344     }
345     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
346     for (const auto& [pid, listener] : listenerMap) {
347         SLOGI("notify device offline with pid %{public}d", static_cast<int>(pid));
348         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
349         listener->OnDeviceOffline(deviceId);
350     }
351     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
352     for (const auto& [pid, listener] : listenerMapForAll) {
353         SLOGI("notify device offline with pid %{public}d across users", static_cast<int>(pid));
354         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
355         listener->OnDeviceOffline(deviceId);
356     }
357 }
358 // LCOV_EXCL_STOP
359 
StartCast(const SessionToken & sessionToken,const OutputDeviceInfo & outputDeviceInfo)360 int32_t AVSessionService::StartCast(const SessionToken& sessionToken, const OutputDeviceInfo& outputDeviceInfo)
361 {
362     SLOGI("SessionId is %{public}s", AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
363     sptr<AVSessionItem> session = GetContainer().GetSessionById(sessionToken.sessionId);
364     CHECK_AND_RETURN_RET_LOG(session != nullptr, ERR_SESSION_NOT_EXIST, "session %{public}s not exist",
365         AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
366     ReportStartCastBegin("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_);
367     int32_t ret = session->StartCast(outputDeviceInfo);
368     ReportStartCastEnd("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_, ret);
369     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "StartCast failed");
370     SLOGD("StartCast set isSourceInCast");
371 
372     SLOGI("no set continuous task in service");
373     HISYSEVENT_BEHAVIOR("SESSION_CAST",
374         "BUNDLE_NAME", session->GetDescriptor().elementName_.GetBundleName(),
375         "MODULE_NAME", session->GetDescriptor().elementName_.GetModuleName(),
376         "ABILITY_NAME", session->GetDescriptor().elementName_.GetAbilityName(),
377         "SESSION_PID", session->GetDescriptor().pid_, "SESSION_UID", session->GetDescriptor().uid_,
378         "SESSION_ID", session->GetDescriptor().sessionId_, "SESSION_TAG", session->GetDescriptor().sessionTag_,
379         "SESSION_TYPE", session->GetDescriptor().sessionType_, "DETAILED_MSG", "start cast session");
380     return AVSESSION_SUCCESS;
381 }
382 
StopCast(const SessionToken & sessionToken)383 int32_t AVSessionService::StopCast(const SessionToken& sessionToken)
384 {
385     sptr<AVSessionItem> session = GetUsersManager().GetContainerFromAll().GetSessionById(sessionToken.sessionId);
386     CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_SUCCESS, "StopCast: session is not exist");
387     CHECK_AND_RETURN_RET_LOG(session->StopCast() == AVSESSION_SUCCESS, AVSESSION_ERROR, "StopCast failed");
388     if (session->GetDescriptor().sessionTag_ == "RemoteCast") {
389         SLOGI("Stop cast at sink, start destroy sink avsession task");
390         HandleSessionRelease(sessionToken.sessionId);
391         return AVSESSION_SUCCESS;
392     }
393 
394     SLOGI("no set continuous task in service");
395     return AVSESSION_SUCCESS;
396 }
397 
NotifyMirrorToStreamCast()398 void AVSessionService::NotifyMirrorToStreamCast()
399 {
400     for (auto& session : GetContainer().GetAllSessions()) {
401         if (session && topSession_ && (session.GetRefPtr() == topSession_.GetRefPtr())) {
402             MirrorToStreamCast(session);
403         }
404     }
405     if (castserviceNameStatePair_.second == deviceStateDisconnection) {
406         DeviceInfo localDeviceInfo;
407         AVRouter::GetInstance().SetServiceAllConnectState(-1, localDeviceInfo);
408     }
409 }
410 
IsMirrorToStreamCastAllowed(sptr<AVSessionItem> & session)411 bool AVSessionService::IsMirrorToStreamCastAllowed(sptr<AVSessionItem>& session)
412 {
413     bool deviceCond = isSupportMirrorToStream_ &&
414                       session->GetDescriptor().sessionType_ == AVSession::SESSION_TYPE_VIDEO &&
415                       !AppManagerAdapter::GetInstance().IsAppBackground(session->GetUid(), session->GetPid());
416 
417     bool connectCond = !is2in1_ && (castserviceNameStatePair_.second == deviceStateConnection);
418 
419     return deviceCond && connectCond;
420 }
421 
MirrorToStreamCast(sptr<AVSessionItem> & session)422 __attribute__((no_sanitize("cfi"))) int32_t AVSessionService::MirrorToStreamCast(sptr<AVSessionItem>& session)
423 {
424     SLOGI("enter MirrorToStreamCast");
425     if (!IsMirrorToStreamCastAllowed(session)) {
426         return AVSESSION_SUCCESS;
427     }
428     checkEnableCast(true);
429     DeviceInfo deviceInfo;
430     deviceInfo.deviceId_ = castDeviceId_;
431     deviceInfo.deviceName_ = castDeviceName_;
432     deviceInfo.deviceType_ = castDeviceType_;
433     deviceInfo.castCategory_ = AVCastCategory::CATEGORY_REMOTE;
434     deviceInfo.supportedProtocols_ = ProtocolType::TYPE_CAST_PLUS_STREAM;
435     deviceInfo.providerId_ = 1;
436     return session->RegisterListenerStreamToCast(castserviceNameStatePair_, deviceInfo);
437 }
438 
SetIsSupportMirrorToStream(bool isSupportMirrorToStream)439 void AVSessionService::SetIsSupportMirrorToStream(bool isSupportMirrorToStream)
440 {
441     isSupportMirrorToStream_ = isSupportMirrorToStream;
442 }
443 
ReportStartCastBegin(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid)444 void AVSessionService::ReportStartCastBegin(std::string func, const OutputDeviceInfo& outputDeviceInfo, int32_t uid)
445 {
446     AVSessionRadarInfo info(func);
447     info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
448     AVSessionRadar::GetInstance().StartCastBegin(outputDeviceInfo, info);
449 }
450 
ReportStartCastEnd(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid,int ret)451 void AVSessionService::ReportStartCastEnd(std::string func, const OutputDeviceInfo& outputDeviceInfo,
452     int32_t uid, int ret)
453 {
454     AVSessionRadarInfo info(func);
455     info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
456     if (ret == AVSESSION_SUCCESS) {
457         AVSessionRadar::GetInstance().StartCastEnd(outputDeviceInfo, info);
458     } else {
459         info.errorCode_ = AVSessionRadar::GetRadarErrorCode(ret);
460         AVSessionRadar::GetInstance().FailToStartCast(outputDeviceInfo, info);
461     }
462 }
463 #endif
464 
AVSessionSystemAbilityLoadCallback(AVSessionService * ptr)465 AVSessionSystemAbilityLoadCallback::AVSessionSystemAbilityLoadCallback(AVSessionService *ptr)
466 {
467     SLOGI("AVSessionSystemAbilityLoadCallback construct");
468     servicePtr_ = ptr;
469 }
470 
~AVSessionSystemAbilityLoadCallback()471 AVSessionSystemAbilityLoadCallback::~AVSessionSystemAbilityLoadCallback()
472 {
473     SLOGI("AVSessionSystemAbilityLoadCallback destruct");
474 }
475 
OnLoadSACompleteForRemote(const std::string & deviceId,int32_t systemAbilityId,const sptr<IRemoteObject> & remoteObject)476 void AVSessionSystemAbilityLoadCallback::OnLoadSACompleteForRemote(const std::string& deviceId,
477     int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject)
478 {
479     SLOGI("OnLoadSACompleteForRemote systemAbilityId:%{public}d, loaded with object:%{public}d",
480         systemAbilityId, static_cast<int>(remoteObject != nullptr));
481 }
482 
AVSessionDeviceStateCallback(AVSessionService * ptr)483 AVSessionDeviceStateCallback::AVSessionDeviceStateCallback(AVSessionService *ptr)
484 {
485     SLOGI("AVSessionDeviceStateCallback construct");
486     servicePtr_ = ptr;
487 }
~AVSessionDeviceStateCallback()488 AVSessionDeviceStateCallback::~AVSessionDeviceStateCallback()
489 {
490     SLOGI("AVSessionDeviceStateCallback destruct");
491 }
492 
OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)493 void AVSessionDeviceStateCallback::OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
494 {
495     SLOGI("AVSessionDeviceStateCallback OnDeviceOnline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
496 }
497 
OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)498 void AVSessionDeviceStateCallback::OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
499 {
500     SLOGI("AVSessionDeviceStateCallback OnDeviceReady %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
501     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceReady get servicePtr_ nullptr");
502     if (servicePtr_->ProcessTargetMigrate(true, deviceInfo)) {
503         SLOGI("OnDeviceReady ProcessTargetMigrate pass");
504     }
505 }
506 
OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)507 void AVSessionDeviceStateCallback::OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
508 {
509     SLOGI("AVSessionDeviceStateCallback OnDeviceOffline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
510     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceOffline get servicePtr_ nullptr");
511     if (servicePtr_->ProcessTargetMigrate(false, deviceInfo)) {
512         SLOGI("OnDeviceOffline ProcessTargetMigrate pass");
513     }
514 }
515 
OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)516 void AVSessionDeviceStateCallback::OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
517 {
518     SLOGD("AVSessionDeviceStateCallback OnDeviceChanged %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
519 }
520 
GetLocalDeviceType()521 int32_t AVSessionService::GetLocalDeviceType()
522 {
523     int32_t deviceType = -1;
524     int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceType(serviceName, deviceType);
525     CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "get local device type failed with ret:%{public}d", ret);
526     return deviceType;
527 }
528 
DoTargetDevListenWithDM()529 void AVSessionService::DoTargetDevListenWithDM()
530 {
531     localDeviceType_ = GetLocalDeviceType();
532     targetDeviceType_ = (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH) ?
533         DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE : DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH;
534     SLOGI("get localDeviceType:%{public}d", localDeviceType_);
535 
536     std::vector<DistributedHardware::DmDeviceInfo> deviceList;
537     int32_t ret = GetTrustedDevicesInfo(deviceList);
538     CHECK_AND_PRINT_LOG(ret == AVSESSION_SUCCESS, "get trusted devcie list fail with ret:%{public}d", ret);
539     for (DistributedHardware::DmDeviceInfo& deviceInfo : deviceList) {
540         if (ProcessTargetMigrate(true, deviceInfo)) {
541             SLOGI("GetTrustedDevicesInfo find target");
542         }
543     }
544 
545     deviceStateCallback_ = std::make_shared<AVSessionDeviceStateCallback>(this);
546     ret = DistributedHardware::DeviceManager::GetInstance().
547         RegisterDevStateCallback(serviceName, "extra", deviceStateCallback_);
548     SLOGE("RegisterDevStateCallback with ret:%{public}d", ret);
549 }
550 
ProcessTargetMigrate(bool isOnline,const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)551 bool AVSessionService::ProcessTargetMigrate(bool isOnline, const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
552 {
553     if (deviceInfo.deviceTypeId != targetDeviceType_ || !CheckWhetherTargetDevIsNext(deviceInfo)) {
554         SLOGE("ProcessTargetMigrate wtih deviceType:%{public}d or version not fit", deviceInfo.deviceTypeId);
555         return false;
556     }
557     if (!isOnline) {
558         isMigrateTargetFound_ = false;
559         DoDisconnectProcessWithMigrate(deviceInfo);
560         deviceIdForMigrate_ = "";
561     } else {
562         isMigrateTargetFound_ = true;
563         deviceIdForMigrate_ = std::string(deviceInfo.deviceId);
564         DoConnectProcessWithMigrate(deviceInfo);
565         if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
566             DoRemoteAVSessionLoad(deviceIdForMigrate_);
567         }
568     }
569     return true;
570 }
571 
DoRemoteAVSessionLoad(std::string remoteDeviceId)572 void AVSessionService::DoRemoteAVSessionLoad(std::string remoteDeviceId)
573 {
574     SLOGI("DoRemoteAVSessionLoad async with deviceId:%{public}s", remoteDeviceId.c_str());
575     AVSessionEventHandler::GetInstance().AVSessionPostTask(
576         [this, remoteDeviceId]() {
577         auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
578         if (mgr == nullptr) {
579             SLOGE("DoRemoteAVSessionLoad get SystemAbilityManager fail");
580             return;
581         }
582         abilityLoadCallback_ = new AVSessionSystemAbilityLoadCallback(this);
583         sptr<IRemoteObject> remoteObject = nullptr;
584         uint8_t outOfTime = doRemoteLoadRetryTime;
585         while (remoteObject == nullptr && outOfTime > 0) {
586             outOfTime--;
587             std::this_thread::sleep_for(std::chrono::milliseconds(CLICK_TIMEOUT));
588             remoteObject = mgr->CheckSystemAbility(AVSESSION_SERVICE_ID, remoteDeviceId);
589             if (remoteObject != nullptr) {
590                 SLOGI("DoRemoteAVSessionLoad done with remoteObject get");
591                 return;
592             } else {
593                 SLOGI("DoRemoteAVSessionLoad get null, retryLeftTime:%{public}u", outOfTime);
594             }
595         }
596         },
597         "DoRemoteAVSessionLoad");
598 }
599 
DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)600 void AVSessionService::DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
601 {
602     if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
603         DoConnectProcessWithMigrateServer(deviceInfo);
604     } else {
605         DoConnectProcessWithMigrateProxy(deviceInfo);
606     }
607 }
608 
DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)609 void AVSessionService::DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
610 {
611     SLOGI("DoConnectProcessWithMigrateServer with deviceType:%{public}d", deviceInfo.deviceTypeId);
612     std::string networkId = std::string(deviceInfo.networkId);
613     if (migrateAVSessionServerMap_.find(networkId) == migrateAVSessionServerMap_.end()) {
614         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer =
615             std::make_shared<MigrateAVSessionServer>(MIGRATE_MODE_NEXT);
616         migrateAVSessionServer->Init(this);
617         migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionId_);
618         MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(MigrateAVSessionManager::migrateSceneNext,
619             migrateAVSessionServer);
620         migrateAVSessionServerMap_.insert({networkId, migrateAVSessionServer});
621         SLOGI("DoConnectProcessWithMigrateServer create migrate server success");
622     } else {
623         SLOGE("DoConnectProcessWithMigrateServer find migrate server already alive");
624     }
625 }
626 
DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)627 void AVSessionService::DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
628 {
629     SLOGI("DoConnectProcessWithMigrateProxy with deviceType:%{public}d", deviceInfo.deviceTypeId);
630     std::string networkId = std::string(deviceInfo.networkId);
631     if (migrateAVSessionProxyMap_.find(networkId) == migrateAVSessionProxyMap_.end()) {
632         std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
633             std::make_shared<MigrateAVSessionProxy>(this);
634         MigrateAVSessionManager::GetInstance().CreateRemoteSessionProxy(networkId,
635             MigrateAVSessionManager::migrateSceneNext, migrateAVSessionProxy);
636         migrateAVSessionProxyMap_.insert({networkId, std::static_pointer_cast<SoftbusSession>(migrateAVSessionProxy)});
637         SLOGI("DoConnectProcessWithMigrateProxy create migrate proxy success");
638     } else {
639         SLOGE("DoConnectProcessWithMigrateProxy find migrate proxy already alive");
640     }
641 }
642 
DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)643 void AVSessionService::DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
644 {
645     if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
646         DoDisconnectProcessWithMigrateServer(deviceInfo);
647     } else {
648         DoDisconnectProcessWithMigrateProxy(deviceInfo);
649     }
650 }
651 
DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)652 void AVSessionService::DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
653 {
654     SLOGI("DoDisconnectProcessWithMigrateServer with deviceType:%{public}d", deviceInfo.deviceTypeId);
655     std::string networkId = std::string(deviceInfo.networkId);
656     MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(MigrateAVSessionManager::migrateSceneNext);
657     if (migrateAVSessionServerMap_.find(networkId) != migrateAVSessionServerMap_.end()) {
658         migrateAVSessionServerMap_.erase(networkId);
659     } else {
660         SLOGE("DoDisconnectProcessWithMigrateServer find networkId not exist");
661     }
662 }
663 
DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)664 void AVSessionService::DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
665 {
666     SLOGI("DoDisconnectProcessWithMigrateProxy with networkId:%{public}s", deviceInfo.networkId);
667     std::string networkId = std::string(deviceInfo.networkId);
668     MigrateAVSessionManager::GetInstance().ReleaseRemoteSessionProxy(networkId,
669         MigrateAVSessionManager::migrateSceneNext);
670     if (migrateAVSessionProxyMap_.find(networkId) != migrateAVSessionProxyMap_.end()) {
671         migrateAVSessionProxyMap_.erase(networkId);
672     } else {
673         SLOGE("DoDisconnectProcessWithMigrateProxy find networkId not exist");
674     }
675 }
676 
UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)677 void AVSessionService::UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)
678 {
679     CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "UpdateLocalFrontSession get sessionListForFront nullptr");
680     std::string preloadSessionId;
681     if (sessionListForFront->size() <= 0) {
682         SLOGI("UpdateLocalFrontSession with empty list");
683         preloadSessionId = "";
684         NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
685         return;
686     }
687     if (topSession_ != nullptr && !topSession_->IsCasting()) {
688         preloadSessionId = topSession_->GetSessionId();
689         NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
690         return;
691     }
692     for (const auto& session : *sessionListForFront) {
693         if (session == nullptr || session->IsCasting()) {
694             continue;
695         }
696         preloadSessionId = session->GetSessionId();
697         break;
698     }
699     NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
700 }
701 
NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)702 void AVSessionService::NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)
703 {
704     SLOGI("NotifyLocalFrontSessionChangeForMigrate with sessionId:%{public}s",
705         AVSessionUtils::GetAnonySessionId(localFrontSessionIdUpdate).c_str());
706     if (migrateAVSessionServerMap_.size() <= 0) {
707         SLOGE("NotifyLocalFrontSessionChangeForMigrate with no migrate");
708         localFrontSessionId_ = localFrontSessionIdUpdate;
709         return;
710     }
711     for (auto it = migrateAVSessionServerMap_.begin(); it != migrateAVSessionServerMap_.end(); it++) {
712         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer = it->second;
713         if (migrateAVSessionServer == nullptr) {
714             SLOGE("notify session change but get migrateserver null, continue");
715             continue;
716         }
717         if (localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0) {
718             DoRemoteAVSessionLoad(deviceIdForMigrate_);
719             migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionIdUpdate);
720         } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0
721             && localFrontSessionId_ != localFrontSessionIdUpdate) {
722             migrateAVSessionServer->LocalFrontSessionChange(localFrontSessionIdUpdate);
723         } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.empty()) {
724             DoRemoteAVSessionLoad(deviceIdForMigrate_);
725             migrateAVSessionServer->LocalFrontSessionLeave(localFrontSessionId_);
726         }
727     }
728     localFrontSessionId_ = localFrontSessionIdUpdate;
729 }
730 
CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)731 bool AVSessionService::CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
732 {
733     Json::Reader reader;
734     Json::Value jsonData;
735     if (!reader.parse(deviceInfo.extraData, jsonData)) {
736         SLOGE("CheckWhetherTargetDevIsNext json parse failed");
737         return false;
738     }
739     if (jsonData.isMember("OS_TYPE")) {
740         Json::Value osValue = jsonData["OS_TYPE"];
741         if (osValue.isNumeric()) {
742             double number = osValue.asDouble();
743             if (number > 0) {
744                 return true;
745             }
746         }
747     }
748     return false;
749 }
750 
GetDistributedSessionControllersInner(const DistributedSessionType & sessionType,std::vector<sptr<IRemoteObject>> & sessionControllers)751 int32_t AVSessionService::GetDistributedSessionControllersInner(const DistributedSessionType& sessionType,
752     std::vector<sptr<IRemoteObject>>& sessionControllers)
753 {
754     if (sessionType == DistributedSessionType::TYPE_SESSION_REMOTE && !migrateAVSessionProxyMap_.empty()) {
755         for (const auto& pair : migrateAVSessionProxyMap_) {
756             std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
757                 std::static_pointer_cast<MigrateAVSessionProxy>(pair.second);
758             CHECK_AND_CONTINUE(migrateAVSessionProxy != nullptr);
759             migrateAVSessionProxy->GetDistributedSessionControllerList(sessionControllers);
760         }
761     } else {
762         SLOGE("GetDistributedSessionControllersInner with err type:%{public}d|proxyEmpty:%{public}d",
763             static_cast<int>(sessionType), static_cast<int>(migrateAVSessionProxyMap_.empty()));
764         return ERR_REMOTE_CONNECTION_NOT_EXIST;
765     }
766     SLOGI("GetDistributedSessionControllersInner with size:%{public}d", static_cast<int>(sessionControllers.size()));
767     return AVSESSION_SUCCESS;
768 }
769 
NotifyRemoteBundleChange(const std::string bundleName)770 void AVSessionService::NotifyRemoteBundleChange(const std::string bundleName)
771 {
772     if (migrateAVSessionProxyMap_.empty()) {
773         SLOGE("not in migrate proxy scene, return");
774         return;
775     }
776     PublishEvent(bundleName.empty() ? remoteMediaNone : remoteMediaAlive);
777 }
778 }