diff options
| author | Keith Packard <keithp@keithp.com> | 2015-07-11 19:53:06 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2015-07-11 19:53:06 -0700 | 
| commit | 51bf46248ca7ee3c817e62274b7366258c9f87cf (patch) | |
| tree | e6c8777488a780ac98a9e60730bb2d543752d579 | |
| parent | b64ab2a8a25b0c22443bc77829c7f35b4f1c2455 (diff) | |
altosdroid: Pop up menu of nearby trackers on map click
This lets the user select one of potentially many overlapping
trackers, and also makes it clear when the current tracker is being
changed.
Signed-off-by: Keith Packard <keithp@keithp.com>
3 files changed, 64 insertions, 20 deletions
| diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 3a5026ee..4ac24053 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -855,6 +855,22 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener {  		update_state(null);  	} +	void touch_trackers(Integer[] serials) { +		AlertDialog.Builder builder_tracker = new AlertDialog.Builder(this); +		builder_tracker.setTitle("Select Tracker"); +		final String[] trackers = new String[serials.length]; +		for (int i = 0; i < serials.length; i++) +			trackers[i] = String.format("%d", serials[i]); +		builder_tracker.setItems(trackers, +					 new DialogInterface.OnClickListener() { +						 public void onClick(DialogInterface dialog, int item) { +							 select_tracker(Integer.parseInt(trackers[item])); +						 } +					 }); +		AlertDialog alert_tracker = builder_tracker.create(); +		alert_tracker.show(); +	} +  	void delete_track(int serial) {  		try {  			mService.send(Message.obtain(null, TelemetryService.MSG_DELETE_SERIAL, (Integer) serial)); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java index 5240d61c..0bf6ab20 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java @@ -253,6 +253,8 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  	public void select_object(AltosLatLon latlon) {  		if (map.transform == null)  			return; +		ArrayList<Integer>	near = new ArrayList<Integer>(); +  		for (Rocket rocket : sorted_rockets()) {  			if (rocket.position == null) {  				debug("rocket %d has no position\n", rocket.serial); @@ -262,10 +264,11 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  			debug("check select %d distance %g width %d\n", rocket.serial, distance, rocket_bitmap.getWidth());  			if (distance < rocket_bitmap.getWidth() * 2.0) {  				debug("selecting %d\n", rocket.serial); -				altos_droid.select_tracker(rocket.serial); -				break; +				near.add(rocket.serial);  			}  		} +		if (near.size() != 0) +			altos_droid.touch_trackers(near.toArray(new Integer[0]));  	}  	class Line { @@ -359,7 +362,6 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  	@Override  	protected void onDraw(Canvas view_canvas) { -		debug("onDraw");  		if (map == null) {  			debug("MapView draw without map\n");  			return; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java index 7691a13e..3b56fb54 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java @@ -21,15 +21,8 @@ import java.util.*;  import org.altusmetrum.altoslib_7.*; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.SupportMapFragment; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.gms.maps.*; +import com.google.android.gms.maps.model.*;  import android.app.Activity;  import android.graphics.Color; @@ -48,6 +41,7 @@ class RocketOnline implements Comparable {  	Marker		marker;  	int		serial;  	long		last_packet; +	int		size;  	void set_position(AltosLatLon position, long last_packet) {  		marker.setPosition(new LatLng(position.lat, position.lon)); @@ -75,6 +69,8 @@ class RocketOnline implements Comparable {  		float x = bitmap.getWidth() / 2.0f - width / 2.0f;  		float y = bitmap.getHeight() / 2.0f - height / 2.0f; +		size = bitmap.getWidth(); +  		canvas.drawText(text, 0, text.length(), x, y, paint);  		return bitmap;  	} @@ -106,7 +102,7 @@ class RocketOnline implements Comparable {  	}  } -public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarkerClickListener { +public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarkerClickListener, GoogleMap.OnMapClickListener {  	public SupportMapFragment mMapFragment;  	private GoogleMap mMap;  	private boolean mapLoaded = false; @@ -152,14 +148,43 @@ public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarke  //		getChildFragmentManager().beginTransaction().add(R.id.map, mMapFragment).commit();  //	} -	public boolean onMarkerClick(Marker marker) { -		for (RocketOnline rocket : rockets.values()) { -			if (rocket.marker.equals(marker)) { -				altos_droid.select_tracker(rocket.serial); -				return true; -			} +	private double pixel_distance(LatLng a, LatLng b) { +		Projection projection = mMap.getProjection(); + +		Point	a_pt = projection.toScreenLocation(a); +		Point	b_pt = projection.toScreenLocation(b); + +		return Math.hypot((double) (a_pt.x - b_pt.x), (double) (a_pt.y - b_pt.y)); +	} + +	private RocketOnline[] sorted_rockets() { +		RocketOnline[]	rocket_array = rockets.values().toArray(new RocketOnline[0]); + +		Arrays.sort(rocket_array); +		return rocket_array; +	} + +	public void onMapClick(LatLng lat_lng) { +		ArrayList<Integer>	near = new ArrayList<Integer>(); + +		for (RocketOnline rocket : sorted_rockets()) { +			LatLng	pos = rocket.marker.getPosition(); + +			if (pos == null) +				continue; + +			double distance = pixel_distance(lat_lng, pos); +			if (distance < rocket.size * 2) +				near.add(rocket.serial);  		} -		return false; + +		if (near.size() != 0) +			altos_droid.touch_trackers(near.toArray(new Integer[0])); +	} + +	public boolean onMarkerClick(Marker marker) { +		onMapClick(marker.getPosition()); +		return true;  	}  	public void setupMap(int map_type) { @@ -170,6 +195,7 @@ public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarke  			mMap.getUiSettings().setTiltGesturesEnabled(false);  			mMap.getUiSettings().setZoomControlsEnabled(false);  			mMap.setOnMarkerClickListener(this); +			mMap.setOnMapClickListener(this);  			mPadMarker = mMap.addMarker(  					new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.pad)) | 
