1 /*
2  * Copyright (c) 2022 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_SYSEVENT_H
17 #define OHOS_AVSESSION_SYSEVENT_H
18 
19 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
20 #include <mutex>
21 #include "hisysevent.h"
22 #include "timer.h"
23 #endif
24 
25 namespace OHOS::AVSession {
26 enum class Operation {
27     OPT_PLAY = 0,
28     OPT_PAUSE,
29     OPT_STOP,
30     OPT_PLAY_NEXT,
31     OPT_PLAY_PREVIOUS,
32     OPT_FAST_FORWARD,
33     OPT_REWIND,
34     OPT_SEEK,
35     OPT_SET_SPEED,
36     OPT_SET_LOOP_MODE,
37     OPT_TOGGLE_FAVORITE,
38     OPT_MEDIA_KEY_EVENT,
39     OPT_OUTPUT_DEVICE_CHANGED,
40     OPT_COMMAND_MAX,
41     OPT_CREATE_SESSION,
42     OPT_DELETE_SESSION,
43     OPT_ALL_CTRL_COMMAND,
44     OPT_SUCCESS_CTRL_COMMAND,
45 };
46 
47 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
48 class AVSessionSysEvent {
49 public:
50     struct LifeCycleInfo {
51         std::string bundleName_;
52         bool appStatus_;
53         int32_t sessionType_;
54         bool isCreateSession_;
55     };
56 
57     struct ControllerCommandInfo {
58         std::string bundleName_;
59         pid_t controllerPid_;
60         int32_t controllerCmd_;
61     };
62 
63     static AVSessionSysEvent& GetInstance();
64 
65     template<typename... Types>
HiSysWriteFault(const std::string & eventName,Types...keyValues)66     static int HiSysWriteFault(const std::string& eventName, Types... keyValues)
67     {
68         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
69             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, keyValues...);
70     }
71 
72     template<typename... Types>
HiSysWriteStatistic(const std::string & eventName,Types...keyValues)73     static int HiSysWriteStatistic(const std::string& eventName, Types... keyValues)
74     {
75         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
76             OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, keyValues...);
77     }
78 
79     template<typename... Types>
HiSysWriteSecurity(const std::string & eventName,Types...keyValues)80     static int HiSysWriteSecurity(const std::string& eventName, Types... keyValues)
81     {
82         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
83             OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY, keyValues...);
84     }
85 
86     template<typename... Types>
HiSysWriteBehavior(const std::string & eventName,Types...keyValues)87     static int HiSysWriteBehavior(const std::string& eventName, Types... keyValues)
88     {
89         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
90             OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, keyValues...);
91     }
92 
93     void Reset();
94     void Regiter();
95     void Unregister();
96     void AddOperationCount(Operation operation);
97     void AddLifeCycleInfo(const std::string& bundleName, bool appStatus,
98         const int32_t& sessionType, bool isCreateSession);
99     void AddControllerCommandInfo(const std::string& bundleName, const pid_t& controllerPid,
100         const int32_t& controllerCmd, const int32_t& sessionType);
101     void SetAudioStatus(pid_t uid, int32_t rendererState);
102     int32_t GetAudioStatus(pid_t uid);
103 
104 private:
105     std::map<pid_t, int32_t> audioStatuses_;
106     AVSessionSysEvent();
107     std::map<Operation, uint32_t> optCounts_;
108     std::unique_ptr<Utils::Timer> timer_;
109     uint32_t timerId_;
110     std::recursive_mutex lock_;
111     static constexpr uint32_t NOTIFY_TIME_INTERVAL = 1 * 60 * 60 * 1000; // retry after 1 hours
112     std::list<AVSessionSysEvent::LifeCycleInfo> lifeCycleInfos_;
113     std::list<AVSessionSysEvent::ControllerCommandInfo> controllerCommandInfos_;
114     static constexpr float MULTIPLE = 1.0f;
115 };
116 #endif
117 
118 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
119 #define HISYSEVENT_FAULT(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteFault(eventName, __VA_ARGS__))
120 #define HISYSEVENT_STATISTIC(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteStatistic(eventName, __VA_ARGS__))
121 #define HISYSEVENT_SECURITY(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteSecurity(eventName, __VA_ARGS__))
122 #define HISYSEVENT_BEHAVIOR(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteBehavior(eventName, __VA_ARGS__))
123 #define HISYSEVENT_RESET AVSessionSysEvent::GetInstance().Reset()
124 #define HISYSEVENT_REGITER AVSessionSysEvent::GetInstance().Regiter()
125 #define HISYSEVENT_UNREGISTER AVSessionSysEvent::GetInstance().Unregister()
126 #define HISYSEVENT_ADD_OPERATION_COUNT(operation) AVSessionSysEvent::GetInstance().AddOperationCount(operation)
127 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(bundleName, controllerPid, controllerCmd, sessionType)           \
128     do {                                                                                                        \
129         AVSessionSysEvent::GetInstance().AddControllerCommandInfo(bundleName, controllerPid,                    \
130                                                                   controllerCmd, sessionType);                  \
131     } while (0)
132 
133 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(bundleName, appStatus, sessionType, isCreateSession)                     \
134     do {                                                                                                        \
135         AVSessionSysEvent::GetInstance().AddLifeCycleInfo(bundleName, appStatus, sessionType, isCreateSession); \
136     } while (0)
137 #define HISYSEVENT_GET_AUDIO_STATUS(uid) AVSessionSysEvent::GetInstance().GetAudioStatus(uid)
138 #define HISYSEVENT_SET_AUDIO_STATUS(uid, rendererState)                                                         \
139     do {                                                                                                        \
140         AVSessionSysEvent::GetInstance().SetAudioStatus(uid, rendererState);                                    \
141     } while (0)
142 
143 #else
144 #define HISYSEVENT_FAULT(...)
145 #define HISYSEVENT_STATISTIC(...)
146 #define HISYSEVENT_SECURITY(...)
147 #define HISYSEVENT_BEHAVIOR(...)
148 #define HISYSEVENT_RESET
149 #define HISYSEVENT_REGITER
150 #define HISYSEVENT_UNREGISTER
151 #define HISYSEVENT_ADD_OPERATION_COUNT(...)
152 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(...)
153 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(...)
154 #define HISYSEVENT_GET_AUDIO_STATUS(...)
155 #define HISYSEVENT_SET_AUDIO_STATUS(...)
156 #endif
157 } // namespace OHOS::AVSession
158 #endif // OHOS_AVSESSION_SYSEVENT_H