New notifications in progress
This commit is contained in:
parent
577afd583e
commit
2d5e5a8e1a
14 changed files with 874 additions and 206 deletions
|
@ -1,9 +1,7 @@
|
|||
package net.osmand.plus;
|
||||
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||
import net.osmand.plus.osmo.OsMoPlugin;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
|
@ -22,6 +20,10 @@ import android.support.v4.app.NotificationCompat.Builder;
|
|||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.plus.notifications.OsmandNotification;
|
||||
import net.osmand.plus.osmo.OsMoPlugin;
|
||||
|
||||
public class NavigationService extends Service implements LocationListener {
|
||||
|
||||
public static class NavigationServiceBinder extends Binder {
|
||||
|
@ -99,6 +101,8 @@ public class NavigationService extends Service implements LocationListener {
|
|||
if (usedBy == 0) {
|
||||
final Intent serviceIntent = new Intent(ctx, NavigationService.class);
|
||||
ctx.stopService(serviceIntent);
|
||||
} else {
|
||||
((OsmandApplication) getApplication()).getNotificationHelper().refreshNotifications();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -147,9 +151,14 @@ public class NavigationService extends Service implements LocationListener {
|
|||
|
||||
// registering icon at top level
|
||||
// Leave icon visible even for navigation for proper display
|
||||
Builder ntf = app.getNotificationHelper().buildNotificationInStatusBar();
|
||||
if (ntf != null) {
|
||||
startForeground(NotificationHelper.NOTIFICATION_SERVICE_ID, ntf.build());
|
||||
OsmandNotification osmandNotification = app.getNotificationHelper().getTopNotification();
|
||||
if (osmandNotification != null) {
|
||||
Builder notification = osmandNotification.buildNotification();
|
||||
if (notification != null) {
|
||||
Notification n = notification.build();
|
||||
osmandNotification.setupNotification(n);
|
||||
startForeground(osmandNotification.getUniqueId(), n);
|
||||
}
|
||||
}
|
||||
return START_REDELIVER_INTENT;
|
||||
}
|
||||
|
@ -170,7 +179,8 @@ public class NavigationService extends Service implements LocationListener {
|
|||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
((OsmandApplication) getApplication()).setNavigationService(null);
|
||||
final OsmandApplication app = (OsmandApplication) getApplication();
|
||||
app.setNavigationService(null);
|
||||
usedBy = 0;
|
||||
// remove updates
|
||||
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||
|
@ -190,8 +200,13 @@ public class NavigationService extends Service implements LocationListener {
|
|||
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
|
||||
alarmManager.cancel(pendingIntent);
|
||||
// remove notification
|
||||
((OsmandApplication) getApplication()).getNotificationHelper().removeServiceNotification();
|
||||
stopForeground(Boolean.TRUE);
|
||||
app.runInUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
app.getNotificationHelper().refreshNotifications();
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -242,7 +257,7 @@ public class NavigationService extends Service implements LocationListener {
|
|||
plugin.getTracker().disableTracker();
|
||||
}
|
||||
}
|
||||
app.getNotificationHelper().removeServiceNotificationCompletely();
|
||||
//app.getNotificationHelper().removeNotifications();
|
||||
NavigationService.this.stopSelf();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,180 +1,91 @@
|
|||
package net.osmand.plus;
|
||||
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
import android.support.v7.app.NotificationCompat;
|
||||
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||
import net.osmand.plus.notifications.GpsWakeUpNotification;
|
||||
import net.osmand.plus.notifications.GpxNotification;
|
||||
import net.osmand.plus.notifications.NavigationNotification;
|
||||
import net.osmand.plus.notifications.OsMoNotification;
|
||||
import net.osmand.plus.notifications.OsmandNotification;
|
||||
import net.osmand.plus.notifications.OsmandNotification.NotificationType;
|
||||
|
||||
public class NotificationHelper {
|
||||
public final static int NOTIFICATION_SERVICE_ID = 5;
|
||||
public final static String OSMAND_STOP_SERVICE_ACTION = "OSMAND_STOP_SERVICE_ACTION"; //$NON-NLS-1$
|
||||
public final static String OSMAND_STOP_GPX_SERVICE_ACTION = "OSMAND_STOP_GPX_SERVICE_ACTION"; //$NON-NLS-1$
|
||||
public final static String OSMAND_START_GPX_SERVICE_ACTION = "OSMAND_START_GPX_SERVICE_ACTION"; //$NON-NLS-1$
|
||||
public final static String OSMAND_SAVE_GPX_SERVICE_ACTION = "OSMAND_SAVE_GPX_SERVICE_ACTION"; //$NON-NLS-1$
|
||||
|
||||
|
||||
private OsmandApplication app;
|
||||
private BroadcastReceiver saveBroadcastReceiver;
|
||||
private BroadcastReceiver stopBroadcastReceiver;
|
||||
private BroadcastReceiver startBroadcastReceiver;
|
||||
|
||||
private NavigationNotification navigationNotification;
|
||||
private GpxNotification gpxNotification;
|
||||
private OsMoNotification osMoNotification;
|
||||
private GpsWakeUpNotification gpsWakeUpNotification;
|
||||
|
||||
public NotificationHelper(OsmandApplication app) {
|
||||
this.app = app;
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
public GpsWakeUpNotification getGpsWakeUpNotification() {
|
||||
return gpsWakeUpNotification;
|
||||
}
|
||||
|
||||
private void init() {
|
||||
saveBroadcastReceiver = new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.saveCurrentTrack();
|
||||
}
|
||||
}
|
||||
};
|
||||
app.registerReceiver(saveBroadcastReceiver, new IntentFilter(OSMAND_SAVE_GPX_SERVICE_ACTION));
|
||||
startBroadcastReceiver = new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.startGPXMonitoring(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
app.registerReceiver(startBroadcastReceiver, new IntentFilter(OSMAND_START_GPX_SERVICE_ACTION));
|
||||
stopBroadcastReceiver = new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.stopRecording();
|
||||
}
|
||||
}
|
||||
};
|
||||
app.registerReceiver(stopBroadcastReceiver, new IntentFilter(OSMAND_STOP_GPX_SERVICE_ACTION));
|
||||
navigationNotification = new NavigationNotification(app);
|
||||
gpxNotification = new GpxNotification(app);
|
||||
osMoNotification = new OsMoNotification(app);
|
||||
gpsWakeUpNotification = new GpsWakeUpNotification(app);
|
||||
}
|
||||
|
||||
public Builder buildNotificationInStatusBar() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
String notificationText = "";
|
||||
int icon = R.drawable.bgs_icon;
|
||||
OsmandMonitoringPlugin monitoringPlugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (service != null) {
|
||||
int soi = service.getServiceOffInterval();
|
||||
notificationText = app.getString(R.string.osmand_running_in_background);
|
||||
String s = "";
|
||||
if ((service.getUsedBy() & NavigationService.USED_BY_NAVIGATION) != 0) {
|
||||
if (s.length() > 0) {
|
||||
s += ", ";
|
||||
}
|
||||
s += app.getString(R.string.shared_string_navigation).toLowerCase();
|
||||
}
|
||||
if ((service.getUsedBy() & NavigationService.USED_BY_GPX) != 0) {
|
||||
if (s.length() > 0) {
|
||||
s += ", ";
|
||||
}
|
||||
s += app.getString(R.string.shared_string_trip_recording).toLowerCase()
|
||||
+ ": " + OsmAndFormatter.getFormattedDistance(app.getSavingTrackHelper().getDistance(), app);
|
||||
}
|
||||
if ((service.getUsedBy() & NavigationService.USED_BY_LIVE) != 0) {
|
||||
if (s.length() > 0) {
|
||||
s += ", ";
|
||||
}
|
||||
s += app.getString(R.string.osmo);
|
||||
}
|
||||
if(s.length() > 0) {
|
||||
notificationText += " (" + s + "). ";
|
||||
}
|
||||
notificationText += app.getString(R.string.gps_wake_up_timer) + ": ";
|
||||
if (soi == 0) {
|
||||
notificationText = notificationText + app.getString(R.string.int_continuosly);
|
||||
} else if (soi <= 90000) {
|
||||
notificationText = notificationText + Integer.toString(soi / 1000) + " " + app.getString(R.string.int_seconds);
|
||||
} else {
|
||||
notificationText = notificationText + Integer.toString(soi / 1000 / 60) + " " + app.getString(R.string.int_min);
|
||||
}
|
||||
//} else if(monitoringPlugin == null) {
|
||||
// return null;
|
||||
//} else if(app.getSavingTrackHelper().getDistance() > 0f){
|
||||
//This produces system notification if unsaved GPX track exists, displaying recorded distance. But only while OsmAnd is in the foreground and while recording has been stopped (otherwise background notification caries this info anyway)
|
||||
//Purpose is doubtful, we have widget for that. If we re-instate, we need to implement notification refresh upon track saved, maybe also work on notification wording to clarify meaning.
|
||||
// notificationText = app.getString(R.string.shared_string_trip_recording);
|
||||
// float dst = app.getSavingTrackHelper().getDistance();
|
||||
// notificationText += ": "+OsmAndFormatter.getFormattedDistance(dst, app);
|
||||
// icon = R.drawable.ic_action_polygom_dark;
|
||||
public OsmandNotification getTopNotification() {
|
||||
if (navigationNotification.isEnabled()) {
|
||||
return navigationNotification;
|
||||
} else if (gpxNotification.isEnabled() && gpxNotification.isActive()) {
|
||||
return gpxNotification;
|
||||
} else if (gpsWakeUpNotification.isEnabled()) {
|
||||
return gpsWakeUpNotification;
|
||||
} else if (osMoNotification.isEnabled()) {
|
||||
return osMoNotification;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void showNotifications() {
|
||||
boolean navNotificationVisible = navigationNotification.showNotification();
|
||||
gpxNotification.showNotification();
|
||||
osMoNotification.showNotification();
|
||||
if (!navNotificationVisible && !gpxNotification.isActive()) {
|
||||
gpsWakeUpNotification.showNotification();
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshNotification(NotificationType notificationType) {
|
||||
switch (notificationType) {
|
||||
case NAVIGATION:
|
||||
navigationNotification.refreshNotification();
|
||||
break;
|
||||
case GPX:
|
||||
gpxNotification.refreshNotification();
|
||||
break;
|
||||
case OSMO:
|
||||
osMoNotification.refreshNotification();
|
||||
break;
|
||||
case GPS:
|
||||
gpsWakeUpNotification.refreshNotification();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshNotifications() {
|
||||
boolean navNotificationVisible = navigationNotification.refreshNotification();
|
||||
gpxNotification.refreshNotification();
|
||||
osMoNotification.refreshNotification();
|
||||
if (!navNotificationVisible && !gpxNotification.isActive()) {
|
||||
gpsWakeUpNotification.refreshNotification();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
Intent contentIntent = new Intent(app, MapActivity.class);
|
||||
PendingIntent contentPendingIntent = PendingIntent.getActivity(app, 0, contentIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
final Builder notificationBuilder = new NotificationCompat.Builder(app)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setContentTitle(Version.getAppName(app)).setContentText(notificationText).setSmallIcon(icon)
|
||||
.setContentIntent(contentPendingIntent).setOngoing(service != null);
|
||||
if (monitoringPlugin != null) {
|
||||
Intent saveIntent = new Intent(OSMAND_SAVE_GPX_SERVICE_ACTION);
|
||||
PendingIntent savePendingIntent = PendingIntent.getBroadcast(app, 0, saveIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
if(service != null && (service.getUsedBy()&2)!=0) {
|
||||
//checks if service.getUsedBy() includes NavigationService.USED_BY_GPX
|
||||
Intent stopIntent = new Intent(OSMAND_STOP_GPX_SERVICE_ACTION);
|
||||
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(app, 0, stopIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_rec_stop,
|
||||
app.getString(R.string.gpx_monitoring_stop), stopPendingIntent);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_save, app.getString(R.string.shared_string_save),
|
||||
savePendingIntent);
|
||||
// } else if(service == null) {
|
||||
} else {
|
||||
Intent startIntent = new Intent(OSMAND_START_GPX_SERVICE_ACTION);
|
||||
PendingIntent startPendingIntent = PendingIntent.getBroadcast(app, 0, startIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_rec_start,
|
||||
app.getString(R.string.gpx_monitoring_start), startPendingIntent);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_save, app.getString(R.string.shared_string_save),
|
||||
savePendingIntent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
public void showNotification() {
|
||||
NotificationManager mNotificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
Builder newNotification = buildNotificationInStatusBar();
|
||||
if(newNotification != null) {
|
||||
mNotificationManager.notify(NOTIFICATION_SERVICE_ID, newNotification.build());
|
||||
gpsWakeUpNotification.removeNotification();
|
||||
}
|
||||
}
|
||||
|
||||
public void removeServiceNotification() {
|
||||
NotificationManager mNotificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.cancel( NOTIFICATION_SERVICE_ID);
|
||||
Builder newNotification = buildNotificationInStatusBar();
|
||||
if(newNotification != null) {
|
||||
mNotificationManager.notify(NOTIFICATION_SERVICE_ID, newNotification.build());
|
||||
}
|
||||
}
|
||||
|
||||
public void removeServiceNotificationCompletely() {
|
||||
NotificationManager mNotificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.cancel( NOTIFICATION_SERVICE_ID);
|
||||
public void removeNotifications() {
|
||||
navigationNotification.removeNotification();
|
||||
gpxNotification.removeNotification();
|
||||
osMoNotification.removeNotification();
|
||||
gpsWakeUpNotification.removeNotification();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -179,7 +179,7 @@ public class OsmAndLocationSimulation {
|
|||
return directions.isEmpty() ? 20.0f : Math.max(20.0f, current.distanceTo(directions.get(0)) / 2 );
|
||||
}
|
||||
|
||||
private void stop() {
|
||||
public void stop() {
|
||||
routeAnimation = null;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ import android.widget.Toast;
|
|||
import net.osmand.CallbackWithObject;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.access.AccessibilityPlugin;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.map.OsmandRegions;
|
||||
import net.osmand.osm.MapPoiTypes;
|
||||
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
||||
|
@ -56,6 +57,7 @@ import java.io.File;
|
|||
import java.io.FileWriter;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.Thread.UncaughtExceptionHandler;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
import btools.routingapp.BRouterServiceConnection;
|
||||
|
@ -196,7 +198,7 @@ public class OsmandApplication extends MultiDexApplication {
|
|||
if(RateUsBottomSheetDialog.shouldShow(this)) {
|
||||
osmandSettings.RATE_US_STATE.set(RateUsBottomSheetDialog.RateUsState.IGNORED);
|
||||
}
|
||||
getNotificationHelper().removeServiceNotification();
|
||||
getNotificationHelper().removeNotifications();
|
||||
}
|
||||
|
||||
public RendererRegistry getRendererRegistry() {
|
||||
|
@ -430,6 +432,19 @@ public class OsmandApplication extends MultiDexApplication {
|
|||
this.navigationService = navigationService;
|
||||
}
|
||||
|
||||
public void stopNavigation() {
|
||||
if (locationProvider.getLocationSimulation().isRouteAnimating()) {
|
||||
locationProvider.getLocationSimulation().stop();
|
||||
}
|
||||
routingHelper.getVoiceRouter().interruptRouteCommands();
|
||||
routingHelper.clearCurrentRoute(null, new ArrayList<LatLon>());
|
||||
routingHelper.setRoutePlanningMode(false);
|
||||
osmandSettings.LAST_ROUTING_APPLICATION_MODE = osmandSettings.APPLICATION_MODE.get();
|
||||
osmandSettings.APPLICATION_MODE.set(osmandSettings.DEFAULT_APPLICATION_MODE.get());
|
||||
if (osmandSettings.USE_MAP_MARKERS.get()) {
|
||||
targetPointsHelper.removeAllWayPoints(false, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void fullExit() {
|
||||
// http://stackoverflow.com/questions/2092951/how-to-close-android-application
|
||||
|
@ -745,7 +760,7 @@ public class OsmandApplication extends MultiDexApplication {
|
|||
serviceIntent.putExtra(NavigationService.USAGE_INTENT, intent);
|
||||
serviceIntent.putExtra(NavigationService.USAGE_OFF_INTERVAL, interval);
|
||||
startService(serviceIntent);
|
||||
getNotificationHelper().showNotification();
|
||||
//getNotificationHelper().showNotifications();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -881,7 +881,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
|||
protected void onStart() {
|
||||
super.onStart();
|
||||
wakeLockHelper.onStart(this);
|
||||
getMyApplication().getNotificationHelper().showNotification();
|
||||
getMyApplication().getNotificationHelper().showNotifications();
|
||||
}
|
||||
|
||||
protected void setProgressDlg(Dialog progressDlg) {
|
||||
|
@ -901,15 +901,14 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
|||
// }
|
||||
// }
|
||||
wakeLockHelper.onStop(this);
|
||||
if (getMyApplication().getNavigationService() == null) {
|
||||
getMyApplication().getNotificationHelper().removeServiceNotificationCompletely();
|
||||
}
|
||||
getMyApplication().getNotificationHelper().refreshNotifications();
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
getMyApplication().getNotificationHelper().removeNotifications();
|
||||
unregisterReceiver(screenOffReceiver);
|
||||
FailSafeFuntions.quitRouteRestoreDialog();
|
||||
OsmandPlugin.onMapActivityDestroy(this);
|
||||
|
|
|
@ -796,17 +796,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
}
|
||||
|
||||
public void stopNavigationWithoutConfirm() {
|
||||
if (getMyApplication().getLocationProvider().getLocationSimulation().isRouteAnimating()) {
|
||||
getMyApplication().getLocationProvider().getLocationSimulation().startStopRouteAnimation(mapActivity);
|
||||
}
|
||||
routingHelper.getVoiceRouter().interruptRouteCommands();
|
||||
routingHelper.clearCurrentRoute(null, new ArrayList<LatLon>());
|
||||
routingHelper.setRoutePlanningMode(false);
|
||||
settings.LAST_ROUTING_APPLICATION_MODE = settings.APPLICATION_MODE.get();
|
||||
settings.APPLICATION_MODE.set(settings.DEFAULT_APPLICATION_MODE.get());
|
||||
if (settings.USE_MAP_MARKERS.get()) {
|
||||
getMyApplication().getTargetPointsHelper().removeAllWayPoints(false, false);
|
||||
}
|
||||
getMyApplication().stopNavigation();
|
||||
mapActivity.updateApplicationModeSettings();
|
||||
mapActivity.getDashboard().clearDeletedPoints();
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@ import net.osmand.plus.OsmandApplication;
|
|||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||
import net.osmand.plus.notifications.OsmandNotification;
|
||||
import net.osmand.plus.notifications.OsmandNotification.NotificationType;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
@ -63,6 +65,7 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
|
||||
private LatLon lastPoint;
|
||||
private float distance = 0;
|
||||
private long duration = 0;
|
||||
private SelectedGpxFile currentTrack;
|
||||
private int points;
|
||||
|
||||
|
@ -227,6 +230,7 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
}
|
||||
distance = 0;
|
||||
points = 0;
|
||||
duration = 0;
|
||||
currentTrack.getModifiableGpxFile().points.clear();
|
||||
currentTrack.getModifiableGpxFile().tracks.clear();
|
||||
currentTrack.getModifiablePointsToDisplay().clear();
|
||||
|
@ -383,7 +387,7 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
if (record) {
|
||||
insertData(location.getLatitude(), location.getLongitude(), location.getAltitude(), location.getSpeed(),
|
||||
location.getAccuracy(), locationTime, settings);
|
||||
ctx.getNotificationHelper().showNotification();
|
||||
ctx.getNotificationHelper().refreshNotification(NotificationType.GPX);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -400,6 +404,9 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
float[] lastInterval = new float[1];
|
||||
net.osmand.Location.distanceBetween(lat, lon, lastPoint.getLatitude(), lastPoint.getLongitude(),
|
||||
lastInterval);
|
||||
if (lastTimeUpdated > 0 && time > lastTimeUpdated) {
|
||||
duration += time - lastTimeUpdated;
|
||||
}
|
||||
distance += lastInterval[0];
|
||||
lastPoint = new LatLon(lat, lon);
|
||||
}
|
||||
|
@ -573,6 +580,7 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
GPXTrackAnalysis analysis = currentTrack.getModifiableGpxFile().getAnalysis(System.currentTimeMillis());
|
||||
distance = analysis.totalDistance;
|
||||
points = analysis.wptPoints;
|
||||
duration = analysis.timeSpan;
|
||||
}
|
||||
|
||||
private void prepareCurrentTrackForRecording() {
|
||||
|
@ -598,7 +606,11 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
|
|||
public float getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
|
||||
public long getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public int getPoints() {
|
||||
return points;
|
||||
}
|
||||
|
|
|
@ -59,7 +59,13 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
ApplicationMode.regWidgetVisibility("monitoring", am.toArray(new ApplicationMode[am.size()]));
|
||||
settings = app.getSettings();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void disable(OsmandApplication app) {
|
||||
super.disable(app);
|
||||
app.getNotificationHelper().refreshNotifications();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLocation(Location location) {
|
||||
liveMonitoringHelper.updateLocation(location);
|
||||
|
@ -334,9 +340,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
@Override
|
||||
protected void onPreExecute() {
|
||||
isSaving = true;
|
||||
if (monitoringControl != null) {
|
||||
monitoringControl.updateInfo(null);
|
||||
}
|
||||
updateControl();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -346,7 +350,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
helper.saveDataToGpx(app.getAppCustomization().getTracksDir());
|
||||
helper.close();
|
||||
} finally {
|
||||
app.getNotificationHelper().showNotification();
|
||||
app.getNotificationHelper().showNotifications();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -354,18 +358,21 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
@Override
|
||||
protected void onPostExecute(Void aVoid) {
|
||||
isSaving = false;
|
||||
if (monitoringControl != null) {
|
||||
monitoringControl.updateInfo(null);
|
||||
}
|
||||
updateControl();
|
||||
}
|
||||
}, (Void) null);
|
||||
}
|
||||
|
||||
public void updateControl() {
|
||||
if (monitoringControl != null) {
|
||||
monitoringControl.updateInfo(null);
|
||||
}
|
||||
}
|
||||
|
||||
public void stopRecording(){
|
||||
settings.SAVE_GLOBAL_TRACK_TO_GPX.set(false);
|
||||
if (app.getNavigationService() != null) {
|
||||
app.getNavigationService().stopIfNeeded(app, NavigationService.USED_BY_GPX);
|
||||
app.getNotificationHelper().showNotification();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,100 @@
|
|||
package net.osmand.plus.notifications;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.support.v4.app.NotificationCompat.BigTextStyle;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
import android.support.v7.app.NotificationCompat;
|
||||
|
||||
import net.osmand.plus.NavigationService;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.Version;
|
||||
|
||||
import static net.osmand.plus.NavigationService.USED_BY_WAKE_UP;
|
||||
|
||||
public class GpsWakeUpNotification extends OsmandNotification {
|
||||
|
||||
public final static String OSMAND_STOP_GPS_WAKE_UP_SERVICE_ACTION = "OSMAND_STOP_GPS_WAKE_UP_SERVICE_ACTION";
|
||||
|
||||
public GpsWakeUpNotification(OsmandApplication app) {
|
||||
super(app);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Intent serviceIntent = new Intent(app, NavigationService.class);
|
||||
app.stopService(serviceIntent);
|
||||
}
|
||||
}, new IntentFilter(OSMAND_STOP_GPS_WAKE_UP_SERVICE_ACTION));
|
||||
}
|
||||
|
||||
@Override
|
||||
public NotificationType getType() {
|
||||
return NotificationType.GPS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return NotificationCompat.PRIORITY_HIGH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isActive() {
|
||||
return isEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
return service != null && (service.getUsedBy() & USED_BY_WAKE_UP) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder buildNotification() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
String notificationTitle;
|
||||
String notificationText;
|
||||
color = 0;
|
||||
icon = R.drawable.bgs_icon;
|
||||
if (service != null && (service.getUsedBy() & USED_BY_WAKE_UP) != 0) {
|
||||
int soi = service.getServiceOffInterval();
|
||||
color = app.getResources().getColor(R.color.osmand_orange);
|
||||
notificationTitle = Version.getAppName(app);
|
||||
notificationText = app.getString(R.string.gps_wake_up_timer) + ": ";
|
||||
if (soi == 0) {
|
||||
notificationText = notificationText + app.getString(R.string.int_continuosly);
|
||||
} else if (soi <= 90000) {
|
||||
notificationText = notificationText + Integer.toString(soi / 1000) + " " + app.getString(R.string.int_seconds);
|
||||
} else {
|
||||
notificationText = notificationText + Integer.toString(soi / 1000 / 60) + " " + app.getString(R.string.int_min);
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Builder notificationBuilder = createBuilder()
|
||||
.setContentTitle(notificationTitle)
|
||||
.setStyle(new BigTextStyle().bigText(notificationText));
|
||||
|
||||
Intent wakeUpIntent = new Intent(OSMAND_STOP_GPS_WAKE_UP_SERVICE_ACTION);
|
||||
PendingIntent stopWakeUpPendingIntent = PendingIntent.getBroadcast(app, 0, wakeUpIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_rec_stop,
|
||||
app.getString(R.string.stop_navigation_service), stopWakeUpPendingIntent);
|
||||
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUniqueId() {
|
||||
return GPS_WAKE_UP_NOTIFICATION_SERVICE_ID;
|
||||
}
|
||||
}
|
165
OsmAnd/src/net/osmand/plus/notifications/GpxNotification.java
Normal file
165
OsmAnd/src/net/osmand/plus/notifications/GpxNotification.java
Normal file
|
@ -0,0 +1,165 @@
|
|||
package net.osmand.plus.notifications;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.support.v4.app.NotificationCompat.BigTextStyle;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
import android.support.v7.app.NotificationCompat;
|
||||
|
||||
import net.osmand.plus.NavigationService;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import static net.osmand.plus.NavigationService.USED_BY_GPX;
|
||||
import static net.osmand.plus.NavigationService.USED_BY_NAVIGATION;
|
||||
|
||||
public class GpxNotification extends OsmandNotification {
|
||||
|
||||
public final static String OSMAND_SAVE_GPX_SERVICE_ACTION = "OSMAND_SAVE_GPX_SERVICE_ACTION";
|
||||
public final static String OSMAND_START_GPX_SERVICE_ACTION = "OSMAND_START_GPX_SERVICE_ACTION";
|
||||
public final static String OSMAND_STOP_GPX_SERVICE_ACTION = "OSMAND_STOP_GPX_SERVICE_ACTION";
|
||||
|
||||
public GpxNotification(OsmandApplication app) {
|
||||
super(app);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.saveCurrentTrack();
|
||||
}
|
||||
}
|
||||
}, new IntentFilter(OSMAND_SAVE_GPX_SERVICE_ACTION));
|
||||
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.startGPXMonitoring(null);
|
||||
plugin.updateControl();
|
||||
}
|
||||
}
|
||||
}, new IntentFilter(OSMAND_START_GPX_SERVICE_ACTION));
|
||||
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
|
||||
if (plugin != null) {
|
||||
plugin.stopRecording();
|
||||
plugin.updateControl();
|
||||
}
|
||||
}
|
||||
}, new IntentFilter(OSMAND_STOP_GPX_SERVICE_ACTION));
|
||||
}
|
||||
|
||||
@Override
|
||||
public NotificationType getType() {
|
||||
return NotificationType.GPX;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return NotificationCompat.PRIORITY_DEFAULT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isActive() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
return isEnabled()
|
||||
&& service != null
|
||||
&& (service.getUsedBy() & USED_BY_GPX) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder buildNotification() {
|
||||
if (!isEnabled()) {
|
||||
return null;
|
||||
}
|
||||
String notificationTitle;
|
||||
String notificationText;
|
||||
color = 0;
|
||||
icon = R.drawable.ic_action_polygom_dark;
|
||||
boolean isGpxRecording = app.getSavingTrackHelper().getIsRecording();
|
||||
float recordedDistane = app.getSavingTrackHelper().getDistance();
|
||||
ongoing = true;
|
||||
if (isGpxRecording) {
|
||||
color = app.getResources().getColor(R.color.osmand_orange);
|
||||
notificationTitle = app.getString(R.string.shared_string_trip) + " • "
|
||||
+ Algorithms.formatDuration((int) (app.getSavingTrackHelper().getDuration() / 1000), true);
|
||||
notificationText = app.getString(R.string.shared_string_recorded)
|
||||
+ ": " + OsmAndFormatter.getFormattedDistance(recordedDistane, app);
|
||||
} else {
|
||||
if (recordedDistane > 0) {
|
||||
notificationTitle = app.getString(R.string.shared_string_pause) + " • "
|
||||
+ Algorithms.formatDuration((int) (app.getSavingTrackHelper().getDuration() / 1000), true);
|
||||
notificationText = app.getString(R.string.shared_string_recorded)
|
||||
+ ": " + OsmAndFormatter.getFormattedDistance(recordedDistane, app);
|
||||
} else {
|
||||
ongoing = false;
|
||||
notificationTitle = app.getString(R.string.shared_string_trip_recording);
|
||||
notificationText = app.getString(R.string.gpx_logging_no_data);
|
||||
}
|
||||
}
|
||||
|
||||
final Builder notificationBuilder = createBuilder()
|
||||
.setContentTitle(notificationTitle)
|
||||
.setStyle(new BigTextStyle().bigText(notificationText));
|
||||
|
||||
Intent saveIntent = new Intent(OSMAND_SAVE_GPX_SERVICE_ACTION);
|
||||
PendingIntent savePendingIntent = PendingIntent.getBroadcast(app, 0, saveIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
if (isGpxRecording) {
|
||||
Intent stopIntent = new Intent(OSMAND_STOP_GPX_SERVICE_ACTION);
|
||||
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(app, 0, stopIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_pause,
|
||||
app.getString(R.string.shared_string_pause), stopPendingIntent);
|
||||
if (app.getSavingTrackHelper().getDistance() > 0) {
|
||||
notificationBuilder.addAction(R.drawable.ic_action_save, app.getString(R.string.shared_string_save),
|
||||
savePendingIntent);
|
||||
}
|
||||
} else {
|
||||
Intent startIntent = new Intent(OSMAND_START_GPX_SERVICE_ACTION);
|
||||
PendingIntent startPendingIntent = PendingIntent.getBroadcast(app, 0, startIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
if (recordedDistane > 0) {
|
||||
notificationBuilder.addAction(R.drawable.ic_action_rec_start,
|
||||
app.getString(R.string.shared_string_continue), startPendingIntent);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_save, app.getString(R.string.shared_string_save),
|
||||
savePendingIntent);
|
||||
} else {
|
||||
notificationBuilder.addAction(R.drawable.ic_action_rec_start,
|
||||
app.getString(R.string.shared_string_record), startPendingIntent);
|
||||
}
|
||||
}
|
||||
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUniqueId() {
|
||||
return GPX_NOTIFICATION_SERVICE_ID;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,242 @@
|
|||
package net.osmand.plus.notifications;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.NotificationCompat.BigTextStyle;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
import android.view.View;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.NavigationService;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.routing.RouteCalculationResult;
|
||||
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||
import net.osmand.plus.routing.RouteDirectionInfo;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.views.TurnPathHelper;
|
||||
import net.osmand.plus.views.mapwidgets.NextTurnInfoWidget.TurnDrawable;
|
||||
import net.osmand.router.TurnType;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static net.osmand.plus.NavigationService.USED_BY_NAVIGATION;
|
||||
|
||||
public class NavigationNotification extends OsmandNotification {
|
||||
|
||||
public final static String OSMAND_PAUSE_NAVIGATION_SERVICE_ACTION = "OSMAND_PAUSE_NAVIGATION_SERVICE_ACTION";
|
||||
public final static String OSMAND_RESUME_NAVIGATION_SERVICE_ACTION = "OSMAND_RESUME_NAVIGATION_SERVICE_ACTION";
|
||||
public final static String OSMAND_STOP_NAVIGATION_SERVICE_ACTION = "OSMAND_STOP_NAVIGATION_SERVICE_ACTION";
|
||||
|
||||
private Map<TurnPathHelper.TurnResource, Bitmap> bitmapCache = new HashMap<>();
|
||||
private Bitmap turnBitmap;
|
||||
private boolean leftSide;
|
||||
|
||||
public NavigationNotification(OsmandApplication app) {
|
||||
super(app);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
leftSide = app.getSettings().DRIVING_REGION.get().leftHandDriving;
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
RoutingHelper routingHelper = app.getRoutingHelper();
|
||||
routingHelper.setRoutePlanningMode(true);
|
||||
routingHelper.setFollowingMode(false);
|
||||
routingHelper.setPauseNaviation(true);
|
||||
}
|
||||
}, new IntentFilter(OSMAND_PAUSE_NAVIGATION_SERVICE_ACTION));
|
||||
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
RoutingHelper routingHelper = app.getRoutingHelper();
|
||||
routingHelper.setRoutePlanningMode(false);
|
||||
routingHelper.setFollowingMode(true);
|
||||
}
|
||||
}, new IntentFilter(OSMAND_RESUME_NAVIGATION_SERVICE_ACTION));
|
||||
|
||||
app.registerReceiver(new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
app.stopNavigation();
|
||||
}
|
||||
}, new IntentFilter(OSMAND_STOP_NAVIGATION_SERVICE_ACTION));
|
||||
}
|
||||
|
||||
@Override
|
||||
public NotificationType getType() {
|
||||
return NotificationType.NAVIGATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return NotificationCompat.PRIORITY_HIGH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isActive() {
|
||||
return isEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
return service != null && (service.getUsedBy() & USED_BY_NAVIGATION) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder buildNotification() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
String notificationTitle;
|
||||
StringBuilder notificationText = new StringBuilder();
|
||||
color = 0;
|
||||
icon = R.drawable.ic_action_start_navigation;
|
||||
turnBitmap = null;
|
||||
RoutingHelper routingHelper = app.getRoutingHelper();
|
||||
boolean followingMode = routingHelper.isFollowingMode() || app.getLocationProvider().getLocationSimulation().isRouteAnimating();
|
||||
if (service != null && (service.getUsedBy() & USED_BY_NAVIGATION) != 0) {
|
||||
color = app.getResources().getColor(R.color.osmand_orange);
|
||||
|
||||
String distanceStr = app.getString(R.string.route_distance) + OsmAndFormatter.getFormattedDistance(app.getRoutingHelper().getLeftDistance(), app);
|
||||
String durationStr = app.getString(R.string.access_arrival_time) + ": " + SimpleDateFormat.getTimeInstance(DateFormat.SHORT)
|
||||
.format(new Date(System.currentTimeMillis() + app.getRoutingHelper().getLeftTime() * 1000));
|
||||
|
||||
TurnType turnType = null;
|
||||
boolean deviatedFromRoute;
|
||||
int turnImminent = 0;
|
||||
int nextTurnDistance = 0;
|
||||
RouteDirectionInfo ri = null;
|
||||
if (routingHelper.isRouteCalculated() && followingMode) {
|
||||
deviatedFromRoute = routingHelper.isDeviatedFromRoute();
|
||||
|
||||
if (deviatedFromRoute) {
|
||||
turnImminent = 0;
|
||||
turnType = TurnType.valueOf(TurnType.OFFR, leftSide);
|
||||
nextTurnDistance = (int) routingHelper.getRouteDeviation();
|
||||
} else {
|
||||
NextDirectionInfo r = routingHelper.getNextRouteDirectionInfo(new NextDirectionInfo(), true);
|
||||
if (r != null && r.distanceTo > 0 && r.directionInfo != null) {
|
||||
ri = r.directionInfo;
|
||||
turnType = r.directionInfo.getTurnType();
|
||||
nextTurnDistance = r.distanceTo;
|
||||
turnImminent = r.imminent;
|
||||
}
|
||||
}
|
||||
|
||||
TurnDrawable drawable = new TurnDrawable(app, false);
|
||||
int height = (int) app.getResources().getDimension(android.R.dimen.notification_large_icon_height);
|
||||
int width = (int) app.getResources().getDimension(android.R.dimen.notification_large_icon_width);
|
||||
drawable.setBounds(0, 0, width, height);
|
||||
drawable.setTurnType(turnType);
|
||||
drawable.setTurnImminent(turnImminent, deviatedFromRoute);
|
||||
turnBitmap = drawableToBitmap(drawable);
|
||||
|
||||
notificationTitle = OsmAndFormatter.getFormattedDistance(nextTurnDistance, app) + " • " + RouteCalculationResult.toString(turnType, app);
|
||||
if (ri != null && !Algorithms.isEmpty(ri.getDescriptionRoutePart())) {
|
||||
notificationText.append(ri.getDescriptionRoutePart());
|
||||
notificationText.append("\n");
|
||||
}
|
||||
notificationText.append(distanceStr).append(" • ").append(durationStr);
|
||||
|
||||
} else {
|
||||
notificationTitle = app.getString(R.string.shared_string_navigation);
|
||||
String error = routingHelper.getLastRouteCalcErrorShort();
|
||||
if (Algorithms.isEmpty(error)) {
|
||||
notificationText.append("Route calculation...");
|
||||
} else {
|
||||
notificationText.append(error);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Builder notificationBuilder = createBuilder()
|
||||
.setContentTitle(notificationTitle)
|
||||
.setStyle(new BigTextStyle().bigText(notificationText))
|
||||
.setLargeIcon(turnBitmap);
|
||||
|
||||
Intent stopIntent = new Intent(OSMAND_STOP_NAVIGATION_SERVICE_ACTION);
|
||||
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(app, 0, stopIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_action_remove_dark,
|
||||
app.getString(R.string.shared_string_control_stop), stopPendingIntent);
|
||||
|
||||
if (routingHelper.isRouteCalculated() && followingMode) {
|
||||
Intent pauseIntent = new Intent(OSMAND_PAUSE_NAVIGATION_SERVICE_ACTION);
|
||||
PendingIntent pausePendingIntent = PendingIntent.getBroadcast(app, 0, pauseIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_pause,
|
||||
app.getString(R.string.shared_string_pause), pausePendingIntent);
|
||||
} else {
|
||||
Intent resumeIntent = new Intent(OSMAND_STOP_NAVIGATION_SERVICE_ACTION);
|
||||
PendingIntent resumePendingIntent = PendingIntent.getBroadcast(app, 0, resumeIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notificationBuilder.addAction(R.drawable.ic_play_dark,
|
||||
app.getString(R.string.shared_string_continue), resumePendingIntent);
|
||||
}
|
||||
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupNotification(Notification notification) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
int smallIconViewId = app.getResources().getIdentifier("right_icon", "id", android.R.class.getPackage().getName());
|
||||
|
||||
if (smallIconViewId != 0) {
|
||||
if (notification.contentIntent != null)
|
||||
notification.contentView.setViewVisibility(smallIconViewId, View.INVISIBLE);
|
||||
|
||||
if (notification.headsUpContentView != null)
|
||||
notification.headsUpContentView.setViewVisibility(smallIconViewId, View.INVISIBLE);
|
||||
|
||||
if (notification.bigContentView != null)
|
||||
notification.bigContentView.setViewVisibility(smallIconViewId, View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Bitmap drawableToBitmap(Drawable drawable) {
|
||||
int height = (int) app.getResources().getDimension(android.R.dimen.notification_large_icon_height);
|
||||
int width = (int) app.getResources().getDimension(android.R.dimen.notification_large_icon_width);
|
||||
|
||||
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(bitmap);
|
||||
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
|
||||
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
|
||||
drawable.draw(canvas);
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUniqueId() {
|
||||
return NAVIGATION_NOTIFICATION_SERVICE_ID;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package net.osmand.plus.notifications;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.NotificationCompat.BigTextStyle;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
|
||||
import net.osmand.plus.NavigationService;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.Version;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.osmo.OsMoPlugin;
|
||||
|
||||
import static android.support.v7.app.NotificationCompat.*;
|
||||
import static net.osmand.plus.NavigationService.USED_BY_GPX;
|
||||
import static net.osmand.plus.NavigationService.USED_BY_LIVE;
|
||||
|
||||
public class OsMoNotification extends OsmandNotification {
|
||||
|
||||
public OsMoNotification(OsmandApplication app) {
|
||||
super(app);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NotificationType getType() {
|
||||
return NotificationType.OSMO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return NotificationCompat.PRIORITY_DEFAULT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isActive() {
|
||||
NavigationService service = app.getNavigationService();
|
||||
return isEnabled()
|
||||
&& service != null
|
||||
&& (service.getUsedBy() & USED_BY_LIVE) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return OsmandPlugin.getEnabledPlugin(OsMoPlugin.class) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder buildNotification() {
|
||||
String notificationTitle;
|
||||
String notificationText;
|
||||
color = 0;
|
||||
icon = R.drawable.ic_osmo_dark;
|
||||
color = app.getResources().getColor(R.color.osmand_orange);
|
||||
notificationTitle = Version.getAppName(app);
|
||||
notificationText = app.getString(R.string.osmo);
|
||||
|
||||
final Builder notificationBuilder = createBuilder()
|
||||
.setContentTitle(notificationTitle)
|
||||
.setStyle(new BigTextStyle().bigText(notificationText));
|
||||
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int getUniqueId() {
|
||||
return OSMO_NOTIFICATION_SERVICE_ID;
|
||||
}
|
||||
}
|
116
OsmAnd/src/net/osmand/plus/notifications/OsmandNotification.java
Normal file
116
OsmAnd/src/net/osmand/plus/notifications/OsmandNotification.java
Normal file
|
@ -0,0 +1,116 @@
|
|||
package net.osmand.plus.notifications;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.support.v4.app.NotificationCompat.Builder;
|
||||
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
|
||||
public abstract class OsmandNotification {
|
||||
|
||||
public final static int NAVIGATION_NOTIFICATION_SERVICE_ID = 5;
|
||||
public final static int GPX_NOTIFICATION_SERVICE_ID = 6;
|
||||
public final static int OSMO_NOTIFICATION_SERVICE_ID = 7;
|
||||
public final static int GPS_WAKE_UP_NOTIFICATION_SERVICE_ID = 8;
|
||||
|
||||
protected OsmandApplication app;
|
||||
protected boolean ongoing = true;
|
||||
protected int color;
|
||||
protected int icon;
|
||||
|
||||
public enum NotificationType {
|
||||
NAVIGATION,
|
||||
GPX,
|
||||
OSMO,
|
||||
GPS
|
||||
}
|
||||
|
||||
public OsmandNotification(OsmandApplication app) {
|
||||
this.app = app;
|
||||
init();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
}
|
||||
|
||||
public abstract NotificationType getType();
|
||||
|
||||
protected Builder createBuilder() {
|
||||
Intent contentIntent = new Intent(app, MapActivity.class);
|
||||
PendingIntent contentPendingIntent = PendingIntent.getActivity(app, 0, contentIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
Builder builder = new Builder(app)
|
||||
.setVisibility(android.support.v7.app.NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setPriority(getPriority())
|
||||
.setOngoing(ongoing)
|
||||
.setContentIntent(contentPendingIntent);
|
||||
|
||||
if (color != 0) {
|
||||
builder.setColor(color);
|
||||
}
|
||||
if (icon != 0) {
|
||||
builder.setSmallIcon(icon);
|
||||
}
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
public abstract Builder buildNotification();
|
||||
|
||||
public abstract int getUniqueId();
|
||||
|
||||
public abstract int getPriority();
|
||||
|
||||
public abstract boolean isActive();
|
||||
|
||||
public abstract boolean isEnabled();
|
||||
|
||||
public void setupNotification(Notification notification) {
|
||||
}
|
||||
|
||||
public boolean showNotification() {
|
||||
NotificationManager notificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (isEnabled()) {
|
||||
Builder newNotification = buildNotification();
|
||||
if (newNotification != null) {
|
||||
Notification notification = newNotification.build();
|
||||
setupNotification(notification);
|
||||
notificationManager.notify(getUniqueId(), notification);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean refreshNotification() {
|
||||
NotificationManager notificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (isEnabled()) {
|
||||
Builder newNotification = buildNotification();
|
||||
if (newNotification != null) {
|
||||
Notification notification = newNotification.build();
|
||||
setupNotification(notification);
|
||||
notificationManager.notify(getUniqueId(), notification);
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
notificationManager.cancel(getUniqueId());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void removeNotification() {
|
||||
NotificationManager notificationManager = (NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.cancel(getUniqueId());
|
||||
}
|
||||
|
||||
public void closeSystemDialogs(Context context) {
|
||||
Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
|
||||
context.sendBroadcast(it);
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@ import net.osmand.plus.OsmandSettings;
|
|||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.TargetPointsHelper.TargetPoint;
|
||||
import net.osmand.plus.notifications.OsmandNotification.NotificationType;
|
||||
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
|
||||
import net.osmand.plus.routing.RouteProvider.RouteService;
|
||||
|
@ -29,6 +30,8 @@ import java.util.Iterator;
|
|||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import static net.osmand.plus.notifications.OsmandNotification.NotificationType.NAVIGATION;
|
||||
|
||||
public class RoutingHelper {
|
||||
|
||||
private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RoutingHelper.class);
|
||||
|
@ -66,6 +69,8 @@ public class RoutingHelper {
|
|||
private static final int RECALCULATE_THRESHOLD_CAUSING_FULL_RECALCULATE_INTERVAL = 120000;
|
||||
private Thread currentRunningJob;
|
||||
private long lastTimeEvaluatedRoute = 0;
|
||||
private String lastRouteCalcError;
|
||||
private String lastRouteCalcErrorShort;
|
||||
private long recalculateCountInInterval = 0;
|
||||
private int evalWaitInterval = 0;
|
||||
|
||||
|
@ -105,7 +110,15 @@ public class RoutingHelper {
|
|||
public OsmandApplication getApplication() {
|
||||
return app;
|
||||
}
|
||||
|
||||
|
||||
public String getLastRouteCalcError() {
|
||||
return lastRouteCalcError;
|
||||
}
|
||||
|
||||
public String getLastRouteCalcErrorShort() {
|
||||
return lastRouteCalcErrorShort;
|
||||
}
|
||||
|
||||
public void setPauseNaviation(boolean b) {
|
||||
this.isPauseNavigation = b;
|
||||
if (b) {
|
||||
|
@ -472,6 +485,7 @@ public class RoutingHelper {
|
|||
// that node already passed
|
||||
route.updateCurrentRoute(newCurrentRoute + 1);
|
||||
currentRoute = newCurrentRoute + 1;
|
||||
app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -830,7 +844,9 @@ public class RoutingHelper {
|
|||
synchronized (RoutingHelper.this) {
|
||||
currentRunningJob = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
lastRouteCalcError = null;
|
||||
lastRouteCalcErrorShort = null;
|
||||
RouteCalculationResult res = provider.calculateRouteImpl(params);
|
||||
if (params.calculationProgress.isCancelled) {
|
||||
synchronized (RoutingHelper.this) {
|
||||
|
@ -856,17 +872,24 @@ public class RoutingHelper {
|
|||
}
|
||||
if(res.isCalculated()){
|
||||
setNewRoute(prev, res, params.start);
|
||||
|
||||
|
||||
} else if (onlineSourceWithoutInternet) {
|
||||
showMessage(app.getString(R.string.error_calculating_route)
|
||||
+ ":\n" + app.getString(R.string.internet_connection_required_for_online_route)); //$NON-NLS-1$
|
||||
lastRouteCalcError = app.getString(R.string.error_calculating_route)
|
||||
+ ":\n" + app.getString(R.string.internet_connection_required_for_online_route);
|
||||
lastRouteCalcErrorShort = app.getString(R.string.error_calculating_route);
|
||||
showMessage(lastRouteCalcError); //$NON-NLS-1$
|
||||
} else {
|
||||
if (res.getErrorMessage() != null) {
|
||||
showMessage(app.getString(R.string.error_calculating_route) + ":\n" + res.getErrorMessage()); //$NON-NLS-1$
|
||||
lastRouteCalcError = app.getString(R.string.error_calculating_route) + ":\n" + res.getErrorMessage();
|
||||
lastRouteCalcErrorShort = app.getString(R.string.error_calculating_route);
|
||||
showMessage(lastRouteCalcError); //$NON-NLS-1$
|
||||
} else {
|
||||
showMessage(app.getString(R.string.empty_route_calculated));
|
||||
lastRouteCalcError = app.getString(R.string.empty_route_calculated);
|
||||
lastRouteCalcErrorShort = app.getString(R.string.empty_route_calculated);
|
||||
showMessage(lastRouteCalcError);
|
||||
}
|
||||
}
|
||||
app.getNotificationHelper().refreshNotification(NAVIGATION);
|
||||
lastTimeEvaluatedRoute = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue