Add brouter service

This commit is contained in:
vshcherb 2014-01-12 01:22:51 +01:00
parent 8b79c279ae
commit 1389c178d9
4 changed files with 62 additions and 57 deletions

View file

@ -0,0 +1,38 @@
package btools.routingapp;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
public class BRouterServiceConnection implements ServiceConnection {
IBRouterService brouterService;
public void onServiceConnected(ComponentName className, IBinder boundService) {
brouterService = IBRouterService.Stub.asInterface((IBinder) boundService);
}
public void onServiceDisconnected(ComponentName className) {
brouterService = null;
}
public void disconnect(Context ctx){
ctx.unbindService(this);
}
public IBRouterService getBrouterService() {
return brouterService;
}
public static BRouterServiceConnection connect(Context ctx){
BRouterServiceConnection conn = new BRouterServiceConnection();
Intent intent = new Intent();
intent.setClassName("btools.routingapp", "btools.routingapp.BRouterService");
boolean hasBRouter = ctx.bindService(intent, conn, Context.BIND_AUTO_CREATE);
if(!hasBRouter){
conn = null;
}
return conn;
}
}

View file

@ -57,6 +57,8 @@ import android.os.Handler;
import android.os.Message;
import android.text.format.DateFormat;
import android.widget.Toast;
import btools.routingapp.BRouterServiceConnection;
import btools.routingapp.IBRouterService;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
@ -99,6 +101,7 @@ public class OsmandApplication extends Application implements ClientContext {
InternalToDoAPI internalToDoAPI;
InternalOsmAndAPI internalOsmAndAPI;
SQLiteAPI sqliteAPI;
BRouterServiceConnection bRouterServiceConnection;
@Override
public void onCreate() {
@ -120,6 +123,12 @@ public class OsmandApplication extends Application implements ClientContext {
internalOsmAndAPI = new net.osmand.plus.api.InternalOsmAndAPIImpl(this);
sqliteAPI = new SQLiteAPIImpl(this);
try {
bRouterServiceConnection = BRouterServiceConnection.connect(this);
} catch(Exception e) {
e.printStackTrace();
}
// settings used everywhere so they need to be created first
osmandSettings = createOsmandSettingsInstance();
// always update application mode to default
@ -737,6 +746,13 @@ public class OsmandApplication extends Application implements ClientContext {
}
}
public IBRouterService getBRouterService() {
if(bRouterServiceConnection == null) {
return null;
}
return bRouterServiceConnection.getBrouterService();
}
public void setLanguage(Context context) {
if (prefferedLocale != null) {
Configuration config = context.getResources().getConfiguration();

View file

@ -76,7 +76,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
}
registerListPreference(settings.AUTO_FOLLOW_ROUTE, screen, entries, intValues);
RouteService[] vls = RouteService.getAvailableRouters(this);
RouteService[] vls = RouteService.getAvailableRouters(getMyApplication());
entries = new String[vls.length];
for(int i=0; i<entries.length; i++){
entries[i] = vls[i].getName();

View file

@ -60,14 +60,8 @@ import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlPullParserException;
import btools.routingapp.IBRouterService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import btools.routingapp.IBRouterService;
public class RouteProvider {
@ -90,22 +84,14 @@ public class RouteProvider {
return this != OSMAND && this != BROUTER;
}
boolean isAvailable(Context ctx) {
boolean isAvailable(OsmandApplication ctx) {
if (this == BROUTER) {
try {
BRouterServiceConnection c = BRouterServiceConnection.connect(ctx);
if(c != null) {
c.disconnect(ctx);
return true;
}
} catch (Exception e) {
return false;
}
return ctx.getBRouterService() != null;
}
return true;
}
public static RouteService[] getAvailableRouters(Context ctx){
public static RouteService[] getAvailableRouters(OsmandApplication ctx){
List<RouteService> list = new ArrayList<RouteProvider.RouteService>();
for(RouteService r : values()) {
if(r.isAvailable(ctx)) {
@ -873,33 +859,6 @@ public class RouteProvider {
}
static class BRouterServiceConnection implements ServiceConnection {
IBRouterService brouterService;
public void onServiceConnected(ComponentName className, IBinder boundService) {
brouterService = IBRouterService.Stub.asInterface((IBinder) boundService);
}
public void onServiceDisconnected(ComponentName className) {
brouterService = null;
}
public void disconnect(Context ctx){
ctx.unbindService(this);
}
public static BRouterServiceConnection connect(Context ctx){
BRouterServiceConnection conn = new BRouterServiceConnection();
Intent intent = new Intent();
intent.setClassName("btools.routingapp", "btools.routingapp.BRouterService");
boolean hasBRouter = ctx.bindService(intent, conn, Context.BIND_AUTO_CREATE);
if(!hasBRouter){
conn = null;
}
return conn;
}
};
protected RouteCalculationResult findBROUTERRoute(RouteCalculationParams params) throws MalformedURLException,
IOException, ParserConfigurationException, FactoryConfigurationError, SAXException {
double[] lats = new double[] { params.start.getLatitude(), params.end.getLatitude() };
@ -923,19 +882,12 @@ public class RouteProvider {
List<Location> res = new ArrayList<Location>();
BRouterServiceConnection conn = BRouterServiceConnection.connect(ctx);
if (conn == null) {
IBRouterService brouterService = ctx.getBRouterService();
if (brouterService == null) {
return new RouteCalculationResult("BRouter service is not available");
}
long begin = System.currentTimeMillis();
try {
while((System.currentTimeMillis() - begin) < 15000 && conn.brouterService == null) {
Thread.sleep(500);
}
if(conn.brouterService == null){
return new RouteCalculationResult("BRouter service is not available");
}
String kmlMessage = conn.brouterService.getTrackFromParams(bpars);
String kmlMessage = brouterService.getTrackFromParams(bpars);
if (kmlMessage == null)
kmlMessage = "no result from brouter";
if (!kmlMessage.startsWith("<")) {
@ -976,7 +928,6 @@ public class RouteProvider {
return new RouteCalculationResult(item.getNodeValue());
}
}
conn.disconnect((Context) params.ctx);
} catch (Exception e) {
return new RouteCalculationResult("Exception calling BRouter: " + e); //$NON-NLS-1$
}