1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#ifndef OHOS_ROSEN_RESSCHED_REPORT_H
17e0dac50fSopenharmony_ci#define OHOS_ROSEN_RESSCHED_REPORT_H
18e0dac50fSopenharmony_ci
19e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
20e0dac50fSopenharmony_ci#include "event_handler.h"
21e0dac50fSopenharmony_ci#include "res_sched_client.h"
22e0dac50fSopenharmony_ci#endif
23e0dac50fSopenharmony_ci#include "window_helper.h"
24e0dac50fSopenharmony_ci#include "wm_common.h"
25e0dac50fSopenharmony_ci#include "wm_single_instance.h"
26e0dac50fSopenharmony_ci
27e0dac50fSopenharmony_cinamespace OHOS {
28e0dac50fSopenharmony_cinamespace Rosen {
29e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
30e0dac50fSopenharmony_cinamespace {
31e0dac50fSopenharmony_ciconstexpr int64_t PERF_TIME_OUT = 200;
32e0dac50fSopenharmony_ciconstexpr int64_t SLIDE_PERF_TIME_OUT = 1000;
33e0dac50fSopenharmony_ciconstexpr int32_t PERF_CLICK_NORMAL_CODE = 9;
34e0dac50fSopenharmony_ciconstexpr int32_t PERF_DRAG_CODE = 31;
35e0dac50fSopenharmony_ciconstexpr int32_t PERF_MOVE_CODE = 32;
36e0dac50fSopenharmony_ciconstexpr int32_t PERF_ANIMATION_BOOST_CODE = 33;
37e0dac50fSopenharmony_ciconstexpr int32_t PERF_SLIDE_CODE = 11;
38e0dac50fSopenharmony_ciconstexpr int32_t PERF_STATUS_BAR_DRAG_CODE = 37;
39e0dac50fSopenharmony_ciconst std::string TASK_NAME = "SlideOff";
40e0dac50fSopenharmony_ci}
41e0dac50fSopenharmony_ci
42e0dac50fSopenharmony_ci/**
43e0dac50fSopenharmony_ci * @brief Slide event status
44e0dac50fSopenharmony_ci */
45e0dac50fSopenharmony_cienum SlideEventStatus : int64_t {
46e0dac50fSopenharmony_ci    SLIDE_EVENT_OFF = 0,
47e0dac50fSopenharmony_ci    SLIDE_EVENT_ON = 1,
48e0dac50fSopenharmony_ci    SLIDE_NORMAL_BEGIN = 3,
49e0dac50fSopenharmony_ci    SLIDE_NORMAL_END = 4,
50e0dac50fSopenharmony_ci};
51e0dac50fSopenharmony_ci#endif
52e0dac50fSopenharmony_ci
53e0dac50fSopenharmony_ciclass ResSchedReport {
54e0dac50fSopenharmony_ci    WM_DECLARE_SINGLE_INSTANCE(ResSchedReport);
55e0dac50fSopenharmony_ci    public:
56e0dac50fSopenharmony_ci    void StopPerfIfNeed()
57e0dac50fSopenharmony_ci    {
58e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
59e0dac50fSopenharmony_ci        if (windowDragBoost_) {
60e0dac50fSopenharmony_ci            ClosePerf(PERF_DRAG_CODE);
61e0dac50fSopenharmony_ci            windowDragBoost_ = false;
62e0dac50fSopenharmony_ci        }
63e0dac50fSopenharmony_ci        if (windowMovingBoost_) {
64e0dac50fSopenharmony_ci            ClosePerf(PERF_MOVE_CODE);
65e0dac50fSopenharmony_ci            windowMovingBoost_ = false;
66e0dac50fSopenharmony_ci        }
67e0dac50fSopenharmony_ci#endif
68e0dac50fSopenharmony_ci    }
69e0dac50fSopenharmony_ci
70e0dac50fSopenharmony_ci    void TrigClick()
71e0dac50fSopenharmony_ci    {
72e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
73e0dac50fSopenharmony_ci        std::unordered_map<std::string, std::string> mapPayload;
74e0dac50fSopenharmony_ci        // 2 means click event.
75e0dac50fSopenharmony_ci        OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_CLICK_NORMAL_CODE, 2, mapPayload);
76e0dac50fSopenharmony_ci#endif
77e0dac50fSopenharmony_ci    }
78e0dac50fSopenharmony_ci
79e0dac50fSopenharmony_ci    void AnimationBoost()
80e0dac50fSopenharmony_ci    {
81e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
82e0dac50fSopenharmony_ci        std::unordered_map<std::string, std::string> mapPayload;
83e0dac50fSopenharmony_ci        OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_ANIMATION_BOOST_CODE, 0, mapPayload);
84e0dac50fSopenharmony_ci#endif
85e0dac50fSopenharmony_ci    }
86e0dac50fSopenharmony_ci
87e0dac50fSopenharmony_ci    void RequestPerfIfNeed(WindowSizeChangeReason reason, WindowType type, WindowMode mode)
88e0dac50fSopenharmony_ci    {
89e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
90e0dac50fSopenharmony_ci        if (WindowHelper::IsMainFloatingWindow(type, mode) || WindowHelper::IsSplitWindowMode(mode)) {
91e0dac50fSopenharmony_ci            switch (reason) {
92e0dac50fSopenharmony_ci                case WindowSizeChangeReason::DRAG_END: {
93e0dac50fSopenharmony_ci                    if (windowDragBoost_) {
94e0dac50fSopenharmony_ci                        ClosePerf(PERF_DRAG_CODE);
95e0dac50fSopenharmony_ci                        windowDragBoost_ = false;
96e0dac50fSopenharmony_ci                    }
97e0dac50fSopenharmony_ci                    break;
98e0dac50fSopenharmony_ci                }
99e0dac50fSopenharmony_ci                case WindowSizeChangeReason::DRAG_START:
100e0dac50fSopenharmony_ci                    [[fallthrough]];
101e0dac50fSopenharmony_ci                case WindowSizeChangeReason::DRAG: {
102e0dac50fSopenharmony_ci                    RequestPerf(PERF_DRAG_CODE, PERF_TIME_OUT);
103e0dac50fSopenharmony_ci                    windowDragBoost_ = true;
104e0dac50fSopenharmony_ci                    break;
105e0dac50fSopenharmony_ci                }
106e0dac50fSopenharmony_ci                case WindowSizeChangeReason::MOVE: {
107e0dac50fSopenharmony_ci                    RequestPerf(PERF_MOVE_CODE, PERF_TIME_OUT);
108e0dac50fSopenharmony_ci                    windowMovingBoost_ = true;
109e0dac50fSopenharmony_ci                    break;
110e0dac50fSopenharmony_ci                }
111e0dac50fSopenharmony_ci                default: {
112e0dac50fSopenharmony_ci                    // doing nothing
113e0dac50fSopenharmony_ci                }
114e0dac50fSopenharmony_ci            }
115e0dac50fSopenharmony_ci        }
116e0dac50fSopenharmony_ci#endif
117e0dac50fSopenharmony_ci    }
118e0dac50fSopenharmony_ci
119e0dac50fSopenharmony_ci    void TrigSlide(WindowType type, bool isOn)
120e0dac50fSopenharmony_ci    {
121e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
122e0dac50fSopenharmony_ci        if (type == WindowType::WINDOW_TYPE_STATUS_BAR || type == WindowType::WINDOW_TYPE_PANEL) {
123e0dac50fSopenharmony_ci            StatusBarDrag(isOn);
124e0dac50fSopenharmony_ci        }
125e0dac50fSopenharmony_ci        if (type == WindowType::WINDOW_TYPE_DESKTOP || type == WindowType::WINDOW_TYPE_KEYGUARD) {
126e0dac50fSopenharmony_ci            Slide(isOn);
127e0dac50fSopenharmony_ci        }
128e0dac50fSopenharmony_ci#endif
129e0dac50fSopenharmony_ci    }
130e0dac50fSopenharmony_ciprivate:
131e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
132e0dac50fSopenharmony_ci    void StatusBarDrag(bool isOn)
133e0dac50fSopenharmony_ci    {
134e0dac50fSopenharmony_ci        static auto lastRequestPerfTime = std::chrono::steady_clock::now();
135e0dac50fSopenharmony_ci        static auto eventRunner = AppExecFwk::EventRunner::GetMainEventRunner();
136e0dac50fSopenharmony_ci        static auto handler = std::make_shared<AppExecFwk::EventHandler>(eventRunner);
137e0dac50fSopenharmony_ci        static auto task = []() {
138e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
139e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_STATUS_BAR_DRAG_CODE,
140e0dac50fSopenharmony_ci                1, mapPayload);
141e0dac50fSopenharmony_ci        };
142e0dac50fSopenharmony_ci        auto current = std::chrono::steady_clock::now();
143e0dac50fSopenharmony_ci        bool isTimeOut = std::chrono::duration_cast<std::chrono::milliseconds>(current - lastRequestPerfTime).
144e0dac50fSopenharmony_ci            count() > SLIDE_PERF_TIME_OUT;
145e0dac50fSopenharmony_ci        if (isTimeOut && isOn) {
146e0dac50fSopenharmony_ci            handler->RemoveTask(TASK_NAME);
147e0dac50fSopenharmony_ci            lastRequestPerfTime = current;
148e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
149e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_STATUS_BAR_DRAG_CODE,
150e0dac50fSopenharmony_ci                0, mapPayload);
151e0dac50fSopenharmony_ci        }
152e0dac50fSopenharmony_ci        if (!isOn) {
153e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
154e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_STATUS_BAR_DRAG_CODE,
155e0dac50fSopenharmony_ci                0, mapPayload);
156e0dac50fSopenharmony_ci            // 990 is the animation duration.
157e0dac50fSopenharmony_ci            handler->PostTask(task, TASK_NAME, 990, AppExecFwk::EventQueue::Priority::HIGH);
158e0dac50fSopenharmony_ci        }
159e0dac50fSopenharmony_ci    }
160e0dac50fSopenharmony_ci
161e0dac50fSopenharmony_ci    void Slide(bool isOn)
162e0dac50fSopenharmony_ci    {
163e0dac50fSopenharmony_ci        static auto lastRequestPerfTime = std::chrono::steady_clock::now();
164e0dac50fSopenharmony_ci        auto current = std::chrono::steady_clock::now();
165e0dac50fSopenharmony_ci        bool isTimeOut = std::chrono::duration_cast<std::chrono::milliseconds>(current - lastRequestPerfTime).
166e0dac50fSopenharmony_ci            count() > SLIDE_PERF_TIME_OUT;
167e0dac50fSopenharmony_ci        if (isTimeOut && isOn) {
168e0dac50fSopenharmony_ci            lastRequestPerfTime = current;
169e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
170e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_SLIDE_CODE,
171e0dac50fSopenharmony_ci                SlideEventStatus::SLIDE_EVENT_ON, mapPayload);
172e0dac50fSopenharmony_ci        }
173e0dac50fSopenharmony_ci        if (!isOn) {
174e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
175e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(PERF_SLIDE_CODE,
176e0dac50fSopenharmony_ci                SlideEventStatus::SLIDE_EVENT_OFF, mapPayload);
177e0dac50fSopenharmony_ci        }
178e0dac50fSopenharmony_ci    }
179e0dac50fSopenharmony_ci
180e0dac50fSopenharmony_ci    void RequestPerf(int32_t code, int64_t timeOut)
181e0dac50fSopenharmony_ci    {
182e0dac50fSopenharmony_ci        auto currentTime = std::chrono::steady_clock::now();
183e0dac50fSopenharmony_ci        bool isTimeOut = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - lastRequestPerfTime_).
184e0dac50fSopenharmony_ci            count() > timeOut;
185e0dac50fSopenharmony_ci        if (isTimeOut) {
186e0dac50fSopenharmony_ci            std::unordered_map<std::string, std::string> mapPayload;
187e0dac50fSopenharmony_ci            // 0 means doing action.
188e0dac50fSopenharmony_ci            OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(code, 0, mapPayload);
189e0dac50fSopenharmony_ci            lastRequestPerfTime_ = currentTime;
190e0dac50fSopenharmony_ci        }
191e0dac50fSopenharmony_ci    }
192e0dac50fSopenharmony_ci
193e0dac50fSopenharmony_ci    void ClosePerf(int32_t code)
194e0dac50fSopenharmony_ci    {
195e0dac50fSopenharmony_ci        std::unordered_map<std::string, std::string> mapPayload;
196e0dac50fSopenharmony_ci        // 1 means stop action.
197e0dac50fSopenharmony_ci        OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(code, 1, mapPayload);
198e0dac50fSopenharmony_ci    }
199e0dac50fSopenharmony_ci
200e0dac50fSopenharmony_ci    std::chrono::steady_clock::time_point lastRequestPerfTime_ = std::chrono::steady_clock::now();
201e0dac50fSopenharmony_ci    bool windowMovingBoost_ = false;
202e0dac50fSopenharmony_ci    bool windowDragBoost_ = false;
203e0dac50fSopenharmony_ci#endif
204e0dac50fSopenharmony_ci};
205e0dac50fSopenharmony_ci} // namespace Rosen
206e0dac50fSopenharmony_ci} // namespace OHOS
207e0dac50fSopenharmony_ci#endif // OHOS_ROSEN_RESSCHED_REPORT_H
208