Skip to content

Commit 74f782f

Browse files
committed
Add map option to show moving stations only
1 parent eba020c commit 74f782f

File tree

8 files changed

+62
-6
lines changed

8 files changed

+62
-6
lines changed

codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapActivity.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,22 @@ public boolean onOptionsItemSelected(MenuItem item) {
133133
boolean showCircles = false;
134134
if (item.isChecked()) {
135135
item.setChecked(false);
136-
_mapView.setMapOrientation(0);
137136
} else {
138137
item.setChecked(true);
139138
showCircles = true;
140139
}
141140
_mapStations.showRangeCircles(showCircles);
142141
return true;
142+
} else if (itemId == R.id.map_menu_show_moving) {
143+
boolean showMoving = false;
144+
if (item.isChecked()) {
145+
item.setChecked(false);
146+
} else {
147+
item.setChecked(true);
148+
showMoving = true;
149+
}
150+
_mapStations.showMovingStations(showMoving);
151+
return true;
143152
}
144153
return super.onOptionsItemSelected(item);
145154
}

codec2talkie/src/main/java/com/radio/codec2talkie/maps/MapStations.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.util.Log;
1313

1414
import androidx.lifecycle.LifecycleOwner;
15+
import androidx.lifecycle.LiveData;
1516
import androidx.lifecycle.ViewModelProvider;
1617
import androidx.lifecycle.ViewModelStoreOwner;
1718

@@ -32,6 +33,7 @@
3233

3334
import java.util.ArrayList;
3435
import java.util.HashMap;
36+
import java.util.List;
3537
import java.util.Locale;
3638

