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 04de856..69b8765 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java @@ -133,13 +133,22 @@ public class MapActivity extends AppCompatActivity { boolean showCircles = false; if (item.isChecked()) { item.setChecked(false); - _mapView.setMapOrientation(0); } else { item.setChecked(true); showCircles = true; } _mapStations.showRangeCircles(showCircles); return true; + } else if (itemId == R.id.map_menu_show_moving) { + boolean showMoving = false; + if (item.isChecked()) { + item.setChecked(false); + } else { + item.setChecked(true); + showMoving = true; + } + _mapStations.showMovingStations(showMoving); + return true; } return super.onOptionsItemSelected(item); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapStations.java b/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapStations.java index 2bac7a3..1f2f91d 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapStations.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapStations.java @@ -12,6 +12,7 @@ import android.util.DisplayMetrics; import android.util.Log; import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; @@ -32,6 +33,7 @@ import org.osmdroid.views.overlay.infowindow.MarkerInfoWindow; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; public class MapStations { @@ -47,10 +49,14 @@ public class MapStations { private final MarkerInfoWindow _infoWindow; + private LiveData> _stationItemLiveData; + private final StationItemViewModel _stationItemViewModel; + private final HashMap _objectOverlayItems = new HashMap<>(); private final HashMap _objectOverlayRangeCircles = new HashMap<>(); private boolean _showCircles = false; + private boolean _showMoving = false; private final MapTrack _activeTrack; @@ -64,9 +70,17 @@ public class MapStations { _infoWindow = new MarkerInfoWindow(R.layout.bonuspack_bubble, _mapView); _activeTrack = new MapTrack(_context, _mapView, _owner); - StationItemViewModel _stationItemViewModel = new ViewModelProvider(_owner).get(StationItemViewModel.class); + _stationItemViewModel = new ViewModelProvider(_owner).get(StationItemViewModel.class); + loadStations(_showMoving); + } + + private void loadStations(boolean movingOnly) { + if (_stationItemLiveData != null) + _stationItemLiveData.removeObservers((LifecycleOwner) _owner); + removePositionMarkers(); + _stationItemLiveData = _stationItemViewModel.getAllStationItems(movingOnly); // FIXME, room livedata sends all list if one item changed event with distinctUntilChanged - _stationItemViewModel.getAllStationItems().observe((LifecycleOwner) _owner, allStations -> { + _stationItemLiveData.observe((LifecycleOwner) _owner, allStations -> { Log.i(TAG, "add stations " + allStations.size()); for (StationItem station : allStations) { //Log.i(TAG, "new position " + station.getLatitude() + " " + station.getLongitude()); @@ -79,6 +93,22 @@ public class MapStations { }); } + private void removePositionMarkers() { + for (Marker marker : _objectOverlayItems.values()) { + marker.remove(_mapView); + } + _objectOverlayItems.clear(); + for (Polygon circle : _objectOverlayRangeCircles.values()) { + _mapView.getOverlays().remove(circle); + } + _objectOverlayRangeCircles.clear(); + } + + public void showMovingStations(boolean isMoving) { + _showMoving = isMoving; + loadStations(_showMoving); + } + public void showRangeCircles(boolean isVisible) { _showCircles = isVisible; for (Polygon polygon : _objectOverlayRangeCircles.values()) { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java index 9120892..c9fb810 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java @@ -85,7 +85,7 @@ public class LogItemActivity extends AppCompatActivity { stationsRecyclerView.setLayoutManager(linearLayoutManagerStations); stationsRecyclerView.addItemDecoration(new DividerItemDecoration(stationsRecyclerView.getContext(), DividerItemDecoration.VERTICAL)); - _stationItemViewModel.getAllStationItems().observe(this, stationsAdapter::submitList); + _stationItemViewModel.getAllStationItems(false).observe(this, stationsAdapter::submitList); // launch with filter if station name is provided if (_stationName == null) { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemDao.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemDao.java index 2ef03fd..61744d6 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemDao.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemDao.java @@ -43,6 +43,11 @@ public abstract class StationItemDao { @Query("SELECT * FROM StationItem ORDER BY srcCallsign ASC") public abstract LiveData> getAllStationItems(); + @Query("SELECT *, (SELECT count(*) FROM PositionItem pos WHERE st.srcCallsign = pos.srcCallsign) AS positionCount " + + "FROM StationItem st " + + "WHERE positionCount > :minCount") + public abstract LiveData> getMovingStationItems(int minCount); + @Query("DELETE FROM StationItem WHERE srcCallsign = :srcCallsign") public abstract void deleteStationItemsFromCallsign(String srcCallsign); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemRepository.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemRepository.java index 9404355..7424f9c 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemRepository.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemRepository.java @@ -15,16 +15,22 @@ import java.util.List; public class StationItemRepository { private static final String TAG = StationItemRepository.class.getSimpleName(); + private static final int MIN_POSITION_COUNT = 2; + private final StationItemDao _stationItemDao; private final LiveData> _stationItems; + private final LiveData> _stationItemsMoving; public StationItemRepository(Application application) { AppDatabase appDatabase = AppDatabase.getDatabase(application); _stationItemDao = appDatabase.stationitemDao(); _stationItems = Transformations.distinctUntilChanged(_stationItemDao.getAllStationItems()); + _stationItemsMoving = Transformations.distinctUntilChanged(_stationItemDao.getMovingStationItems(MIN_POSITION_COUNT)); } - public LiveData> getAllStationItems() { return _stationItems; } + public LiveData> getAllStationItems(boolean movingOnly) { + return movingOnly ? _stationItemsMoving : _stationItems; + } public void upsertStationItem(StationItem stationItem) { AppDatabase.getDatabaseExecutor().execute(() -> { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemViewModel.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemViewModel.java index d970bb0..c33449e 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemViewModel.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemViewModel.java @@ -19,7 +19,7 @@ public class StationItemViewModel extends AndroidViewModel { _stationItemRepository = new StationItemRepository(application); } - public LiveData> getAllStationItems() { return _stationItemRepository.getAllStationItems(); } + public LiveData> getAllStationItems(boolean movingOnly) { return _stationItemRepository.getAllStationItems(movingOnly); } public void deleteStationItems(String srcCallsign, int hours) { _stationItemRepository.deleteStationItems(srcCallsign, hours); diff --git a/codec2talkie/src/main/res/menu/map_menu.xml b/codec2talkie/src/main/res/menu/map_menu.xml index 3abdcfb..ac2037a 100644 --- a/codec2talkie/src/main/res/menu/map_menu.xml +++ b/codec2talkie/src/main/res/menu/map_menu.xml @@ -10,6 +10,11 @@ android:title="@string/map_menu_show_range" android:checkable="true" android:checked="false"/> + diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index 44d91be..a93ecd5 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -365,4 +365,5 @@ This will remove everything older than %d hours. Are you sure? Rotate map with compass Show range circles + Show moving stations \ No newline at end of file