Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Customized export label for file sharing (#333, #470) #483

Merged
merged 9 commits into from
Feb 4, 2025
3 changes: 3 additions & 0 deletions app/src/main/java/net/osmtracker/OSMTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public static final class Preferences {
public final static String KEY_GPS_LOGGING_MIN_DISTANCE = "gps.logging.min_distance";
public final static String KEY_USE_BAROMETER = "gpx.use_barometer";
public final static String KEY_OUTPUT_FILENAME = "gpx.filename";
public final static String KEY_OUTPUT_FILENAME_LABEL = "gpx.export.label";
public final static String KEY_OUTPUT_ACCURACY = "gpx.accuracy";
public final static String KEY_OUTPUT_GPX_HDOP_APPROXIMATION = "gpx.hdop.approximation";
public final static String KEY_OUTPUT_DIR_PER_TRACK = "gpx.directory_per_track";
Expand Down Expand Up @@ -61,7 +62,9 @@ public static final class Preferences {
public final static boolean VAL_USE_BAROMETER = false;

public final static String VAL_OUTPUT_FILENAME_NAME = "name";
public final static String VAL_OUTPUT_FILENAME_LABEL = "OSMTracker";
public final static String VAL_OUTPUT_FILENAME_NAME_DATE = "name_date";
public final static String VAL_OUTPUT_FILENAME_DATE_NAME = "date_name";
public final static String VAL_OUTPUT_FILENAME_DATE = "date";
public final static String VAL_OUTPUT_FILENAME = VAL_OUTPUT_FILENAME_NAME_DATE;

Expand Down
67 changes: 64 additions & 3 deletions app/src/main/java/net/osmtracker/gpx/ExportToTempFileTask.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package net.osmtracker.gpx;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.preference.PreferenceManager;
import android.util.Log;

import androidx.annotation.NonNull;

import net.osmtracker.OSMTracker;
import net.osmtracker.db.DataHelper;
import net.osmtracker.db.TrackContentProvider;
import net.osmtracker.exception.ExportTrackException;

import java.io.File;
Expand All @@ -25,13 +33,66 @@ public abstract class ExportToTempFileTask extends ExportTrackTask {
public ExportToTempFileTask(Context context, long trackId) {
super(context, trackId);
try {
tmpFile = File.createTempFile("osm-upload", ".gpx", context.getCacheDir());
Log.d(TAG, "Temporary file: " + tmpFile.getAbsolutePath());
} catch (IOException ioe) {
String exportLabelName = PreferenceManager.getDefaultSharedPreferences(context).getString(
OSMTracker.Preferences.KEY_OUTPUT_FILENAME_LABEL, OSMTracker.Preferences.VAL_OUTPUT_FILENAME_LABEL);
String trackName = new DataHelper(context).getTrackById(trackId).getName();
long date = new DataHelper(context).getTrackById(trackId).getStartDate();

String formattedTrackStartDate = DataHelper.FILENAME_FORMATTER.format(new Date(date));

// Create temporary file
String namefinal = createFile(trackName, formattedTrackStartDate, exportLabelName);
tmpFile = new File(context.getCacheDir(),namefinal+".gpx");
Log.d(TAG, "Temporary file: "+ tmpFile.getAbsolutePath());
} catch (Exception ioe) {
Log.e(TAG, "Could not create temporary file", ioe);
throw new IllegalStateException("Could not create temporary file", ioe);
}
}
//create temporary file
private String createFile(String sanitizedTrackName, String formattedTrackStartDate, String exportLabelName) throws IOException{
String result = "";
String desiredOutputFormat = PreferenceManager.getDefaultSharedPreferences(context).getString(
OSMTracker.Preferences.KEY_OUTPUT_FILENAME,
OSMTracker.Preferences.VAL_OUTPUT_FILENAME);

boolean thereIsTrackName = sanitizedTrackName != null && sanitizedTrackName.length() >= 1;
switch(desiredOutputFormat){
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_NAME:
if(thereIsTrackName)
result += sanitizedTrackName;
else
result += formattedTrackStartDate; // fallback case
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_NAME_DATE:
if(thereIsTrackName)
if(sanitizedTrackName.equals(formattedTrackStartDate)) {
result += sanitizedTrackName;
}else{
result += sanitizedTrackName + "_" + formattedTrackStartDate; // name is not equal
}
else
result += formattedTrackStartDate;
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_DATE_NAME:
if(thereIsTrackName){
if(sanitizedTrackName.equals(formattedTrackStartDate)){
result += formattedTrackStartDate;
}else{
result += formattedTrackStartDate + "_" + sanitizedTrackName;
}
}else{
result += formattedTrackStartDate;
}
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_DATE:
result += formattedTrackStartDate;
break;
}
if(!(exportLabelName.equals("")))
result += "_"+ exportLabelName;
return result;
}

@Override
protected File getExportDirectory(Date startDate) throws ExportTrackException {
Expand Down
31 changes: 25 additions & 6 deletions app/src/main/java/net/osmtracker/gpx/ExportTrackTask.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package net.osmtracker.gpx;

import android.Manifest;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.media.MediaScannerConnection;
import android.os.AsyncTask;
import android.os.Environment;
import android.preference.PreferenceManager;
import androidx.core.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;

Expand Down Expand Up @@ -569,25 +565,48 @@ public String buildGPXFilename(Cursor cursor, File parentDirectory) {

public String formatGpxFilename(String desiredOutputFormat, String sanitizedTrackName, String formattedTrackStartDate){
String result = "";
String exportLabelName = PreferenceManager.getDefaultSharedPreferences(context).getString(
OSMTracker.Preferences.KEY_OUTPUT_FILENAME_LABEL, OSMTracker.Preferences.VAL_OUTPUT_FILENAME_LABEL);
if(exportLabelName == null){
jamescr marked this conversation as resolved.
Show resolved Hide resolved
exportLabelName = OSMTracker.Preferences.VAL_OUTPUT_FILENAME_LABEL;
}
boolean thereIsTrackName = sanitizedTrackName != null && sanitizedTrackName.length() >= 1;

switch(desiredOutputFormat){
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_NAME:
if(thereIsTrackName)
result += sanitizedTrackName;
else
result += formattedTrackStartDate; // fallback case
result += formattedTrackStartDate;
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_NAME_DATE:
if(thereIsTrackName)
result += sanitizedTrackName + "_" + formattedTrackStartDate;
if(sanitizedTrackName.equals(formattedTrackStartDate)) {
result += sanitizedTrackName;
}else{
result += sanitizedTrackName + "_" + formattedTrackStartDate; // name is not equal
}
else
result += formattedTrackStartDate;
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_DATE_NAME:
if(thereIsTrackName){
if(sanitizedTrackName.equals(formattedTrackStartDate)){
result += formattedTrackStartDate;
}else{
result += formattedTrackStartDate + "_" + sanitizedTrackName;
}
}else{
result += formattedTrackStartDate;
}
break;
case OSMTracker.Preferences.VAL_OUTPUT_FILENAME_DATE:
result += formattedTrackStartDate;
break;
}
if(!(exportLabelName.equals(""))) {
result += "_" + exportLabelName;
}
return result;
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values/strings-preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@

<string name="prefs_output">GPX settings</string>
<string name="prefs_storage_dir">Storage folder in documents</string>
<string name="prefs_export_label">Filename label</string>
<string name="prefs_export_label_summary">This label will be appended at the end of filename</string>
<string name="prefs_storage_dir_hint">Effective for the next track (not the current one)</string>
<string name="prefs_output_one_dir_per_track">One directory per track</string>
<string name="prefs_output_one_dir_per_track_summary">Save each track and associated files to its own directory</string>
Expand All @@ -82,7 +84,9 @@
<string-array name="prefs_output_filename_keys">
<item>Track name</item>
<item>Name, start date and time</item>
<item>Start date and time, name</item>
<item>Start date and time</item>

</string-array>

<string name="prefs_output_accuracy">Accuracy in GPX file</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/values-preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<string-array name="prefs_output_filename_values">
<item>name</item>
<item>name_date</item>
<item>date_name</item>
<item>date</item>
</string-array>

Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
android:title="@string/prefs_output_one_dir_per_track"
android:summary="@string/prefs_output_one_dir_per_track_summary"
android:defaultValue="true" />
<EditTextPreference android:key="gpx.export.label" android:defaultValue="OSMTracker" android:summary="@string/prefs_export_label_summary"
android:title="@string/prefs_export_label"/>
<ListPreference android:key="gpx.filename" android:defaultValue="name_date" android:summary="@string/prefs_output_filename_summary"
android:title="@string/prefs_output_filename" android:entryValues="@array/prefs_output_filename_values"
android:entries="@array/prefs_output_filename_keys" />
Expand Down
23 changes: 17 additions & 6 deletions app/src/test/java/net/osmtracker/gpx/ExportToStorageTaskTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public void testBuildGPXFilenameUsingOnlyTrackName() {
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_NAME;

String expectedFilename = "MyTrack.gpx";
String expectedFilename = "MyTrack_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx";

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand All @@ -94,7 +94,18 @@ public void testBuildGPXFilenameUsingTrackNameAndStartDate() {
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_NAME_DATE;

String expectedFilename = "MyTrack_2000-01-02_03-04-05.gpx";
String expectedFilename = "MyTrack_2000-01-02_03-04-05_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx";

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}

@Test
public void testBuildGPXFilenameUsingStartDateAndTrackName() {
String trackNameInDatabase = "MyTrack";
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_DATE_NAME;

String expectedFilename = "2000-01-02_03-04-05_MyTrack_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx";

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand All @@ -105,7 +116,7 @@ public void testBuildGPXFilenameUsingOnlyStartDate() {
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_DATE;

String expectedFilename = "2000-01-02_03-04-05.gpx";
String expectedFilename = "2000-01-02_03-04-05_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx";

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand All @@ -116,7 +127,7 @@ public void testBuildGPXFilenameWhenSanitizesTrackName() {
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_NAME;

String expectedFilename = ";M_y_T_r_a_c_k;.gpx";
String expectedFilename = ";M_y_T_r_a_c_k;_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx";

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand All @@ -127,7 +138,7 @@ public void testBuildGPXFilenameWhenUsesTrackNameButThereIsNoName() {
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_NAME;

String expectedFilename = "2000-01-02_03-04-05.gpx"; // Must fallback to use the start date
String expectedFilename = "2000-01-02_03-04-05_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx"; // Must fallback to use the start date

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand All @@ -138,7 +149,7 @@ public void testBuildGPXFilenameWhenUsesTrackNameAndStartDateButThereIsNoName()
Date trackStartDate = createDateFrom(2000, 1, 2, 3, 4, 5);
String preferenceSetting = Preferences.VAL_OUTPUT_FILENAME_NAME_DATE;

String expectedFilename = "2000-01-02_03-04-05.gpx"; // Must fallback to use the start date
String expectedFilename = "2000-01-02_03-04-05_"+Preferences.VAL_OUTPUT_FILENAME_LABEL+".gpx"; // Must fallback to use the start date

doTestBuildGPXFilename(trackNameInDatabase, preferenceSetting, trackStartDate.getTime(), expectedFilename);
}
Expand Down