zoukankan      html  css  js  c++  java
  • (FFOS Gecko & Gaia) OTA

      当download完成时,又回到了UpdatePrompt,因为此时需要提示user下载完成,确认apply。

    1. UpdatePrompt.showUpdateDownloaded

      showUpdateDownloaded: function UP_showUpdateDownloaded(aUpdate, aBackground) {
        if (this._systemUpdateListener) {
          this._systemUpdateListener.onUpdateReady();
        } else {
          this._isPendingUpdateReady = true;
        }
    
        // The update has been downloaded and staged. We send the update-downloaded
        // event right away. After the user has been idle for a while, we send the
        // update-prompt-restart event, increasing the chances that we can apply the
        // update quietly without user intervention.
        this.sendUpdateEvent("update-downloaded", aUpdate);
    
        if (Services.idle.idleTime >= this.applyIdleTimeout) {
          this.showApplyPrompt(aUpdate);
          return;
        }
    
        let applyIdleTimeoutSeconds = this.applyIdleTimeout / 1000;
        // We haven't been idle long enough, so register an observer
        log("Update is ready to apply, registering idle timeout of " +
            applyIdleTimeoutSeconds + " seconds before prompting.");
    
        this._update = aUpdate;
        this.waitForIdle();
      },

    2. SystemUpdatable.handleEvent

        case 'update-downloaded':
          this.downloading = false;
          UpdateManager.downloaded(this);
          this.showApplyPrompt(detail.isOSUpdate);
          break;

    3. SystemUpdatable.showApplyPrompt

    // isOsUpdate comes from Gecko's update object passed in the mozChromeEvent
    // and is expected to be true in case of an update package that gets applied
    // in recovery mode (FOTA). We want to show the battery warning only in this
    // case as described in bug 959195
    SystemUpdatable.prototype.showApplyPrompt = function(isOsUpdate) {
      var batteryLevel = window.navigator.battery.level * 100;
      // 获取battery状态
      this.getBatteryPercentageThreshold().then(function(threshold) {
        this.showingApplyPrompt = true;
        if (isOsUpdate && batteryLevel < threshold) {
          this.showApplyPromptBatteryNok(threshold);
        } else {
          // battery充足情况下,提示apply
          this.showApplyPromptBatteryOk();
        }
      }.bind(this));
    };

    4. SystemUpdatable.showApplyPromptBatteryOk

    SystemUpdatable.prototype.showApplyPromptBatteryOk = function() {
      // Update will be completed after restart
      this.forgetKnownUpdate();
    
      var cancel = {
        title: 'later',
        callback: this.declineInstallWait.bind(this)
      };
    
      var confirm = {
        title: 'installNow',
        callback: this.acceptInstall.bind(this),
        recommend: true
      };
    
      Service.request('UtilityTray:hide');
    // 弹出确认对话框,当confirm升级时,调用acceptInstall函数 Service.request(
    'showCustomDialog', 'systemUpdateReady', 'wantToInstallNow', cancel, confirm ); };

    5. SystemUpdatable.acceptInstall

    SystemUpdatable.prototype.acceptInstall = function() {
      Service.request('hideCustomDialog');
    
      // Display a splash-screen so the user knows an update is being applied
      var splash = document.createElement('form');
      splash.id = 'system-update-splash';
      ['label', 'divider', 'icon'].forEach(function(name) {
        var child = document.createElement('div');
        child.id = name;
        splash.appendChild(child);
      });
      splash.firstChild.setAttribute('data-l10n-id', 'systemUpdate');
    
      var screen = document.getElementById('screen');
      screen.appendChild(splash);
    
      this._dispatchEvent('update-prompt-apply-result', 'restart');
    };

    6. UpdatePrompt.handleEvent

          case "update-prompt-apply-result":
            this.handleApplyPromptResult(detail);
            break;

    7. UpdatePrompt.handleApplyPromptResult

      handleApplyPromptResult: function UP_handleApplyPromptResult(aDetail) {
        if (this._applyPromptTimer) {
          this._applyPromptTimer.cancel();
          this._applyPromptTimer = null;
        }
    
        switch (aDetail.result) {
          // Battery not okay, do not wait for idle to re-prompt
          case "low-battery":
            break;
          case "wait":
            // Wait until the user is idle before prompting to apply the update
            this.waitForIdle();
            break;
          case "restart":
            this.finishUpdate();
            this._update = null;
            break;
        }
      },

    8. UpdatePrompt.finishUpdate

      这里分两种情况,一种是GOTA,只需要重启b2g进程,还有一种是FOTA,调用UpdateService去完成apply的工作。

      finishUpdate: function UP_finishUpdate() {
        if (!this._update.isOSUpdate) {
          // Standard gecko+gaia updates will just need to restart the process
    this.restartProcess(); return; } try { Services.aus.applyOsUpdate(this._update); } catch (e) { this._update.errorCode = Cr.NS_ERROR_FAILURE; this.showUpdateError(this._update); } },
  • 相关阅读:
    《团队-爬取豆瓣Top250-团队一阶段互评》
    团队-爬虫豆瓣top250项目-开发文档
    结对总结
    课后作业-阅读任务-阅读提问-2
    2017-10-06-构建之法:现代软件工程-阅读笔记
    结对-结对编项目贪吃蛇-开发过程
    团队-爬取豆瓣电影TOP250-开发环境搭建过程
    个人-GIT使用方法
    课后作业-阅读任务-阅读提问-1
    课后作业-阅读任务-阅读笔记-1
  • 原文地址:https://www.cnblogs.com/code-4-fun/p/4705435.html
Copyright © 2011-2022 走看看