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