Public API: allow marker creation.

Fixes #2031.
This commit is contained in:
Dennis Guse
2024-12-19 18:39:53 +01:00
parent 26c660ec5b
commit 522d9ebe2e
9 changed files with 65 additions and 25 deletions
+9 -8
View File
@@ -109,19 +109,20 @@ The API can be invoked by sending an explicit Intent to start an activity.
* Debug: `de.dennisguse.opentracks.debug` * Debug: `de.dennisguse.opentracks.debug`
* Nightly: `de.dennisguse.opentracks.nightly` * Nightly: `de.dennisguse.opentracks.nightly`
`Class`: `Classes`:
* **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording` * **Start a recording:** `de.dennisguse.opentracks.publicapi.StartRecording`
* Set track data: `TRACK_NAME`, `TRACK_DESCRIPTION`, `TRACK_CATEGORY`, and `TRACK_ICON` (
non-localized identifier
see [/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38](/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38)).
NOTE: if `TRACK_ICON` is not present, `TRACK_CATEGORY` will be used to determine the icon (
localized).
* Send recorded data to another application via _Dashboard API_: `STATS_TARGET_PACKAGE` and
`STATS_TARGET_CLASS`
* **Stop a recording:** `de.dennisguse.opentracks.publicapi.StopRecording` * **Stop a recording:** `de.dennisguse.opentracks.publicapi.StopRecording`
* **Create a marker:** `de.dennisguse.opentracks.publicapi.CreateMarker`
For testing via adb: `adb shell am start -e someParameter someValue -n "package/class"` For testing via adb: `adb shell am start -e someParameter someValue -n "package/class"`
`StartRecording` supports the following parameters:
* Set track data: `TRACK_NAME`, `TRACK_DESCRIPTION`, `TRACK_CATEGORY`, and `TRACK_ICON` (non-localized identifier see [/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38](/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java#L38)).
NOTE: if `TRACK_ICON` is not present, `TRACK_CATEGORY` will be used to determine the icon (localized).
* Send recorded data to another application via _Dashboard API_: `STATS_TARGET_PACKAGE` and `STATS_TARGET_CLASS`
The Public API is disabled by default to protect the user's privacy, but it can easily be enabled in the settings. The Public API is disabled by default to protect the user's privacy, but it can easily be enabled in the settings.
## File formats compatibility with open-source software ## File formats compatibility with open-source software
@@ -482,7 +482,7 @@ public class CustomContentProviderUtilsTest {
assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1); assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1);
// Get marker id that needs to delete. // Get marker id that needs to delete.
Marker.Id marker1Id = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker1))); Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
// Delete // Delete
contentProviderUtils.deleteMarker(context, marker1Id); contentProviderUtils.deleteMarker(context, marker1Id);
@@ -509,7 +509,7 @@ public class CustomContentProviderUtilsTest {
assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1); assertEquals(contentProviderUtils.getMarkers(trackId).size(), 1);
// Get marker id that needs to delete. // Get marker id that needs to delete.
Marker.Id marker1Id = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker1))); Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
// Check marker has photo and it's in the external storage. // Check marker has photo and it's in the external storage.
assertTrue(marker1.hasPhoto()); assertTrue(marker1.hasPhoto());
@@ -553,11 +553,11 @@ public class CustomContentProviderUtilsTest {
// Insert at first. // Insert at first.
Marker marker1 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId)); Marker marker1 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
marker1.setDescription(MOCK_DESC); marker1.setDescription(MOCK_DESC);
Marker.Id marker1Id = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker1))); Marker.Id marker1Id = contentProviderUtils.insertMarker(marker1);
Marker marker2 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId)); Marker marker2 = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
marker2.setDescription(MOCK_DESC); marker2.setDescription(MOCK_DESC);
Marker.Id marker2Id = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker2))); Marker.Id marker2Id = contentProviderUtils.insertMarker(marker2);
// Delete // Delete
assertNotNull(contentProviderUtils.getMarker(marker1Id)); assertNotNull(contentProviderUtils.getMarker(marker1Id));
@@ -598,7 +598,7 @@ public class CustomContentProviderUtilsTest {
Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId)); Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
marker.setDescription(TEST_DESC); marker.setDescription(TEST_DESC);
Marker.Id markerId = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker))); Marker.Id markerId = contentProviderUtils.insertMarker(marker);
assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).getDescription()); assertEquals(TEST_DESC, contentProviderUtils.getMarker(markerId).getDescription());
} }
@@ -614,7 +614,7 @@ public class CustomContentProviderUtilsTest {
// Insert at first. // Insert at first.
Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId)); Marker marker = new Marker(trackId, contentProviderUtils.getLastValidTrackPoint(trackId));
marker.setDescription(TEST_DESC); marker.setDescription(TEST_DESC);
Marker.Id markerId = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker))); Marker.Id markerId = contentProviderUtils.insertMarker(marker);
// Update // Update
marker = contentProviderUtils.getMarker(markerId); marker = contentProviderUtils.getMarker(markerId);
@@ -638,7 +638,7 @@ public class CustomContentProviderUtilsTest {
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId); TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint); Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
marker.setDescription(TEST_DESC); marker.setDescription(TEST_DESC);
Marker.Id markerId = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker))); Marker.Id markerId = contentProviderUtils.insertMarker(marker);
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id()); File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
assertTrue(dir.exists()); assertTrue(dir.exists());
@@ -673,7 +673,7 @@ public class CustomContentProviderUtilsTest {
TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId); TrackPoint trackPoint = contentProviderUtils.getLastValidTrackPoint(trackId);
Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint); Marker marker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
marker.setDescription(TEST_DESC); marker.setDescription(TEST_DESC);
Marker.Id markerId = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker))); Marker.Id markerId = contentProviderUtils.insertMarker(marker);
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id()); File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
assertTrue(dir.exists()); assertTrue(dir.exists());
@@ -709,7 +709,7 @@ public class CustomContentProviderUtilsTest {
marker.setDescription(TEST_DESC); marker.setDescription(TEST_DESC);
Marker otherMarker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint); Marker otherMarker = TestDataUtil.createMarkerWithPhoto(context, trackId, trackPoint);
otherMarker.setDescription(TEST_DESC); otherMarker.setDescription(TEST_DESC);
Marker.Id markerId = new Marker.Id(ContentUris.parseId(contentProviderUtils.insertMarker(marker))); Marker.Id markerId = contentProviderUtils.insertMarker(marker);
contentProviderUtils.insertMarker(otherMarker); contentProviderUtils.insertMarker(otherMarker);
File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id()); File dir = new File(FileUtils.getPhotoDir(context), "" + trackId.id());
+8
View File
@@ -98,6 +98,14 @@ limitations under the License.
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".publicapi.CreateMarker"
android:exported="true"
android:theme="@style/SplashTheme">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- NOTE: the name of the MAIN/LAUNCHER is used by icon packs; if this is changed, icon packs break.--> <!-- NOTE: the name of the MAIN/LAUNCHER is used by icon packs; if this is changed, icon packs break.-->
<activity <activity
@@ -487,12 +487,11 @@ public class ContentProviderUtils {
return markers; return markers;
} }
/** // TODO Merge with updateMarker
* @return the content provider URI of the inserted marker. public Marker.Id insertMarker(@NonNull Marker marker) {
*/
public Uri insertMarker(@NonNull Marker marker) {
marker.setId(null); marker.setId(null);
return contentResolver.insert(MarkerColumns.CONTENT_URI, createContentValues(marker)); Uri uri = contentResolver.insert(MarkerColumns.CONTENT_URI, createContentValues(marker));
return new Marker.Id(ContentUris.parseId(uri));
} }
private void deleteMarkerPhoto(Context context, Marker marker) { private void deleteMarkerPhoto(Context context, Marker marker) {
@@ -13,7 +13,7 @@ import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
public abstract class AbstractAPIActivity extends AppCompatActivity { abstract class AbstractAPIActivity extends AppCompatActivity {
private final String TAG = AbstractAPIActivity.class.getSimpleName(); private final String TAG = AbstractAPIActivity.class.getSimpleName();
@@ -0,0 +1,16 @@
package de.dennisguse.opentracks.publicapi;
import de.dennisguse.opentracks.services.TrackRecordingService;
public class CreateMarker extends AbstractAPIActivity {
@Override
protected void execute(TrackRecordingService service) {
service.createMarker();
}
@Override
protected boolean isPostExecuteStopService() {
return false;
}
}
@@ -12,7 +12,7 @@ import de.dennisguse.opentracks.ui.markers.MarkerEditActivity;
import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.IntentUtils;
/** /**
* Public API to creates a Marker for a given track with a given location * INTERNAL: only meant for clients of OSMDashboard API.
*/ */
public class CreateMarkerActivity extends AppCompatActivity { public class CreateMarkerActivity extends AppCompatActivity {
@@ -13,7 +13,7 @@ import de.dennisguse.opentracks.ui.markers.MarkerDetailActivity;
import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.IntentUtils;
/** /**
* Public api to show an existing marker * INTERNAL: only meant for clients of OSMDashboard API.
*/ */
public class ShowMarkerActivity extends AppCompatActivity { public class ShowMarkerActivity extends AppCompatActivity {
@@ -36,7 +36,9 @@ import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.time.Duration; import java.time.Duration;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
@@ -243,6 +245,20 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
gpsStatusObservable.postValue(STATUS_GPS_DEFAULT); gpsStatusObservable.postValue(STATUS_GPS_DEFAULT);
} }
public Marker.Id createMarker() {
if (!isRecording()) {
return null;
}
//TODO This contains some duplication to TrackRecodingActivity's Marker creation
TrackPoint trackPoint = trackRecordingManager.getLastStoredTrackPointWithLocation();
if (trackPoint == null) {
return null;
}
Marker marker = new Marker(recordingStatus.trackId(), trackPoint);
return new ContentProviderUtils(this).insertMarker(marker);
}
@Override @Override
public boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) { public boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
if (!isRecording()) { if (!isRecording()) {