xref: /base/update/updater/services/updater_ui.cpp (revision fb299fa2)
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