【开发方案】KaiOS APN 设置界面菜单选项定制

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

一、模块需求介绍

参考:KaiOS APN Settings模块代码-CSDN博客

APN 列表页对每一条APN提供编辑、删除等功能 ,对APN整体提供reset重置功能。

当前需要隐藏reset,不允许用户重置APN。

二、代码实现方案

APN列表页在gaia/apps/settings/应用中,在panel.js设置菜单选项,接口registerSoftkey

  • gaia/apps/settings/elements/apn_lists.html 定义了 APN Settings界面的结构和布局
  • gaia/apps/settings/js/panels/apn_list/panel.js 功能逻辑
  • gaia/apps/settings/js/panels/apn_list/apn_template_factory.js 界面模板

apn_list/panel.js

/**
 * The apn list panel
 */
'use strict';
define(function(require) { //eslint-disable-line
  const ListView = require('modules/mvvm/list_view');
  const SettingsPanel = require('modules/settings_panel');
  const ApnSettingsManager = require('modules/apn/apn_settings_manager');
  const ApnTemplateFactory = require('panels/apn_list/apn_template_factory');
  return function createApnSettingsPanel() {

    //设置案件
    function registerSoftkey() {
      //1.左边:添加APN
      const softkeyAdd = {
        name: 'Add Apn',
        l10nId: 'add-apn',
        priority: 1,
        method: () => {
          onApnAddAction(serviceIdNum, apnType, rootElement);
        }
      };
      //2.中间:选中APN
      const softkeySelect = {
        name: 'Select',
        l10nId: 'select',
        priority: 2,
        method: () => {
          if (!rootElement.querySelector('.focus label')) {
            return;
          }
          const dataItemId = rootElement.querySelector('.focus label').dataset
            .id;
          const radioElement = rootElement.querySelector('.focus input');
          onApnItemDefaultSet(
            serviceIdNum,
            apnType,
            radioElement,
            itemsOBJ[dataItemId]
          );
          SettingsSoftkey.hide();
          returnTop();
        }
      };
      //3.右边:编辑+删除(+重置)
      const softkeyOption = [
        {
          name: 'Edit',
          l10nId: 'edit',
          priority: 7,
          method: () => {
            focusId = getFocusPos(rootElement);
            const dataItemId = rootElement.querySelector('.focus label').dataset
              .id;
            onApnItemEdit(itemsOBJ[dataItemId]);
          }
        },
        {
          name: 'Delete',
          l10nId: 'delete-apn',
          priority: 8,
          method: () => {
            const dataItemId = rootElement.querySelector('.focus label').dataset
              .id;
            const focusItem = itemsOBJ[dataItemId];
            const dialogConfig = {
              title: { id: 'confirmation', args: {} },
              body: {
                id: 'delete-apn-confirm',
                args: {
                  apnName: focusItem.apn.carrier
                }
              },
              cancel: {
                l10nId: 'cancel',
                priority: 1
              },
              confirm: {
                l10nId: 'delete-apn',
                priority: 3,
                callback: () => {
                  if (focusItem.apn.deletedCpApn === false) {
                    focusItem.apn.deletedCpApn = true;
                    ApnSettingsManager.updateApn(
                      serviceIdNum,
                      focusItem.id,
                      focusItem.apn
                    )
                      .then(() => {
                        onApnDelete(rootElement, focusItem.apn.carrier);
                      })
                      .then(() => {
                        updateUI();
                      });
                  } else {
                    ApnSettingsManager.removeApn(serviceIdNum, focusItem.id)
                      .then(() => {
                        onApnDelete(rootElement, focusItem.apn.carrier);
                      })
                      .then(() => {
                        updateUI();
                      });
                  }
                }
              }
            };
            DialogHelper.show(dialogConfig);
          }
        }, //如果没有定制开发添加下面reset,可以去掉此逗号 

        //【开发方案】添加 reset 功能,重置APN
        {
            name: 'Reset to Default',
            l10nId: 'reset-apn',
            priority: 9,
            method() {
                resetApn();
            }
        }
      ]; //softkeyOption 

      const softkeyParams = {
        header: { l10nId: 'options' },
        items: []
      };
      let focusLabel = rootElement.querySelector('.focus label');
      if (!focusLabel) {
        focusLabel = rootElement.querySelector('li label');
      }
      softkeyParams.items.push(softkeyAdd);

      //最终判断菜单用的常量
      if (focusLabel) {
        softkeyParams.items.push(softkeySelect);
        const dataItemId = focusLabel.dataset.id;
        const focusItem = itemsOBJ[dataItemId];
        if (
          focusItem.itemCategory !== 'preset' ||
          focusItem.itemApn.carrier !== 'Jio 4G'
        ) {
          // eslint-disable-next-line
          softkeyParams.items.push.apply(softkeyParams.items, softkeyOption);
        }
      }
      SettingsSoftkey.init(softkeyParams);

    } //菜单功能函数接口 registerSoftkey

    //更新菜单配置
    function updateSoftkey() {
      registerSoftkey();
      SettingsSoftkey.show();
    }


    return SettingsPanel({
    }); //SettingsPanel

  }; //createApnSettingsPanel.
});

