【Code】KaiOS 关于PNN运营商名称显示的代码分析(Launcher&System APP)

PNN 分为long和short,在任何平台都是一样的,基于SIM的EF设计。

_updateCardInfos 同名代码

Launcher APP: SimCardStatus 卡状态

KaiOS 4.0 运营商名称会显示在主界面(锁屏中央),数据源可以在如下接口打印。

  • 代码路径:gaia/apps/launcher/src/simCardStatus.js
  • 设备路径:system/b2g/webapps/launcher
    • Note:application里面是找不到simCardStatus.js文件的,逻辑全部都打包到了application\dist\app.bundle.js 中,而且通过代码全搜的时候不能直接找到,只能找到同名不带函数括号的。
    • key: "_updateCardInfos" -- 搜索函数的方法
// KaiOS source code
// gaia/apps/launcher/src/simCardStatus.js
/* global emitter */
import React from 'react';
import BaseComponent from 'base-component';
import Service from 'service';
import '../style/scss/simcard.scss';

export default class SimCardStatus extends BaseComponent {
  name = 'SimCardStatus';
  simCardsName = {};
  _updateCardInfos() {
    const conns = navigator.b2g.mobileConnections;
    if (!conns) {
      return;
    }

    let cardInfos = [];
    const simSlots = window.SIMSlotManager.getSlots();

    Array.from(conns).forEach((conn, index) => {
      const isAbsent = !conn.iccId;

      // Raw signal level from MozMobileConnections is -1~4
      // we normalize it to 0~5 for data-icon convenient
      let signalLevel = 0;
      if ((!isAbsent && conn.voice.connected) ||
        (conn.data && 'registered' === conn.data.state)) {
        if (conn.signalStrength) {
          signalLevel = conn.signalStrength.level + 1;
        } else {
          signalLevel = Math.ceil(conn.voice.relSignalStrength / 20);
        }
      }

      let stateL10nId;
      let carrierName;
      let data = conn.data;
      let network;
      let voice_data = conn.voice ? conn.voice : conn.data;
      let ims = conn.imsHandler;
      let isVoWifi = !!ims && ('voice-over-wifi' === ims.capability ||
        'video-over-wifi' === ims.capability);

      if (conn.voice && conn.voice.connected) {
        network = conn.voice.network;
      } else if (data && 'registered' === data.state) {
        network = conn.data.network;
      }
      if (isAbsent) {
        stateL10nId = 'noSimCard';
      } else if (simSlots[index].getCardState() !== 'ready') {
        stateL10nId = 'lockedSim';
      } else if ('searching' === voice_data.state) {
        stateL10nId = 'searching';
      } else if (network || isVoWifi) {
        let iccid = conn.iccId;
        let iccObj = navigator.b2g.iccManager.getIccById(iccid);