Bugfix: ShareContentProvider should report contentType for all Uris (not only TrackFileFormat).

Part of #2265.
This commit is contained in:
Dennis Guse
2026-02-08 18:11:30 +01:00
parent 1a5d06f9c6
commit b65d83010d
2 changed files with 18 additions and 21 deletions
@@ -89,11 +89,10 @@ public class ShareContentProvider extends CustomContentProvider {
trackIdBuilder.deleteCharAt(trackIdBuilder.lastIndexOf(TRACKID_DELIMITER)); trackIdBuilder.deleteCharAt(trackIdBuilder.lastIndexOf(TRACKID_DELIMITER));
Uri uri = Uri.parse(TracksColumns.CONTENT_URI + "/" + trackFileFormat.getPreferenceId() + "/" + trackIdBuilder + "/" + Uri.encode(filename)); Uri uri = Uri.parse(TracksColumns.CONTENT_URI + "/" + trackFileFormat.getPreferenceId() + "/" + trackIdBuilder + "/" + Uri.encode(filename));
String mime = getTypeMime(uri);
Log.d(TAG, "Created uri " + uri + " with MIME " + mime); Log.d(TAG, "Created uri " + uri + " with MIME " + trackFileFormat.getMimeType());
return new Pair<>(uri, mime); return new Pair<>(uri, trackFileFormat.getMimeType());
} }
static Set<Track.Id> parseURI(Uri uri) { static Set<Track.Id> parseURI(Uri uri) {
@@ -126,6 +125,7 @@ public class ShareContentProvider extends CustomContentProvider {
} }
} }
@Nullable
private static TrackFileFormat getTrackFileFormat(@NonNull Uri uri) { private static TrackFileFormat getTrackFileFormat(@NonNull Uri uri) {
return switch (uriMatcher.match(uri)) { return switch (uriMatcher.match(uri)) {
case URI_GPX -> TrackFileFormat.GPX; case URI_GPX -> TrackFileFormat.GPX;
@@ -134,16 +134,10 @@ public class ShareContentProvider extends CustomContentProvider {
case URI_KMZ_WITH_TRACKDETAIL_SENSORDATA_AND_PICTURES -> case URI_KMZ_WITH_TRACKDETAIL_SENSORDATA_AND_PICTURES ->
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES; TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES;
case URI_CSV -> TrackFileFormat.CSV; case URI_CSV -> TrackFileFormat.CSV;
default -> default -> null;
throw new RuntimeException("Could not derive TrackFileFormat from Uri " + uri);
}; };
} }
@Nullable
private static String getTypeMime(@NonNull Uri uri) {
return getTrackFileFormat(uri).getMimeType();
}
@Override @Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
if (uriMatcher.match(uri) == -1) { if (uriMatcher.match(uri) == -1) {
@@ -182,9 +176,9 @@ public class ShareContentProvider extends CustomContentProvider {
@Nullable @Nullable
@Override @Override
public String getType(@NonNull Uri uri) { public String getType(@NonNull Uri uri) {
String mime = getTypeMime(uri); TrackFileFormat trackFileFormat = getTrackFileFormat(uri);
if (mime != null) { if (trackFileFormat != null) {
return mime; return trackFileFormat.getMimeType();
} }
return super.getType(uri); return super.getType(uri);
@@ -5,7 +5,6 @@ import android.content.res.Resources;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@@ -31,11 +30,13 @@ public enum TrackFileFormat {
return new KMLTrackExporter(context, contentProviderUtils, false); return new KMLTrackExporter(context, contentProviderUtils, false);
} }
@NonNull
@Override @Override
public String getMimeType() { public String getMimeType() {
return "application/vnd.google-earth.kml+xml"; return "application/vnd.google-earth.kml+xml";
} }
@NonNull
public String getExtension() { public String getExtension() {
return "kml"; return "kml";
} }
@@ -50,11 +51,13 @@ public enum TrackFileFormat {
return new KMZTrackExporter(context, contentProviderUtils, exportPhotos); return new KMZTrackExporter(context, contentProviderUtils, exportPhotos);
} }
@NonNull
@Override @Override
public String getMimeType() { public String getMimeType() {
return "application/vnd.google-earth.kmz"; return "application/vnd.google-earth.kmz";
} }
@NonNull
public String getExtension() { public String getExtension() {
return "kmz"; return "kmz";
} }
@@ -72,11 +75,13 @@ public enum TrackFileFormat {
return new GPXTrackExporter(contentProviderUtils, context.getString(R.string.app_name)); return new GPXTrackExporter(contentProviderUtils, context.getString(R.string.app_name));
} }
@NonNull
@Override @Override
public String getMimeType() { public String getMimeType() {
return "application/gpx+xml"; return "application/gpx+xml";
} }
@NonNull
public String getExtension() { public String getExtension() {
return "gpx"; return "gpx";
} }
@@ -88,11 +93,13 @@ public enum TrackFileFormat {
return new CSVTrackExporter(contentProviderUtils); return new CSVTrackExporter(contentProviderUtils);
} }
@NonNull
@Override @Override
public String getMimeType() { public String getMimeType() {
return "text/csv"; return "text/csv";
} }
@NonNull
@Override @Override
public String getExtension() { public String getExtension() {
return "csv"; return "csv";
@@ -115,16 +122,10 @@ public enum TrackFileFormat {
return preferenceIdLabelMap; return preferenceIdLabelMap;
} }
public static TrackFileFormat valueOfPreferenceId(final String preferenceId) {
return Arrays.stream(values())
.filter(trackFileFormat -> trackFileFormat.getPreferenceId().equals(preferenceId))
.findFirst()
.orElse(null);
}
/** /**
* Returns the mime type for each format. * Returns the mime type for each format.
*/ */
@NonNull
public abstract String getMimeType(); public abstract String getMimeType();
/** /**
@@ -137,6 +138,7 @@ public enum TrackFileFormat {
/** /**
* Returns the file extension for each format. * Returns the file extension for each format.
*/ */
@NonNull
public abstract String getExtension(); public abstract String getExtension();
/** /**
@@ -149,6 +151,7 @@ public enum TrackFileFormat {
/** /**
* The identifier to be stored in the preferences. * The identifier to be stored in the preferences.
*/ */
@NonNull
public String getPreferenceId() { public String getPreferenceId() {
return preferenceId; return preferenceId;
} }