From 78e325196729202e416655e87cf7d1593cda2cc7 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 18 Nov 2015 13:24:28 +1300 Subject: Initial code for location providers --- src/org/traccar/location/BaseLocationProvider.java | 37 ++++++++++++++++++++++ src/org/traccar/location/LocationProvider.java | 30 ++++++++++++++++++ .../location/OpenCellIdLocationProvider.java | 24 ++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/org/traccar/location/BaseLocationProvider.java create mode 100644 src/org/traccar/location/LocationProvider.java create mode 100644 src/org/traccar/location/OpenCellIdLocationProvider.java (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/location/BaseLocationProvider.java b/src/org/traccar/location/BaseLocationProvider.java new file mode 100644 index 000000000..80b10b33c --- /dev/null +++ b/src/org/traccar/location/BaseLocationProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.location; + +import org.traccar.model.Event; + +import java.util.Map; + +public abstract class BaseLocationProvider implements LocationProvider { + + @Override + public void getLocation(Map attributes, LocationProviderCallback callback) { + if (attributes.containsKey(Event.KEY_MCC) || attributes.containsKey(Event.KEY_MNC)) { + Number mcc = (Number) attributes.get(Event.KEY_MCC); + Number mnc = (Number) attributes.get(Event.KEY_MNC); + Number lac = (Number) attributes.get(Event.KEY_LAC); + Number cid = (Number) attributes.get(Event.KEY_CID); + getLocation(mcc.intValue(), mnc.intValue(), lac.longValue(), cid.longValue(), callback); + } + } + + protected abstract void getLocation(int mcc, int mnc, long lac, long cid, LocationProviderCallback callback); + +} diff --git a/src/org/traccar/location/LocationProvider.java b/src/org/traccar/location/LocationProvider.java new file mode 100644 index 000000000..cbc9663f8 --- /dev/null +++ b/src/org/traccar/location/LocationProvider.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.location; + +import java.util.Map; + +public interface LocationProvider { + + interface LocationProviderCallback { + + void onResult(double latitude, double longitude); + + } + + void getLocation(Map attributes, LocationProviderCallback callback); + +} diff --git a/src/org/traccar/location/OpenCellIdLocationProvider.java b/src/org/traccar/location/OpenCellIdLocationProvider.java new file mode 100644 index 000000000..22456c482 --- /dev/null +++ b/src/org/traccar/location/OpenCellIdLocationProvider.java @@ -0,0 +1,24 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.location; + +public class OpenCellIdLocationProvider extends BaseLocationProvider { + + protected void getLocation(int mcc, int mnc, long lac, long cid, LocationProviderCallback callback) { + // TODO + } + +} -- cgit v1.2.3 From 6ec22b7a68b5334e215662e4cb83a20f9a1cad18 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 18 Nov 2015 14:01:00 +1300 Subject: Implement OpenCellID location provider --- src/org/traccar/location/LocationProvider.java | 4 +- .../location/OpenCellIdLocationProvider.java | 44 +++++++++++++++++++++- .../org/traccar/location/LocationProviderTest.java | 15 +++++--- 3 files changed, 55 insertions(+), 8 deletions(-) (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/location/LocationProvider.java b/src/org/traccar/location/LocationProvider.java index cbc9663f8..2bff1a7ca 100644 --- a/src/org/traccar/location/LocationProvider.java +++ b/src/org/traccar/location/LocationProvider.java @@ -21,7 +21,9 @@ public interface LocationProvider { interface LocationProviderCallback { - void onResult(double latitude, double longitude); + void onSuccess(double latitude, double longitude); + + void onFailure(); } diff --git a/src/org/traccar/location/OpenCellIdLocationProvider.java b/src/org/traccar/location/OpenCellIdLocationProvider.java index 22456c482..2339585ad 100644 --- a/src/org/traccar/location/OpenCellIdLocationProvider.java +++ b/src/org/traccar/location/OpenCellIdLocationProvider.java @@ -15,10 +15,50 @@ */ package org.traccar.location; +import com.ning.http.client.AsyncCompletionHandler; +import com.ning.http.client.Response; +import org.traccar.Context; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; + public class OpenCellIdLocationProvider extends BaseLocationProvider { - protected void getLocation(int mcc, int mnc, long lac, long cid, LocationProviderCallback callback) { - // TODO + private String url; + + public OpenCellIdLocationProvider(String key) { + this("http://opencellid.org/cell/get", key); + } + + public OpenCellIdLocationProvider(String url, String key) { + this.url = url + "?format=json&mcc=%d&mnc=%d&lac=%d&cellid=%d&key=" + key; + } + + protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) { + String x = String.format(url, mcc, mnc, lac, cid); + Context.getAsyncHttpClient().prepareGet(String.format(url, mcc, mnc, lac, cid)) + .execute(new AsyncCompletionHandler() { + @Override + public Object onCompleted(Response response) throws Exception { + try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) { + JsonObject json = reader.readObject(); + if (json.containsKey("lat") && json.containsKey("lon")) { + callback.onSuccess( + json.getJsonNumber("lat").doubleValue(), + json.getJsonNumber("lon").doubleValue()); + } else { + callback.onFailure(); + } + } + return null; + } + + @Override + public void onThrowable(Throwable t) { + callback.onFailure(); + } + }); } } diff --git a/test/org/traccar/location/LocationProviderTest.java b/test/org/traccar/location/LocationProviderTest.java index c4aedbb09..b7280cfea 100644 --- a/test/org/traccar/location/LocationProviderTest.java +++ b/test/org/traccar/location/LocationProviderTest.java @@ -24,20 +24,25 @@ public class LocationProviderTest { } public void testOpenCellId() { - OpenCellIdLocationProvider locationProvider = new OpenCellIdLocationProvider(); + OpenCellIdLocationProvider locationProvider = new OpenCellIdLocationProvider("fake"); Map attributes = new HashMap<>(); - attributes.put(Event.KEY_MCC, 250); + attributes.put(Event.KEY_MCC, 260); attributes.put(Event.KEY_MNC, 2); - attributes.put(Event.KEY_LAC, 4711); - attributes.put(Event.KEY_CID, 7989334); + attributes.put(Event.KEY_LAC, 10250); + attributes.put(Event.KEY_CID, 26511); locationProvider.getLocation(attributes, new LocationProvider.LocationProviderCallback() { @Override - public void onResult(double latitude, double longitude) { + public void onSuccess(double latitude, double longitude) { Assert.assertEquals(60.07254, latitude, 0.00001); Assert.assertEquals(30.30996, longitude, 0.00001); } + + @Override + public void onFailure() { + Assert.fail(); + } }); } -- cgit v1.2.3 From a7f7df0ebdf56a6dbaa5a17600c05c5b6d3033a4 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 18 Nov 2015 22:04:41 +1300 Subject: Support GSM based locations (fix #346) --- debug.xml | 2 ++ src/org/traccar/location/BaseLocationProvider.java | 22 +++++++++---- .../traccar/protocol/Gps103ProtocolDecoder.java | 36 +++++++++++++++++++--- .../protocol/Gps103ProtocolDecoderTest.java | 5 ++- 4 files changed, 54 insertions(+), 11 deletions(-) (limited to 'src/org/traccar/location') diff --git a/debug.xml b/debug.xml index 2e6e4e12a..426dadc4c 100644 --- a/debug.xml +++ b/debug.xml @@ -20,6 +20,8 @@ false fake + 260 + 2 true diff --git a/src/org/traccar/location/BaseLocationProvider.java b/src/org/traccar/location/BaseLocationProvider.java index 80b10b33c..d6eddc1cd 100644 --- a/src/org/traccar/location/BaseLocationProvider.java +++ b/src/org/traccar/location/BaseLocationProvider.java @@ -15,6 +15,7 @@ */ package org.traccar.location; +import org.traccar.Context; import org.traccar.model.Event; import java.util.Map; @@ -23,13 +24,22 @@ public abstract class BaseLocationProvider implements LocationProvider { @Override public void getLocation(Map attributes, LocationProviderCallback callback) { - if (attributes.containsKey(Event.KEY_MCC) || attributes.containsKey(Event.KEY_MNC)) { - Number mcc = (Number) attributes.get(Event.KEY_MCC); - Number mnc = (Number) attributes.get(Event.KEY_MNC); - Number lac = (Number) attributes.get(Event.KEY_LAC); - Number cid = (Number) attributes.get(Event.KEY_CID); - getLocation(mcc.intValue(), mnc.intValue(), lac.longValue(), cid.longValue(), callback); + + Number mcc = (Number) attributes.get(Event.KEY_MCC); + if (mcc == null) { + mcc = Context.getConfig().getInteger("location.mcc"); + } + + Number mnc = (Number) attributes.get(Event.KEY_MNC); + if (mnc == null) { + mnc = Context.getConfig().getInteger("location.mnc"); } + + Number lac = (Number) attributes.get(Event.KEY_LAC); + Number cid = (Number) attributes.get(Event.KEY_CID); + + getLocation(mcc.intValue(), mnc.intValue(), lac.longValue(), cid.longValue(), callback); + } protected abstract void getLocation(int mcc, int mnc, long lac, long cid, LocationProviderCallback callback); diff --git a/src/org/traccar/protocol/Gps103ProtocolDecoder.java b/src/org/traccar/protocol/Gps103ProtocolDecoder.java index aa693f42e..a91848f5b 100644 --- a/src/org/traccar/protocol/Gps103ProtocolDecoder.java +++ b/src/org/traccar/protocol/Gps103ProtocolDecoder.java @@ -63,6 +63,17 @@ public class Gps103ProtocolDecoder extends BaseProtocolDecoder { .any() .compile(); + private static final Pattern PATTERN_NETWORK = new PatternBuilder() + .text("imei:") + .number("(d+),") // imei + .expression("[^,]+,") // alarm + .number("d+,,") + .text("L,,,") + .number("(x+),,") // lac + .number("(x+),,,") // cid + .any() + .compile(); + private static final Pattern PATTERN_HANDSHAKE = new PatternBuilder() .number("##,imei:(d+),A") .compile(); @@ -93,14 +104,31 @@ public class Gps103ProtocolDecoder extends BaseProtocolDecoder { return null; } - Parser parser = new Parser(PATTERN, sentence); + Position position = new Position(); + position.setProtocol(getProtocolName()); + + Parser parser = new Parser(PATTERN_NETWORK, sentence); + if (parser.matches()) { + + if (!identify(parser.next(), channel, remoteAddress)) { + return null; + } + position.setDeviceId(getDeviceId()); + + getLastLocation(position, null); + + position.set(Event.KEY_LAC, parser.nextInt(16)); + position.set(Event.KEY_CID, parser.nextInt(16)); + + return position; + + } + + parser = new Parser(PATTERN, sentence); if (!parser.matches()) { return null; } - Position position = new Position(); - position.setProtocol(getProtocolName()); - String imei = parser.next(); if (!identify(imei, channel, remoteAddress)) { return null; diff --git a/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java b/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java index 03d7b5c72..371b137fd 100644 --- a/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java @@ -10,7 +10,10 @@ public class Gps103ProtocolDecoderTest extends ProtocolDecoderTest { Gps103ProtocolDecoder decoder = new Gps103ProtocolDecoder(new Gps103Protocol()); - verifyNothing(decoder, text( + verifyAttributes(decoder, text( + "imei:359710041100000,tracker,000000000,,L,,,fa8,,c9af,,,,,0,0,0.00%,,")); + + verifyAttributes(decoder, text( "imei:863070016871385,tracker,0000000119,,L,,,0FB6,,CB5D,,,")); verifyPosition(decoder, text( -- cgit v1.2.3 From 9b2b2da4d0568a50298cedfb07329f3eedb15d46 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 19 Nov 2015 08:26:10 +1300 Subject: Check for missing LBS information --- src/org/traccar/location/BaseLocationProvider.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/location/BaseLocationProvider.java b/src/org/traccar/location/BaseLocationProvider.java index d6eddc1cd..c422ed50a 100644 --- a/src/org/traccar/location/BaseLocationProvider.java +++ b/src/org/traccar/location/BaseLocationProvider.java @@ -15,6 +15,7 @@ */ package org.traccar.location; +import org.traccar.Config; import org.traccar.Context; import org.traccar.model.Event; @@ -25,20 +26,24 @@ public abstract class BaseLocationProvider implements LocationProvider { @Override public void getLocation(Map attributes, LocationProviderCallback callback) { + Config config = Context.getConfig(); + Number mcc = (Number) attributes.get(Event.KEY_MCC); - if (mcc == null) { - mcc = Context.getConfig().getInteger("location.mcc"); + if (mcc == null && config.hasKey("location.mcc")) { + mcc = config.getInteger("location.mcc"); } Number mnc = (Number) attributes.get(Event.KEY_MNC); - if (mnc == null) { - mnc = Context.getConfig().getInteger("location.mnc"); + if (mnc == null && config.hasKey("location.mnc")) { + mnc = config.getInteger("location.mnc"); } Number lac = (Number) attributes.get(Event.KEY_LAC); Number cid = (Number) attributes.get(Event.KEY_CID); - getLocation(mcc.intValue(), mnc.intValue(), lac.longValue(), cid.longValue(), callback); + if (mcc != null && mnc != null && lac != null && cid != null) { + getLocation(mcc.intValue(), mnc.intValue(), lac.longValue(), cid.longValue(), callback); + } } -- cgit v1.2.3 From ff731f55ca109872dc7a73ff8cf87adef9787ea0 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 19 Nov 2015 10:50:00 +1300 Subject: Remove unused import and variable --- src/org/traccar/BasePipelineFactory.java | 1 - src/org/traccar/location/OpenCellIdLocationProvider.java | 1 - 2 files changed, 2 deletions(-) (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java index 4244da8c9..b02bd0e53 100644 --- a/src/org/traccar/BasePipelineFactory.java +++ b/src/org/traccar/BasePipelineFactory.java @@ -31,7 +31,6 @@ import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.handler.logging.LoggingHandler; import org.jboss.netty.handler.timeout.IdleStateHandler; import org.traccar.helper.Log; -import org.traccar.location.LocationProvider; public abstract class BasePipelineFactory implements ChannelPipelineFactory { diff --git a/src/org/traccar/location/OpenCellIdLocationProvider.java b/src/org/traccar/location/OpenCellIdLocationProvider.java index 2339585ad..b06f44d1e 100644 --- a/src/org/traccar/location/OpenCellIdLocationProvider.java +++ b/src/org/traccar/location/OpenCellIdLocationProvider.java @@ -36,7 +36,6 @@ public class OpenCellIdLocationProvider extends BaseLocationProvider { } protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) { - String x = String.format(url, mcc, mnc, lac, cid); Context.getAsyncHttpClient().prepareGet(String.format(url, mcc, mnc, lac, cid)) .execute(new AsyncCompletionHandler() { @Override -- cgit v1.2.3 From 192800b5261d3128386bd83d6b8b684ea417fa9b Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 20 Nov 2015 18:11:06 +1300 Subject: Add support for Mozilla Location Service --- src/org/traccar/Context.java | 12 +++- .../traccar/location/MozillaLocationProvider.java | 75 ++++++++++++++++++++++ .../location/OpenCellIdLocationProvider.java | 36 +++++------ 3 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 src/org/traccar/location/MozillaLocationProvider.java (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index aff72cd01..c833d0c2e 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -30,6 +30,7 @@ import org.traccar.geocode.OpenCageReverseGeocoder; import org.traccar.geocode.ReverseGeocoder; import org.traccar.helper.Log; import org.traccar.location.LocationProvider; +import org.traccar.location.MozillaLocationProvider; import org.traccar.location.OpenCellIdLocationProvider; import org.traccar.web.WebServer; @@ -153,8 +154,17 @@ public final class Context { } if (config.getBoolean("location.enable")) { + String type = config.getString("location.type", "opencellid"); String key = config.getString("location.key"); - locationProvider = new OpenCellIdLocationProvider(key); + + switch (type) { + case "mozilla": + locationProvider = new MozillaLocationProvider(); + break; + default: + locationProvider = new OpenCellIdLocationProvider(key); + break; + } } if (config.getBoolean("web.enable")) { diff --git a/src/org/traccar/location/MozillaLocationProvider.java b/src/org/traccar/location/MozillaLocationProvider.java new file mode 100644 index 000000000..eb01fff62 --- /dev/null +++ b/src/org/traccar/location/MozillaLocationProvider.java @@ -0,0 +1,75 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.location; + +import com.ning.http.client.AsyncCompletionHandler; +import com.ning.http.client.Response; +import org.traccar.Context; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; + +public class MozillaLocationProvider extends BaseLocationProvider { + + private String url; + private String template; + + public MozillaLocationProvider() { + this("https://location.services.mozilla.com/v1/geolocate", "test"); + } + + public MozillaLocationProvider(String url, String key) { + this.url = url + "?key=" + key; + + template = new StringBuilder() + .append("{\"cellTowers\":[{") + .append("\"radioType\":\"gsm\",") + .append("\"mobileCountryCode\":%d,") + .append("\"mobileNetworkCode\":%d,") + .append("\"locationAreaCode\":%d,") + .append("\"cellId\":%d") + .append("}]}") + .toString(); + } + + protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) { + String body = String.format(template,mcc, mnc, lac, cid); + Context.getAsyncHttpClient().preparePost(url).setBody(body).execute(new AsyncCompletionHandler() { + @Override + public Object onCompleted(Response response) throws Exception { + try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) { + JsonObject json = reader.readObject().getJsonObject("location"); + if (json.containsKey("lat") && json.containsKey("lon")) { + callback.onSuccess( + json.getJsonNumber("lat").doubleValue(), + json.getJsonNumber("lon").doubleValue()); + } else { + callback.onFailure(); + } + } + return null; + } + + @Override + public void onThrowable(Throwable t) { + callback.onFailure(); + } + }); + + } + +} diff --git a/src/org/traccar/location/OpenCellIdLocationProvider.java b/src/org/traccar/location/OpenCellIdLocationProvider.java index b06f44d1e..94cc1a4e4 100644 --- a/src/org/traccar/location/OpenCellIdLocationProvider.java +++ b/src/org/traccar/location/OpenCellIdLocationProvider.java @@ -38,26 +38,26 @@ public class OpenCellIdLocationProvider extends BaseLocationProvider { protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) { Context.getAsyncHttpClient().prepareGet(String.format(url, mcc, mnc, lac, cid)) .execute(new AsyncCompletionHandler() { - @Override - public Object onCompleted(Response response) throws Exception { - try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) { - JsonObject json = reader.readObject(); - if (json.containsKey("lat") && json.containsKey("lon")) { - callback.onSuccess( - json.getJsonNumber("lat").doubleValue(), - json.getJsonNumber("lon").doubleValue()); - } else { - callback.onFailure(); - } - } - return null; - } - - @Override - public void onThrowable(Throwable t) { + @Override + public Object onCompleted(Response response) throws Exception { + try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) { + JsonObject json = reader.readObject(); + if (json.containsKey("lat") && json.containsKey("lon")) { + callback.onSuccess( + json.getJsonNumber("lat").doubleValue(), + json.getJsonNumber("lon").doubleValue()); + } else { callback.onFailure(); } - }); + } + return null; + } + + @Override + public void onThrowable(Throwable t) { + callback.onFailure(); + } + }); } } -- cgit v1.2.3 From e52ccadfb975476b1a6412e615a7109ff42f787a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 20 Nov 2015 18:14:18 +1300 Subject: Add missing comma to mozilla provider --- src/org/traccar/location/MozillaLocationProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/org/traccar/location') diff --git a/src/org/traccar/location/MozillaLocationProvider.java b/src/org/traccar/location/MozillaLocationProvider.java index eb01fff62..d30fbf642 100644 --- a/src/org/traccar/location/MozillaLocationProvider.java +++ b/src/org/traccar/location/MozillaLocationProvider.java @@ -47,7 +47,7 @@ public class MozillaLocationProvider extends BaseLocationProvider { } protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) { - String body = String.format(template,mcc, mnc, lac, cid); + String body = String.format(template, mcc, mnc, lac, cid); Context.getAsyncHttpClient().preparePost(url).setBody(body).execute(new AsyncCompletionHandler() { @Override public Object onCompleted(Response response) throws Exception { -- cgit v1.2.3