浏览模式: 标准 | 列表
11月
04

WiFi激活

WiFi激活不是本人首创,该方法在WebOS还只是1.0.2的时候,就已经被开发出来了,并被记录在了 http://www.webos-internals.org/wiki/Patch_webOS_Bypassing_Activation 上。

但是上面写的都是手工修改的方法,做起来比较麻烦,用MetaDoctor就会简单的多:

第一步,在patches目录下找到你需要修改的版本的目录,然后在里面创建一个空的patch文件,比如叫wifi-activation.patch。

第二步,用MetaDoctor的scripts目录下面的unpack-doctor或者unpack-rootfs把WebOS Doctor解开。

第三步,找到/usr/palm/applications/com.palm.app.firstuse/app/controllers/firstuse-util.js,复制一份,比如叫firstuse-util.new.js,然后对其修改保存。

第四步,运行diff –u firstuse-util.js firstuse-util.new.js > firstuse-util.patch,生成补丁。

第五步,同样方法修改并生成account-service.patch。

第六步,把这两个patch里的内容复制到patches目录下创建的那个wifi-activation.patch文件中,每个文件开头那两行的格式,可以按照bypass-activation.patch里面的格式改一下(我没试过不改可不可以用)。

最后,修改Makefile,在其中加上WIFI_ACTIVATION这个选项,修改方法可以参考它原来的BYPASS_ACTIVATION的代码,具体修改那几行这里就不列出来了。 上面的说明中,细心的读者也许会发现,我把Wiki里面关于app-assistant.js的修改给忽略了。不是我忘记了,而是故意的,下面就来解释为何忽略。关于app-assistant.js的修改其实就是bypass-activation.patch做的事情,不同版本的webOS的bypass-activation.patch并不相同,所以按照那个修改并不是最好的方法,最好的方法是直接在Makefile中把BYPASS_ACTIVATION这一项打开就一样了。另外,WIFI_ACTIVATION跟BYPASS_ACTIVATION并没有直接的关系,只是打开BYPASS_ACTIVATION之后,你可以在刷机之后不用插卡,但是不能用其它方式激活,只能用WIFI激活。而不打开BYPASS_ACTIVATION的话则必须插卡,但是除了可以用WIFI激活意外,也可以用2G、3G方式激活。

好了,现在运行一下MetaDoctor的make命令,你的带WIFI激活的ROM就生成了。

刷机之后,在紧急拨号菜单里就可以打开WIFI设置页了。

但这个WIFI设置有一点点小问题,就是设置完成之后,你会发现无法退出这个设置界面,要想继续激活的过程,就需要用“方块+Sym+R”来重启手机才能继续。

那如何才能让让WIFI设置界面可以在设置完成之后正常退出呢?这个思路可以参考紧急拨号界面。

在account-service.js这个文件中,有一个方法是用来打开紧急拨号界面的,我们来看一下它的代码:

JavaScript代码
 
  1. makeEmergencyCall: function (emergencyNumber) {  
  2.     Mojo.Log.info("Emegerncy call to phone app -------------------------------------------------: ",emergencyNumber);  
  3.     return new Mojo.Service.Request("palm://com.palm.applicationManager/open", {  
  4.            parameters: {  
  5.                id: 'com.palm.app.phone',  
  6.                params: {  
  7.                    "prefill": emergencyNumber,  
  8.                 "firstuse":true,  
  9.                 "locale": Account.language + '_' + Account.country   
  10.                }  
  11.            }  
  12.        });  
  13.       
  14. },  

这段代码中,我们可以看到firstuse和locale这两个参数,也就是说紧急拨号调用的就是电话程序,只不过是传入了一个firstuse参数让其可以作特殊处理(locale则是可以在调用它时设置语言)。所以,我们在紧急拨号界面下可以看到取消按钮,而普通情况下打电话则没有这个按钮。

所以,我们也可以给WIFI设置程序增加一个firstuse参数,如果要让他也能根据调用环境设置语言,我们也可以给它增加一个locale参数,不过com.palm.app.wifi本身是不支持这两个参数的,因此我们要对它进行修改。下面是对com.palm.app.wifi相关文件进行的修改:

