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