3739
public class MapStations {
@@ -47,10 +49,14 @@ public class MapStations {
4749

4850
private final MarkerInfoWindow _infoWindow;
4951

52+
private LiveData<List<StationItem>> _stationItemLiveData;
53+
private final StationItemViewModel _stationItemViewModel;
54+
5055
private final HashMap<String, Marker> _objectOverlayItems = new HashMap<>();
5156
private final HashMap<String, Polygon> _objectOverlayRangeCircles = new HashMap<>();
5257

5358
private boolean _showCircles = false;
59+
private boolean _showMoving = false;
5460

5561
private final MapTrack _activeTrack;
5662

@@ -64,9 +70,17 @@ public MapStations(Context context, MapView mapView, ViewModelStoreOwner owner)
6470
_infoWindow = new MarkerInfoWindow(R.layout.bonuspack_bubble, _mapView);
6571
_activeTrack = new MapTrack(_context, _mapView, _owner);
6672

67-
StationItemViewModel _stationItemViewModel = new ViewModelProvider(_owner).get(StationItemViewModel.class);
73+
_stationItemViewModel = new ViewModelProvider(_owner).get(StationItemViewModel.class);
74+
loadStations(_showMoving);
75+
}
76+
77+
private void loadStations(boolean movingOnly) {
78+
if (_stationItemLiveData != null)
79+
_stationItemLiveData.removeObservers((LifecycleOwner) _owner);
80+
removePositionMarkers();
81+
_stationItemLiveData = _stationItemViewModel.getAllStationItems(movingOnly);
6882
// FIXME, room livedata sends all list if one item changed event with distinctUntilChanged
69-
_stationItemViewModel.getAllStationItems().observe((LifecycleOwner) _owner, allStations -> {
83+
_stationItemLiveData.observe((LifecycleOwner) _owner, allStations -> {
7084
Log.i(TAG, "add stations " + allStations.size());
7185
for (StationItem station : allStations) {
7286
//Log.i(TAG, "new position " + station.getLatitude() + " " + station.getLongitude());
@@ -79,6 +93,22 @@ public MapStations(Context context, MapView mapView, ViewModelStoreOwner owner)
7993
});
8094
}
8195

96+
private void removePositionMarkers() {
97+
for (Marker marker : _objectOverlayItems.values()) {
98+
marker.remove(_mapView);
99+
}
100+
_objectOverlayItems.clear();
101+
for (Polygon circle : _objectOverlayRangeCircles.values()) {
102+
_mapView.getOverlays().remove(circle);
103+
}
104+
_objectOverlayRangeCircles.clear();
105+
}
106+
107+
public void showMovingStations(boolean isMoving) {
108+
_showMoving = isMoving;
109+
loadStations(_showMoving);
110+
}
111+
82112
public void showRangeCircles(boolean isVisible) {
83113
_showCircles = isVisible;
84114
for (Polygon polygon : _objectOverlayRangeCircles.values()) {

codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected void onCreate(Bundle savedInstanceState) {
8585
stationsRecyclerView.setLayoutManager(linearLayoutManagerStations);
8686
stationsRecyclerView.addItemDecoration(new DividerItemDecoration(stationsRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
8787

88-
_stationItemViewModel.getAllStationItems().observe(this, stationsAdapter::submitList);
88+
_stationItemViewModel.getAllStationItems(false).observe(this, stationsAdapter::submitList);
8989

9090
// launch with filter if station name is provided
9191
if (_stationName == null) {

codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemDao.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public void upsertStationItem(StationItem stationItem) {
4343
@Query("SELECT * FROM StationItem ORDER BY srcCallsign ASC")
4444
public abstract LiveData<List<StationItem>> getAllStationItems();
4545

46+
@Query("SELECT *, (SELECT count(*) FROM PositionItem pos WHERE st.srcCallsign = pos.srcCallsign) AS positionCount " +
47+
"FROM StationItem st " +
48+
"WHERE positionCount > :minCount")
49+
public abstract LiveData<List<StationItem>> getMovingStationItems(int minCount);
50+
4651
@Query("DELETE FROM StationItem WHERE srcCallsign = :srcCallsign")
4752
public abstract void deleteStationItemsFromCallsign(String srcCallsign);
4853

codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemRepository.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,22 @@
1515
public class StationItemRepository {
1616
private static final String TAG = StationItemRepository.class.getSimpleName();
1717

18+
private static final int MIN_POSITION_COUNT = 2;
19+
1820
private final StationItemDao _stationItemDao;
1921
private final LiveData<List<StationItem>> _stationItems;
22+
private final LiveData<List<StationItem>> _stationItemsMoving;
2023

2124
public StationItemRepository(Application application) {
2225
AppDatabase appDatabase = AppDatabase.getDatabase(application);
2326
_stationItemDao = appDatabase.stationitemDao();
2427
_stationItems = Transformations.distinctUntilChanged(_stationItemDao.getAllStationItems());
28+
_stationItemsMoving = Transformations.distinctUntilChanged(_stationItemDao.getMovingStationItems(MIN_POSITION_COUNT));
2529
}
2630

27-
public LiveData<List<StationItem>> getAllStationItems() { return _stationItems; }
31+
public LiveData<List<StationItem>> getAllStationItems(boolean movingOnly) {
32+
return movingOnly ? _stationItemsMoving : _stationItems;
33+
}
2834

2935
public void upsertStationItem(StationItem stationItem) {
3036
AppDatabase.getDatabaseExecutor().execute(() -> {

codec2talkie/src/main/java/com/radio/codec2talkie/storage/station/StationItemViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public StationItemViewModel(@NonNull Application application) {
1919
_stationItemRepository = new StationItemRepository(application);
2020
}
2121

22-
public LiveData<List<StationItem>> getAllStationItems() { return _stationItemRepository.getAllStationItems(); }
22+
public LiveData<List<StationItem>> getAllStationItems(boolean movingOnly) { return _stationItemRepository.getAllStationItems(movingOnly); }
2323

2424
public void deleteStationItems(String srcCallsign, int hours) {
2525
_stationItemRepository.deleteStationItems(srcCallsign, hours);

codec2talkie/src/main/res/menu/map_menu.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
android:title="@string/map_menu_show_range"
1111
android:checkable="true"
1212
android:checked="false"/>
13+
<item
14+
android:id="@+id/map_menu_show_moving"
15+
android:title="@string/map_menu_show_moving"
16+
android:checkable="true"
17+
android:checked="false"/>
1318
<item
1419
android:id="@+id/map_menu_clear_cache"
1520
android:title="@string/map_menu_clear_cache_title" />

codec2talkie/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,4 +365,5 @@
365365
<string name="log_item_activity_delete_hours_title">This will remove everything older than %d hours. Are you sure?</string>
366366
<string name="map_menu_rotate_map">Rotate map with compass</string>
367367
<string name="map_menu_show_range">Show range circles</string>
368+
<string name="map_menu_show_moving">Show moving stations</string>
368369
</resources>

0 commit comments

Comments
 (0)