1190978c3Sopenharmony_ci/*
2190978c3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3190978c3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4190978c3Sopenharmony_ci * you may not use this file except in compliance with the License.
5190978c3Sopenharmony_ci * You may obtain a copy of the License at
6190978c3Sopenharmony_ci *
7190978c3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8190978c3Sopenharmony_ci *
9190978c3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10190978c3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11190978c3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12190978c3Sopenharmony_ci * See the License for the specific language governing permissions and
13190978c3Sopenharmony_ci * limitations under the License.
14190978c3Sopenharmony_ci */
15190978c3Sopenharmony_ci
16190978c3Sopenharmony_ci#include "firmware_manager.h"
17190978c3Sopenharmony_ci
18190978c3Sopenharmony_ci#include <cstdlib>
19190978c3Sopenharmony_ci#include <thread>
20190978c3Sopenharmony_ci
21190978c3Sopenharmony_ci#include "config_parse.h"
22190978c3Sopenharmony_ci#include "dupdate_errno.h"
23190978c3Sopenharmony_ci#include "dupdate_upgrade_helper.h"
24190978c3Sopenharmony_ci#ifdef NETMANAGER_BASE_ENABLE
25190978c3Sopenharmony_ci#include "dupdate_net_manager.h"
26190978c3Sopenharmony_ci#endif
27190978c3Sopenharmony_ci#include "file_utils.h"
28190978c3Sopenharmony_ci#include "firmware_callback_utils.h"
29190978c3Sopenharmony_ci#include "firmware_changelog_utils.h"
30190978c3Sopenharmony_ci#include "firmware_common.h"
31190978c3Sopenharmony_ci#include "firmware_constant.h"
32190978c3Sopenharmony_ci#include "firmware_database.h"
33190978c3Sopenharmony_ci#include "firmware_event_listener.h"
34190978c3Sopenharmony_ci#include "firmware_flow_manager.h"
35190978c3Sopenharmony_ci#include "firmware_iexecute_mode.h"
36190978c3Sopenharmony_ci#include "firmware_log.h"
37190978c3Sopenharmony_ci#include "firmware_manual_check_mode.h"
38190978c3Sopenharmony_ci#include "firmware_download_mode.h"
39190978c3Sopenharmony_ci#include "firmware_install_apply_mode.h"
40190978c3Sopenharmony_ci#include "firmware_status_cache.h"
41190978c3Sopenharmony_ci#include "firmware_task_operator.h"
42190978c3Sopenharmony_ci#include "firmware_update_helper.h"
43190978c3Sopenharmony_ci#include "progress_thread.h"
44190978c3Sopenharmony_ci#include "schedule_task.h"
45190978c3Sopenharmony_ci#include "startup_schedule.h"
46190978c3Sopenharmony_ci#include "string_utils.h"
47190978c3Sopenharmony_ci#include "time_utils.h"
48190978c3Sopenharmony_ci
49190978c3Sopenharmony_cinamespace OHOS {
50190978c3Sopenharmony_cinamespace UpdateEngine {
51190978c3Sopenharmony_ciconstexpr int32_t INIT_DELAY_TIME = 5; // 进程启动延时时间5秒,为了安装重启之后可以看到版本号及时刷新
52190978c3Sopenharmony_ciconstexpr int32_t PROCESS_EXIT_DELAY_TIME = 1; // 进程退出等待时间,单位:秒
53190978c3Sopenharmony_ciconstexpr uint64_t PULLUP_AFTER_TERMINATE_INTERVAL = 5; // 终止升级后SA拉起间隔
54190978c3Sopenharmony_ci
55190978c3Sopenharmony_ciFirmwareManager::FirmwareManager() {}
56190978c3Sopenharmony_ci
57190978c3Sopenharmony_ciFirmwareManager::~FirmwareManager()
58190978c3Sopenharmony_ci{
59190978c3Sopenharmony_ci    DelayedSingleton<FirmwareEventListener>::GetInstance()->UnregisterNetChangedListener();
60190978c3Sopenharmony_ci}
61190978c3Sopenharmony_ci
62190978c3Sopenharmony_civoid FirmwareManager::Init(StartupReason startupReason)
63190978c3Sopenharmony_ci{
64190978c3Sopenharmony_ci    DelayedSingleton<ConfigParse>::GetInstance()->LoadConfigInfo(); // 启动读取配置信息
65190978c3Sopenharmony_ci    FIRMWARE_LOGI("FirmwareManager Init");
66190978c3Sopenharmony_ci
67190978c3Sopenharmony_ci    // 当StartupReason为PROCESS_ENV_RESET时, 会进行以下处理:
68190978c3Sopenharmony_ci    // 1. 删除Firmware目录(FIRMWARE_DIR_INFOS)中的所有允许删除的目录中的所有文件及子目录
69190978c3Sopenharmony_ci    // 2. 清空Firmware SP(FirmwarePreferencesUtil)中所有记录
70190978c3Sopenharmony_ci    // 3. 删除数据库(FirmwareDatabase/DownloadDatabase
71190978c3Sopenharmony_ci    if (startupReason == StartupReason::PROCESS_ENV_RESET) {
72190978c3Sopenharmony_ci        FileUtils::DestroyBaseDirectory(FIRMWARE_DIR_INFOS);
73190978c3Sopenharmony_ci        preferencesUtil_->RemoveAll();
74190978c3Sopenharmony_ci        DelayedSingleton<FirmwareDatabase>::GetInstance()->DeleteDbStore();
75190978c3Sopenharmony_ci    }
76190978c3Sopenharmony_ci    FileUtils::InitAndCreateBaseDirs(FIRMWARE_DIR_INFOS);
77190978c3Sopenharmony_ci
78190978c3Sopenharmony_ci    std::thread initThread([this, startupReason] { this->DelayInit(startupReason); });
79190978c3Sopenharmony_ci    initThread.detach();
80190978c3Sopenharmony_ci}
81190978c3Sopenharmony_ci
82190978c3Sopenharmony_civoid FirmwareManager::DelayInit(StartupReason startupReason)
83190978c3Sopenharmony_ci{
84190978c3Sopenharmony_ci    FIRMWARE_LOGI("FirmwareManager DelayInit startupReason %{public}d", startupReason);
85190978c3Sopenharmony_ci    RestoreUpdate();
86190978c3Sopenharmony_ci    DelayedSingleton<FirmwareEventListener>::GetInstance()->RegisterNetChangedListener();
87190978c3Sopenharmony_ci
88190978c3Sopenharmony_ci    auto eventType = CommonEventType::PROCESS_INIT;
89190978c3Sopenharmony_ci    if (startupReason == StartupReason::DEVICE_REBOOT) {
90190978c3Sopenharmony_ci        // 重启启动,延时5秒,等待系统初始化完再恢复周期提醒alarm | 执行升级结果判断  避免出现通知hap拉不起的问题
91190978c3Sopenharmony_ci        sleep(INIT_DELAY_TIME);
92190978c3Sopenharmony_ci        eventType = CommonEventType::BOOT_COMPLETE;
93190978c3Sopenharmony_ci    }
94190978c3Sopenharmony_ci
95190978c3Sopenharmony_ci    // 以下两种情况会向OUC发送初始启动消息:
96190978c3Sopenharmony_ci    // 1. DUE启动原因为StartupReason::PROCESS_ENV_RESET,DUE缓存数据清空
97190978c3Sopenharmony_ci    // 2. DUE首次启动,还未向OUC发送过初始启动消息
98190978c3Sopenharmony_ci    NotifyInitEvent();
99190978c3Sopenharmony_ci
100190978c3Sopenharmony_ci    // 处理 设备重启/进程初始化 事件
101190978c3Sopenharmony_ci    HandleEvent(eventType);
102190978c3Sopenharmony_ci}
103190978c3Sopenharmony_ci
104190978c3Sopenharmony_civoid FirmwareManager::RestoreUpdate()
105190978c3Sopenharmony_ci{
106190978c3Sopenharmony_ci    FirmwareTask firmwareTask;
107190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(firmwareTask);
108190978c3Sopenharmony_ci    FIRMWARE_LOGI("RestoreUpdate status: %{public}d", firmwareTask.status);
109190978c3Sopenharmony_ci    if (firmwareTask.status == UpgradeStatus::DOWNLOAD_PAUSE) {
110190978c3Sopenharmony_ci        HandleBootDownloadPauseStatusProcess(firmwareTask);
111190978c3Sopenharmony_ci        return;
112190978c3Sopenharmony_ci    }
113190978c3Sopenharmony_ci    if (firmwareTask.status == UpgradeStatus::DOWNLOADING) {
114190978c3Sopenharmony_ci        HandleBootDownloadOnStatusProcess(firmwareTask);
115190978c3Sopenharmony_ci        return;
116190978c3Sopenharmony_ci    }
117190978c3Sopenharmony_ci    if (firmwareTask.status == UpgradeStatus::DOWNLOAD_SUCCESS) {
118190978c3Sopenharmony_ci        HandleBootDownloadedStatusProcess(firmwareTask);
119190978c3Sopenharmony_ci        return;
120190978c3Sopenharmony_ci    }
121190978c3Sopenharmony_ci
122190978c3Sopenharmony_ci    if (firmwareTask.status == UpgradeStatus::INSTALLING) {
123190978c3Sopenharmony_ci        HandleBootInstallOnStatusProcess(firmwareTask);
124190978c3Sopenharmony_ci        return;
125190978c3Sopenharmony_ci    }
126190978c3Sopenharmony_ci}
127190978c3Sopenharmony_ci
128190978c3Sopenharmony_cibool FirmwareManager::IsIdle()
129190978c3Sopenharmony_ci{
130190978c3Sopenharmony_ci    if (DelayedSingleton<FirmwareStatusCache>::GetInstance()->IsChecking()) {
131190978c3Sopenharmony_ci        FIRMWARE_LOGI("FirmwareManager IsIdle checking");
132190978c3Sopenharmony_ci        return false;
133190978c3Sopenharmony_ci    }
134190978c3Sopenharmony_ci
135190978c3Sopenharmony_ci    FirmwareTask task;
136190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
137190978c3Sopenharmony_ci    bool isIdle = !task.isExistTask;
138190978c3Sopenharmony_ci    FIRMWARE_LOGI("FirmwareManager IsIdle:%{public}s", StringUtils::GetBoolStr(isIdle).c_str());
139190978c3Sopenharmony_ci    return isIdle;
140190978c3Sopenharmony_ci}
141190978c3Sopenharmony_ci
142190978c3Sopenharmony_cistd::vector<ScheduleTask> FirmwareManager::GetScheduleTasks()
143190978c3Sopenharmony_ci{
144190978c3Sopenharmony_ci    ScheduleTask scheduleTask;
145190978c3Sopenharmony_ci    return {scheduleTask};
146190978c3Sopenharmony_ci}
147190978c3Sopenharmony_ci
148190978c3Sopenharmony_cibool FirmwareManager::Exit()
149190978c3Sopenharmony_ci{
150190978c3Sopenharmony_ci    FIRMWARE_LOGI("FirmwareManager Exit");
151190978c3Sopenharmony_ci    return true;
152190978c3Sopenharmony_ci}
153190978c3Sopenharmony_ci
154190978c3Sopenharmony_civoid FirmwareManager::DoCancelDownload(BusinessError &businessError)
155190978c3Sopenharmony_ci{
156190978c3Sopenharmony_ci    FirmwareTask task;
157190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
158190978c3Sopenharmony_ci    if (!task.isExistTask) {
159190978c3Sopenharmony_ci        FIRMWARE_LOGI("DoCancelDownload no task");
160190978c3Sopenharmony_ci        businessError.Build(CallResult::FAIL, "no download task to cancel!");
161190978c3Sopenharmony_ci        businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_DOWNLOAD_COMMON_ERROR), "no download task to cancel!");
162190978c3Sopenharmony_ci        return;
163190978c3Sopenharmony_ci    }
164190978c3Sopenharmony_ci    ProgressThread::isCancel_ = true;
165190978c3Sopenharmony_ci    return;
166190978c3Sopenharmony_ci}
167190978c3Sopenharmony_ci
168190978c3Sopenharmony_civoid FirmwareManager::DoTerminateUpgrade(BusinessError &businessError)
169190978c3Sopenharmony_ci{
170190978c3Sopenharmony_ci    ScheduleTask scheduleTask;
171190978c3Sopenharmony_ci    scheduleTask.startupReason = StartupReason::PROCESS_ENV_RESET;
172190978c3Sopenharmony_ci    scheduleTask.minDelayTime = PULLUP_AFTER_TERMINATE_INTERVAL;
173190978c3Sopenharmony_ci    if (!DelayedSingleton<StartupSchedule>::GetInstance()->Schedule(scheduleTask)) {
174190978c3Sopenharmony_ci        FIRMWARE_LOGE("DoTerminateUpgrade fail");
175190978c3Sopenharmony_ci        businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_INTERNAL_ERROR), "terminate upgrade error!");
176190978c3Sopenharmony_ci        return;
177190978c3Sopenharmony_ci    }
178190978c3Sopenharmony_ci
179190978c3Sopenharmony_ci    // 主线程拉起子线程之后向OUC返回回调结果,子线程sleep 1秒之后,DUE进程退出
180190978c3Sopenharmony_ci    auto execFunc = []() {
181190978c3Sopenharmony_ci        sleep(PROCESS_EXIT_DELAY_TIME);
182190978c3Sopenharmony_ci        _Exit(0);
183190978c3Sopenharmony_ci    };
184190978c3Sopenharmony_ci    std::thread th = std::thread(execFunc);
185190978c3Sopenharmony_ci    th.detach();
186190978c3Sopenharmony_ci}
187190978c3Sopenharmony_ci
188190978c3Sopenharmony_civoid FirmwareManager::DoCheck(OnCheckComplete onCheckComplete)
189190978c3Sopenharmony_ci{
190190978c3Sopenharmony_ci    auto *flowManager = new FirmwareFlowManager();
191190978c3Sopenharmony_ci    std::shared_ptr<FirmwareIExecuteMode> executeMode =
192190978c3Sopenharmony_ci        std::make_shared<FirmwareManualCheckMode>([=](BusinessError &businessError, CheckResult &checkResult) {
193190978c3Sopenharmony_ci            FIRMWARE_LOGI("FirmwareManager DoCheck newVersionInfoResult");
194190978c3Sopenharmony_ci            onCheckComplete(businessError, checkResult);
195190978c3Sopenharmony_ci            delete flowManager;
196190978c3Sopenharmony_ci        });
197190978c3Sopenharmony_ci    flowManager->SetExecuteMode(executeMode);
198190978c3Sopenharmony_ci    flowManager->Start();
199190978c3Sopenharmony_ci}
200190978c3Sopenharmony_ci
201190978c3Sopenharmony_civoid FirmwareManager::DoDownload(const DownloadOptions &downloadOptions, BusinessError &businessError)
202190978c3Sopenharmony_ci{
203190978c3Sopenharmony_ci    auto *flowManager = new FirmwareFlowManager();
204190978c3Sopenharmony_ci    std::shared_ptr<FirmwareIExecuteMode> executeMode =
205190978c3Sopenharmony_ci        std::make_shared<FirmwareDownloadMode>(downloadOptions, businessError, [=]() {
206190978c3Sopenharmony_ci            FIRMWARE_LOGI("FirmwareManager DoDownload finish");
207190978c3Sopenharmony_ci            delete flowManager;
208190978c3Sopenharmony_ci        });
209190978c3Sopenharmony_ci    flowManager->SetExecuteMode(executeMode);
210190978c3Sopenharmony_ci    flowManager->Start();
211190978c3Sopenharmony_ci}
212190978c3Sopenharmony_ci
213190978c3Sopenharmony_cibool FirmwareManager::CanInstall(void)
214190978c3Sopenharmony_ci{
215190978c3Sopenharmony_ci    FirmwareTask task;
216190978c3Sopenharmony_ci    FirmwareTaskOperator firmwareTaskOperator;
217190978c3Sopenharmony_ci    firmwareTaskOperator.QueryTask(task);
218190978c3Sopenharmony_ci    FIRMWARE_LOGI("check can install task.status:%{public}d", CAST_INT(task.status));
219190978c3Sopenharmony_ci    if (FirmwareUpdateHelper::GetInstallType() == InstallType::SYS_INSTALLER) {
220190978c3Sopenharmony_ci        return task.status == UpgradeStatus::DOWNLOAD_SUCCESS || task.status == UpgradeStatus::INSTALL_SUCCESS;
221190978c3Sopenharmony_ci    } else {
222190978c3Sopenharmony_ci        return task.status == UpgradeStatus::DOWNLOAD_SUCCESS;
223190978c3Sopenharmony_ci    }
224190978c3Sopenharmony_ci}
225190978c3Sopenharmony_ci
226190978c3Sopenharmony_civoid FirmwareManager::DoInstall(const UpgradeOptions &upgradeOptions, BusinessError &businessError,
227190978c3Sopenharmony_ci    InstallType installType)
228190978c3Sopenharmony_ci{
229190978c3Sopenharmony_ci    FIRMWARE_LOGI("FirmwareManager DoInstall upgradeOptions order:%{public}d, installType = %{public}d",
230190978c3Sopenharmony_ci        CAST_INT(upgradeOptions.order), CAST_INT(installType));
231190978c3Sopenharmony_ci    if (!CanInstall()) {
232190978c3Sopenharmony_ci        FIRMWARE_LOGI("status can not Install");
233190978c3Sopenharmony_ci        return;
234190978c3Sopenharmony_ci    }
235190978c3Sopenharmony_ci    FirmwareFlowManager *flowManager = new FirmwareFlowManager();
236190978c3Sopenharmony_ci    std::shared_ptr<FirmwareIExecuteMode> executeMode =
237190978c3Sopenharmony_ci        std::make_shared<FirmwareInstallApplyMode>(upgradeOptions, businessError, installType, [=]() {
238190978c3Sopenharmony_ci            FIRMWARE_LOGI("FirmwareManager DoInstall finish");
239190978c3Sopenharmony_ci        });
240190978c3Sopenharmony_ci    flowManager->SetExecuteMode(executeMode);
241190978c3Sopenharmony_ci    flowManager->Start();
242190978c3Sopenharmony_ci}
243190978c3Sopenharmony_ci
244190978c3Sopenharmony_civoid FirmwareManager::DoAutoDownloadSwitchChanged(bool isDownloadSwitchOn)
245190978c3Sopenharmony_ci{
246190978c3Sopenharmony_ci    FIRMWARE_LOGI("DoAutoDownloadSwitchChanged isDownloadSwitchOn %{public}s", isDownloadSwitchOn ? "on" : "off");
247190978c3Sopenharmony_ci    preferencesUtil_->SaveBool(Firmware::AUTO_DOWNLOAD_SWITCH, isDownloadSwitchOn);
248190978c3Sopenharmony_ci    FirmwareTask task;
249190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
250190978c3Sopenharmony_ci    if (!task.isExistTask) {
251190978c3Sopenharmony_ci        FIRMWARE_LOGI("DoAutoDownloadSwitchChanged no task");
252190978c3Sopenharmony_ci        return;
253190978c3Sopenharmony_ci    }
254190978c3Sopenharmony_ci    FIRMWARE_LOGI("DoAutoDownloadSwitchChanged current task status %{public}d", task.status);
255190978c3Sopenharmony_ci    // 当前是否有搜索完待下载的包
256190978c3Sopenharmony_ci    if (task.status != UpgradeStatus::CHECK_VERSION_SUCCESS) {
257190978c3Sopenharmony_ci        return;
258190978c3Sopenharmony_ci    }
259190978c3Sopenharmony_ci    if (!isDownloadSwitchOn) {
260190978c3Sopenharmony_ci        // 开关关,发送新版本通知
261190978c3Sopenharmony_ci        DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
262190978c3Sopenharmony_ci            task.taskId, EventId::EVENT_DOWNLOAD_WAIT, UpgradeStatus::CHECK_VERSION_SUCCESS);
263190978c3Sopenharmony_ci    }
264190978c3Sopenharmony_ci}
265190978c3Sopenharmony_ci
266190978c3Sopenharmony_civoid FirmwareManager::DoClearError(BusinessError &businessError)
267190978c3Sopenharmony_ci{
268190978c3Sopenharmony_ci    FirmwareTask task;
269190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
270190978c3Sopenharmony_ci    if (!task.isExistTask) {
271190978c3Sopenharmony_ci        FIRMWARE_LOGI("DoClearError has no task");
272190978c3Sopenharmony_ci        return;
273190978c3Sopenharmony_ci    }
274190978c3Sopenharmony_ci    if (!FirmwareUpdateHelper::IsUpgradeFailed(task.status)) {
275190978c3Sopenharmony_ci        businessError.Build(CallResult::FAIL, "please check status before clear error");
276190978c3Sopenharmony_ci        businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_UPDATE_COMMON_ERROR),
277190978c3Sopenharmony_ci            "please check status before clear error");
278190978c3Sopenharmony_ci        return;
279190978c3Sopenharmony_ci    }
280190978c3Sopenharmony_ci    FirmwareUpdateHelper::ClearFirmwareInfo();
281190978c3Sopenharmony_ci}
282190978c3Sopenharmony_ci
283190978c3Sopenharmony_civoid FirmwareManager::HandleEvent(CommonEventType event)
284190978c3Sopenharmony_ci{
285190978c3Sopenharmony_ci    FIRMWARE_LOGI("handleEvent event %{public}d", static_cast<uint32_t>(event));
286190978c3Sopenharmony_ci    switch (event) {
287190978c3Sopenharmony_ci        case CommonEventType::NET_CHANGED:
288190978c3Sopenharmony_ci            HandleNetChanged();
289190978c3Sopenharmony_ci            break;
290190978c3Sopenharmony_ci        case CommonEventType::BOOT_COMPLETE:
291190978c3Sopenharmony_ci            HandleBootComplete();
292190978c3Sopenharmony_ci            break;
293190978c3Sopenharmony_ci        default:
294190978c3Sopenharmony_ci            break;
295190978c3Sopenharmony_ci    }
296190978c3Sopenharmony_ci}
297190978c3Sopenharmony_ci
298190978c3Sopenharmony_civoid FirmwareManager::HandleBootComplete()
299190978c3Sopenharmony_ci{
300190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootComplete");
301190978c3Sopenharmony_ci    FirmwareTask task;
302190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
303190978c3Sopenharmony_ci    if (!task.isExistTask) {
304190978c3Sopenharmony_ci        FIRMWARE_LOGI("HandleBootComplete has no task");
305190978c3Sopenharmony_ci        return;
306190978c3Sopenharmony_ci    }
307190978c3Sopenharmony_ci
308190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootComplete status %{public}d", CAST_INT(task.status));
309190978c3Sopenharmony_ci    if (task.status == UpgradeStatus::UPDATING) {
310190978c3Sopenharmony_ci        HandleBootUpdateOnStatusProcess(task);
311190978c3Sopenharmony_ci        return;
312190978c3Sopenharmony_ci    }
313190978c3Sopenharmony_ci}
314190978c3Sopenharmony_ci
315190978c3Sopenharmony_civoid FirmwareManager::HandleNetChanged()
316190978c3Sopenharmony_ci{
317190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleNetChanged");
318190978c3Sopenharmony_ci    #ifdef NETMANAGER_BASE_ENABLE
319190978c3Sopenharmony_ci    if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable()) {
320190978c3Sopenharmony_ci        FIRMWARE_LOGE("HandleNetChanged network not available.");
321190978c3Sopenharmony_ci        ProgressThread::isNoNet_ = true;
322190978c3Sopenharmony_ci        return;
323190978c3Sopenharmony_ci    }
324190978c3Sopenharmony_ci
325190978c3Sopenharmony_ci    ProgressThread::isNoNet_ = false;
326190978c3Sopenharmony_ci    FirmwareTask task;
327190978c3Sopenharmony_ci    FirmwareTaskOperator().QueryTask(task);
328190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleNetChanged status %{public}d", task.status);
329190978c3Sopenharmony_ci
330190978c3Sopenharmony_ci    if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable(NetType::NOT_METERED_WIFI)) {
331190978c3Sopenharmony_ci        return;
332190978c3Sopenharmony_ci    }
333190978c3Sopenharmony_ci
334190978c3Sopenharmony_ci    if (task.status == UpgradeStatus::DOWNLOAD_PAUSE) {
335190978c3Sopenharmony_ci        HandleResumeDownload(task);
336190978c3Sopenharmony_ci        return;
337190978c3Sopenharmony_ci    }
338190978c3Sopenharmony_ci
339190978c3Sopenharmony_ci    if (task.status == UpgradeStatus::CHECK_VERSION_SUCCESS) {
340190978c3Sopenharmony_ci        bool isDownloadSwitchOn = preferencesUtil_->ObtainBool(Firmware::AUTO_DOWNLOAD_SWITCH, false);
341190978c3Sopenharmony_ci        FIRMWARE_LOGI("HandleNetChanged isDownloadSwitchOn %{public}s",
342190978c3Sopenharmony_ci            StringUtils::GetBoolStr(isDownloadSwitchOn).c_str());
343190978c3Sopenharmony_ci        if (isDownloadSwitchOn) {
344190978c3Sopenharmony_ci            DoAutoDownload(task);
345190978c3Sopenharmony_ci        }
346190978c3Sopenharmony_ci    }
347190978c3Sopenharmony_ci    #endif
348190978c3Sopenharmony_ci}
349190978c3Sopenharmony_ci
350190978c3Sopenharmony_ci// updater调用后正常启动
351190978c3Sopenharmony_civoid FirmwareManager::HandleBootUpdateOnStatusProcess(const FirmwareTask &task)
352190978c3Sopenharmony_ci{
353190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootUpdateOnStatusProcess");
354190978c3Sopenharmony_ci    FirmwareResultProcess resultProcess;
355190978c3Sopenharmony_ci    std::map<std::string, UpdateResult> resultMap;
356190978c3Sopenharmony_ci    std::vector<FirmwareComponent> components;
357190978c3Sopenharmony_ci    FirmwareComponentOperator().QueryAll(components);
358190978c3Sopenharmony_ci    switch (resultProcess.GetUpdaterResult(components, resultMap)) {
359190978c3Sopenharmony_ci        case UpdateResultCode::SUCCESS:
360190978c3Sopenharmony_ci            HandleBootUpdateSuccess(task, resultMap);
361190978c3Sopenharmony_ci            break;
362190978c3Sopenharmony_ci        case UpdateResultCode::FAILURE:
363190978c3Sopenharmony_ci            HandleBootUpdateFail(task, resultMap);
364190978c3Sopenharmony_ci            break;
365190978c3Sopenharmony_ci        default:
366190978c3Sopenharmony_ci            break;
367190978c3Sopenharmony_ci    }
368190978c3Sopenharmony_ci}
369190978c3Sopenharmony_ci
370190978c3Sopenharmony_civoid FirmwareManager::HandleBootUpdateSuccess(const FirmwareTask &task,
371190978c3Sopenharmony_ci    const std::map<std::string, UpdateResult> &resultMap)
372190978c3Sopenharmony_ci{
373190978c3Sopenharmony_ci    preferencesUtil_->SaveString(Firmware::UPDATE_ACTION, "upgrade");
374190978c3Sopenharmony_ci    std::vector<FirmwareComponent> components;
375190978c3Sopenharmony_ci    FirmwareComponentOperator().QueryAll(components);
376190978c3Sopenharmony_ci    std::vector<VersionComponent> versionComponents;
377190978c3Sopenharmony_ci    for (const auto &component : components) {
378190978c3Sopenharmony_ci        VersionComponent versionComponent;
379190978c3Sopenharmony_ci        versionComponent.componentType = CAST_INT(ComponentType::OTA);
380190978c3Sopenharmony_ci        versionComponent.componentId = component.componentId;
381190978c3Sopenharmony_ci        versionComponent.upgradeAction = UpgradeAction::UPGRADE;
382190978c3Sopenharmony_ci        versionComponent.displayVersion = component.targetBlDisplayVersionNumber;
383190978c3Sopenharmony_ci        versionComponent.innerVersion = component.targetBlVersionNumber;
384190978c3Sopenharmony_ci        versionComponent.componentExtra = JsonBuilder().Append("{}").ToJson();
385190978c3Sopenharmony_ci        versionComponents.push_back(versionComponent);
386190978c3Sopenharmony_ci    }
387190978c3Sopenharmony_ci
388190978c3Sopenharmony_ci    DelayedSingleton<FirmwareChangelogUtils>::GetInstance()->SaveHotaCurrentVersionComponentId();
389190978c3Sopenharmony_ci    if (task.combinationType == CombinationType::HOTA) {
390190978c3Sopenharmony_ci        FIRMWARE_LOGI("notify upgrade success");
391190978c3Sopenharmony_ci        DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(task.taskId, EventId::EVENT_UPGRADE_SUCCESS,
392190978c3Sopenharmony_ci            UpgradeStatus::UPDATE_SUCCESS, ErrorMessage{}, versionComponents);
393190978c3Sopenharmony_ci        FirmwareUpdateHelper::ClearFirmwareInfo();
394190978c3Sopenharmony_ci        return;
395190978c3Sopenharmony_ci    }
396190978c3Sopenharmony_ci}
397190978c3Sopenharmony_ci
398190978c3Sopenharmony_civoid FirmwareManager::HandleBootUpdateFail(const FirmwareTask &task,
399190978c3Sopenharmony_ci    const std::map<std::string, UpdateResult> &resultMap)
400190978c3Sopenharmony_ci{
401190978c3Sopenharmony_ci    preferencesUtil_->SaveString(Firmware::UPDATE_ACTION, "recovery");
402190978c3Sopenharmony_ci    std::vector<FirmwareComponent> components;
403190978c3Sopenharmony_ci    FirmwareComponentOperator().QueryAll(components);
404190978c3Sopenharmony_ci    std::vector<VersionComponent> versionComponents;
405190978c3Sopenharmony_ci    for (const auto &component : components) {
406190978c3Sopenharmony_ci        VersionComponent versionComponent;
407190978c3Sopenharmony_ci        versionComponent.componentType = CAST_INT(ComponentType::OTA);
408190978c3Sopenharmony_ci        versionComponent.componentId = component.componentId;
409190978c3Sopenharmony_ci        versionComponent.upgradeAction = UpgradeAction::UPGRADE;
410190978c3Sopenharmony_ci        versionComponent.displayVersion = component.targetBlDisplayVersionNumber;
411190978c3Sopenharmony_ci        versionComponent.innerVersion = component.targetBlVersionNumber;
412190978c3Sopenharmony_ci        versionComponent.componentExtra = JsonBuilder().Append("{}").ToJson();
413190978c3Sopenharmony_ci        versionComponents.push_back(versionComponent);
414190978c3Sopenharmony_ci    }
415190978c3Sopenharmony_ci
416190978c3Sopenharmony_ci    ErrorMessage errorMessage;
417190978c3Sopenharmony_ci    for (const auto &result : resultMap) {
418190978c3Sopenharmony_ci        if (result.second.result == UPDATER_RESULT_FAILURE) {
419190978c3Sopenharmony_ci            errorMessage.errorCode = CAST_INT(result.second.GetUpdateResultCode());
420190978c3Sopenharmony_ci            errorMessage.errorMessage = result.second.reason;
421190978c3Sopenharmony_ci            break;
422190978c3Sopenharmony_ci        }
423190978c3Sopenharmony_ci    }
424190978c3Sopenharmony_ci
425190978c3Sopenharmony_ci    DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(task.taskId, EventId::EVENT_UPGRADE_FAIL,
426190978c3Sopenharmony_ci        UpgradeStatus::UPDATE_FAIL, errorMessage, versionComponents);
427190978c3Sopenharmony_ci    FIRMWARE_LOGI("upgrade fail");
428190978c3Sopenharmony_ci    FirmwareUpdateHelper::ClearFirmwareInfo();
429190978c3Sopenharmony_ci}
430190978c3Sopenharmony_ci
431190978c3Sopenharmony_ci// sysInstaller安装中重启,进度回退为下载完成
432190978c3Sopenharmony_civoid FirmwareManager::HandleBootInstallOnStatusProcess(FirmwareTask &task)
433190978c3Sopenharmony_ci{
434190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootInstallOnStatusProcess");
435190978c3Sopenharmony_ci    FirmwareTaskOperator().UpdateProgressByTaskId(
436190978c3Sopenharmony_ci        task.taskId, UpgradeStatus::DOWNLOAD_SUCCESS, Firmware::ONE_HUNDRED);
437190978c3Sopenharmony_ci    std::vector<FirmwareComponent> firmwareComponentList;
438190978c3Sopenharmony_ci    FirmwareComponentOperator firmwareComponentOperator;
439190978c3Sopenharmony_ci    firmwareComponentOperator.QueryAll(firmwareComponentList);
440190978c3Sopenharmony_ci    for (const FirmwareComponent &component : firmwareComponentList) {
441190978c3Sopenharmony_ci        if (component.status == UpgradeStatus::INSTALLING) {
442190978c3Sopenharmony_ci            firmwareComponentOperator.UpdateProgressByUrl(
443190978c3Sopenharmony_ci                component.url, UpgradeStatus::DOWNLOAD_SUCCESS, Firmware::ONE_HUNDRED);
444190978c3Sopenharmony_ci        }
445190978c3Sopenharmony_ci    }
446190978c3Sopenharmony_ci    BusinessError businessError;
447190978c3Sopenharmony_ci    UpgradeOptions upgradeOptions;
448190978c3Sopenharmony_ci    upgradeOptions.order = Order::INSTALL_AND_APPLY;
449190978c3Sopenharmony_ci    DoInstall(upgradeOptions, businessError, InstallType::SYS_INSTALLER);
450190978c3Sopenharmony_ci}
451190978c3Sopenharmony_ci
452190978c3Sopenharmony_civoid FirmwareManager::HandleBootDownloadOnStatusProcess(FirmwareTask &task)
453190978c3Sopenharmony_ci{
454190978c3Sopenharmony_ci    // 下载中重启,清除记录和数据
455190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootDownloadOnStatusProcess ClearFirmwareInfo");
456190978c3Sopenharmony_ci    FirmwareUpdateHelper::ClearFirmwareInfo();
457190978c3Sopenharmony_ci}
458190978c3Sopenharmony_ci
459190978c3Sopenharmony_civoid FirmwareManager::HandleBootDownloadPauseStatusProcess(FirmwareTask &task)
460190978c3Sopenharmony_ci{
461190978c3Sopenharmony_ci    FirmwareUpdateHelper::ClearFirmwareInfo();
462190978c3Sopenharmony_ci}
463190978c3Sopenharmony_ci
464190978c3Sopenharmony_civoid FirmwareManager::HandleResumeDownload(FirmwareTask &task)
465190978c3Sopenharmony_ci{
466190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleResumeDownload");
467190978c3Sopenharmony_ci}
468190978c3Sopenharmony_ci
469190978c3Sopenharmony_civoid FirmwareManager::HandleBootDownloadedStatusProcess(FirmwareTask &task)
470190978c3Sopenharmony_ci{
471190978c3Sopenharmony_ci    FIRMWARE_LOGI("HandleBootDownloadedStatusProcess");
472190978c3Sopenharmony_ci}
473190978c3Sopenharmony_ci
474190978c3Sopenharmony_civoid FirmwareManager::DoAutoDownload(const FirmwareTask &task)
475190978c3Sopenharmony_ci{
476190978c3Sopenharmony_ci    FIRMWARE_LOGI("DoAutoDownload");
477190978c3Sopenharmony_ci}
478190978c3Sopenharmony_ci
479190978c3Sopenharmony_civoid FirmwareManager::NotifyInitEvent()
480190978c3Sopenharmony_ci{
481190978c3Sopenharmony_ci    bool dueInitFlag = preferencesUtil_->ObtainBool(Constant::DUE_INIT_FLAG, false);
482190978c3Sopenharmony_ci    FIRMWARE_LOGI("DUE_INIT_FLAG is %{public}s", StringUtils::GetBoolStr(dueInitFlag).c_str());
483190978c3Sopenharmony_ci    if (!dueInitFlag) {
484190978c3Sopenharmony_ci        preferencesUtil_->SaveBool(Constant::DUE_INIT_FLAG, true);
485190978c3Sopenharmony_ci        DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent("", EventId::EVENT_INITIALIZE,
486190978c3Sopenharmony_ci            UpgradeStatus::INIT);
487190978c3Sopenharmony_ci    }
488190978c3Sopenharmony_ci}
489190978c3Sopenharmony_ci} // namespace UpdateEngine
490190978c3Sopenharmony_ci} // namespace OHOS
491