[ 
https://issues.apache.org/jira/browse/CB-2273?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Joe Bowser resolved CB-2273.
----------------------------

    Resolution: Fixed

Merged the fix in, turns out that it does work fine, but that our geolocation 
plugin is slow.  There's no reason for this not to go in at this point. 
https://git-wip-us.apache.org/repos/asf?p=cordova-android.git;a=commit;h=99e7d1e1619a116c402aade71d29a767032d6d1d
                
> There is a bug in the android geolocation plugin of Cordova 2.3
> ---------------------------------------------------------------
>
>                 Key: CB-2273
>                 URL: https://issues.apache.org/jira/browse/CB-2273
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android
>    Affects Versions: 2.2.0, 2.3.0
>         Environment: HTC t328D,Android 4.0.3
>            Reporter: SunshineTech Zhang
>            Assignee: Joe Bowser
>              Labels: patch
>
> When I call the watchPosition function, it only call back my successCallback 
> function 2 times and errorCallback function once. That is, it call back 
> successCallback function of getCurrentPosition and watchPosition; and 
> errorCallback function of watchPosition when timeout event was fired. Then 
> the plugin gives nothing any more.
> Then I read the source code of org.apache.cordova.GeoBroker and 
> org.apache.cordova.CordovaLocationListener. I found there was an issue in the 
> win and fail method of org.apache.cordova.CordovaLocationListener. That is, 
> after the listener called its callbacks' by traversal, it then stop itself, 
> so it doesn't listen position changed information for its watches list.
> So I modify them, the plugin runs well.
> 1. I modify the win and fail method in the 
> org.apache.cordova.CordovaLocationListener as the following:
> protected void fail(int code, String message) {
>         for (CallbackContext callbackContext: this.callbacks)
>         {
>             this.owner.fail(code, message, callbackContext, false);
>         }
>         if(this.owner.isGlobalListener(this) && this.watches.size() == 0)
>         {
>               Log.d(TAG, "Stopping global listener");
>               this.stop();
>         }
>         this.callbacks.clear();
>         Iterator<CallbackContext> it = this.watches.values().iterator();
>         while (it.hasNext()) {
>             this.owner.fail(code, message, it.next(), true);
>         }
>     }
>     private void win(Location loc) {
>         for (CallbackContext callbackContext: this.callbacks)
>         {
>             this.owner.win(loc, callbackContext, false);
>         }
>         if(this.owner.isGlobalListener(this) && this.watches.size() == 0)
>         {
>               Log.d(TAG, "Stopping global listener");
>               this.stop();
>         }
>         this.callbacks.clear();
>         Iterator<CallbackContext> it = this.watches.values().iterator();
>         while (it.hasNext()) {
>             this.owner.win(loc, it.next(), true);
>         }
>     }
> 2、I modify the win and fail method in the org.apache.cordova.GeoBroker as the 
> following:
> public void win(Location loc, CallbackContext callbackContext, boolean 
> keepCallback) {
>       PluginResult result = new PluginResult(PluginResult.Status.OK, 
> this.returnLocationJSON(loc));
>       result.setKeepCallback(keepCallback);
>         callbackContext.sendPluginResult(result);
> }
> public void fail(int code, String msg, CallbackContext callbackContext, 
> boolean keepCallback) {
>         JSONObject obj = new JSONObject();
>         String backup = null;
>         try {
>             obj.put("code", code);
>             obj.put("message", msg);
>         } catch (JSONException e) {
>             obj = null;
>             backup = "{'code':" + code + ",'message':'" + msg.replaceAll("'", 
> "\'") + "'}";
>         }
>         PluginResult result;
>         if (obj != null) {
>             result = new PluginResult(PluginResult.Status.ERROR, obj);
>         } else {
>             result = new PluginResult(PluginResult.Status.ERROR, backup);
>         }
>         result.setKeepCallback(keepCallback);
>         callbackContext.sendPluginResult(result);
>     }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to