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.monitoring.OsmandMonitoringPlugin;
import net.osmand.util.Algorithms;
import static net.osmand.plus.NavigationService.USED_BY_GPX;
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 final static String GROUP_NAME = "GPX";
private boolean wasNoDataDismissed;
private boolean lastBuiltNoData;
public GpxNotification(OsmandApplication app) {
super(app, GROUP_NAME);
}
@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();
if (!app.getSettings().SAVE_GLOBAL_TRACK_TO_GPX.get()) {
plugin.stopRecording();
}
}
}
}, 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 void onNotificationDismissed() {
if (!wasNoDataDismissed) {
wasNoDataDismissed = lastBuiltNoData;
}
}
@Override
public Builder buildNotification(boolean wearable) {
if (!isEnabled()) {
return null;
}
String notificationTitle;
String notificationText;
color = 0;
icon = R.drawable.ic_action_polygom_dark;
boolean isGpxRecording = app.getSavingTrackHelper().getIsRecording();
float recordedDistance = app.getSavingTrackHelper().getDistance();
ongoing = true;
lastBuiltNoData = false;
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(recordedDistance, app);
} else {
if (recordedDistance > 0) {
notificationTitle = app.getString(R.string.shared_string_paused) + " • "
+ Algorithms.formatDuration((int) (app.getSavingTrackHelper().getDuration() / 1000), true);
notificationText = app.getString(R.string.shared_string_recorded)
+ ": " + OsmAndFormatter.getFormattedDistance(recordedDistance, app);
} else {
ongoing = false;
notificationTitle = app.getString(R.string.shared_string_trip_recording);
notificationText = app.getString(R.string.gpx_logging_no_data);
lastBuiltNoData = true;
}
}
if ((wasNoDataDismissed || !app.getSettings().SHOW_TRIP_REC_NOTIFICATION.get()) && !ongoing) {
return null;
}
final Builder notificationBuilder = createBuilder(wearable)
.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);
if (app.getSavingTrackHelper().getDistance() > 0) {
notificationBuilder.addAction(R.drawable.ic_pause,
app.getString(R.string.shared_string_pause), stopPendingIntent);
notificationBuilder.addAction(R.drawable.ic_action_save,
app.getString(R.string.shared_string_save), savePendingIntent);
} else {
notificationBuilder.addAction(R.drawable.ic_action_rec_stop,
app.getString(R.string.shared_string_control_stop), stopPendingIntent);
}
} else {
Intent startIntent = new Intent(OSMAND_START_GPX_SERVICE_ACTION);
PendingIntent startPendingIntent = PendingIntent.getBroadcast(app, 0, startIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
if (recordedDistance > 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 getOsmandNotificationId() {
return GPX_NOTIFICATION_SERVICE_ID;
}
@Override
public int getOsmandWearableNotificationId() {
return WEAR_GPX_NOTIFICATION_SERVICE_ID;
}
}