diff --git a/OsmAnd/res/drawable-hdpi/monitoring.png b/OsmAnd/res/drawable-hdpi/monitoring.png new file mode 100644 index 0000000000..cbc5e15c90 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/monitoring.png differ diff --git a/OsmAnd/res/drawable-large/monitoring.png b/OsmAnd/res/drawable-large/monitoring.png new file mode 100644 index 0000000000..cbc5e15c90 Binary files /dev/null and b/OsmAnd/res/drawable-large/monitoring.png differ diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index b37a8ff258..cd43db3c6a 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -19,6 +19,7 @@ \n\t* better UI finish (icons) \n\t* lots of bug fixes + No route Remove target point Target point %1$s Waypoint %1$s diff --git a/OsmAnd/src/net/osmand/plus/NavigationService.java b/OsmAnd/src/net/osmand/plus/NavigationService.java index 789162eb99..b0487187c3 100644 --- a/OsmAnd/src/net/osmand/plus/NavigationService.java +++ b/OsmAnd/src/net/osmand/plus/NavigationService.java @@ -35,6 +35,7 @@ public class NavigationService extends Service implements LocationListener { } private final static int NOTIFICATION_SERVICE_ID = 1; public final static String OSMAND_STOP_SERVICE_ACTION = "OSMAND_STOP_SERVICE_ACTION"; //$NON-NLS-1$ + public final static String NAVIGATION_START_SERVICE_PARAM = "NAVIGATION_START_SERVICE_PARAM"; private static final int LOST_LOCATION_MSG_ID = 10; private static final long LOST_LOCATION_CHECK_DELAY = 20000; @@ -55,6 +56,7 @@ public class NavigationService extends Service implements LocationListener { private PendingIntent pendingIntent; private BroadcastReceiver broadcastReceiver; private LiveMonitoringHelper liveMonitoringHelper; + private boolean startedForNavigation; @Override public IBinder onBind(Intent intent) { @@ -85,14 +87,20 @@ public class NavigationService extends Service implements LocationListener { return serviceOffProvider; } + public boolean startedForNavigation(){ + return startedForNavigation; + } @Override - public void onCreate() { - super.onCreate(); - // initializing variables - setForeground(true); + public int onStartCommand(Intent intent, int flags, int startId) { handler = new Handler(); settings = ((OsmandApplication) getApplication()).getSettings(); - serviceOffInterval = settings.SERVICE_OFF_INTERVAL.get(); + + startedForNavigation = intent.getBooleanExtra(NAVIGATION_START_SERVICE_PARAM, false); + if (startedForNavigation) { + serviceOffInterval = 0; + } else { + serviceOffInterval = settings.SERVICE_OFF_INTERVAL.get(); + } // use only gps provider serviceOffProvider = LocationManager.GPS_PROVIDER; serviceError = serviceOffInterval / 5; @@ -122,23 +130,33 @@ public class NavigationService extends Service implements LocationListener { } // registering icon at top level - broadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - NavigationService.this.stopSelf(); - } + // Leave icon visible even for navigation for proper testing +// if (!startedForNavigation) { + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + NavigationService.this.stopSelf(); + } - }; - registerReceiver(broadcastReceiver, new IntentFilter(OSMAND_STOP_SERVICE_ACTION)); - Intent notificationIntent = new Intent(OSMAND_STOP_SERVICE_ACTION); - Notification notification = new Notification(R.drawable.bgs_icon, "", //$NON-NLS-1$ - System.currentTimeMillis()); - notification.flags = Notification.FLAG_NO_CLEAR; - notification.setLatestEventInfo(this, Version.getAppName(this), - getString(R.string.service_stop_background_service), PendingIntent.getBroadcast(this, 0, notificationIntent, - PendingIntent.FLAG_UPDATE_CURRENT)); - NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - mNotificationManager.notify(NOTIFICATION_SERVICE_ID, notification); + }; + registerReceiver(broadcastReceiver, new IntentFilter(OSMAND_STOP_SERVICE_ACTION)); + Intent notificationIntent = new Intent(OSMAND_STOP_SERVICE_ACTION); + Notification notification = new Notification(R.drawable.bgs_icon, "", //$NON-NLS-1$ + System.currentTimeMillis()); + notification.flags = Notification.FLAG_NO_CLEAR; + notification.setLatestEventInfo(this, Version.getAppName(this), getString(R.string.service_stop_background_service), + PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)); + NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + mNotificationManager.notify(NOTIFICATION_SERVICE_ID, notification); +// } + return START_REDELIVER_INTENT; + } + + @Override + public void onCreate() { + super.onCreate(); + // initializing variables + setForeground(true); } private boolean isContinuous(){ diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index bcb106dbf2..9516ea6c57 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -86,7 +86,7 @@ public class OsmandApplication extends Application { long timeToStart = System.currentTimeMillis(); osmandSettings = createOsmandSettingsInstance(); - routingHelper = new RoutingHelper(osmandSettings, this, player); + routingHelper = new RoutingHelper(this, player); manager = new ResourceManager(this); daynightHelper = new DayNightHelper(this); bidforfix = new BidForFixHelper("osmand.net", getString(R.string.default_buttons_support), getString(R.string.default_buttons_cancel)); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 7ccb55efb4..a5b5a6f121 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -426,9 +426,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe if (endPoint == null) { notRestoreRoutingMode(); } else { - routingHelper.setFollowingMode(true); - routingHelper.setFinalAndCurrentLocation(endPoint, intermediates, startPoint, gpxRoute); - getMyApplication().showDialogInitializingCommandPlayer(MapActivity.this); + followRoute(settings.getApplicationMode(), endPoint, intermediates, startPoint, gpxRoute); } } }; @@ -944,6 +942,26 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe settings.getIntermediatePoints(), getLastKnownLocation(), routingHelper.getCurrentGPXRoute()); } } + + public void followRoute(ApplicationMode appMode, LatLon finalLocation, List intermediatePoints, Location currentLocation, GPXRouteParams gpxRoute){ + // change global settings + // Do not overwrite PREV_APPLICATION_MODE if already navigating + if (!routingHelper.isFollowingMode()) { + settings.PREV_APPLICATION_MODE.set(settings.APPLICATION_MODE.get()); + } + boolean changed = settings.APPLICATION_MODE.set(appMode); + if (changed) { + updateApplicationModeSettings(); + } + getMapView().refreshMap(changed); + settings.FOLLOW_THE_ROUTE.set(true); + if(gpxRoute == null) { + settings.FOLLOW_THE_GPX_ROUTE.set(null); + } + routingHelper.setFollowingMode(true); + routingHelper.setFinalAndCurrentLocation(finalLocation, intermediatePoints, currentLocation, gpxRoute); + getMyApplication().showDialogInitializingCommandPlayer(MapActivity.this); + } public void navigateToPoint(LatLon point, boolean updateRoute, int intermediate){ if(point != null){ diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 45a3710cfb..72700eaeaa 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -469,10 +469,6 @@ public class MapActivityActions implements DialogProvider { return; } ApplicationMode mode = getAppMode(buttons, settings); - // Do not overwrite PREV_APPLICATION_MODE if already navigating - if (!routingHelper.isFollowingMode()) { - settings.PREV_APPLICATION_MODE.set(settings.APPLICATION_MODE.get()); - } routingHelper.setAppMode(mode); settings.FOLLOW_THE_ROUTE.set(false); settings.FOLLOW_THE_GPX_ROUTE.set(null); @@ -502,24 +498,9 @@ public class MapActivityActions implements DialogProvider { AccessibleToast.makeText(mapActivity, R.string.route_updated_loc_found, Toast.LENGTH_LONG).show(); } ApplicationMode mode = getAppMode(buttons, settings); - // change global settings - // Do not overwrite PREV_APPLICATION_MODE if already navigating - if (!routingHelper.isFollowingMode()) { - settings.PREV_APPLICATION_MODE.set(settings.APPLICATION_MODE.get()); - } - boolean changed = settings.APPLICATION_MODE.set(mode); - if (changed) { - mapActivity.updateApplicationModeSettings(); - mapActivity.getMapView().refreshMap(true); - } - routingHelper.setAppMode(mode); - settings.FOLLOW_THE_ROUTE.set(true); - settings.FOLLOW_THE_GPX_ROUTE.set(null); - routingHelper.setFollowingMode(true); - routingHelper.setFinalAndCurrentLocation(mapActivity.getPointToNavigate(), mapActivity.getIntermediatePoints(), - current, null); dialog.dismiss(); - getMyApplication().showDialogInitializingCommandPlayer(mapActivity); + mapActivity.followRoute(mode, mapActivity.getPointToNavigate(), mapActivity.getIntermediatePoints(), + current, null); } }; @@ -533,15 +514,12 @@ public class MapActivityActions implements DialogProvider { builder.setView(view); builder.setTitle(R.string.get_directions); + builder.setPositiveButton(R.string.follow, followCall); + builder.setNeutralButton(R.string.only_show, onlyShowCall); if (gpxRouteEnabled) { - builder.setPositiveButton(R.string.follow, followCall); - builder.setNeutralButton(R.string.gpx_navigation, useGpxNavigation); - builder.setNegativeButton(R.string.only_show, onlyShowCall); + builder.setNegativeButton(R.string.gpx_navigation, useGpxNavigation); } else { - // view.findViewById(R.id.TextView).setVisibility(View.GONE); - builder.setPositiveButton(R.string.follow, followCall); - builder.setNeutralButton(R.string.only_show, onlyShowCall); - builder.setNegativeButton(R.string.default_buttons_cancel, null); + builder.setNegativeButton(R.string.no_route, null); } builder.show(); } @@ -553,7 +531,6 @@ public class MapActivityActions implements DialogProvider { public void navigateUsingGPX(final ApplicationMode appMode) { final LatLon endForRouting = mapActivity.getPointToNavigate(); final MapActivityLayers mapLayers = mapActivity.getMapLayers(); - final RoutingHelper routingHelper = mapActivity.getRoutingHelper(); mapLayers.selectGPXFileLayer(new CallbackWithObject() { @Override @@ -597,23 +574,10 @@ public class MapActivityActions implements DialogProvider { mapLayers.getNavigationLayer().setPointToNavigate(point, new ArrayList()); } } - // change global settings - // Do not overwrite PREV_APPLICATION_MODE if already navigating - if (!routingHelper.isFollowingMode()) { - settings.PREV_APPLICATION_MODE.set(settings.APPLICATION_MODE.get()); - } - boolean changed = settings.APPLICATION_MODE.set(appMode); - if (changed) { - mapActivity.updateApplicationModeSettings(); - } - mapActivity.getMapView().refreshMap(changed); if(endPoint != null){ - settings.FOLLOW_THE_ROUTE.set(true); - settings.FOLLOW_THE_GPX_ROUTE.set(result.path); - routingHelper.setFollowingMode(true); - routingHelper.setFinalAndCurrentLocation(endPoint, + mapActivity.followRoute(appMode, endPoint, new ArrayList(), startForRouting, gpxRoute); - getMyApplication().showDialogInitializingCommandPlayer(mapActivity); + settings.FOLLOW_THE_GPX_ROUTE.set(result.path); } } }); diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index f88182933d..0d0a9b1452 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -10,6 +10,8 @@ import net.osmand.OsmAndFormatter; import net.osmand.access.AccessibleToast; import net.osmand.osm.LatLon; import net.osmand.osm.MapUtils; +import net.osmand.plus.NavigationService; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.OsmandSettings.MetricsConstants; @@ -21,6 +23,7 @@ import net.osmand.plus.voice.CommandPlayer; import net.osmand.router.Interruptable; import net.osmand.router.RouteSegmentResult; import android.content.Context; +import android.content.Intent; import android.location.Location; import android.os.Handler; import android.widget.Toast; @@ -40,7 +43,7 @@ public class RoutingHelper { private List listeners = new ArrayList(); - private Context context; + private OsmandApplication app; private boolean isFollowingMode = false; @@ -74,9 +77,8 @@ public class RoutingHelper { } - public RoutingHelper(OsmandSettings settings, Context context, CommandPlayer player){ - this.settings = settings; - this.context = context; + public RoutingHelper(OsmandApplication context, CommandPlayer player){ + this.app = context; voiceRouter = new VoiceRouter(this, player); uiHandler = new Handler(); } @@ -84,11 +86,22 @@ public class RoutingHelper { public boolean isFollowingMode() { return isFollowingMode; } - - public void setFollowingMode(boolean isFollowingMode) { - this.isFollowingMode = isFollowingMode; - } + public void setFollowingMode(boolean follow) { + isFollowingMode = follow; + Intent serviceIntent = new Intent(app, NavigationService.class); + if(follow) { + if(app.getNavigationService() == null) { + serviceIntent.putExtra(NavigationService.NAVIGATION_START_SERVICE_PARAM, true); + app.startService(serviceIntent); + } + } else { + if(app.getNavigationService() != null && app.getNavigationService().startedForNavigation()) { + app.stopService(serviceIntent); + } + } + } + public synchronized void setFinalAndCurrentLocation(LatLon finalLocation, List intermediatePoints, Location currentLocation, GPXRouteParams gpxRoute){ @@ -121,7 +134,7 @@ public class RoutingHelper { settings.FOLLOW_THE_GPX_ROUTE.set(null); // clear last fixed location this.lastProjection = null; - this.isFollowingMode = false; + setFollowingMode(false); } } @@ -340,7 +353,7 @@ public class RoutingHelper { // 2. check if intermediate found if(route.getIntermediatePointsToPass() > 0 && route.getDistanceToNextIntermediate(lastFixedLocation) < posTolerance) { - showMessage(context.getString(R.string.arrived_at_intermediate_point)); + showMessage(app.getString(R.string.arrived_at_intermediate_point)); voiceRouter.arrivedIntermediatePoint(); route.passIntermediatePoint(); int toDel = settings.getIntermediatePoints().size() - route.getIntermediatePointsToPass(); @@ -356,7 +369,7 @@ public class RoutingHelper { // 3. check if destination found Location lastPoint = routeNodes.get(routeNodes.size() - 1); if (currentRoute > routeNodes.size() - 3 && currentLocation.distanceTo(lastPoint) < posTolerance * 1.2) { - showMessage(context.getString(R.string.arrived_at_destination)); + showMessage(app.getString(R.string.arrived_at_destination)); voiceRouter.arrivedDestinationPoint(); clearCurrentRoute(null, null); return true; @@ -478,7 +491,7 @@ public class RoutingHelper { int dist = getLeftDistance(); int hours = getLeftTime() / (60 * 60); int minutes = (getLeftTime() / 60) % 60; - return context.getString(R.string.route_general_information, OsmAndFormatter.getFormattedDistance(dist, context), + return app.getString(R.string.route_general_information, OsmAndFormatter.getFormattedDistance(dist, app), hours, minutes); } @@ -588,7 +601,7 @@ public class RoutingHelper { public void run() { boolean leftSide = settings.LEFT_SIDE_NAVIGATION.get(); boolean fastRoute = settings.FAST_ROUTE_MODE.get(); - RouteCalculationResult res = provider.calculateRouteImpl(start, end, intermediates, mode, service, context, gpxRoute, previousRoute, fastRoute, + RouteCalculationResult res = provider.calculateRouteImpl(start, end, intermediates, mode, service, app, gpxRoute, previousRoute, fastRoute, leftSide, this); if (interrupted) { currentRunningJob = null; @@ -606,16 +619,16 @@ public class RoutingHelper { } if (res.isCalculated()) { - showMessage(context.getString(R.string.new_route_calculated_dist) - + ": " + OsmAndFormatter.getFormattedDistance(res.getWholeDistance(), context)); //$NON-NLS-1$ + showMessage(app.getString(R.string.new_route_calculated_dist) + + ": " + OsmAndFormatter.getFormattedDistance(res.getWholeDistance(), app)); //$NON-NLS-1$ } else if (service != RouteService.OSMAND && !settings.isInternetConnectionAvailable()) { - showMessage(context.getString(R.string.error_calculating_route) - + ":\n" + context.getString(R.string.internet_connection_required_for_online_route), Toast.LENGTH_LONG); //$NON-NLS-1$ + showMessage(app.getString(R.string.error_calculating_route) + + ":\n" + app.getString(R.string.internet_connection_required_for_online_route), Toast.LENGTH_LONG); //$NON-NLS-1$ } else { if (res.getErrorMessage() != null) { - showMessage(context.getString(R.string.error_calculating_route) + ":\n" + res.getErrorMessage(), Toast.LENGTH_LONG); //$NON-NLS-1$ + showMessage(app.getString(R.string.error_calculating_route) + ":\n" + res.getErrorMessage(), Toast.LENGTH_LONG); //$NON-NLS-1$ } else { - showMessage(context.getString(R.string.empty_route_calculated), Toast.LENGTH_LONG); + showMessage(app.getString(R.string.empty_route_calculated), Toast.LENGTH_LONG); } } lastTimeEvaluatedRoute = System.currentTimeMillis(); @@ -647,7 +660,7 @@ public class RoutingHelper { uiHandler.post(new Runnable() { @Override public void run() { - AccessibleToast.makeText(context, msg, length).show(); + AccessibleToast.makeText(app, msg, length).show(); } }); } @@ -662,7 +675,7 @@ public class RoutingHelper { } protected Context getContext() { - return context; + return app; } @@ -670,4 +683,5 @@ public class RoutingHelper { return provider.createOsmandRouterGPX(route); } + }