1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci
16020a203aSopenharmony_ci#include "AppLaunchMonitor.h"
17020a203aSopenharmony_ci#include "AppLaunchMonitorConverter.h"
18020a203aSopenharmony_ci#include "ActionId.h"
19020a203aSopenharmony_ci#include "JlogId.h"
20020a203aSopenharmony_ci#include "hiview_logger.h"
21020a203aSopenharmony_ci
22020a203aSopenharmony_cinamespace OHOS {
23020a203aSopenharmony_cinamespace HiviewDFX {
24020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance");
25020a203aSopenharmony_ci
26020a203aSopenharmony_ciusing AppStartCheckPointData = IAppLaunchSceneDataProcessor::AppStartCheckPointData;
27020a203aSopenharmony_ci
28020a203aSopenharmony_ciAppLaunchMonitor::AppLaunchMonitor(IMonitorRegistry* registry, IAppThrExecutor* exec, IAppStartReporter* reporter,
29020a203aSopenharmony_ci                                   IAppLaunchSceneDataProcessor* scene)
30020a203aSopenharmony_ci{
31020a203aSopenharmony_ci    this->registry = registry;
32020a203aSopenharmony_ci    this->exec = exec;
33020a203aSopenharmony_ci    this->reporter = reporter;
34020a203aSopenharmony_ci    this->scene = scene;
35020a203aSopenharmony_ci    this->actionId = APP_START;
36020a203aSopenharmony_ci}
37020a203aSopenharmony_ci
38020a203aSopenharmony_civoid AppLaunchMonitor::HandleEvt(std::shared_ptr<XperfEvt> evt)
39020a203aSopenharmony_ci{
40020a203aSopenharmony_ci    HIVIEW_LOGI("AppLaunchMonitor::HandleEvt");
41020a203aSopenharmony_ci    if (exec != nullptr) {
42020a203aSopenharmony_ci        IAppThrExecutor::AppEvtData appEvtData = AppLaunchMonitorConverter::ConvertXperfEvtToAppEvtData(*evt.get());
43020a203aSopenharmony_ci        exec->ExecuteHandleEvtInMainThr(this, appEvtData);
44020a203aSopenharmony_ci    } else {
45020a203aSopenharmony_ci        HIVIEW_LOGE("[AppLaunchMonitor::HandleEvt] exec is null");
46020a203aSopenharmony_ci    }
47020a203aSopenharmony_ci}
48020a203aSopenharmony_ci
49020a203aSopenharmony_civoid AppLaunchMonitor::ExecuteProcessAppEvtTaskInMainThr(const IAppThrExecutor::AppEvtData& data)
50020a203aSopenharmony_ci{
51020a203aSopenharmony_ci    HIVIEW_LOGI("AppLaunchMonitor::ExecuteProcessAppEvtTaskInMainThr");
52020a203aSopenharmony_ci    try {
53020a203aSopenharmony_ci        AppStartCheckPointData cpData = AppLaunchMonitorConverter::ConvertAppEvtDataToCheckPointData(data);
54020a203aSopenharmony_ci        if (scene != nullptr) {
55020a203aSopenharmony_ci            scene->ProcessSceneData(cpData);
56020a203aSopenharmony_ci        } else {
57020a203aSopenharmony_ci            HIVIEW_LOGE("[AppLaunchMonitor::ExecuteProcessAppEvtTaskInMainThr] scene is null");
58020a203aSopenharmony_ci        }
59020a203aSopenharmony_ci    } catch (std::logic_error& ex) {
60020a203aSopenharmony_ci        HIVIEW_LOGD("exception error:%{public}s", std::string(ex.what()).c_str());
61020a203aSopenharmony_ci    }
62020a203aSopenharmony_ci}
63020a203aSopenharmony_ci
64020a203aSopenharmony_civoid AppLaunchMonitor::ReportMetrics(const AppStartMetrics& metrics)
65020a203aSopenharmony_ci{
66020a203aSopenharmony_ci    HIVIEW_LOGI("AppLaunchMonitor::ReportMetrics");
67020a203aSopenharmony_ci    try {
68020a203aSopenharmony_ci        ReportNormal(metrics);
69020a203aSopenharmony_ci    } catch (std::logic_error& ex) {
70020a203aSopenharmony_ci        HIVIEW_LOGE("ReportMetrics error: %{public}s", std::string(ex.what()).c_str());
71020a203aSopenharmony_ci    }
72020a203aSopenharmony_ci}
73020a203aSopenharmony_ci
74020a203aSopenharmony_civoid AppLaunchMonitor::ReportNormal(const AppStartMetrics& metrics)
75020a203aSopenharmony_ci{
76020a203aSopenharmony_ci    HIVIEW_LOGI("AppLaunchMonitor::ReportNormal");
77020a203aSopenharmony_ci    if (reporter == nullptr) {
78020a203aSopenharmony_ci        HIVIEW_LOGE("reporter is null.");
79020a203aSopenharmony_ci        return;
80020a203aSopenharmony_ci    }
81020a203aSopenharmony_ci    AppStartReportEvent reportEvent = ConstructReportEvent(metrics);
82020a203aSopenharmony_ci    reporter->ReportNormal(reportEvent);
83020a203aSopenharmony_ci}
84020a203aSopenharmony_ci
85020a203aSopenharmony_ci
86020a203aSopenharmony_ciAppStartReportEvent AppLaunchMonitor::ConstructReportEvent(const AppStartMetrics& metrics)
87020a203aSopenharmony_ci{
88020a203aSopenharmony_ci    AppStartReportEvent re = AppLaunchMonitorConverter::ConvertMetricToReportEvent(metrics);
89020a203aSopenharmony_ci    return re;
90020a203aSopenharmony_ci}
91020a203aSopenharmony_ci} // HiviewDFX
92020a203aSopenharmony_ci} // OHOS