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