在 /packages/services/Telephonyres/xml/network_setting.xml增加新菜单的布局
如旧的roaming布局是button_roaming_key, 可以新增布局文件是button_roamingforxx_key
旧的只有enable和disable两项,使用switch, 新的是national data roaming和all network roaming和disable, 使用ListPreference
注意: 是新增布局,不是删除旧的
2. 在代码中添加布局:
/packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java
a.新增控件
旧的:private static final String BUTTON_ROAMING_KEY = "button_roaming_key";
新增:private static final String BUTTON_ROAMING_KEY = "button_roamingforxx_key";
旧的控件:private SwitchPreference mButtonDataRoam;
新的控件:private ListPreference mButtonDataRoamForXX; //因为有三项,所以使用 ListPreference
b.在onCreat里加载布局到控件里:
旧的 mButtonDataRoam = (SwitchPreference) prefSet.findPreference(BUTTON_ROAMING_KEY);
新的:mButtonDataRoamForXX =...
c. 在 updateBody()中使用feature来控制mobile network settings界面是显示默认的漫游开关,还是显示新的AT&T的漫游开关菜单
if (prefSet != null) {
653 prefSet.addPreference(mButtonDataRoam); //默认是显示的data roaming开关,可以在这里定制显示为AT&T的漫游菜单
654 prefSet.addPreference(mButtonPreferredNetworkMode);
...
657 }
3. 设置初始默认值 (例如初始值是设置为national data roaming打开,还是all network roaming打开,还是disable)
可以在updateBody中设置菜单的选项,具体怎么设置可以参考mButtonPreferredNetworkMode的实现,mButtonPreferredNetworkMode也是ListPreferencem
4. 增加点击national data roaming和all network roaming 菜单的逻辑
在onPreferenceChange增加点击ButtonDataRoamForXX的逻辑(具体可以参考mButtonDataRoam是怎么做的)
//以及默认为national data roaming时, data方面的控制逻辑修改。
a.目前判断漫游状态的接口是:
/frameworks/base/telephony/java/android/telephony/ServiceState.java
getDataRoaming()
上面这个接口状态可以认为是全网漫游:all network raoming的接口(sim卡的mcc != 注册网络的mcc)
可以在同样的地方定制一个national data roaming状态的接口:getNationalDataRoaming()
判断是否是national roaming的方法是: (sim卡的mcc == 注册网络的mcc) &&(sim卡的mnc != 注册网络的mnc)
----------------------------------
b.判断漫游开关状态的接口是:
/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
getDataOnRoamingEnabled()
//假设项目是双卡,会走如下逻辑读取漫游开关数据库
isDataRoamingEnabled = TelephonyManager.getIntWithSubId(mResolver,
Settings.Global.DATA_ROAMING, phoneSubId) != 0;
这里假设对漫游数据库的设计是:0代表disable , 1代表national roaming , 2 代表 all network roaming
上面这一段可以修改为:
isDataRoamingEnabled =TelephonyManager.getIntWithSubId(mResolver,
Settings.Global.DATA_ROAMING, phoneSubId) ==2 ; //定制是否是全网漫游模式,AT&T的漫游菜单,才这样判断,否则保持默认
同时在增加national roaming的开关状态接口getNationalDataOnRoamingEnabled() --> 参考getDataOnRoamingEnabled()的设计
c.最后一步,在代码中有判断漫游状态及开关的状态处增加national roaming的判断,以界面打开数据开关走到onSetUserDataEnabled里判断漫游开关举例:
原始的:
if (getDataOnRoamingEnabled() == false &&
mPhone.getServiceState().getDataRoaming() == true) {
新的:
if (getDataOnRoamingEnabled() == false &&
mPhone.getServiceState().getDataRoaming() == true || (getNationalDataRoaming() && getNationalDataOnRoamingEnabled()) ) {
note : 上面的方案针对N和M,不是最简洁的,可以作为参考。