1/* 2 * Copyright (c) 2021 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 16import prompt from '@ohos.prompt' 17import app from '@ohos.ability.featureAbility'; 18import client from '@ohos.update'; 19 20const HAS_NEW_VERSION = 1; 21const NO_NEW_VERSION = 0; 22const STATUS_CHECK_SUCCESS = 12; 23const PACKAGE_NAME = "com.ohos.ota.updateclient"; 24const VENDOR = "public"; 25const TAG = "OUC_DEMO "; 26var EventId = { 27 EVENT_TASK_BASE: 0x01000000, 28 EVENT_TASK_RECEIVE: 0x01000001, 29 EVENT_TASK_CANCEL: 0x01000002, 30 EVENT_DOWNLOAD_WAIT: 0x01000003, 31 EVENT_DOWNLOAD_START: 0x01000004, 32 EVENT_PROGRESS_UPDATE: 0x01000005, 33 EVENT_DOWNLOAD_PAUSE: 0x01000006, 34 EVENT_DOWNLOAD_RESUME: 0x01000007, 35 EVENT_DOWNLOAD_SUCCESS: 0x01000008, 36 EVENT_DOWNLOAD_FAIL: 0x01000009, 37 EVENT_UPGRADE_WAIT: 0x01000010, 38 EVENT_UPGRADE_START: 0x01000011, 39 EVENT_UPGRADE_UPDATE: 0x01000012, 40 EVENT_APPLY_WAIT: 0x01000013, 41 EVENT_APPLY_START: 0x01000014, 42 EVENT_UPGRADE_SUCCESS: 0x01000015, 43 EVENT_UPGRADE_FAIL: 0x01000016 44} 45let upgradeInfo = { 46 upgradeApp: PACKAGE_NAME, 47 businessType: { 48 vendor: VENDOR, 49 subType: 1 50 } 51} 52let eventClassifyInfo = { 53 eventClassify: EventId.EVENT_TASK_BASE, 54 extraInfo: "" 55} 56var temp = 0; 57let versionDigestInfo; 58let pauseDownloadOptions = { 59 isAllowAutoResume: false 60} 61const page = { 62 data: { 63 title: "当前版本:10.2.1", 64 button: "查看更新", 65 pageType: "currVersion", 66 versionName: "10.2.0", 67 size: "20MB", 68 journal: "本次更新解决了一些BUG。", 69 matter: "请保持50%以上电量", 70 showLoad: "", 71 width: "5%", 72 showBanner: "", 73 showButton: "download", 74 upgradeInfo: "", 75 updater: Object(), 76 timer: undefined, 77 dialog: "", 78 showSimpledialog: "" 79 }, 80 onInit() { 81 console.info(TAG + "onInit") 82 try { 83 page.data.updater = client.getOnlineUpdater(upgradeInfo); 84 page.getCurrVersion(); 85 } catch (error) { 86 console.error(TAG + "onInit error: " + JSON.stringify(error)); 87 } 88 }, 89 onClick: function () { 90 if (page.data.pageType == "currVersion") { // 检查更新版本 91 page.data.pageType = "checkVersion"; 92 page.data.button = "取消查看"; 93 page.data.showLoad = "load"; 94 page.checkNewVersion(); 95 } else if (page.data.pageType == "newVersion") { // 当前需要下载新的版本 96 page.data.pageType = "downVersion"; 97 page.data.showLoad = "load"; 98 page.data.showBanner = 'banner'; 99 page.data.button = "暂停下载"; 100 if (page.data.updater == undefined) { 101 page.data.pageType = "errorPage"; 102 page.data.showButton = 'download'; 103 page.data.button = '退出'; 104 page.data.title = "初始化出现错误,退出app"; 105 return; 106 } 107 this.download() 108 } else if (this.pageType == "lastVersion") { // 已经是新的版本了,单击后退出页面 109 page.data.showLoad = ""; 110 app.terminateSelf(); 111 } else if (page.data.pageType == "checkVersion") { // 检查中,取消检查 112 page.data.showSimpledialog = "simpledialog"; 113 this.$element('simpledialog').show(); 114 page.data.dialog = "是否取消检查"; 115 } else if (page.data.pageType == "downVersion") { // 下载中,取消下载 116 page.data.showSimpledialog = "simpledialog"; 117 page.data.dialog = "是否暂停下载!"; 118 this.$element('simpledialog').show(); 119 temp = 1; 120 } else if (page.data.pageType == "errorPage") { // 出错,退出 121 app.terminateSelf(); 122 } 123 }, 124 download() { 125 console.info(TAG + "download"); 126 page.data.updater.on(eventClassifyInfo, eventInfo => { 127 console.info(TAG + "download eventInfo: " + JSON.stringify(eventInfo)) 128 if (page.data.pageType != "downVersion") { 129 return; 130 } 131 let progress = { 132 status: eventInfo.taskBody?.status, 133 percent: eventInfo.taskBody?.progress, 134 endReason: eventInfo.taskBody?.errorMessages?.[0]?.errorCode?.toString() 135 } 136 let percent = progress.percent; 137 if (progress.percent > 5) { 138 percent = progress.percent - 5; 139 } else if (progress.percent > 90) { 140 percent = 90; 141 } 142 page.data.width = percent + '%'; 143 if (progress.percent == 100) { 144 page.data.showLoad = ""; 145 page.data.showBanner = ''; 146 if (temp == 1) { 147 this.$element('simpledialog').close(); 148 } 149 } 150 // 下载成功 UpdateState.UPDATE_STATE_DOWNLOAD_SUCCESS 151 if (eventInfo.eventId == EventId.EVENT_DOWNLOAD_SUCCESS) { 152 page.data.pageType = "downSuccess"; 153 page.data.showButton = "upgrade"; 154 page.data.upgradeInfo = page.data.versionName + "安装包下载完成,是否安装?"; 155 } else if (eventInfo.eventId == EventId.EVENT_DOWNLOAD_FAIL) { // 失败 156 page.data.pageType = "errorPage"; 157 page.data.showButton = 'download'; 158 page.data.button = '退出'; 159 page.data.title = "下载失败"; 160 if (progress.endReason) { 161 page.data.title = "下载失败,失败原因:" + progress.endReason; 162 } 163 } 164 }); 165 let downloadOptions = { 166 allowNetwork: 1, 167 order: 1 168 } 169 page.data.updater.download(versionDigestInfo, downloadOptions).then(result => { 170 console.info(TAG + "download result: " + JSON.stringify(result)); 171 }).catch(err => { 172 console.error(TAG + "download err: " + JSON.stringify(err)); 173 }); 174 }, 175 clickInstall: function () { 176 if (page.data.pageType == "downSuccess") { // 下载成功,开始升级 177 page.upgrade(); 178 } 179 }, 180 181 clickCancel: function () { 182 if (page.data.pageType == "downSuccess") { // 下载成功,取消升级 183 page.data.showSimpledialog = "simpledialog"; 184 page.data.dialog = "是否稍后安装"; 185 this.$element('simpledialog').show(); 186 } 187 }, 188 189 getCurrVersion() { 190 console.info(TAG + "getCurrVersion"); 191 if (page.data.updater == undefined) { 192 page.data.pageType = "errorPage"; 193 page.data.showButton = 'download'; 194 page.data.button = '退出'; 195 page.data.title = "初始化出现错误,退出app"; 196 return; 197 } 198 199 // 获取版本信息 200 page.data.updater.getTaskInfo().then(taskInfo => { 201 console.info(TAG + "getTaskInfo result: " + JSON.stringify(taskInfo)); 202 let taskStatus = taskInfo?.taskBody?.status; 203 if (taskStatus < STATUS_CHECK_SUCCESS) { 204 this.checkNewVersionLocal(); 205 } else { 206 this.getNewVersionInfoLocal(); 207 } 208 }); 209 }, 210 211 checkNewVersionLocal() { 212 page.data.updater.checkNewVersion().then(data => { 213 console.info(TAG + "checkNewVersion result: " + JSON.stringify(data)); 214 if (data.isExistNewVersion == NO_NEW_VERSION) { // 已经是新版本 215 page.data.title = "当前已经是新版本"; 216 page.data.button = "确定"; 217 page.data.pageType = "lastVersion"; 218 page.data.versionName = data?.newVersionInfo?.versionComponents?.[0]?.displayVersion; 219 } else if (data.isExistNewVersion == HAS_NEW_VERSION) { 220 page.data.button = "查看更新"; 221 page.data.pageType = "currVersion"; 222 page.data.versionName = data?.newVersionInfo?.versionComponents?.[0]?.displayVersion; 223 } else { 224 page.data.title = "获取新版本失败"; 225 } 226 }).catch(error => { 227 console.info(TAG + "checkNewVersion error: " + JSON.stringify(error)); 228 page.data.pageType = "errorPage"; 229 page.data.showButton = 'download'; 230 page.data.button = '退出'; 231 page.data.title = "检查新版本失败"; 232 if (error.errorNum) { 233 page.data.title = "检查新版本失败,失败原因:" + error.errorNum; 234 } 235 }); 236 }, 237 238 getNewVersionInfoLocal() { 239 page.data.updater.getNewVersionInfo().then(data => { 240 console.info(TAG + "getNewVersionInfo result: " + JSON.stringify(data)); 241 page.data.button = "查看更新"; 242 page.data.pageType = "currVersion"; 243 page.data.versionName = data?.versionComponents?.[0]?.displayVersion; 244 }).catch(error => { 245 console.info(TAG + "getNewVersionInfo error: " + JSON.stringify(error)); 246 page.data.pageType = "errorPage"; 247 page.data.showButton = 'download'; 248 page.data.button = '退出'; 249 page.data.title = "检查新版本失败"; 250 if (error.errorNum) { 251 page.data.title = "检查新版本失败,失败原因:" + error.errorNum; 252 } 253 }); 254 }, 255 256 checkNewVersion: function () { 257 if (page.data.updater == undefined) { 258 page.data.pageType = "errorPage"; 259 page.data.showButton = 'download'; 260 page.data.button = '退出'; 261 page.data.title = "初始化出现错误,退出app"; 262 return; 263 } 264 console.info(TAG + "checkNewVersion"); 265 page.data.updater.getNewVersionInfo().then(info => { 266 console.info(TAG + "checkNewVersion getNewVersionInfo: " + JSON.stringify(info)); 267 versionDigestInfo = info?.versionDigestInfo; 268 page.data.showLoad = ""; 269 let size = info?.versionComponents?.[0]?.size / 1024 / 1024; 270 page.data.versionName = info?.versionComponents?.[0]?.displayVersion; 271 page.data.size = String(size.toFixed(2)) + "MB"; 272 if (info?.versionComponents?.[0]?.descriptionInfo?.content != undefined) { 273 page.data.journal = info?.versionComponents?.[0]?.descriptionInfo?.content; 274 } 275 page.data.pageType = "newVersion"; 276 page.data.button = "下载更新包"; 277 }).catch(error => { 278 page.data.pageType = "errorPage"; 279 page.data.showButton = 'download'; 280 page.data.button = '退出'; 281 page.data.title = "检查新版本失败"; 282 if (error.errorNum) { 283 page.data.title = "检查新版本失败,失败原因:" + error.errorNum; 284 } 285 }); 286 }, 287 288 upgrade() { 289 if (page.data.updater == undefined) { 290 page.data.pageType = "errorPage"; 291 page.data.showButton = 'download'; 292 page.data.button = '退出'; 293 page.data.title = "初始化出现错误,退出app"; 294 return; 295 } 296 page.data.updater.on(eventClassifyInfo, eventInfo => { 297 console.info(TAG + "upgrade eventInfo: " + JSON.stringify(eventInfo)); 298 let progress = { 299 status: eventInfo.taskBody?.status, 300 percent: eventInfo.taskBody?.progress, 301 endReason: eventInfo.taskBody?.errorMessages?.[0]?.errorCode?.toString() 302 } 303 page.data.width = progress.percent + '%'; 304 if (progress.status == EventId.EVENT_UPGRADE_FAIL) { // 失败 305 page.data.showLoad = ""; 306 page.data.pageType = "errorPage"; 307 page.data.showButton = 'download'; 308 page.data.button = '退出'; 309 page.data.title = "升级失败,失败原因:" + progress.endReason; 310 } 311 }); 312 let upgradeOptions = { 313 order: 2 314 } 315 page.data.updater.upgrade(versionDigestInfo, upgradeOptions).then(result => { 316 console.info(TAG + "upgrade result: " + JSON.stringify(result)); 317 }).catch(err => { 318 console.error(TAG + "upgrade err: " + JSON.stringify(err)); 319 }); 320 }, 321 322 closeDialog() { 323 this.$element('simpledialog').close(); 324 }, 325 326 cancelDialog() { 327 prompt.showToast({ 328 message: '取消对话框' 329 }) 330 }, 331 cancelSchedule(e) { 332 this.$element('simpledialog').close() 333 prompt.showToast({ 334 message: '取消成功' 335 }) 336 }, 337 setSchedule(e) { 338 this.$element('simpledialog').close() 339 prompt.showToast({ 340 message: '确定成功' 341 }) 342 if (page.data.pageType == "downVersion") { 343 page.data.showLoad = ""; 344 page.data.showBanner = ''; 345 page.data.pageType = "newVersion"; 346 page.data.button = "下载更新包"; 347 page.data.updater.pauseDownload(versionDigestInfo, pauseDownloadOptions); 348 } else if (page.data.pageType == "downSuccess") { 349 page.data.upgradeInfo = ""; 350 page.data.showButton = 'download'; 351 page.data.button = "查看更新"; 352 page.data.pageType = "currVersion"; 353 page.getCurrVersion(); 354 } else if (page.data.pageType == "checkVersion") { 355 page.data.button = "检查更新"; 356 page.getCurrVersion(); 357 } 358 } 359} 360 361export default page;