JavaScript代码
 
  1. --- .orig/usr/palm/applications/com.palm.app.wifi/app/controllers/app-assistant.js  
  2. +++ /usr/palm/applications/com.palm.app.wifi/app/controllers/app-assistant.js  
  3. @@ -9,6 +9,16 @@  
  4.     var dashboardStage = this.controller.getStageProxy('wifidashboard');  
  5.     var networkListStage = this.controller.getStageProxy('networklist');  
  6.    
  7. +   if (params) {  
  8. +       this.firstuse = PalmSystem.isMinimal || params.firstuse === true;  
  9. +       //If the First Use passes the locale different than the current one, change the Mojo.Locale(Framework)  
  10. +       if (this.firstuse) {  
  11. +           if (params.locale && params.locale.length === 5 && params.locale != Mojo.Locale.current) {  
  12. +               Mojo.Locale.set(params.locale);  
  13. +           }  
  14. +       }  
  15. +    }  
  16. +  
  17.     if (networkListStage)  
  18.     {  
  19.         Mojo.Log.info("Wifi launch reactivate");  
  20. --- .orig/usr/palm/applications/com.palm.app.wifi/app/controllers/networklist-assistant.js  
  21. +++ /usr/palm/applications/com.palm.app.wifi/app/controllers/networklist-assistant.js  
  22. @@ -3,6 +3,7 @@  
  23.  var list_label_toggle_off = $L("Off");  
  24.  var list_label_list_other_network = $L("Join other network");  
  25.  var list_label_list_network = $L("Join network");  
  26. +var list_label_done_button = $L("Done");  
  27.    
  28.  var list_label_status_associating = $L("Connecting......");  
  29.  var list_label_status_associated = $L("...Connecting...");  
  30. @@ -70,7 +71,7 @@  
  31.              Mojo.Log.info("initialize(): called via wifi preferences with params - " + Object.toJSON(params));  
  32.              this.bRunViaPreferencesMenu = true;  
  33.              this.params = params;  
  34. -        } else if (params.hotspot) {  
  35. +        } else if (params.hotspot || params.firstuse) {  
  36.              this.params = params;  
  37.          }  
  38.          this.findNetworksHandle = undefined;  
  39. @@ -170,6 +171,17 @@  
  40.              }  
  41.          });  
  42.    
  43. +        this.doneButtonModel = {buttonLabel: list_label_done_button};        
  44. +        this.controller.setupWidget('doneButton', {type:Mojo.Widget.activityButton}, this.doneButtonModel);  
  45. +        this.doneButton = this.controller.get('doneButton');  
  46. +        if (this.params && this.params.firstuse) {  
  47. +            this.doneButton.style.display = "block";  
  48. +        }  
  49. +        else {  
  50. +            this.doneButton.style.display = "none";  
  51. +        }  
  52. +        Mojo.Event.listen(this.doneButton, 'mojo-tap'this.closeAllStages.bind(this))  
  53. +  
  54.          timing.pause('scene#networklist#setup');  
  55.  //        Mojo.Log.info("setup(): leaving");  
  56.      },  
  57. @@ -976,6 +988,10 @@  
  58.             template: 'joinwapicerts/joinwapicerts-scene',  
  59.             assistant: new JoinwapicertsAssistant(this, item)  
  60.          });  
  61. +    },  
  62. +  
  63. +    closeAllStages: function() {  
  64. +        this.controller.stageController.getAppController().closeAllStages();  
  65.      }  
  66.    
  67.  });  
  68. --- .orig/usr/palm/applications/com.palm.app.wifi/app/views/networklist/networklist-scene.html  
  69. +++ /usr/palm/applications/com.palm.app.wifi/app/views/networklist/networklist-scene.html  
  70. @@ -18,4 +18,5 @@  
  71.      <div id="wifiOffText" style="display:none;" class="palm-text-wrapper">  
  72.             <div class="palm-body-text" x-mojo-loc=''>Wi-Fi is turned off.</div>  
  73.      </div>  
  74. +    <div x-mojo-element="Button" style="display:none;" id="doneButton"></div>  
  75.  </div>  

其实很简单就是增加一个Done的按钮,这个按钮在com.palm.app.wifi启动时,如果带有firstuse这个参数就设置为可见,而这个按钮的用处就是关闭WIFI设置程序。另外,开头还会根据locale参数来设置一下语言。

那现在我们在com.palm.app.firstuse里面再调用它,只要带上这两个参数就可以了。接下来我们可能还希望在刷机第一次启动时,选择语言之前就能进行WIFI配置。最简单的方法当然就是在设置语言的页面里面也调用这个打开WIFI设置程序的方法咯。但如果你真的这样做的话,会发现你并看不到WIFI设置程序。原因是最开始执行时,被放在后面了,只有当它完全启动之后,再调用一次,他才会显示到前面来。但是我们不知道它需要多久才能启动完毕,所以我们设置几个定时器,每隔一段时间调用一次就可以啦:

