1 /*
2  * Copyright (c) 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 #ifndef OHOS_AVSESSION_RADAR_H
17 #define OHOS_AVSESSION_RADAR_H
18 
19 #include "radar_constants.h"
20 #include "element_name.h"
21 #include <nlohmann/json.hpp>
22 #include <string>
23 #include <algorithm>
24 #include "avsession_descriptor.h"
25 #include "bundle_mgr_proxy.h"
26 #include "bundle_status_callback_host.h"
27 #include "iservice_registry.h"
28 
29 namespace OHOS::AVSession {
30 struct AVSessionRadarInfo {
31     int32_t bizScene_ { 0 };
32     int32_t bizStage_ { 0 };
33     int32_t stageRes_ { 0 };
34     int32_t bizState_ { 0 };
35     int32_t triggerMode_ { 0 };
36     int32_t errorCode_ { 0 };
37     int32_t isTrust_ { static_cast<int32_t>(TrustStatus::UNKOWN) };
38     std::string hostPkg_;
39     std::string toCallPkg_ { CAST_ENGINE_PKG };
40     std::string func_;
41     std::string discoveryDeviceList_;
42     std::string peerUdid_;
43     std::string peerBtMac_;
44     std::string peerNetId_;
45     std::string peerDevType_;
46     std::string localSessName_;
47     std::string peerSessName_;
48     std::string bundleName_;
AVSessionRadarInfoAVSessionRadarInfo49     explicit AVSessionRadarInfo(std::string funcName) : func_(funcName) {}
CheckTriggerModeAVSessionRadarInfo50     void CheckTriggerMode()
51     {
52         if (bundleName_.empty()) {
53             triggerMode_ = static_cast<int32_t>(TriggerMode::UNKNOWN);
54             return;
55         }
56         triggerMode_ = (bundleName_.find(MEDIA_CONTROL_PKG) == std::string::npos) ?
57             static_cast<int32_t>(TriggerMode::APPLICATION) :
58             static_cast<int32_t>(TriggerMode::MEDIA_CONTROL);
59     }
60 };
61 
62 class AVSessionRadar {
63 public:
64     static AVSessionRadar &GetInstance();
65     static std::string GetAnonymousDeviceId(std::string deviceId);
66     static int32_t GetRadarErrorCode(int32_t err);
67     void InitBMS();
68     void GetJsonCastDeviceList(const OutputDeviceInfo &deviceInfo, std::string& deviceList);
69     void GetPeerInfo(const OutputDeviceInfo &outputDeviceInfo, AVSessionRadarInfo &info);
70     void GetPeerInfoFromDeviceInfo(const DeviceInfo &deviceInfo, AVSessionRadarInfo &info);
71 
72     void StartCastDiscoveryBegin(AVSessionRadarInfo &info);
73     void StartCastDiscoveryEnd(AVSessionRadarInfo &info);
74     void FailToStartCastDiscovery(AVSessionRadarInfo &info);
75 
76     void CastDeviceAvailable(const OutputDeviceInfo &castOutputDeviceInfo, AVSessionRadarInfo &info);
77 
78     void StopCastDiscoveryBegin(AVSessionRadarInfo &info);
79     void StopCastDiscoveryEnd(AVSessionRadarInfo &info);
80     void FailToStopCastDiscovery(AVSessionRadarInfo &info);
81 
82     void StartCastBegin(const OutputDeviceInfo& outputDeviceInfo, AVSessionRadarInfo &info);
83     void StartCastEnd(const OutputDeviceInfo& outputDeviceInfo, AVSessionRadarInfo &info);
84     void FailToStartCast(AVSessionRadarInfo &info);
85     void FailToStartCast(const OutputDeviceInfo& outputDeviceInfo, AVSessionRadarInfo &info);
86     void StartConnect(AVSessionRadarInfo &info);
87     void ConnectFinish(const DeviceInfo &deviceInfo, AVSessionRadarInfo &info);
88 
89     void StartPlayBegin(AVSessionRadarInfo &info);
90     void StartPlayEnd(AVSessionRadarInfo &info);
91     void StartPlayFailed(AVSessionRadarInfo &info);
92     void PlayerStarted(AVSessionRadarInfo &info);
93 
94     void SendControlCommandBegin(AVSessionRadarInfo &info);
95     void SendControlCommandEnd(AVSessionRadarInfo &info);
96     void FailToSendControlCommand(AVSessionRadarInfo &info);
97     void ControlCommandRespond(AVSessionRadarInfo &info);
98     void ControlCommandError(AVSessionRadarInfo &info);
99 
100     void StopCastBegin(const OutputDeviceInfo& outputDeviceInfo, AVSessionRadarInfo &info);
101     void StopCastEnd(const OutputDeviceInfo& outputDeviceInfo, AVSessionRadarInfo &info);
102     void StopCastFinish(const DeviceInfo &deviceInfo, AVSessionRadarInfo &info);
103     void FailToStopCast(AVSessionRadarInfo &info);
104     void FailToStopCast(const OutputDeviceInfo &outputDeviceInfo, AVSessionRadarInfo &info);
105 
106     void reset();
107 
108 private:
109     AVSessionRadar() = default;
110     ~AVSessionRadar() = default;
111     std::string GetLocalDeviceNetworkId();
112     std::string GetUdidByNetworkId(const std::string &networkId);
113     void ReportWithTrustInfo(AVSessionRadarInfo &info);
114     void ReportWithoutTrustInfo(AVSessionRadarInfo &info);
115     void ReportHiSysEventBehavior(AVSessionRadarInfo &info);
116     std::string ConvertHexToString(int32_t hex);
117     std::string GetLocalDevType();
118     std::string GetBundleNameFromUid(int32_t uid);
119 
120 private:
121     std::string orgPkg_ { AVSESSION_PKG_NAME };
122     std::string localUdid_;
123     std::string localNetId_;
124     std::string localDevType_;
125     sptr<AppExecFwk::BundleMgrProxy> bundleMgrProxy_;
126 };
127 } // namespace OHOS::AVSession
128 #endif // OHOS_AVSESSION_RADAR_H