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


    一、模块需求介绍

    参考: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

    1. /**
    2. * The apn list panel
    3. */
    4. 'use strict';
    5. define(function(require) { //eslint-disable-line
    6. const ListView = require('modules/mvvm/list_view');
    7. const SettingsPanel = require('modules/settings_panel');
    8. const ApnSettingsManager = require('modules/apn/apn_settings_manager');
    9. const ApnTemplateFactory = require('panels/apn_list/apn_template_factory');
    10. return function createApnSettingsPanel() {
    11. //设置案件
    12. function registerSoftkey() {
    13. //1.左边:添加APN
    14. const softkeyAdd = {
    15. name: 'Add Apn',
    16. l10nId: 'add-apn',
    17. priority: 1,
    18. method: () => {
    19. onApnAddAction(serviceIdNum, apnType, rootElement);
    20. }
    21. };
    22. //2.中间:选中APN
    23. const softkeySelect = {
    24. name: 'Select',
    25. l10nId: 'select',
    26. priority: 2,
    27. method: () => {
    28. if (!rootElement.querySelector('.focus label')) {
    29. return;
    30. }
    31. const dataItemId = rootElement.querySelector('.focus label').dataset
    32. .id;
    33. const radioElement = rootElement.querySelector('.focus input');
    34. onApnItemDefaultSet(
    35. serviceIdNum,
    36. apnType,
    37. radioElement,
    38. itemsOBJ[dataItemId]
    39. );
    40. SettingsSoftkey.hide();
    41. returnTop();
    42. }
    43. };
    44. //3.右边:编辑+删除(+重置)
    45. const softkeyOption = [
    46. {
    47. name: 'Edit',
    48. l10nId: 'edit',
    49. priority: 7,
    50. method: () => {
    51. focusId = getFocusPos(rootElement);
    52. const dataItemId = rootElement.querySelector('.focus label').dataset
    53. .id;
    54. onApnItemEdit(itemsOBJ[dataItemId]);
    55. }
    56. },
    57. {
    58. name: 'Delete',
    59. l10nId: 'delete-apn',
    60. priority: 8,
    61. method: () => {
    62. const dataItemId = rootElement.querySelector('.focus label').dataset
    63. .id;
    64. const focusItem = itemsOBJ[dataItemId];
    65. const dialogConfig = {
    66. title: { id: 'confirmation', args: {} },
    67. body: {
    68. id: 'delete-apn-confirm',
    69. args: {
    70. apnName: focusItem.apn.carrier
    71. }
    72. },
    73. cancel: {
    74. l10nId: 'cancel',
    75. priority: 1
    76. },
    77. confirm: {
    78. l10nId: 'delete-apn',
    79. priority: 3,
    80. callback: () => {
    81. if (focusItem.apn.deletedCpApn === false) {
    82. focusItem.apn.deletedCpApn = true;
    83. ApnSettingsManager.updateApn(
    84. serviceIdNum,
    85. focusItem.id,
    86. focusItem.apn
    87. )
    88. .then(() => {
    89. onApnDelete(rootElement, focusItem.apn.carrier);
    90. })
    91. .then(() => {
    92. updateUI();
    93. });
    94. } else {
    95. ApnSettingsManager.removeApn(serviceIdNum, focusItem.id)
    96. .then(() => {
    97. onApnDelete(rootElement, focusItem.apn.carrier);
    98. })
    99. .then(() => {
    100. updateUI();
    101. });
    102. }
    103. }
    104. }
    105. };
    106. DialogHelper.show(dialogConfig);
    107. }
    108. }, //如果没有定制开发添加下面reset,可以去掉此逗号
    109. //【开发方案】添加 reset 功能,重置APN
    110. {
    111. name: 'Reset to Default',
    112. l10nId: 'reset-apn',
    113. priority: 9,
    114. method() {
    115. resetApn();
    116. }
    117. }
    118. ]; //softkeyOption
    119. const softkeyParams = {
    120. header: { l10nId: 'options' },
    121. items: []
    122. };
    123. let focusLabel = rootElement.querySelector('.focus label');
    124. if (!focusLabel) {
    125. focusLabel = rootElement.querySelector('li label');
    126. }
    127. softkeyParams.items.push(softkeyAdd);
    128. //最终判断菜单用的常量
    129. if (focusLabel) {
    130. softkeyParams.items.push(softkeySelect);
    131. const dataItemId = focusLabel.dataset.id;
    132. const focusItem = itemsOBJ[dataItemId];
    133. if (
    134. focusItem.itemCategory !== 'preset' ||
    135. focusItem.itemApn.carrier !== 'Jio 4G'
    136. ) {
    137. // eslint-disable-next-line
    138. softkeyParams.items.push.apply(softkeyParams.items, softkeyOption);
    139. }
    140. }
    141. SettingsSoftkey.init(softkeyParams);
    142. } //菜单功能函数接口 registerSoftkey
    143. //更新菜单配置
    144. function updateSoftkey() {
    145. registerSoftkey();
    146. SettingsSoftkey.show();
    147. }
    148. return SettingsPanel({
    149. }); //SettingsPanel
    150. }; //createApnSettingsPanel.
    151. });

    方案介绍

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

    1. const softkeyOption_custom = [
    2. {
    3. name: 'More Info',
    4. l10nId: 'more-info',
    5. priority: 7,
    6. method: function() {
    7. focusId = getFocusPos(rootElement);
    8. const dataItemId=rootElement.querySelector('.focus label').dataset.id;
    9. onApnItemMoreInfo(itemsOBJ[dataItemId]);
    10. }
    11. }
    12. ];
    13. if (focusLabel) {
    14. softkeyParams.items.push(softkeySelect);
    15. const dataItemId = focusLabel.dataset.id;
    16. const focusItem = itemsOBJ[dataItemId];
    17. if(ApnUtils.isOpSim()) { //自定义接口判断 , ApnUtils工具类自定义在js/module中
    18. softkeyParams.items.push.apply(softkeyParams.items, softkeyOption_custom );
    19. dump('apn_list/panel, OP require to remove Reset menu.');
    20. } else {
    21. softkeyParams.items.push.apply(softkeyParams.items, softkeyOption);
    22. }
    23. }

    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}]

    1. /* global ApnHelper, SimCardHelper */
    2. /**
    3. * The apn utilities
    4. */
    5. 'use strict';
    6. define(function(require) { //eslint-disable-line
    7. const ApnConst = require('modules/apn/apn_const');
    8. const ApnItem = require('modules/apn/apn_item');
    9. //新增函数判断运营商
    10. function isOpSim() {
    11. let connection = navigator.b2g.mobileConnections;
    12. if (connection[0]) {
    13. let iccId = connection[0].iccId;
    14. if (iccId) {
    15. let iccInfo = navigator.b2g.iccManager.getIccById(iccId).iccInfo;
    16. if (iccInfo) {
    17. let mcc = iccInfo.mcc;
    18. let mnc = iccInfo.mnc;
    19. let gid1 = iccInfo.gid1 + '';
    20. let gid1Upper = gid1.toUpperCase() + '';
    21. let mccmnc = mcc.concat(mnc);
    22. dump('apn_utils: check isOpSim, mccmnc = ' + mccmnc + ', gid1 = ' + gid1);
    23. if (gid1Upper.indexOf('BA01490000000000') == 0 && mccmnc === '311480') {
    24. return true;
    25. } else if (mccmnc === '31420') {
    26. return true;
    27. }
    28. }
    29. }
    30. }
    31. return false;
    32. }
    33. return {
    34. getOperatorCode,
    35. apnTypeFilter,
    36. getDefaultApns,
    37. getCpApns,
    38. getEuApns,
    39. generateId,
    40. separateApnsByType,
    41. isMatchedApn,
    42. sortByCategory,
    43. clone,
    44. isOpSim
    45. };
    46. });

    三、调试Debug

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

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

  • 相关阅读:
    【数据结构趣味多】时间复杂度和空间复杂度
    制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)
    Kurento多对多webrtc会议搭建测试
    大数据在电力行业的应用案例100讲(十九)-按钮设计与开发落地
    安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】
    数据结构:静动图结合,活灵活现 讲解—— 堆排序, 直接选择排序
    MyBatis的< resultMap >标签的简析
    外汇天眼:法国金融市场管理局(AMF)致力于向零售投资者提供有关金融产品费用的信息
    学习【Cesium】第九篇,鼠标交互和数据查询(学不会揍我)
    stable diffusion本地部署教程
  • 原文地址:https://blog.csdn.net/qq_38666896/article/details/136298000