KaiOS APN 编辑页代码逻辑

19 篇文章 0 订阅
15 篇文章 0 订阅

一、模块设计

代码路径:

  • gaia/apps/settings/js/panels/apn_editor
    • panel.js
    • apn_editor.js 编辑页显示逻辑
    • apn_editor_const.js 编辑页显示参数定义
    • apn_editor_session.js 编辑页保存数据逻辑
  • gaia/apps/settings/js/modules/apn/
    • apn_const.js
    • apn_item.js
    • apn_list.js
    • apn_selections.js
    • apn_settings.js
    • apn_settings_manager.js
    • apn_utils.js
  • gaia/apps/settings/elements/apn_editor.html 界面布局

二、代码分析

apn_editor_const.js

kaios 3.1:跟Android 不同,默认不支持显示mcc、mnc、MVNO value&type、bearer、server

/**
 * The apn editor const
 */
'use strict';
define(() => {
  //没有mccmnc、mvno value&type、bearer、server
  const APN_PROPERTY_DEFAULTS = {
    carrier: '',
    apn: '',
    user: '',
    password: '',
    proxy: '',
    port: '',
    mmsc: '',
    mmsproxy: '',
    mmsport: '',
    authtype: 'notDefined',
    types: ['default'],
    protocol: 'notDefined',
    roaming_protocol: 'notDefined' //eslint-disable-line
  };

  const APN_PROPERTIES = Object.keys(APN_PROPERTY_DEFAULTS);

  //解析
  const VALUE_CONVERTERS = {
    TO_STRING: {
      types(types) {
        if (types && Array.isArray(types) && types.length) {
          return types.join(', ');
        }
        return 'default';
      }
    },
    TO_DATA: {
      types(string) {
        return string.split(',').map(str => str.trim());
      }
    }
  };

  return {
    get APN_PROPERTIES() {
      return APN_PROPERTIES;
    },
    get APN_PROPERTY_DEFAULTS() {
      return APN_PROPERTY_DEFAULTS;
    },
    get VALUE_CONVERTERS() {
      return VALUE_CONVERTERS;
    }
  };
});

参考代码:

https://github.com/mozilla-b2g/gaia/blob/master/apps/settings/js/panels/apn_editor/apn_editor_const.js

/**
 * The apn editor const
 */
define(function(require) {
  'use strict';

  var APN_PROPERTY_DEFAULTS = {
    'apn': '',
    'user': '',
    'password': '',
    'proxy': '',
    'port': '',
    'mmsc': '',
    'mmsproxy': '',
    'mmsport': '',
    'authtype': 'notDefined',
    'types': ['default'],
    'protocol': 'notDefined',
    'roaming_protocol': 'notDefined',
    'mtu' : ''
  };

  var APN_PROPERTIES = Object.keys(APN_PROPERTY_DEFAULTS);

  var VALUE_CONVERTERS = {
    'TO_STRING': {
      'types': function(types) {
        if (types && Array.isArray(types) && types.length) {
          return types.join(', ');
        } else {
          return 'default';
        }
      }
    },
    'TO_DATA': {
      'types': function(string) {
        return string.split(',').map((str) => str.trim());
      }
    }
  };

  return {
    get APN_PROPERTIES() { return APN_PROPERTIES; },
    get APN_PROPERTY_DEFAULTS() { return APN_PROPERTY_DEFAULTS; },
    get VALUE_CONVERTERS() { return VALUE_CONVERTERS; }
  };
});

apn_editor_session.js 

用于保存编辑和新增APN。

apn_editor.js 功能逻辑

/**
 * The apn editor module
 */
'use strict';