方案介绍

在功能函数 registerSoftkey 中自定义菜单选项常量 softkeyOption_custom,然后最后通过判断你选择不同的菜单内容项。

      const softkeyOption_custom = [
          {
              name: 'More Info',
              l10nId: 'more-info',
              priority: 7,
              method: function() {
                  focusId = getFocusPos(rootElement);
                  const dataItemId=rootElement.querySelector('.focus label').dataset.id;
                  onApnItemMoreInfo(itemsOBJ[dataItemId]);
              }
          }
      ];

      if (focusLabel) {
        softkeyParams.items.push(softkeySelect);
        const dataItemId = focusLabel.dataset.id;
        const focusItem = itemsOBJ[dataItemId];
        if(ApnUtils.isOpSim()) { //自定义接口判断 , ApnUtils工具类自定义在js/module中
			softkeyParams.items.push.apply(softkeyParams.items, softkeyOption_custom );
			dump('apn_list/panel, OP require to remove Reset menu.');
        } else {
            softkeyParams.items.push.apply(softkeyParams.items, softkeyOption);
        }
      }

apn_list/panel.js 导入个工具类可用如下方式:

const ApnUtils = require('modules/apn/apn_utils');

apn_utils.js

  • gaia/apps/settings/js/module/apn/apn_utils.js

Note:新增接口的时候一定要同步加到return中,否则报错找不到函数:

04-05 16:50:43.277  2048  2048 E Web Content: [JavaScript Error: "TypeError: ApnUtils.isOpSim is not a function" {file: "http://settings.localhost/js/panels/apn_list/panel.js" line: 291}]

/* global ApnHelper, SimCardHelper */
/**
 * The apn utilities
 */
'use strict';
define(function(require) { //eslint-disable-line
  const ApnConst = require('modules/apn/apn_const');
  const ApnItem = require('modules/apn/apn_item');



  //新增函数判断运营商
  function isOpSim() {
    let connection = navigator.b2g.mobileConnections;
    if (connection[0]) {
      let iccId = connection[0].iccId;
      if (iccId) {
        let iccInfo = navigator.b2g.iccManager.getIccById(iccId).iccInfo;
        if (iccInfo) {
	  let mcc = iccInfo.mcc;
          let mnc = iccInfo.mnc;
          let gid1 = iccInfo.gid1 + '';
          let gid1Upper = gid1.toUpperCase() + '';
          let mccmnc = mcc.concat(mnc);
          dump('apn_utils: check isOpSim, mccmnc = ' + mccmnc + ', gid1 = ' + gid1);
          if (gid1Upper.indexOf('BA01490000000000') == 0 && mccmnc === '311480') {
              return true;
          } else if (mccmnc === '31420') {
              return true;
          }
        }
      }
    }
	return false;
  }
                    
  return {
    getOperatorCode,
    apnTypeFilter,
    getDefaultApns,
    getCpApns,
    getEuApns,
    generateId,
    separateApnsByType,
    isMatchedApn,
    sortByCategory,
    clone,
    isOpSim
  };
});

三、调试Debug

push替换settings应用文件application.zip到设备快速调试。

如果是kaios全编项目,则settings产物在 gaia/profile/webapps 目录下。

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值