在 /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,不是最簡潔的,可以作爲參考。