define(function(require) {  //eslint-disable-line

  //导包
  const ApnEditorConst = require('panels/apn_editor/apn_editor_const'); 
  const ApnEditorSession = require('panels/apn_editor/apn_editor_session');

  const { APN_PROPERTIES } = ApnEditorConst;
  const { APN_PROPERTY_DEFAULTS } = ApnEditorConst;

  //APN编辑页对象,构造函数
  ApnEditor.prototype = {
    //数据转换
    convertValue(value, converter) {
      if (converter) {
        return converter(value);
      }
      return value;
    },

    //填充APN属性值
    fillInputElements(inputElements, apn) {
      APN_PROPERTIES.forEach(function input(name) {
        const inputElement = inputElements[name];
        if (inputElement) {
          inputElement.removeAttribute('disabled');
          const value = 
              (apn && apn[name.toLowerCase()]) || APN_PROPERTY_DEFAULTS[name];
          inputElement.value = this.convertValue(
            value,
            VALUE_CONVERTERS.TO_STRING[name]
          );
        }  //if
      }, this);
    },

    //新建APN
    createApn(serviceId, apnItem) {
      this.fillInputElements(this.inputElements, apnItem.apn);
      return ApnEditorSession(
        { serviceId, mode: 'new' },
        this.inputElements,
        apnItem
      );
    },

    //编辑APN
    editApn(serviceId, apnItem, editable) {
      this.fillInputElementsNoneEditable(this.inputElements, apnItem, editable);
      return ApnEditorSession(
        { serviceId, mode: 'edit' },
        this.inputElements,
        apnItem
      );
    }
  };  //ApnEditor.prototype END


  return function apnEditor(rootElement) {
    return new ApnEditor(rootElement);
  };

});

对比:(Old Version) gaia/apps/settings/js/panels/apn_editor/apn_editor.js

//十年前 kaios 版本
/**
 * The apn editor module
 */
define(function(require) {
  'use strict';

  var ApnEditorConst = require('panels/apn_editor/apn_editor_const');
  var ApnEditorSession = require('panels/apn_editor/apn_editor_session');

  var APN_PROPERTIES = ApnEditorConst.APN_PROPERTIES;
  var APN_PROPERTY_DEFAULTS = ApnEditorConst.APN_PROPERTY_DEFAULTS;
  var VALUE_CONVERTERS = ApnEditorConst.VALUE_CONVERTERS;

  function ApnEditor(rootElement) {
    this._inputElements = {};
    APN_PROPERTIES.forEach(function(name) {
      this._inputElements[name] = rootElement.querySelector('.' + name);
    }, this);
  }

  ApnEditor.prototype = {
    _convertValue: function ae_convertValue(value, converter) {
      if (converter) {
        return converter(value);
      } else {
        return value;
      }
    },
    _fillInputElements: function ae_fillInputElements(inputElements, apn) {
      APN_PROPERTIES.forEach(function(name) {
        var inputElement = inputElements[name];
        if (inputElement) {
          var value = (apn && apn[name.toLowerCase()]) ||
            APN_PROPERTY_DEFAULTS[name];
          inputElement.value =
            this._convertValue(value, VALUE_CONVERTERS.TO_STRING[name]);
        }
      }, this);
    },
    createApn: function ae_createApn(serviceId, apnItem) {
      this._fillInputElements(this._inputElements, apnItem.apn);
      return ApnEditorSession(serviceId, 'new', this._inputElements, apnItem);
    },
    editApn: function ae_editApn(serviceId, apnItem) {
      this._fillInputElements(this._inputElements, apnItem.apn);
      return ApnEditorSession(serviceId, 'edit', this._inputElements, apnItem);
    }
  };

  return function ctor_apn_editor(rootElement) {
    return new ApnEditor(rootElement);
  };
});

三、编译调试

APN编辑页面在Settings应用(gaia/apps/settings)中,可以进行模块单编,或者本地push对应应用的application.zip快速调试。

详细可参考:KaiOS 系统全编和模块单编-CSDN博客

四、参考资料

模块介绍:KaiOS APN Settings模块代码-CSDN博客

老版本代码:GitHub - mozilla-b2g/gaia: DEPRECATED - Gaia is a HTML5-based Phone UI for the Boot 2 Gecko Project.

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值