• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;