1/*
2 * Copyright (c) 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 <map>
17#include <hisysevent.h>
18#include "pip_report.h"
19#include "window_manager_hilog.h"
20
21namespace OHOS {
22namespace Rosen {
23namespace {
24const std::string PNAMEID = "windowManager";
25const std::string PVERSION = "1.0";
26}
27WM_IMPLEMENT_SINGLE_INSTANCE(PiPReporter)
28
29#define LOG_WHEN_ERROR(errCode)                                                               \
30    do {                                                                                      \
31        if ((errCode) != 0) {                                                                 \
32            TLOGE(WmsLogTag::WMS_PIP, "Write HiSysEvent error, errCode:%{public}d", errCode); \
33        }                                                                                     \
34    } while (false)
35
36static std::map<std::string, int32_t> CONTROL_ACTION_MAP = {
37    {"playbackStateChanged", 0},
38    {"nextVideo", 1},
39    {"previousVideo", 2},
40    {"hangUp", 3},
41    {"micStateChanged", 4},
42    {"videoStateChanged", 5},
43    {"voiceStateChanged", 6},
44    {"fastForward", 7},
45    {"fastBackward", 8}
46};
47constexpr char EVENT_KEY_SOURCE[] = "SOURCE";
48constexpr char EVENT_KEY_TEMPLATE_TYPE[] = "TEMPLATE_TYPE";
49constexpr char EVENT_KEY_PNAMEID[] = "PNAMEID";
50constexpr char EVENT_KEY_PVERSION[] = "PVERSION";
51constexpr char EVENT_KEY_START_PACKAGE_NAME[] = "START_PACKAGE_NAME";
52constexpr char EVENT_KEY_STOP_PACKAGE_NAME[] = "STOP_PACKAGE_NAME";
53constexpr char EVENT_KEY_OPERATION_PACKAGE_NAME[] = "OPERATION_PACKAGE_NAME";
54constexpr char EVENT_KEY_OPERATION_CODE[] = "OPERATION_CODE";
55constexpr char EVENT_KEY_OPERATION_ERROR_REASON[] = "OPERATION_ERROR_REASON";
56constexpr char EVENT_KEY_ACTION_EVENT[] = "ACTION_EVENT";
57constexpr char EVENT_KEY_WINDOW_WIDTH[] = "WINDOW_WIDTH";
58constexpr char EVENT_KEY_WINDOW_HEIGHT[] = "WINDOW_HEIGHT";
59
60void PiPReporter::SetCurrentPackageName(const std::string& packageName)
61{
62    std::lock_guard<std::mutex> lock(packageNameMutex_);
63    packageName_ = packageName;
64}
65
66std::string PiPReporter::GetPackageName() const
67{
68    std::lock_guard<std::mutex> lock(packageNameMutex_);
69    return packageName_;
70}
71
72void PiPReporter::ReportPiPStartWindow(int32_t source, int32_t templateType,
73                                       int32_t isSuccess, const std::string& errorReason)
74{
75    TLOGI(WmsLogTag::WMS_PIP, "Report start pip widow");
76    if (source == 0) {
77        TLOGI(WmsLogTag::WMS_PIP, "need not report start pip widow");
78        return;
79    }
80    std::string eventName = "START_PIP";
81    int32_t ret = HiSysEventWrite(
82        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, eventName,
83        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
84        EVENT_KEY_PNAMEID, PNAMEID,
85        EVENT_KEY_PVERSION, PVERSION,
86        EVENT_KEY_SOURCE, source,
87        EVENT_KEY_TEMPLATE_TYPE, templateType,
88        EVENT_KEY_START_PACKAGE_NAME, GetPackageName(),
89        EVENT_KEY_OPERATION_CODE, isSuccess,
90        EVENT_KEY_OPERATION_ERROR_REASON, errorReason);
91    LOG_WHEN_ERROR(ret);
92}
93
94void PiPReporter::ReportPiPStopWindow(int32_t source, int32_t templateType,
95                                      int32_t isSuccess, const std::string& errorReason)
96{
97    TLOGI(WmsLogTag::WMS_PIP, "Report stop pip widow");
98    if (source == 0) {
99        TLOGI(WmsLogTag::WMS_PIP, "need not report stop pip widow");
100        return;
101    }
102    std::string eventName = "STOP_PIP";
103    int32_t ret = HiSysEventWrite(
104        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, eventName,
105        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
106        EVENT_KEY_PNAMEID, PNAMEID,
107        EVENT_KEY_PVERSION, PVERSION,
108        EVENT_KEY_SOURCE, source,
109        EVENT_KEY_TEMPLATE_TYPE, templateType,
110        EVENT_KEY_STOP_PACKAGE_NAME, GetPackageName(),
111        EVENT_KEY_OPERATION_CODE, isSuccess,
112        EVENT_KEY_OPERATION_ERROR_REASON, errorReason);
113    LOG_WHEN_ERROR(ret);
114}
115
116void PiPReporter::ReportPiPActionEvent(int32_t templateType, const std::string& actionEvent)
117{
118    TLOGI(WmsLogTag::WMS_PIP, "Report pip widow action event");
119    std::string eventName = "CONTROL_PANNEL_ACTION_EVENT";
120    if (CONTROL_ACTION_MAP.find(actionEvent) == CONTROL_ACTION_MAP.end()) {
121        TLOGE(WmsLogTag::WMS_PIP, "actionEvent %{public}s not found", actionEvent.c_str());
122        return;
123    }
124    int32_t currentAction = CONTROL_ACTION_MAP[actionEvent];
125    int32_t ret = HiSysEventWrite(
126        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, eventName,
127        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
128        EVENT_KEY_PNAMEID, PNAMEID,
129        EVENT_KEY_PVERSION, PVERSION,
130        EVENT_KEY_TEMPLATE_TYPE, templateType,
131        EVENT_KEY_ACTION_EVENT, currentAction,
132        EVENT_KEY_OPERATION_PACKAGE_NAME, GetPackageName());
133    LOG_WHEN_ERROR(ret);
134}
135
136void PiPReporter::ReportPiPControlEvent(int32_t templateType, PiPControlType controlType)
137{
138    TLOGI(WmsLogTag::WMS_PIP, "templateType:%{public}d, controlType:%{public}d", templateType, controlType);
139    int32_t ret = HiSysEventWrite(
140        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, "CONTROL_CONTROL_EVENT",
141        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
142        EVENT_KEY_PNAMEID, PNAMEID,
143        EVENT_KEY_PVERSION, PVERSION,
144        EVENT_KEY_TEMPLATE_TYPE, templateType,
145        EVENT_KEY_ACTION_EVENT, static_cast<uint32_t>(controlType),
146        EVENT_KEY_OPERATION_PACKAGE_NAME, GetPackageName());
147    LOG_WHEN_ERROR(ret);
148}
149
150void PiPReporter::ReportPiPRatio(int32_t windowWidth, int32_t windowHeight)
151{
152    TLOGI(WmsLogTag::WMS_PIP, "Report pip widow ratio");
153    std::string eventName = "UPDATE_PIP_RATIO";
154    int32_t ret = HiSysEventWrite(
155        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, eventName,
156        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
157        EVENT_KEY_PNAMEID, PNAMEID,
158        EVENT_KEY_PVERSION, PVERSION,
159        EVENT_KEY_WINDOW_WIDTH, windowWidth,
160        EVENT_KEY_WINDOW_HEIGHT, windowHeight,
161        EVENT_KEY_OPERATION_PACKAGE_NAME, GetPackageName());
162    LOG_WHEN_ERROR(ret);
163}
164
165void PiPReporter::ReportPiPRestore()
166{
167    TLOGI(WmsLogTag::WMS_PIP, "Report pip widow restore");
168    std::string eventName = "RESOTRE_PIP";
169    int32_t ret = HiSysEventWrite(
170        OHOS::HiviewDFX::HiSysEvent::Domain::MULTIWINDOW_UE, eventName,
171        OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
172        EVENT_KEY_PNAMEID, PNAMEID,
173        EVENT_KEY_PVERSION, PVERSION,
174        EVENT_KEY_OPERATION_PACKAGE_NAME, GetPackageName());
175    LOG_WHEN_ERROR(ret);
176}
177} // namespace Rosen
178} // namespace OHOS
179