增加National data roaming 菜單定製

AT&T 等運營商需求:
增加 National data roaming /All network roaming 漫遊開關選項
National data roaming :sim卡與註冊網絡:mcc相同,mnc不同
All network roaming :sim卡與註冊網絡:mcc不同
 
目前MTK平臺行爲: 漫遊開關只有enable 和disable 選項, 不區分National data roaming /All network roaming
 
 
 
方案: 在mobile network settings中新增 National data roaming /All network roaming 菜單,用feature控制是顯示平臺原始的漫遊開關,還是新的漫遊開關
具體實現分爲兩部分:1. 界面部分實現  2. data framework部分實現
 
一 : 界面部分實現
//添加具有national data roaming和all network roaming和disable選項的漫遊開關菜單
 
1.增加布局文件
   在 /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) {
652       prefSet.removeAll();
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是怎麼做的)
-----------------------------------------------------------
二:data framework 部分
//怎麼去判斷當前網絡是否處在national data roaming狀態的?   
//以及默認爲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,不是最簡潔的,可以作爲參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章