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_ROSEN_WM_UTILS_PERFORM_REPORTER_H
17#define OHOS_ROSEN_WM_UTILS_PERFORM_REPORTER_H
18
19#include <atomic>
20#include <chrono>
21#include <string>
22#include <vector>
23#include <map>
24#include <mutex>
25#include "wm_single_instance.h"
26
27namespace OHOS {
28namespace Rosen {
29
30enum class WindowDFXHelperType : uint32_t {
31    WINDOW_RECT_CHECK = 1,
32    WINDOW_ZORDER_CHECK,
33    WINDOW_FOCUS_CHECK,
34    WINDOW_TRANSPARENT_CHECK,
35    WINDOW_MODAL_UIEXTENSION_UICONTENT_CHECK,
36    WINDOW_MODAL_UIEXTENSION_SUBWINDOW_CHECK,
37};
38
39struct WindowProfileInfo {
40    std::string bundleName = "";
41    int32_t windowVisibleState = -1;
42    int32_t windowLocatedScreen = -1;
43    int32_t windowSceneMode = -1;
44};
45
46class PerformReporter {
47public:
48    PerformReporter(const std::string& tag, const std::vector<int64_t>& timeSpiltsMs, uint32_t reportInterval = 50);
49    void start();
50    void end();
51
52private:
53    void count(int64_t costTime);
54    bool report();
55    void clear();
56
57    std::string tag_;
58    std::atomic<uint32_t> totalCount_;
59    std::map<int64_t, std::atomic<uint32_t>> timeSplitCount_;
60    std::chrono::steady_clock::time_point startTime_;
61    uint32_t reportInterval_;
62
63    static constexpr auto BARRIER = std::numeric_limits<int64_t>::max();
64};
65
66// the map form : <bundleName, <abilityName, count>>
67using FullInfoMap = std::map<std::string, std::map<std::string, uint32_t>>;
68// the map form : <bundleName, count>
69using BundleNameMap = std::map<std::string, uint32_t>;
70class WindowInfoReporter {
71WM_DECLARE_SINGLE_INSTANCE(WindowInfoReporter);
72
73public:
74    void InsertCreateReportInfo(const std::string& bundleName);
75    void InsertShowReportInfo(const std::string& bundleName);
76    void InsertHideReportInfo(const std::string& bundleName);
77    void InsertDestroyReportInfo(const std::string& bundleName);
78
79    void InsertRecentReportInfo(const std::string& bundleName, const std::string& packageName);
80    void InsertNavigationBarReportInfo(const std::string& bundleName, const std::string& packageName);
81
82    void ReportBackButtonInfoImmediately();
83    void ReportZeroOpacityInfoImmediately(const std::string& bundleName, const std::string& packageName);
84    // report when application startup request window
85    void ReportStartWindow(const std::string& bundleName, const std::string& windowName);
86    void ReportRecordedInfos();
87    void ReportContainerStartBegin(int32_t missionId, const std::string& bundleName, int64_t timestamp);
88    int32_t ReportWindowProfileInfo(const WindowProfileInfo& windowProfileInfo);
89    void ReportWindowException(int32_t detectionType, int32_t pid, const std::string& windowInfo);
90
91private:
92    void UpdateReportInfo(FullInfoMap& infoMap, const std::string& bundleName,
93        const std::string& packageName);
94    void UpdateReportInfo(BundleNameMap& infoMap, const std::string& bundleName);
95    std::string GetMsgString(const FullInfoMap& infoMap);
96    std::string GetMsgString(const BundleNameMap& infoMap);
97
98    void Report(const std::string& reportTag, const std::string& msg);
99    void ClearRecordedInfos();
100
101    BundleNameMap windowCreateReportInfos_;
102    BundleNameMap windowShowReportInfos_;
103    BundleNameMap windowHideReportInfos_;
104    BundleNameMap windowDestoryReportInfos_;
105    FullInfoMap windowRecentReportInfos_;
106    FullInfoMap windowNavigationBarReportInfos_;
107
108    std::mutex mtx_;
109};
110}
111}
112#endif