Add map option to show moving stations only

master 1.46
sh123 2022-09-07 21:17:02 +03:00
rodzic eba020cbfe
commit 74f782feb5
8 zmienionych plików z 62 dodań i 6 usunięć

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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<List<StationItem>> _stationItemLiveData;
private final StationItemViewModel _stationItemViewModel;
private final HashMap<String, Marker> _objectOverlayItems = new HashMap<>();
private final HashMap<String, Polygon> _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()) {

Wyświetl plik

@ -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) {

Wyświetl plik

@ -43,6 +43,11 @@ public abstract class StationItemDao {
@Query("SELECT * FROM StationItem ORDER BY srcCallsign ASC")
public abstract LiveData<List<StationItem>> getAllStationItems();
@Query("SELECT *, (SELECT count(*) FROM PositionItem pos WHERE st.srcCallsign = pos.srcCallsign) AS positionCount " +
"FROM StationItem st " +
"WHERE positionCount > :minCount")
public abstract LiveData<List<StationItem>> getMovingStationItems(int minCount);
@Query("DELETE FROM StationItem WHERE srcCallsign = :srcCallsign")
public abstract void deleteStationItemsFromCallsign(String srcCallsign);

Wyświetl plik

@ -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<List<StationItem>> _stationItems;
private final LiveData<List<StationItem>> _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<List<StationItem>> getAllStationItems() { return _stationItems; }
public LiveData<List<StationItem>> getAllStationItems(boolean movingOnly) {
return movingOnly ? _stationItemsMoving : _stationItems;
}
public void upsertStationItem(StationItem stationItem) {
AppDatabase.getDatabaseExecutor().execute(() -> {

Wyświetl plik

@ -19,7 +19,7 @@ public class StationItemViewModel extends AndroidViewModel {
_stationItemRepository = new StationItemRepository(application);
}
public LiveData<List<StationItem>> getAllStationItems() { return _stationItemRepository.getAllStationItems(); }
public LiveData<List<StationItem>> getAllStationItems(boolean movingOnly) { return _stationItemRepository.getAllStationItems(movingOnly); }
public void deleteStationItems(String srcCallsign, int hours) {
_stationItemRepository.deleteStationItems(srcCallsign, hours);

Wyświetl plik

@ -10,6 +10,11 @@
android:title="@string/map_menu_show_range"
android:checkable="true"
android:checked="false"/>
<item
android:id="@+id/map_menu_show_moving"
android:title="@string/map_menu_show_moving"
android:checkable="true"
android:checked="false"/>
<item
android:id="@+id/map_menu_clear_cache"
android:title="@string/map_menu_clear_cache_title" />

Wyświetl plik

@ -365,4 +365,5 @@
<string name="log_item_activity_delete_hours_title">This will remove everything older than %d hours. Are you sure?</string>
<string name="map_menu_rotate_map">Rotate map with compass</string>
<string name="map_menu_show_range">Show range circles</string>
<string name="map_menu_show_moving">Show moving stations</string>
</resources>