• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "socperf_plugin.h"
17 #include "res_type.h"
18 #include "res_sched_log.h"
19 #include "plugin_mgr.h"
20 #include "config_info.h"
21 
22 namespace OHOS {
23 namespace ResourceSchedule {
24 using namespace ResType;
25 namespace {
26     const std::string LIB_NAME = "libsocperf_plugin.z.so";
27     const int32_t PERF_REQUEST_CMD_ID_APP_START             = 10000;
28     const int32_t PERF_REQUEST_CMD_ID_WARM_START            = 10001;
29     const int32_t PERF_REQUEST_CMD_ID_WINDOW_SWITCH         = 10002;
30     const int32_t PERF_REQUEST_CMD_ID_EVENT_CLICK           = 10006;
31     const int32_t PERF_REQUEST_CMD_ID_PUSH_PAGE_START       = 10007;
32     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE           = 10008;
33     const int32_t PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER      = 10009;
34     const int32_t PERF_REQUEST_CMD_ID_EVENT_TOUCH           = 10010;
35     const int32_t PERF_REQUEST_CMD_ID_PUSH_PAGE_COMPLETE    = 10011;
36     const int32_t PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE     = 10012;
37     const int32_t PERF_REQUEST_CMD_ID_POP_PAGE              = 10016;
38     const int32_t PERF_REQUEST_CMD_ID_RESIZE_WINDOW         = 10018;
39     const int32_t PERF_REQUEST_CMD_ID_MOVE_WINDOW           = 10019;
40 }
IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)41 IMPLEMENT_SINGLE_INSTANCE(SocPerfPlugin)
42 
43 void SocPerfPlugin::Init()
44 {
45     functionMap = {
46         { RES_TYPE_WINDOW_FOCUS,
47             [this](const std::shared_ptr<ResData>& data) { HandleWindowFocus(data); } },
48         { RES_TYPE_CLICK_RECOGNIZE,
49             [this](const std::shared_ptr<ResData>& data) { HandleEventClick(data); } },
50         { RES_TYPE_PUSH_PAGE,
51             [this](const std::shared_ptr<ResData>& data) { HandlePushPage(data); } },
52         { RES_TYPE_SLIDE_RECOGNIZE,
53             [this](const std::shared_ptr<ResData>& data) { HandleEventSlide(data); } },
54         { RES_TYPE_WEB_GESTURE,
55             [this](const std::shared_ptr<ResData>& data) { HandleEventWebGesture(data); } },
56         { RES_TYPE_POP_PAGE,
57             [this](const std::shared_ptr<ResData>& data) { HandlePopPage(data); } },
58         { RES_TYPE_APP_ABILITY_START,
59             [this](const std::shared_ptr<ResData>& data) { HandleAppAbilityStart(data); } },
60         { RES_TYPE_RESIZE_WINDOW,
61             [this](const std::shared_ptr<ResData>& data) { HandleResizeWindow(data); } },
62         { RES_TYPE_MOVE_WINDOW,
63             [this](const std::shared_ptr<ResData>& data) { HandleMoveWindow(data); } },
64         { RES_TYPE_SLIDE_NORMAL,
65             [this](const std::shared_ptr<ResData>& data) { HandleSlideNormal(data); } },
66     };
67     resTypes = {
68         RES_TYPE_WINDOW_FOCUS,
69         RES_TYPE_CLICK_RECOGNIZE,
70         RES_TYPE_PUSH_PAGE,
71         RES_TYPE_SLIDE_RECOGNIZE,
72         RES_TYPE_WEB_GESTURE,
73         RES_TYPE_POP_PAGE,
74         RES_TYPE_APP_ABILITY_START,
75         RES_TYPE_RESIZE_WINDOW,
76         RES_TYPE_MOVE_WINDOW,
77         RES_TYPE_SLIDE_NORMAL,
78     };
79     for (auto resType : resTypes) {
80         PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);
81     }
82     RESSCHED_LOGI("SocPerfPlugin::Init success");
83 }
84 
Disable()85 void SocPerfPlugin::Disable()
86 {
87     functionMap.clear();
88     for (auto resType : resTypes) {
89         PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);
90     }
91     resTypes.clear();
92     RESSCHED_LOGI("SocPerfPlugin::Disable success");
93 }
94 
DispatchResource(const std::shared_ptr<ResData> & data)95 void SocPerfPlugin::DispatchResource(const std::shared_ptr<ResData>& data)
96 {
97     auto funcIter = functionMap.find(data->resType);
98     if (funcIter != functionMap.end()) {
99         auto function = funcIter->second;
100         if (function) {
101             function(data);
102         }
103     }
104 }
105 
HandleAppAbilityStart(const std::shared_ptr<ResData> & data)106 void SocPerfPlugin::HandleAppAbilityStart(const std::shared_ptr<ResData>& data)
107 {
108     if (data->value == AppStartType::APP_COLD_START) {
109         RESSCHED_LOGI("SocPerfPlugin: socperf->APP_COLD_START");
110         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_APP_START, "");
111     } else if (data->value == AppStartType::APP_WARM_START) {
112         RESSCHED_LOGI("SocPerfPlugin: socperf->APP_WARM_START");
113         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WARM_START, "");
114     }
115 }
116 
HandleWindowFocus(const std::shared_ptr<ResData> & data)117 void SocPerfPlugin::HandleWindowFocus(const std::shared_ptr<ResData>& data)
118 {
119     if (data->value == WindowFocusStatus::WINDOW_FOCUS) {
120         RESSCHED_LOGI("SocPerfPlugin: socperf->WINDOW_SWITCH");
121         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_WINDOW_SWITCH, "");
122     }
123 }
124 
HandleEventClick(const std::shared_ptr<ResData> & data)125 void SocPerfPlugin::HandleEventClick(const std::shared_ptr<ResData>& data)
126 {
127     RESSCHED_LOGI("SocPerfPlugin: socperf->EVENT_CLICK: %{public}lld", (long long)data->value);
128     if (data->value == ClickEventType::TOUCH_EVENT) {
129         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_TOUCH, "");
130     } else if (data->value == ClickEventType::CLICK_EVENT) {
131         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_CLICK, "");
132     }
133 }
134 
HandlePushPage(const std::shared_ptr<ResData> & data)135 void SocPerfPlugin::HandlePushPage(const std::shared_ptr<ResData>& data)
136 {
137     if (data->value == PUSH_PAGE_START) {
138         RESSCHED_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_START");
139         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_PUSH_PAGE_START, true, "");
140     } else if (data->value == PUSH_PAGE_COMPLETE) {
141         RESSCHED_LOGI("SocPerfPlugin: socperf->PUSH_PAGE_COMPLETE");
142         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_PUSH_PAGE_START, false, "");
143         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_PUSH_PAGE_COMPLETE, "");
144     }
145 }
146 
HandlePopPage(const std::shared_ptr<ResData> & data)147 void SocPerfPlugin::HandlePopPage(const std::shared_ptr<ResData>& data)
148 {
149     RESSCHED_LOGI("SocPerfPlugin: socperf->POP_PAGE: %{public}lld", (long long)data->value);
150     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_POP_PAGE, "");
151 }
152 
HandleEventSlide(const std::shared_ptr<ResData> & data)153 void SocPerfPlugin::HandleEventSlide(const std::shared_ptr<ResData>& data)
154 {
155     RESSCHED_LOGI("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
156     if (data->value == SlideEventStatus::SLIDE_EVENT_ON) {
157         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, true, "");
158     } else if (data->value == SlideEventStatus::SLIDE_EVENT_OFF) {
159         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE, false, "");
160         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, "");
161     }
162 }
163 
HandleEventWebGesture(const std::shared_ptr<ResData> & data)164 void SocPerfPlugin::HandleEventWebGesture(const std::shared_ptr<ResData>& data)
165 {
166     RESSCHED_LOGI("SocPerfPlugin: socperf->WEB_GESTURE: %{public}lld", (long long)data->value);
167     OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_WEB_GESTURE, true, "");
168 }
169 
HandleResizeWindow(const std::shared_ptr<ResData> & data)170 void SocPerfPlugin::HandleResizeWindow(const std::shared_ptr<ResData>& data)
171 {
172     if (data == nullptr) {
173         return;
174     }
175     RESSCHED_LOGI("SocPerfPlugin: socperf->RESIZE_WINDOW: %{public}lld", (long long)data->value);
176     if (data->value == WindowResizeType::WINDOW_RESIZING) {
177         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, "");
178     } else if (data->value == WindowResizeType::WINDOW_RESIZE_STOP) {
179         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_RESIZE_WINDOW, false, "");
180     }
181 }
182 
HandleMoveWindow(const std::shared_ptr<ResData> & data)183 void SocPerfPlugin::HandleMoveWindow(const std::shared_ptr<ResData>& data)
184 {
185     if (data == nullptr) {
186         return;
187     }
188     RESSCHED_LOGI("SocPerfPlugin: socperf->MOVE_WINDOW: %{public}lld", (long long)data->value);
189     if (data->value == WindowMoveType::WINDOW_MOVING) {
190         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_MOVE_WINDOW, "");
191     } else if (data->value == WindowMoveType::WINDOW_MOVE_STOP) {
192         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_MOVE_WINDOW, false, "");
193     }
194 }
195 
HandleSlideNormal(const std::shared_ptr<ResData> & data)196 void SocPerfPlugin::HandleSlideNormal(const std::shared_ptr<ResData>& data)
197 {
198     if (data == nullptr) {
199         return;
200     }
201     RESSCHED_LOGI("SocPerfPlugin: socperf->SLIDE_NORMAL: %{public}lld", (long long)data->value);
202     if (data->value == SlideNormalStatus::SLIDE_NORMAL_BEGIN) {
203         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequest(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, "");
204     } else if (data->value == SlideNormalStatus::SLIDE_NORMAL_END) {
205         OHOS::SOCPERF::SocPerfClient::GetInstance().PerfRequestEx(PERF_REQUEST_CMD_ID_EVENT_SLIDE_OVER, false, "");
206     }
207 }
208 
OnPluginInit(std::string & libName)209 extern "C" bool OnPluginInit(std::string& libName)
210 {
211     if (libName != LIB_NAME) {
212         RESSCHED_LOGE("SocPerfPlugin::OnPluginInit lib name is not match");
213         return false;
214     }
215     SocPerfPlugin::GetInstance().Init();
216     return true;
217 }
218 
OnPluginDisable()219 extern "C" void OnPluginDisable()
220 {
221     SocPerfPlugin::GetInstance().Disable();
222 }
223 
OnDispatchResource(const std::shared_ptr<ResData> & data)224 extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
225 {
226     SocPerfPlugin::GetInstance().DispatchResource(data);
227 }
228 } // namespace ResourceSchedule
229 } // namespace OHOS
230