kopia lustrzana https://github.com/ge0rg/aprsdroid
implement tap on multiple overlapping stations
rodzic
40353fa407
commit
e3560ba623
|
|
@ -23,6 +23,7 @@
|
||||||
<!-- Maps activity -->
|
<!-- Maps activity -->
|
||||||
<string name="sta_lastreport">%s Last Report</string>
|
<string name="sta_lastreport">%s Last Report</string>
|
||||||
<string name="map_track_call">Tracking %s...</string>
|
<string name="map_track_call">Tracking %s...</string>
|
||||||
|
<string name="map_select">Select station</string>
|
||||||
|
|
||||||
<string name="map_loading">Loading...</string>
|
<string name="map_loading">Loading...</string>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
package org.aprsdroid.app
|
package org.aprsdroid.app
|
||||||
|
|
||||||
import _root_.android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
import _root_.android.app.AlertDialog
|
||||||
|
import _root_.android.content.{BroadcastReceiver, Context, DialogInterface, Intent, IntentFilter}
|
||||||
import _root_.android.database.Cursor
|
import _root_.android.database.Cursor
|
||||||
import _root_.android.graphics.drawable.{Drawable, BitmapDrawable}
|
import _root_.android.graphics.drawable.{Drawable, BitmapDrawable}
|
||||||
import _root_.android.graphics.{Canvas, Paint, Path, Point, Rect, Typeface}
|
import _root_.android.graphics.{Canvas, Paint, Path, Point, Rect, Typeface}
|
||||||
import _root_.android.os.{Bundle, Handler}
|
import _root_.android.os.{Bundle, Handler}
|
||||||
import _root_.android.util.Log
|
import _root_.android.util.Log
|
||||||
import _root_.android.view.{Menu, MenuItem, View}
|
import _root_.android.view.{Menu, MenuItem, View}
|
||||||
|
import _root_.android.widget.SimpleCursorAdapter
|
||||||
|
import _root_.android.widget.Spinner
|
||||||
import _root_.android.widget.TextView
|
import _root_.android.widget.TextView
|
||||||
import _root_.com.google.android.maps._
|
import _root_.com.google.android.maps._
|
||||||
import _root_.scala.collection.mutable.ArrayBuffer
|
import _root_.scala.collection.mutable.ArrayBuffer
|
||||||
|
|
@ -122,6 +125,14 @@ class Station(val movelog : ArrayBuffer[GeoPoint], val pt : GeoPoint,
|
||||||
val call : String, val origin : String, val symbol : String)
|
val call : String, val origin : String, val symbol : String)
|
||||||
extends OverlayItem(pt, call, origin) {
|
extends OverlayItem(pt, call, origin) {
|
||||||
|
|
||||||
|
def inArea(bl : GeoPoint, tr : GeoPoint) = {
|
||||||
|
val lat_ok = (bl.latitudeE6 <= pt.latitudeE6 && pt.latitudeE6 <= tr.latitudeE6)
|
||||||
|
val lon_ok = if (bl.longitudeE6 <= tr.longitudeE6)
|
||||||
|
(bl.longitudeE6 <= pt.longitudeE6 && pt.longitudeE6 <= tr.longitudeE6)
|
||||||
|
else
|
||||||
|
(bl.longitudeE6 <= pt.longitudeE6 || pt.longitudeE6 <= tr.longitudeE6)
|
||||||
|
lat_ok && lon_ok
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StationOverlay(icons : Drawable, context : MapAct, db : StorageDatabase) extends ItemizedOverlay[Station](icons) {
|
class StationOverlay(icons : Drawable, context : MapAct, db : StorageDatabase) extends ItemizedOverlay[Station](icons) {
|
||||||
|
|
@ -246,6 +257,42 @@ class StationOverlay(icons : Drawable, context : MapAct, db : StorageDatabase) e
|
||||||
stations.add(sta)
|
stations.add(sta)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def onTap(gp : GeoPoint, mv : MapView) : Boolean = {
|
||||||
|
//Log.d(TAG, "user tapped " + gp)
|
||||||
|
//Log.d(TAG, "icon bounds: " + icons.getBounds())
|
||||||
|
// convert geopoint to pixels
|
||||||
|
val proj = mv.getProjection()
|
||||||
|
val p = proj.toPixels(gp, null)
|
||||||
|
// ... to pixel area ... to geo area
|
||||||
|
//Log.d(TAG, "coords: " + p)
|
||||||
|
val botleft = proj.fromPixels(p.x - 16, p.y + 16)
|
||||||
|
val topright = proj.fromPixels(p.x + 16, p.y - 16)
|
||||||
|
Log.d(TAG, "from " + botleft + " to " + topright)
|
||||||
|
// fetch stations in the tap
|
||||||
|
val list = stations.filter(_.inArea(botleft, topright)).map(_.call)
|
||||||
|
Log.d(TAG, "found " + list.size() + " stations")
|
||||||
|
val result = if (list.size() == 0)
|
||||||
|
false // nothing found, do not revert to superclass
|
||||||
|
else if (list.size() == 1) {
|
||||||
|
// found one entry
|
||||||
|
val call = list.get(0)
|
||||||
|
Log.d(TAG, "user clicked on " + call)
|
||||||
|
context.openDetails(call)
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
// TODO: replace simple adapter with StationListAdapter for better UI
|
||||||
|
new AlertDialog.Builder(context).setTitle(R.string.map_select)
|
||||||
|
.setItems(list.toArray.asInstanceOf[Array[CharSequence]], new DialogInterface.OnClickListener() {
|
||||||
|
override def onClick(di : DialogInterface, item : Int) {
|
||||||
|
context.openDetails(list.get(item))
|
||||||
|
}})
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.show()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
override def onTap(index : Int) : Boolean = {
|
override def onTap(index : Int) : Boolean = {
|
||||||
val s = stations(index)
|
val s = stations(index)
|
||||||
val target = if (s.origin != null && s.origin != "") s.origin
|
val target = if (s.origin != null && s.origin != "") s.origin
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,10 @@ class StorageDatabase(context : Context) extends
|
||||||
|
|
||||||
def getRectStations(lat1 : Int, lon1 : Int, lat2 : Int, lon2 : Int, limit : String) : Cursor = {
|
def getRectStations(lat1 : Int, lon1 : Int, lat2 : Int, lon2 : Int, limit : String) : Cursor = {
|
||||||
Log.d(TAG, "StorageDatabase.getRectStations: %d,%d - %d,%d".format(lat1, lon1, lat2, lon2))
|
Log.d(TAG, "StorageDatabase.getRectStations: %d,%d - %d,%d".format(lat1, lon1, lat2, lon2))
|
||||||
getStations("LAT >= ? AND LAT <= ? AND LON >= ? AND LON <= ?",
|
// check for areas overflowing between +180 and -180 degrees
|
||||||
|
val QUERY = if (lon1 <= lon2) "LAT >= ? AND LAT <= ? AND LON >= ? AND LON <= ?"
|
||||||
|
else "LAT >= ? AND LAT <= ? AND (LON <= ? OR LON >= ?)"
|
||||||
|
getStations(QUERY,
|
||||||
Array(lat1, lat2, lon1, lon2).map(_.toString), limit)
|
Array(lat1, lat2, lon1, lon2).map(_.toString), limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue