diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java index 9dcc1ed..2cf4b00 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java @@ -5,6 +5,7 @@ import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.DashPathEffect; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; @@ -15,9 +16,12 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.lifecycle.LiveData; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; @@ -37,6 +41,7 @@ import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Marker; import org.osmdroid.views.overlay.Polygon; +import org.osmdroid.views.overlay.Polyline; import org.osmdroid.views.overlay.compass.CompassOverlay; import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider; import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; @@ -44,6 +49,7 @@ import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; public class MapActivity extends AppCompatActivity { @@ -63,6 +69,10 @@ public class MapActivity extends AppCompatActivity { private boolean _rotateMap = false; private boolean _showCircles = false; + private LiveData> _stationTrack; + List _stationTrackPoints = new ArrayList<>(); + Polyline _stationTrackLine = new Polyline(); //see note below! + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -120,6 +130,7 @@ public class MapActivity extends AppCompatActivity { _logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class); _logItemViewModel.getLastPositions().observe(this, lastPositions -> { for (LogItemGroup lastPosition : lastPositions) { + Log.i(TAG, "new position " + lastPosition.getLatitude() + " " + lastPosition.getLongitude()); // do not add items without coordinate if (lastPosition.getMaidenHead() == null) continue; if (addStationPositionIcon(lastPosition)) { @@ -129,6 +140,14 @@ public class MapActivity extends AppCompatActivity { } } }); + + // add track + Paint p = _stationTrackLine.getOutlinePaint(); + p.setStrokeWidth(8); + p.setColor(Color.RED); + p.setStyle(Paint.Style.STROKE); + p.setPathEffect(new DashPathEffect(new float[] {10f, 10f}, 0f)); + _map.getOverlayManager().add(_stationTrackLine); } @Override @@ -170,6 +189,14 @@ public class MapActivity extends AppCompatActivity { polygon.setPoints(circlePoints); } + private void addTrack(List positions) { + for (LogItemGroup trackPoint : positions) { + Log.i(TAG, "addPoint " + trackPoint.getLatitude() + " " + trackPoint.getLongitude()); + _stationTrackPoints.add(new GeoPoint(trackPoint.getLatitude(), trackPoint.getLongitude())); + } + _stationTrackLine.setPoints(_stationTrackPoints); + } + private boolean addStationPositionIcon(LogItemGroup group) { String callsign = group.getSrcCallsign(); Marker marker = null; @@ -240,9 +267,20 @@ public class MapActivity extends AppCompatActivity { BitmapDrawable drawableText = new BitmapDrawable(getResources(), bitmap); BitmapDrawable drawableInfoIcon = new BitmapDrawable(getResources(), bitmapInfoIcon); marker = new Marker(_map); + marker.setId(callsign); marker.setIcon(drawableText); marker.setImage(drawableInfoIcon); - + marker.setOnMarkerClickListener((monitoredMarker, mapView) -> { + if (_stationTrack != null) + _stationTrack.removeObservers(this); + _map.getOverlays().remove(_stationTrackLine); + _stationTrackPoints.clear(); + _stationTrackLine.setPoints(_stationTrackPoints); + _map.getOverlays().add(_stationTrackLine); + _stationTrack = _logItemViewModel.getLastPositions(monitoredMarker.getId()); + _stationTrack.observe(this, this::addTrack); + return false; + }); _map.getOverlays().add(marker); _objectOverlayItems.put(callsign, marker); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java index 4343252..4ea43e9 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java @@ -60,6 +60,25 @@ public interface LogItemDao { "ORDER BY srcCallsign ASC") LiveData> getLastPositions(); + @Query("SELECT pos.timestampEpoch AS timestampEpoch, " + + "pos.srcCallsign AS srcCallsign, " + + "pos.dstCallsign AS dstCallsign, " + + "pos.latitude AS latitude, " + + "pos.longitude AS longitude, " + + "pos.maidenHead AS maidenHead, " + + "pos.altitudeMeters AS altitudeMeters, " + + "pos.bearingDegrees AS bearingDegrees, " + + "pos.speedMetersPerSecond AS speedMetersPerSecond, " + + "pos.status AS status, " + + "pos.comment AS comment, " + + "pos.symbolCode AS symbolCode, " + + "pos.privacyLevel AS privacyLevel, " + + "pos.rangeMiles AS rangeMiles, " + + "pos.directivityDeg AS directivityDeg " + + "FROM PositionItem AS pos WHERE pos.srcCallsign = :srcCallsign " + + "ORDER BY pos.timestampEpoch DESC") + LiveData> getStationPositions(String srcCallsign); + @Query("SELECT * FROM LogItem ORDER by timestampEpoch ASC") LiveData> getAllLogItems(); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemRepository.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemRepository.java index 7d7f477..03c7f9c 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemRepository.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemRepository.java @@ -3,6 +3,7 @@ package com.radio.codec2talkie.storage.log; import android.app.Application; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; import com.radio.codec2talkie.storage.AppDatabase; import com.radio.codec2talkie.storage.log.group.LogItemGroup; @@ -30,6 +31,10 @@ public class LogItemRepository { public LiveData> getLastPositions() { return _lastPositions; } + public LiveData> getStationPositions(String srcCallsign) { + return _logItemDao.getStationPositions(srcCallsign); + } + public LiveData> getLogItems(String groupName) { return _logItemDao.getLogItems(groupName); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemViewModel.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemViewModel.java index 209e46c..cd84616 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemViewModel.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemViewModel.java @@ -34,6 +34,8 @@ public class LogItemViewModel extends AndroidViewModel { public LiveData> getLastPositions() { return _lastPositions; } + public LiveData> getLastPositions(String callsign) { return _logItemRepository.getStationPositions(callsign); } + public void deleteAllLogItems() { _logItemRepository.deleteAllLogItems(); } public void deleteLogItems(String groupName) {