import java.util.*;
-import org.altusmetrum.altoslib_13.*;
+import org.altusmetrum.altoslib_14.*;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;
}
}
-public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarkerClickListener, GoogleMap.OnMapClickListener, AltosMapTypeListener {
- public SupportMapFragment mMapFragment;
+public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarkerClickListener, GoogleMap.OnMapClickListener, OnMapReadyCallback, AltosMapTypeListener {
+ public AltosOnlineMapFragment mMapFragment;
private GoogleMap mMap;
private boolean mapLoaded = false;
Context context;
private boolean pad_set;
private Polyline mPolyline;
- private View map_view;
-
private double mapAccuracy = -1;
private AltosLatLon my_position = null;
private AltosDroid altos_droid;
+ public static class AltosOnlineMapFragment extends SupportMapFragment {
+ AltosMapOnline c;
+ View map_view;
+
+ public AltosOnlineMapFragment(AltosMapOnline c) {
+ this.c = c;
+ }
+
+ public AltosOnlineMapFragment() {
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ if (c != null)
+ getMapAsync(c);
+ }
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ map_view = super.onCreateView(inflater, container, savedInstanceState);
+ return map_view;
+ }
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ map_view = null;
+ }
+ public void set_visible(boolean visible) {
+ if (map_view == null)
+ return;
+ if (visible)
+ map_view.setVisibility(View.VISIBLE);
+ else
+ map_view.setVisibility(View.GONE);
+ }
+ }
+
public void onCreateView(AltosDroid altos_droid) {
this.altos_droid = altos_droid;
- final int map_type = AltosPreferences.map_type();
AltosPreferences.register_map_type_listener(this);
- mMapFragment = new SupportMapFragment() {
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- setupMap(map_type);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- map_view = super.onCreateView(inflater, container, savedInstanceState);
- return map_view;
- }
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- map_view = null;
- }
- };
+ mMapFragment = new AltosOnlineMapFragment(this);
}
public void onDestroyView() {
}
private RocketOnline[] sorted_rockets() {
- RocketOnline[] rocket_array = rockets.values().toArray(new RocketOnline[0]);
+ synchronized(rockets) {
+ RocketOnline[] rocket_array = rockets.values().toArray(new RocketOnline[0]);
- Arrays.sort(rocket_array);
- return rocket_array;
+ Arrays.sort(rocket_array);
+ return rocket_array;
+ }
}
public void onMapClick(LatLng lat_lng) {
return true;
}
- public void setupMap(int map_type) {
- mMap = mMapFragment.getMap();
+ void
+ position_permission() {
+ if (mMap != null)
+ mMap.setMyLocationEnabled(true);
+ }
+
+ @Override
+ public void onMapReady(GoogleMap googleMap) {
+ final int map_type = AltosPreferences.map_type();
+ mMap = googleMap;
if (mMap != null) {
map_type_changed(map_type);
- mMap.setMyLocationEnabled(true);
+ if (altos_droid.have_location_permission)
+ mMap.setMyLocationEnabled(true);
+ else
+ altos_droid.tell_map_permission(this);
mMap.getUiSettings().setTiltGesturesEnabled(false);
mMap.getUiSettings().setZoomControlsEnabled(false);
mMap.setOnMarkerClickListener(this);
if (mMap == null)
return;
- if (rockets.containsKey(serial)) {
- rocket = rockets.get(serial);
- rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon), state.received_time);
- } else {
- rocket = new RocketOnline(context,
- serial,
- mMap, state.gps.lat, state.gps.lon,
- state.received_time);
- rockets.put(serial, rocket);
+ synchronized(rockets) {
+ if (rockets.containsKey(serial)) {
+ rocket = rockets.get(serial);
+ rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon), state.received_time);
+ } else {
+ rocket = new RocketOnline(context,
+ serial,
+ mMap, state.gps.lat, state.gps.lon,
+ state.received_time);
+ rockets.put(serial, rocket);
+ }
}
}
private void remove_rocket(int serial) {
- RocketOnline rocket = rockets.get(serial);
- rocket.remove();
- rockets.remove(serial);
+ synchronized(rockets) {
+ RocketOnline rocket = rockets.get(serial);
+ rocket.remove();
+ rockets.remove(serial);
+ }
}
public void set_visible(boolean visible) {
- if (map_view == null)
- return;
- if (visible)
- map_view.setVisibility(View.VISIBLE);
- else
- map_view.setVisibility(View.GONE);
+ if (mMapFragment != null)
+ mMapFragment.set_visible(visible);
}
public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) {
if (telem_state != null) {
- for (int serial : rockets.keySet()) {
- if (!telem_state.states.containsKey(serial))
- remove_rocket(serial);
- }
+ synchronized(rockets) {
+ for (int serial : rockets.keySet()) {
+ if (!telem_state.containsKey(serial))
+ remove_rocket(serial);
+ }
- for (int serial : telem_state.states.keySet()) {
- set_rocket(serial, telem_state.states.get(serial));
+ for (int serial : telem_state.keySet()) {
+ set_rocket(serial, telem_state.get(serial));
+ }
}
}