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#include "updater_ui.h" 16#include <mutex> 17#include <thread> 18#include "control/callback_manager.h" 19#include "language/language_ui.h" 20#include "driver/graphic_engine.h" 21#include "log/log.h" 22#include "page/page_manager.h" 23#include "scope_guard.h" 24#include "updater_main.h" 25#include "updater_ui_facade.h" 26#include "updater/updater_const.h" 27#include "utils.h" 28#include "updater_ui_stub.h" 29 30namespace Updater { 31namespace { 32constexpr uint32_t DISPLAY_TIME = 1 * 1000 * 1000; /* 1s */ 33constexpr uint32_t SUCCESS_DELAY = 3 * 1000 * 1000; 34constexpr int CALLBACK_DELAY = 20 * 1000; /* 20ms */ 35 36inline auto &GetFacade() 37{ 38 return UpdaterUiFacade::GetInstance(); 39} 40} // namespace 41 42void DoProgress() 43{ 44 constexpr int maxSleepMs = 1000 * 1000; 45 constexpr int minSleepMs = 3000; 46 constexpr float ratio = 10.0; 47 // if 100 as fullpercent, then 0.3 per step 48 constexpr int progressValueStep = static_cast<int>(0.3 * ratio); 49 constexpr int maxProgressValue = static_cast<int>(100 * ratio); 50 int progressvalueTmp = 0; 51 if (GetFacade().GetMode() != UPDATERMODE_FACTORYRST && GetFacade().GetMode() != UPDATERMODE_REBOOTFACTORYRST) { 52 return; 53 } 54 GetFacade().ShowProgress(0); 55 while (progressvalueTmp <= maxProgressValue) { 56 progressvalueTmp = progressvalueTmp + progressValueStep; 57 GetFacade().ShowProgress(progressvalueTmp / ratio); 58 Utils::UsSleep(minSleepMs); 59 if (progressvalueTmp >= maxProgressValue) { 60 Utils::UsSleep(maxSleepMs); 61 return; 62 } 63 } 64} 65 66DEFINE_ASYN_CALLBACK(OnRebootEvt) 67{ 68 LOG(INFO) << "On Label Reboot"; 69 GraphicEngine::GetInstance().StopEngine(); 70 PostUpdater(false); 71 Utils::UpdaterDoReboot("", "Updater reboot btn event"); 72} 73 74DEFINE_SYNC_CALLBACK(OnLabelResetEvt) 75{ 76 LOG(INFO) << "On Label Reset"; 77 if (!GetFacade().SetMode(UPDATERMODE_FACTORYRST)) { 78 return; 79 } 80 GetFacade().ShowFactoryConfirmPage(); 81} 82 83DEFINE_ASYN_CALLBACK(OnLabelSDCardEvt) 84{ 85 LOG(INFO) << "On Label SDCard"; 86 if (!GetFacade().SetMode(UPDATERMODE_SDCARD)) { 87 return; 88 } 89 Utils::UsSleep(CALLBACK_DELAY); 90 GetFacade().ClearText(); 91 GetFacade().ShowProgress(0); 92 GetFacade().ShowLog(TR(LOG_SDCARD_NOTMOVE)); 93 Utils::UsSleep(DISPLAY_TIME); 94 UpdaterParams upParams; 95 upParams.updateMode = SDCARD_UPDATE; 96 if (UpdaterFromSdcard(upParams) != UPDATE_SUCCESS) { 97 GetFacade().ShowMainpage(); 98 return; 99 } 100 PostUpdater(true); 101 Utils::UpdaterDoReboot("", "Updater sdcard update success reboot"); 102} 103 104DEFINE_ASYN_CALLBACK(OnLabelSDCardNoDelayEvt) 105{ 106 LOG(INFO) << "On Label SDCard No Delay"; 107 if (!GetFacade().SetMode(UPDATERMODE_SDCARD)) { 108 return; 109 } 110 Utils::UsSleep(CALLBACK_DELAY); 111 UpdaterParams upParams; 112 upParams.updateMode = SDCARD_UPDATE; 113 UPDATER_UI_INSTANCE.ShowProgressPage(); 114 if (auto res = UpdaterFromSdcard(upParams); res != UPDATE_SUCCESS) { 115 Utils::RemoveUpdateInfoFromMisc("sdcard_update"); 116 GetFacade().ShowLogRes(res == UPDATE_CORRUPT ? TR(LOGRES_VERIFY_FAILED) : TR(LOGRES_UPDATE_FAILED)); 117 GetFacade().ShowFailedPage(); 118 return; 119 } 120 GetFacade().ShowLogRes(TR(LABEL_UPD_OK_DONE)); 121 GetFacade().ShowSuccessPage(); 122 Utils::UsSleep(SUCCESS_DELAY); 123 PostUpdater(true); 124 Utils::UpdaterDoReboot("", "Updater sdcard update success reboot"); 125} 126 127DEFINE_ASYN_CALLBACK(OnLabelSDUpdateResEvt) 128{ 129 LOG(INFO) << "On Label SDCard To Reserve Userdata"; 130 if (!GetFacade().SetMode(UPDATERMODE_SDCARD)) { 131 return; 132 } 133 Utils::UsSleep(CALLBACK_DELAY); 134 UpdaterParams upParams; 135 upParams.updateMode = SDCARD_UPDATE; 136 UPDATER_UI_INSTANCE.ShowProgressPage(); 137 Utils::SetMessageToMisc("boot-updater", 0, "sdcard_intral_update"); // set retain userdata 138 if (!Utils::CheckUpdateMode(Updater::SDCARD_INTRAL_MODE)) { 139 LOG(ERROR) << "sdcard_intral_update write to misc failed"; 140 GetFacade().ShowFailedPage(); 141 return; 142 } 143 LOG(INFO) << "sdcard_intral_update write to misc success"; 144 if (auto res = UpdaterFromSdcard(upParams); res != UPDATE_SUCCESS) { 145 Utils::RemoveUpdateInfoFromMisc("sdcard_update"); 146 GetFacade().ShowLogRes(res == UPDATE_CORRUPT ? TR(LOGRES_VERIFY_FAILED) : TR(LOGRES_UPDATE_FAILED)); 147 GetFacade().ShowFailedPage(); 148 return; 149 } 150 GetFacade().ShowLogRes(TR(LABEL_UPD_OK_DONE)); 151 GetFacade().ShowSuccessPage(); 152 Utils::UsSleep(SUCCESS_DELAY); 153 PostUpdater(true); 154 Utils::UpdaterDoReboot("", "Updater sdcard update success reboot"); 155} 156 157DEFINE_SYNC_CALLBACK(OnLabelCancelEvt) 158{ 159 LOG(INFO) << "On Label Cancel"; 160 PageManager::GetInstance().GoBack(); 161} 162 163DEFINE_SYNC_CALLBACK(OnReturnToMainEvt) 164{ 165 LOG(INFO) << "On Return To Main"; 166 PageManager::GetInstance().ShowMainPage(); 167} 168 169DEFINE_ASYN_CALLBACK(OnLabelOkEvt) 170{ 171 LOG(INFO) << "On Label Ok"; 172 Utils::UsSleep(CALLBACK_DELAY); 173 GetFacade().ShowMainpage(); 174 GetFacade().ClearText(); 175 GetFacade().ShowLog(TR(LOG_WIPE_DATA)); 176 if (!GetFacade().SetMode(UPDATERMODE_FACTORYRST)) { 177 return; 178 } 179 GetFacade().ShowProgress(0); 180 GetFacade().ShowProgressPage(); 181 DoProgress(); 182 if (FactoryReset(USER_WIPE_DATA, "/data") == 0) { 183 GetFacade().ShowLog(TR(LOG_WIPE_DONE)); 184 GetFacade().ShowSuccessPage(); 185 } else { 186 GetFacade().ShowLog(TR(LOG_WIPE_FAIL)); 187 GetFacade().ShowFailedPage(); 188 } 189} 190 191DEFINE_ASYN_CALLBACK(OnConfirmRstEvt) 192{ 193 LOG(INFO) << "On Label Ok"; 194 if (!GetFacade().SetMode(UPDATERMODE_FACTORYRST)) { 195 return; 196 } 197 Utils::AddUpdateInfoToMisc("user_wipe_data", std::nullopt); 198 GetFacade().ShowUpdInfo(TR(LABEL_RESET_PROGRESS_INFO)); 199 GetFacade().ShowProgressPage(); 200 DoProgress(); 201 if (FactoryReset(USER_WIPE_DATA, "/data") != 0) { 202 Utils::RemoveUpdateInfoFromMisc("user_wipe_data"); 203 GetFacade().ShowLogRes(TR(LOG_WIPE_FAIL)); 204 GetFacade().ShowFailedPage(); 205 } else { 206 GetFacade().ShowSuccessPage(); 207 PostUpdater(true); 208 Utils::UsSleep(SUCCESS_DELAY); 209 Utils::UpdaterDoReboot("", "Updater factory reset success"); 210 } 211} 212 213DEFINE_ASYN_CALLBACK(OnMenuShutdownEvt) 214{ 215 LOG(DEBUG) << "shutdown"; 216 GraphicEngine::GetInstance().StopEngine(); 217 Utils::DoShutdown("Updater shutdown btn event"); 218} 219 220DEFINE_ASYN_CALLBACK(OnMenuClearCacheEvt) 221{ 222 LOG(INFO) << "On clear cache"; 223 GetFacade().ClearText(); 224 if (!GetFacade().SetMode(UPDATERMODE_FACTORYRST)) { 225 return; 226 } 227 Utils::UsSleep(CALLBACK_DELAY); 228 GetFacade().ShowUpdInfo(TR(LOG_CLEAR_CAHCE)); 229 GetFacade().ShowProgressPage(); 230 ClearMisc(); 231 DoProgress(); 232 GetFacade().ShowMainpage(); 233} 234} // namespace Updater 235