forked from upstream-mirrors/OpenTracks
Add "show on map" format selection dialog
This commit is contained in:
@@ -347,23 +347,6 @@ limitations under the License.
|
|||||||
<activity android:name=".settings.SettingsCustomLayoutListActivity" />
|
<activity android:name=".settings.SettingsCustomLayoutListActivity" />
|
||||||
<activity android:name=".settings.SettingsCustomLayoutEditActivity" />
|
<activity android:name=".settings.SettingsCustomLayoutEditActivity" />
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".share.ShowOnMapProxyActivity$KML"
|
|
||||||
android:exported="true">
|
|
||||||
<intent-filter android:label="@string/open_track_as_KML">
|
|
||||||
<action android:name="Intent.OpenTracks-Dashboard" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity
|
|
||||||
android:name=".share.ShowOnMapProxyActivity$GPX"
|
|
||||||
android:exported="true">
|
|
||||||
<intent-filter android:label="@string/open_track_as_GPX">
|
|
||||||
<action android:name="Intent.OpenTracks-Dashboard" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ShowErrorActivity"
|
android:name=".ShowErrorActivity"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (itemId == R.id.list_context_menu_show_on_map) {
|
if (itemId == R.id.list_context_menu_show_on_map) {
|
||||||
IntentDashboardUtils.startDashboard(this, false, trackIds);
|
IntentDashboardUtils.showTrackOnMap(this, false, trackIds);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
||||||
IntentDashboardUtils.startDashboard(this, false, trackId);
|
IntentDashboardUtils.showTrackOnMap(this, false, trackId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
|||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
if (item.getItemId() == R.id.track_detail_menu_show_on_map) {
|
||||||
IntentDashboardUtils.startDashboard(this, true, trackId);
|
IntentDashboardUtils.showTrackOnMap(this, true, trackId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
package de.dennisguse.opentracks.io.file;
|
package de.dennisguse.opentracks.io.file;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
@@ -128,6 +134,23 @@ public enum TrackFileFormat {
|
|||||||
this.preferenceId = preferenceId;
|
this.preferenceId = preferenceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<String, String> toPreferenceIdLabelMap(final Resources resources, final TrackFileFormat ... trackFileFormats) {
|
||||||
|
Map<String, String> preferenceIdLabelMap = new LinkedHashMap<>(trackFileFormats.length);
|
||||||
|
for (TrackFileFormat trackFileFormat : trackFileFormats) {
|
||||||
|
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
|
||||||
|
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
|
||||||
|
preferenceIdLabelMap.put(trackFileFormat.getPreferenceId(), String.format("%s (%s)", trackFileFormatUpperCase, resources.getString(photoMessageId)));
|
||||||
|
}
|
||||||
|
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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import androidx.preference.ListPreference;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Map;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
@@ -46,27 +46,15 @@ public class ImportExportSettingsFragment extends PreferenceFragmentCompat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setExportTrackFileFormatOptions() {
|
private void setExportTrackFileFormatOptions() {
|
||||||
final TrackFileFormat[] trackFileFormats = {
|
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(),
|
||||||
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
|
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
|
||||||
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA,
|
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||||
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
|
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||||
TrackFileFormat.GPX,
|
TrackFileFormat.GPX,
|
||||||
TrackFileFormat.CSV
|
TrackFileFormat.CSV);
|
||||||
};
|
|
||||||
String[] entries = new String[trackFileFormats.length];
|
|
||||||
String[] entryValues = new String[trackFileFormats.length];
|
|
||||||
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
TrackFileFormat trackFileFormat = trackFileFormats[i];
|
|
||||||
String trackFileFormatUpperCase = trackFileFormat.getExtension().toUpperCase(Locale.US); //ASCII upper case
|
|
||||||
int photoMessageId = trackFileFormat.includesPhotos() ? R.string.export_with_photos : R.string.export_without_photos;
|
|
||||||
entries[i] = String.format("%s (%s)", trackFileFormatUpperCase, getString(photoMessageId));
|
|
||||||
entryValues[i] = trackFileFormat.getPreferenceId();
|
|
||||||
}
|
|
||||||
|
|
||||||
ListPreference listPreference = findPreference(getString(R.string.export_trackfileformat_key));
|
ListPreference listPreference = findPreference(getString(R.string.export_trackfileformat_key));
|
||||||
listPreference.setEntries(entries);
|
listPreference.setEntries(options.values().toArray(new String[0]));
|
||||||
listPreference.setEntryValues(entryValues);
|
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setExportDirectorySummary() {
|
private void setExportDirectorySummary() {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
|||||||
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
|
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
|
||||||
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
|
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
|
||||||
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout;
|
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout;
|
||||||
|
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -761,4 +762,13 @@ public class PreferencesUtils {
|
|||||||
public static void clear() {
|
public static void clear() {
|
||||||
sharedPreferences.edit().clear().commit();
|
sharedPreferences.edit().clear().commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setShowOnMapFormat(final String showOnMapFormat) {
|
||||||
|
setString(R.string.show_on_map_format_key, showOnMapFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getShowOnMapFormat() {
|
||||||
|
return getString(R.string.show_on_map_format_key, IntentDashboardUtils.PREFERENCE_ID_ASK);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,15 @@ import android.content.SharedPreferences;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
import androidx.preference.ListPreference;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
|
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||||
|
|
||||||
public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
||||||
|
|
||||||
@@ -28,6 +33,8 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
|||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setShowOnMapFormatOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -64,4 +71,14 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
|
|||||||
|
|
||||||
super.onDisplayPreferenceDialog(preference);
|
super.onDisplayPreferenceDialog(preference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setShowOnMapFormatOptions() {
|
||||||
|
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
|
||||||
|
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, getString(R.string.show_on_dashboard));
|
||||||
|
options.put(IntentDashboardUtils.PREFERENCE_ID_ASK, getString(R.string.show_on_map_format_ask));
|
||||||
|
ListPreference listPreference = findPreference(getString(R.string.show_on_map_format_key));
|
||||||
|
listPreference.setEntries(options.values().toArray(new String[0]));
|
||||||
|
listPreference.setEntryValues(options.keySet().toArray(new String[0]));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
package de.dennisguse.opentracks.share;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Pair;
|
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
import de.dennisguse.opentracks.data.ShareContentProvider;
|
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
|
||||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
|
||||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to convert IntentDashboardUtils.startDashboard-requests into {@link TrackFileFormat}.
|
|
||||||
*/
|
|
||||||
public abstract class ShowOnMapProxyActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
private final TrackFileFormat trackFileFormat;
|
|
||||||
|
|
||||||
protected ShowOnMapProxyActivity(TrackFileFormat trackFileFormat) {
|
|
||||||
this.trackFileFormat = trackFileFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onCreate(final Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
Set<Track.Id> trackIds = IntentDashboardUtils.extractTrackIdsFromIntent(getIntent());
|
|
||||||
|
|
||||||
showTrackfileFormat(this, trackFileFormat, trackIds);
|
|
||||||
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send intent to show tracks on a map (needs an another app) as KMZ.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param trackIds the track ids
|
|
||||||
*/
|
|
||||||
private static void showTrackfileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
|
|
||||||
if (trackIds.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
|
|
||||||
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
|
|
||||||
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
|
|
||||||
|
|
||||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
||||||
|
|
||||||
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class KML extends ShowOnMapProxyActivity {
|
|
||||||
public KML() {
|
|
||||||
super(TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GPX extends ShowOnMapProxyActivity {
|
|
||||||
public GPX() {
|
|
||||||
super(TrackFileFormat.GPX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,31 +5,45 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.ShareContentProvider;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
||||||
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an {@link Intent} to request showing a Dashboard.
|
* Create an {@link Intent} to request showing tracks on a Map or a Dashboard.
|
||||||
* The receiving {@link android.app.Activity} gets temporary access to the {@link TracksColumns} and the {@link TrackPointsColumns} (incl. update).
|
* The receiving {@link android.app.Activity} gets temporary access to the {@link TracksColumns} and the {@link TrackPointsColumns} (incl. update).
|
||||||
*/
|
*/
|
||||||
public class IntentDashboardUtils {
|
public class IntentDashboardUtils {
|
||||||
|
|
||||||
private static final String TAG = IntentDashboardUtils.class.getSimpleName();
|
private static final String TAG = IntentDashboardUtils.class.getSimpleName();
|
||||||
|
|
||||||
private static final String ACTION_DASHBOARD = "Intent.OpenTracks-Dashboard";
|
private static final String ACTION_DASHBOARD = "Intent.OpenTracks-Dashboard";
|
||||||
|
|
||||||
private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload";
|
private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload";
|
||||||
|
|
||||||
|
public static final TrackFileFormat[] SHOW_ON_MAP_TRACK_FILE_FORMATS = new TrackFileFormat[] {
|
||||||
|
TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES,
|
||||||
|
TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA,
|
||||||
|
TrackFileFormat.GPX};
|
||||||
|
|
||||||
|
public static final String PREFERENCE_ID_DASHBOARD = ACTION_DASHBOARD;
|
||||||
|
public static final String PREFERENCE_ID_ASK = "ASK";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assume "v1" if not present.
|
* Assume "v1" if not present.
|
||||||
*/
|
*/
|
||||||
@@ -49,24 +63,78 @@ public class IntentDashboardUtils {
|
|||||||
private static final int TRACK_URI_INDEX = 0;
|
private static final int TRACK_URI_INDEX = 0;
|
||||||
private static final int TRACKPOINTS_URI_INDEX = 1;
|
private static final int TRACKPOINTS_URI_INDEX = 1;
|
||||||
private static final int MARKERS_URI_INDEX = 2;
|
private static final int MARKERS_URI_INDEX = 2;
|
||||||
|
private static final int NONE_SELECTED = -1;
|
||||||
|
|
||||||
private IntentDashboardUtils() {
|
private IntentDashboardUtils() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
||||||
|
* Shows an AlertDialog with different format option if none is defined as preference.
|
||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
|
* @param isRecording are we currently recording?
|
||||||
* @param trackIds the track ids
|
* @param trackIds the track ids
|
||||||
*/
|
*/
|
||||||
public static void startDashboard(Context context, boolean isRecording, Track.Id... trackIds) {
|
public static void showTrackOnMap(Context context, boolean isRecording, Track.Id... trackIds) {
|
||||||
startDashboard(context, isRecording, null, null, trackIds);
|
Map<String, String> options = TrackFileFormat.toPreferenceIdLabelMap(context.getResources(), IntentDashboardUtils.SHOW_ON_MAP_TRACK_FILE_FORMATS);
|
||||||
|
options.put(IntentDashboardUtils.PREFERENCE_ID_DASHBOARD, context.getString(R.string.show_on_dashboard));
|
||||||
|
final String[] optionLabels = options.values().toArray(new String[0]);
|
||||||
|
final String[] optionValues = options.keySet().toArray(new String[0]);
|
||||||
|
final AtomicInteger checkedItem = new AtomicInteger(NONE_SELECTED);
|
||||||
|
String preferenceValue = PreferencesUtils.getShowOnMapFormat();
|
||||||
|
for (int i = 0; i < optionValues.length; i++) {
|
||||||
|
if (optionValues[i].equals(preferenceValue)) {
|
||||||
|
checkedItem.set(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (checkedItem.get() == NONE_SELECTED) {
|
||||||
|
checkedItem.set(0); // set first option as default
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle(R.string.select_show_on_map_behavior);
|
||||||
|
builder.setSingleChoiceItems(optionLabels, checkedItem.get(), (dialog, which) -> checkedItem.set(which));
|
||||||
|
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, false));
|
||||||
|
builder.setNeutralButton(R.string.always, ((dialog, which) -> onFormatSelected(context, isRecording, optionValues[checkedItem.get()], trackIds, true)));
|
||||||
|
builder.setNegativeButton(android.R.string.cancel, null);
|
||||||
|
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
} else {
|
||||||
|
onFormatSelected(context, isRecording, preferenceValue, trackIds, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A format was selected, remember if <code>always</code> is true and start the necessary action
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param isRecording are we currently recording?
|
||||||
|
* @param selectedValue the chosen format
|
||||||
|
* @param trackIds the track ids
|
||||||
|
* @param always set the selectedValue as default preference
|
||||||
|
*/
|
||||||
|
private static void onFormatSelected(final Context context, final boolean isRecording, final String selectedValue, final Track.Id[] trackIds, final boolean always) {
|
||||||
|
if (always) {
|
||||||
|
PreferencesUtils.setShowOnMapFormat(selectedValue);
|
||||||
|
}
|
||||||
|
TrackFileFormat trackFileFormat = TrackFileFormat.valueOfPreferenceId(selectedValue);
|
||||||
|
if (trackFileFormat != null) {
|
||||||
|
showTrackOnMapWithFileFormat(context, trackFileFormat, Set.of(trackIds));
|
||||||
|
} else {
|
||||||
|
startDashboard(context, isRecording, null, null, trackIds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
* Send intent to show tracks on a map (needs an another app) as resource URIs.
|
||||||
* By providing a targetPackage and targetClass an explicit intent can be sent,
|
* By providing a targetPackage and targetClass an explicit intent can be sent,
|
||||||
* thus bypassing the need for the user to select an app.
|
* thus bypassing the need for the user to select an app.
|
||||||
|
*
|
||||||
|
* @param context the context
|
||||||
|
* @param isRecording are we currently recording?
|
||||||
|
* @param targetPackage the target package
|
||||||
|
* @param targetClass the target class
|
||||||
|
* @param trackIds the track ids
|
||||||
*/
|
*/
|
||||||
public static void startDashboard(Context context, boolean isRecording, String targetPackage, String targetClass, Track.Id... trackIds) {
|
public static void startDashboard(Context context, boolean isRecording, String targetPackage, String targetClass, Track.Id... trackIds) {
|
||||||
if (trackIds.length == 0) {
|
if (trackIds.length == 0) {
|
||||||
@@ -108,16 +176,27 @@ public class IntentDashboardUtils {
|
|||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<Track.Id> extractTrackIdsFromIntent(@NonNull Intent intent) {
|
/**
|
||||||
final ArrayList<Uri> uris = intent.getParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD);
|
* Send intent to show tracks on a map (needs an another app) to support specific trackFileFormat.
|
||||||
final Uri tracksUri = uris.get(TRACK_URI_INDEX);
|
*
|
||||||
|
* @param context the context
|
||||||
String[] trackIdsString = ContentProviderUtils.parseTrackIdsFromUri(tracksUri);
|
* @param trackFileFormat the track file format
|
||||||
Set<Track.Id> trackIds = new HashSet<>(trackIdsString.length);
|
* @param trackIds the track ids
|
||||||
for (String s : trackIdsString) {
|
*/
|
||||||
trackIds.add(new Track.Id(Long.parseLong(s)));
|
private static void showTrackOnMapWithFileFormat(Context context, TrackFileFormat trackFileFormat, Set<Track.Id> trackIds) {
|
||||||
|
if (trackIds.isEmpty()) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return trackIds;
|
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
|
||||||
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
|
||||||
|
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", trackFileFormat);
|
||||||
|
intent.setDataAndType(uriAndMime.first, uriAndMime.second);
|
||||||
|
|
||||||
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
|
|
||||||
|
context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, trackFileFormat.getExtension())));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,4 +99,5 @@ limitations under the License.
|
|||||||
<item>@string/waypoint_type_water_fountain</item>
|
<item>@string/waypoint_type_water_fountain</item>
|
||||||
<item>@string/waypoint_type_waypoint</item>
|
<item>@string/waypoint_type_waypoint</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -44,6 +44,8 @@
|
|||||||
true
|
true
|
||||||
</bool>
|
</bool>
|
||||||
|
|
||||||
|
<string name="show_on_map_format_key" translatable="false">showOnMapFormatKey</string>
|
||||||
|
|
||||||
<string name="settings_default_export_directory_key" translatable="false">settingsDefaultExportDirectory</string>
|
<string name="settings_default_export_directory_key" translatable="false">settingsDefaultExportDirectory</string>
|
||||||
<string name="post_workout_export_enabled_key" translatable="false">instantExportEnabled</string>
|
<string name="post_workout_export_enabled_key" translatable="false">instantExportEnabled</string>
|
||||||
<bool name="post_workout_export_enabled_default" translatable="false">false</bool>
|
<bool name="post_workout_export_enabled_default" translatable="false">false</bool>
|
||||||
|
|||||||
@@ -639,4 +639,9 @@ limitations under the License.
|
|||||||
<string name="error_crash_title">%1$s crashed</string>
|
<string name="error_crash_title">%1$s crashed</string>
|
||||||
<string name="share_crash_report">Share crash report</string>
|
<string name="share_crash_report">Share crash report</string>
|
||||||
<string name="report_bug">Report bug</string>
|
<string name="report_bug">Report bug</string>
|
||||||
|
|
||||||
|
<string name="select_show_on_map_behavior">Select \"show on map\" behavior</string>
|
||||||
|
<string name="show_on_map_format_ask">Ask</string>
|
||||||
|
<string name="show_on_dashboard">OpenTracks Dashboard API</string>
|
||||||
|
<string name="always">Always</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -43,4 +43,10 @@
|
|||||||
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
|
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
|
||||||
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
|
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:defaultValue="@string/show_on_map_format_ask"
|
||||||
|
android:key="@string/show_on_map_format_key"
|
||||||
|
android:title="@string/select_show_on_map_behavior"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
Reference in New Issue
Block a user