From 7f7cc1db2a5e15e5fbf2456b1c04114a7eb28cc0 Mon Sep 17 00:00:00 2001 From: Bryce Curtis Date: Thu, 23 Sep 2010 14:34:56 -0500 Subject: [PATCH] Add geolocation options as defined by W3C spec. --- framework/assets/js/geolocation.js | 38 +++++++++++++++++++++-- framework/src/com/phonegap/GeoBroker.java | 26 ++++++++++------ 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/framework/assets/js/geolocation.js b/framework/assets/js/geolocation.js index 40f06da4..e063f075 100755 --- a/framework/assets/js/geolocation.js +++ b/framework/assets/js/geolocation.js @@ -42,8 +42,22 @@ Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallba } return; } + var maximumAge = 10000; + var enableHighAccuracy = false; + var timeout = 10000; + if (typeof options != "undefined") { + if (typeof options.maximumAge != "undefined") { + maximumAge = options.maximumAge; + } + if (typeof options.enableHighAccuracy != "undefined") { + enableHighAccuracy = options.enableHighAccuracy; + } + if (typeof options.timeout != "undefined") { + timeout = options.timeout; + } + } navigator._geo.listeners["global"] = {"success" : successCallback, "fail" : errorCallback }; - PhoneGap.execAsync(null, null, "Geolocation", "getCurrentLocation", []); + PhoneGap.execAsync(null, null, "Geolocation", "getCurrentLocation", [enableHighAccuracy, timeout, maximumAge]); } /** @@ -56,15 +70,32 @@ Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallba * @return String The watch id that must be passed to #clearWatch to stop watching. */ Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { - var frequency = (options != undefined)? options.frequency : 10000; + var maximumAge = 10000; + var enableHighAccuracy = false; + var timeout = 10000; + if (typeof options != "undefined") { + if (typeof options.frequency != "undefined") { + maximumAge = options.frequency; + } + if (typeof options.maximumAge != "undefined") { + maximumAge = options.maximumAge; + } + if (typeof options.enableHighAccuracy != "undefined") { + enableHighAccuracy = options.enableHighAccuracy; + } + if (typeof options.timeout != "undefined") { + timeout = options.timeout; + } + } var id = PhoneGap.createUUID(); navigator._geo.listeners[id] = {"success" : successCallback, "fail" : errorCallback }; - PhoneGap.execAsync(null, null, "Geolocation", "start", [frequency, id]); + PhoneGap.execAsync(null, null, "Geolocation", "start", [id, enableHighAccuracy, timeout, maximumAge]); return id; }; /* * Native callback when watch position has a new position. + * PRIVATE METHOD * * @param {String} id * @param {Number} lat @@ -98,6 +129,7 @@ Geolocation.prototype.success = function(id, lat, lng, alt, altacc, head, vel, s /** * Native callback when watch position has an error. + * PRIVATE METHOD * * @param {String} id The ID of the watch * @param {Number} code The error code diff --git a/framework/src/com/phonegap/GeoBroker.java b/framework/src/com/phonegap/GeoBroker.java index e799f50c..45281d76 100755 --- a/framework/src/com/phonegap/GeoBroker.java +++ b/framework/src/com/phonegap/GeoBroker.java @@ -67,10 +67,10 @@ public class GeoBroker implements Plugin { try { if (action.equals("getCurrentLocation")) { - this.getCurrentLocation(); + this.getCurrentLocation(args.getBoolean(0), args.getInt(1), args.getInt(2)); } else if (action.equals("start")) { - String s = this.start(args.getInt(0), args.getString(1)); + String s = this.start(args.getString(0), args.getBoolean(1), args.getInt(2), args.getInt(3)); return new PluginResult(status, s); } else if (action.equals("stop")) { @@ -143,36 +143,42 @@ public class GeoBroker implements Plugin { /** * Get current location. * The result is returned to JavaScript via a callback. + * + * @param enableHighAccuracy + * @param timeout + * @param maximumAge */ - public void getCurrentLocation() { + public void getCurrentLocation(boolean enableHighAccuracy, int timeout, int maximumAge) { // Create a geolocation listener just for getCurrentLocation and call it "global" if (this.global == null) { - this.global = new GeoListener("global", this.ctx, 10000, this.webView); + this.global = new GeoListener("global", this.ctx, maximumAge, this.webView); } else { - this.global.start(10000); + this.global.start(maximumAge); } } /** * Start geolocation listener and add to listener list. * - * @param freq Period to retrieve geolocation - * @param key The listener id + * @param key The listener id + * @param enableHighAccuracy + * @param timeout + * @param maximumAge * @return */ - public String start(int freq, String key) { + public String start(String key, boolean enableHighAccuracy, int timeout, int maximumAge) { // Make sure this listener doesn't already exist GeoListener listener = geoListeners.get(key); if (listener == null) { - listener = new GeoListener(key, this.ctx, freq, this.webView); + listener = new GeoListener(key, this.ctx, maximumAge, this.webView); geoListeners.put(key, listener); } // Start it - listener.start(freq); + listener.start(maximumAge); return key; }