JavaScript代码
 
  1. --- .orig/usr/palm/applications/com.palm.app.firstuse/app/controllers/language-assistant.js  
  2. +++ /usr/palm/applications/com.palm.app.firstuse/app/controllers/language-assistant.js  
  3. @@ -34,6 +34,7 @@  
  4.           
  5.         // Listen to ## key presses  
  6.         this.controller.listen(this.controller.sceneElement, Mojo.Event.keydown, FirstUseUtil.handleKeyPressEvent.bind(this));  
  7. +       AppAssistant.accountService.enableWifi();  
  8.     },  
  9.       
  10.     powerDownDevice: function () {  
  11. --- .orig/usr/palm/applications/com.palm.app.firstuse/app/controllers/firstuse-util.js  
  12. +++ /usr/palm/applications/com.palm.app.firstuse/app/controllers/firstuse-util.js  
  13. @@ -197,11 +197,13 @@  
  14.         }  
  15.         else{  
  16.             labels = [{label: $L('Emergency call'), command: 'emergency-call'},   
  17. +               {label: $L('Enable WiFi'), command: 'enable-wifi'},  
  18.                 {label: $L('Cancel'), command: 'cancel'}  
  19.                 ];  
  20.             if(FirstUseUtil.customerCareNumber && FirstUseUtil.customerCareNumber.length > 0) {  
  21.                 labels = [{label: $L('Emergency call'), command: 'emergency-call'},   
  22.                     {label: $L('Call customer service'), command: 'customer-care'},  
  23. +                   {label: $L('Enable WiFi'), command: 'enable-wifi'},  
  24.                     {label: $L('Cancel'), command: 'cancel'}  
  25.                 ];  
  26.             }  
  27. @@ -220,6 +222,8 @@  
  28.             Mojo.Log.info("----------------- FirstUseUtil.carrierName ----------------", FirstUseUtil.carrierName());  
  29.             var carrierName = Mojo.Environment.DeviceInfo.carrierName || (FirstUseUtil.carrierString && typeof FirstUseUtil.carrierString === "string" ? FirstUseUtil.carrierString.toUpperCase() : "");  
  30.             AppAssistant.accountService.callCustomerCare(FirstUseUtil.customerCareNumber, $L(carrierName));  
  31. +       } else if (value == "enable-wifi") {  
  32. +           AppAssistant.accountService.enableWifi();  
  33.         } else if(value == "exit"){  
  34.             if (isDemoMode){  
  35.                 new Mojo.Service.Request('palm://com.palm.oddService', {  
  36. --- .orig/usr/palm/applications/com.palm.app.firstuse/app/models/account-service.js  
  37. +++ /usr/palm/applications/com.palm.app.firstuse/app/models/account-service.js  
  38. @@ -408,6 +408,33 @@  
  39.         });  
  40.     },  
  41.       
  42. +   enableWifi: function() {  
  43. +       var method = function() {  
  44. +           return new Mojo.Service.Request("palm://com.palm.applicationManager/open", {  
  45. +               parameters: {  
  46. +                   id: 'com.palm.app.wifi',  
  47. +                   params: {  
  48. +                       "firstuse"true,  
  49. +                       "locale": Account.language + '_' + Account.country  
  50. +                   }  
  51. +               }  
  52. +           });  
  53. +       };  
  54. +       var t1 = setTimeout(function() {  
  55. +           clearTimeout(t1);  
  56. +           method();  
  57. +       }, 8000);  
  58. +       var t2 = setTimeout(function() {  
  59. +           clearTimeout(t2);  
  60. +           method();  
  61. +       }, 4000);  
  62. +       var t3 = setTimeout(function() {  
  63. +           clearTimeout(t3);  
  64. +           method();  
  65. +       }, 2000);  
  66. +       return method();  
  67. +   },  
  68. +  
  69.     makeEmergencyCall: function (emergencyNumber) {  
  70.         Mojo.Log.info("Emegerncy call to phone app -------------------------------------------------: ",emergencyNumber);  
  71.         return new Mojo.Service.Request("palm://com.palm.applicationManager/open", {  

经过这样的修改,我们就可以实现完美的开机WIFI设置了。

上面两段加起来就是WIFI激活的补丁了。我们用这个补丁来替换最开始那个wifi-activation.patch就可以啦。

不过我们还需要作一点小小的工作,那就是要把com.palm.app.wifi这个包的处理部分也要加入到Makefile中,我们可以在Makefile中寻找这段代码:

  1. ifeq (${ADD_EXTRA_CARRIERS},1)  
  2.     OLDIPKGS += pmcarrierdb  
  3. endif  

然后再它前面加入:

  1. ifeq (${WIFI_ACTIVATION},1)  
  2.     OLDIPKGS += com.palm.app.wifi  
  3. endif  

就可以啦,接下来的工作,Makefile就可以正确处理了。

最后我们运行:

make DEVICE=veer CARRIER=att all

就可以生成带有WIFI激活功能的ROM了。