From a34c72d5cb98ffbea7a6c70ddf981ac722c9444e Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Fri, 21 Jan 2011 22:07:17 +0100 Subject: [PATCH 1/8] move backends to own subdir --- src/{ => backend}/AfskUploader.scala | 0 src/{ => backend}/AprsIsUploader.scala | 0 src/{ => backend}/HttpPostUploader.scala | 0 src/{ => backend}/TcpUploader.scala | 0 src/{ => backend}/UdpUploader.scala | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => backend}/AfskUploader.scala (100%) rename src/{ => backend}/AprsIsUploader.scala (100%) rename src/{ => backend}/HttpPostUploader.scala (100%) rename src/{ => backend}/TcpUploader.scala (100%) rename src/{ => backend}/UdpUploader.scala (100%) diff --git a/src/AfskUploader.scala b/src/backend/AfskUploader.scala similarity index 100% rename from src/AfskUploader.scala rename to src/backend/AfskUploader.scala diff --git a/src/AprsIsUploader.scala b/src/backend/AprsIsUploader.scala similarity index 100% rename from src/AprsIsUploader.scala rename to src/backend/AprsIsUploader.scala diff --git a/src/HttpPostUploader.scala b/src/backend/HttpPostUploader.scala similarity index 100% rename from src/HttpPostUploader.scala rename to src/backend/HttpPostUploader.scala diff --git a/src/TcpUploader.scala b/src/backend/TcpUploader.scala similarity index 100% rename from src/TcpUploader.scala rename to src/backend/TcpUploader.scala diff --git a/src/UdpUploader.scala b/src/backend/UdpUploader.scala similarity index 100% rename from src/UdpUploader.scala rename to src/backend/UdpUploader.scala From 5b61d0fbbfe401cc9816279118a150b291f9750f Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 22 Jan 2011 04:07:11 +0100 Subject: [PATCH 2/8] change backend API --- src/AprsService.scala | 13 +------------ src/backend/AfskUploader.scala | 4 ++-- src/backend/AprsIsUploader.scala | 31 ++++++++++++++++++++++++++++-- src/backend/HttpPostUploader.scala | 3 ++- src/backend/TcpUploader.scala | 7 +++++-- src/backend/UdpUploader.scala | 4 +++- 6 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/AprsService.scala b/src/AprsService.scala index 6816967..2b81079 100644 --- a/src/AprsService.scala +++ b/src/AprsService.scala @@ -99,18 +99,7 @@ class AprsService extends Service with LocationListener { prefs.getString("ssid", null), prefs.getString("passcode", null)) val filterdist = prefs.getString("filterdist", "10").toInt - prefs.getString("conntype", "http") match { - case "udp" => - poster = new UdpUploader(hostname, login) - case "http" => - poster = new HttpPostUploader(hostname, login) - case "tcp" => - poster = new TcpUploader(this, hostname, login, " filter m/%d".format(filterdist)) - case "afsk" => - poster = new AfskUploader(hostname, login) - case _ => - stopSelf() - } + poster = AprsIsUploader.instanciateUploader(this, prefs) poster.start() } diff --git a/src/backend/AfskUploader.scala b/src/backend/AfskUploader.scala index aad48b2..38a828a 100644 --- a/src/backend/AfskUploader.scala +++ b/src/backend/AfskUploader.scala @@ -1,12 +1,12 @@ package de.duenndns.aprsdroid -import _root_.android.location.Location +import _root_.android.content.SharedPreferences import _root_.android.preference.PreferenceManager import _root_.android.util.Log import _root_.java.net.{InetAddress, DatagramSocket, DatagramPacket} import com.nogy.afu.soundmodem.{Message, APRSFrame, Afsk} -class AfskUploader(host : String, login : String) extends AprsIsUploader(host, login) { +class AfskUploader(prefs : SharedPreferences) extends AprsIsUploader(prefs) { val TAG = "AprsAfsk" var FrameLength = 150 //1200Bits = 1sec to open VOX var Digis = "WIDE1-1" diff --git a/src/backend/AprsIsUploader.scala b/src/backend/AprsIsUploader.scala index 641dd17..66adb5d 100644 --- a/src/backend/AprsIsUploader.scala +++ b/src/backend/AprsIsUploader.scala @@ -1,8 +1,35 @@ package de.duenndns.aprsdroid -import _root_.android.location.Location +import _root_.android.content.SharedPreferences + +object AprsIsUploader { + val DEFAULT_CONNTYPE = "tcp" + + def instanciateUploader(service : AprsService, prefs : SharedPreferences) : AprsIsUploader = { + prefs.getString("conntype", DEFAULT_CONNTYPE) match { + case "udp" => + new UdpUploader(prefs) + case "http" => + new HttpPostUploader(prefs) + case "afsk" => + new AfskUploader(prefs) + case _ => + new TcpUploader(service, prefs) + } + } + def instanciatePrefsAct(prefs : SharedPreferences) = { + prefs.getString("conntype", DEFAULT_CONNTYPE) match { + case "afsk" => R.xml.pref_afsk + case "udp" => R.xml.pref_udp + case _ => R.xml.pref_tcp // TCP is default + } + } +} + +abstract class AprsIsUploader(prefs : SharedPreferences) { + val login = AprsPacket.formatLogin(prefs.getString("callsign", null).trim(), + prefs.getString("ssid", null), prefs.getString("passcode", null)) -abstract class AprsIsUploader(host : String, login : String) { def start() def update(packet : String) : String diff --git a/src/backend/HttpPostUploader.scala b/src/backend/HttpPostUploader.scala index 32d8734..adf32c2 100644 --- a/src/backend/HttpPostUploader.scala +++ b/src/backend/HttpPostUploader.scala @@ -8,8 +8,9 @@ import _root_.org.apache.http.entity.StringEntity import _root_.org.apache.http.impl.client.DefaultHttpClient import _root_.org.apache.http.client.methods.HttpPost -class HttpPostUploader(host : String, login : String) extends AprsIsUploader(host, login) { +class HttpPostUploader(prefs : SharedPreferences) extends AprsIsUploader(prefs) { val TAG = "AprsHttpPost" + val host = prefs.getString("http.server", "srvr.aprs-is.net") def start() { } diff --git a/src/backend/TcpUploader.scala b/src/backend/TcpUploader.scala index be4b9ca..11d917f 100644 --- a/src/backend/TcpUploader.scala +++ b/src/backend/TcpUploader.scala @@ -1,5 +1,6 @@ package de.duenndns.aprsdroid +import _root_.android.content.SharedPreferences import _root_.android.app.Service import _root_.android.location.Location import _root_.android.preference.PreferenceManager @@ -7,9 +8,11 @@ import _root_.android.util.Log import _root_.java.io.{BufferedReader, InputStreamReader, OutputStreamWriter, PrintWriter} import _root_.java.net.{InetAddress, Socket} -class TcpUploader(service : AprsService, hostname : String, login : String, filter : String) - extends AprsIsUploader(hostname, login) { +class TcpUploader(service : AprsService, prefs : SharedPreferences) extends AprsIsUploader(prefs) { val TAG = "TcpUploader" + val hostname = prefs.getString("tcp.server", "srvr.aprs-is.net") + val filterdist = prefs.getString("tcp.filterdist", "10").toInt + val filter = " filter m/%d".format(filterdist) var conn : TcpSocketThread = null createConnection() diff --git a/src/backend/UdpUploader.scala b/src/backend/UdpUploader.scala index 0dfb8f4..6b235b0 100644 --- a/src/backend/UdpUploader.scala +++ b/src/backend/UdpUploader.scala @@ -1,13 +1,15 @@ package de.duenndns.aprsdroid +import _root_.android.content.SharedPreferences import _root_.android.location.Location import _root_.android.preference.PreferenceManager import _root_.android.util.Log import _root_.java.net.{InetAddress, DatagramSocket, DatagramPacket} -class UdpUploader(host : String, login : String) extends AprsIsUploader(host, login) { +class UdpUploader(prefs : SharedPreferences) extends AprsIsUploader(prefs) { val TAG = "AprsUdp" lazy val socket = new DatagramSocket() + val host = prefs.getString("udp.server", "srvr.aprs-is.net") def start() { } From 7a96ec102b990157bded194a29756cb6b18f3ca8 Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Wed, 26 Jan 2011 03:26:53 +0100 Subject: [PATCH 3/8] refactor proguard ant task --- build.xml | 16 +--------------- proguard.cfg | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 proguard.cfg diff --git a/build.xml b/build.xml index 2273c8f..d2848de 100644 --- a/build.xml +++ b/build.xml @@ -125,25 +125,11 @@ - + -injars ${out.classes.absolute.dir}:${external.libs.dir}:tools/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties) -outjars ${out.absolute.dir}/classes.min.jar -libraryjars ${toString:android.target.classpath} - -dontwarn scala.** - -dontnote scala.** - -dontobfuscate - -dontpreverify - -repackageclasses '' - -allowaccessmodification - -optimizations !code/simplification/arithmetic,!code/allocation/variable - -keepattributes *Annotation* -printusage ${optimized.dir}/proguard.usage - -keep public class * extends android.app.Activity - -keep public class * extends android.app.Service - -keep public interface scala.ScalaObject - -dontskipnonpubliclibraryclasses - -dontskipnonpubliclibraryclassmembers - -allowaccessmodification diff --git a/proguard.cfg b/proguard.cfg new file mode 100644 index 0000000..2970b73 --- /dev/null +++ b/proguard.cfg @@ -0,0 +1,33 @@ +-dontwarn scala.** +-dontnote scala.** +-dontobfuscate +-dontpreverify +-repackageclasses '' +-allowaccessmodification +-optimizations !code/simplification/arithmetic,!code/allocation/variable +-keepattributes *Annotation* +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Service +-keep public class * extends android.view.View { + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); + public void set*(...); +} +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} +-keepclassmembers class * implements android.os.Parcelable { + static android.os.Parcelable$Creator CREATOR; +} +-keepclassmembers class **.R$* { + public static ; +} +-keep public interface scala.ScalaObject +-dontskipnonpubliclibraryclasses +-dontskipnonpubliclibraryclassmembers +-allowaccessmodification + From e5522ad328678a3d8fd11fc8f76638a1aa4d722c Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Wed, 26 Jan 2011 03:32:36 +0100 Subject: [PATCH 4/8] preferences for backends --- AndroidManifest.xml | 4 +++- res/values/notrans.xml | 1 + res/values/strings.xml | 27 +++++++++++++++++++++------ res/xml/pref_afsk.xml | 19 +++++++++++++++++++ res/xml/pref_tcp.xml | 35 +++++++++++++++++++++++++++++++++++ res/xml/pref_udp.xml | 20 ++++++++++++++++++++ res/xml/preferences.xml | 34 +++++++++++++--------------------- src/BackendPrefs.scala | 12 ++++++++++++ 8 files changed, 124 insertions(+), 28 deletions(-) create mode 100644 res/xml/pref_afsk.xml create mode 100644 res/xml/pref_tcp.xml create mode 100644 res/xml/pref_udp.xml create mode 100644 src/BackendPrefs.scala diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2977f70..6d5a62d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,11 +20,13 @@ - + + + diff --git a/res/values/notrans.xml b/res/values/notrans.xml index 7f830fc..8c8e5cd 100644 --- a/res/values/notrans.xml +++ b/res/values/notrans.xml @@ -5,5 +5,6 @@ http://aprsdroid.org/ /$ + diff --git a/res/values/strings.xml b/res/values/strings.xml index e55dd07..859b987 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -101,10 +101,12 @@ Status message The text after your coordinates Enter your status message -Networking +APRS Connection Connection Protocol -Choose UDP (port 8080) or HTTP POST (URL) +AFSK, HTTP, TCP or UDP Choose the connection protocol +Connection Preferences +Configuration of Connection UDP port 8080 @@ -115,6 +117,7 @@ Server APRS-IS server (port 8080) to send beacons Enter the APRS-IS server hostname +host:port Location Settings Minimum update time Minutes between beacon transmissions @@ -126,8 +129,20 @@ Keep GPS on longer to get more precise data Use network location Acquire position from the cellular network -Incoming Filter (TCP only) -Neighbor radius -Receive packets from stations in this radius -Radius around you to monitor for packets [km] + +AFSK Preferences +HTTP Preferences +UDP Preferences +TCP Preferences + + +APRS-IS TCP server (port 14580) to contact +Message filter +m/10 b/DO1GL* +m/10 +Filter for incoming packets +Enter a filter for incoming messages ("m/10" filters 10km around own position) + +Message filter help +Online reference for APRS-IS filters diff --git a/res/xml/pref_afsk.xml b/res/xml/pref_afsk.xml new file mode 100644 index 0000000..5ff8b74 --- /dev/null +++ b/res/xml/pref_afsk.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/res/xml/pref_tcp.xml b/res/xml/pref_tcp.xml new file mode 100644 index 0000000..3ad71f1 --- /dev/null +++ b/res/xml/pref_tcp.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + diff --git a/res/xml/pref_udp.xml b/res/xml/pref_udp.xml new file mode 100644 index 0000000..b035196 --- /dev/null +++ b/res/xml/pref_udp.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 8efa654..e04a1a7 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -37,6 +37,7 @@ android:summary="@string/p_ssid_summary" android:entries="@array/p_ssid_e" android:entryValues="@array/p_ssid_ev" + android:defaultValue="" android:dialogTitle="@string/p_ssid_entry" /> - - - - - - + android:title="@string/p__connection"> - - + + + + + diff --git a/src/BackendPrefs.scala b/src/BackendPrefs.scala new file mode 100644 index 0000000..d2bf020 --- /dev/null +++ b/src/BackendPrefs.scala @@ -0,0 +1,12 @@ +package de.duenndns.aprsdroid + +import _root_.android.os.Bundle +import _root_.android.preference.{PreferenceActivity, PreferenceManager} + +class BackendPrefs extends PreferenceActivity { + override def onCreate(savedInstanceState: Bundle) { + super.onCreate(savedInstanceState) + val prefs = PreferenceManager.getDefaultSharedPreferences(this) + addPreferencesFromResource(AprsIsUploader.instanciatePrefsAct(prefs)) + } +} From 5047ea7df4f49f27d164bad81a017933b49b77ed Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 5 Feb 2011 14:32:39 +0100 Subject: [PATCH 5/8] cache and benchmark some drawing code --- src/MapAct.scala | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/MapAct.scala b/src/MapAct.scala index 8b61c71..b88f21f 100644 --- a/src/MapAct.scala +++ b/src/MapAct.scala @@ -181,14 +181,19 @@ class StationOverlay(icons : Drawable, context : Context, db : StorageDatabase) val iconbitmap = icons.asInstanceOf[BitmapDrawable].getBitmap val p = new Point() + val proj = m.getProjection() + val zoom = m.getZoomLevel() + val (width, height) = (m.getWidth(), m.getHeight()) for (s <- stations) { - m.getProjection().toPixels(s.point, p) - if (p.x >= 0 && p.y >= 0 && p.x < m.getWidth() && p.y < m.getHeight()) { + proj.toPixels(s.point, p) + if (p.x >= 0 && p.y >= 0 && p.x < width && p.y < height) { val srcRect = symbol2rect(s.symbol) val destRect = new Rect(p.x-8, p.y-8, p.x+8, p.y+8) // first draw callsign and trace - if (m.getZoomLevel() >= 10) { + if (zoom >= 10) { + Benchmark("drawTrace") { drawTrace(c, m, s.call) + } c.drawText(s.call, p.x, p.y+20, strokePaint) c.drawText(s.call, p.x, p.y+20, textPaint) @@ -196,7 +201,7 @@ class StationOverlay(icons : Drawable, context : Context, db : StorageDatabase) // then the bitmap c.drawBitmap(iconbitmap, srcRect, destRect, null) // and finally the bitmap overlay, if any - if (m.getZoomLevel() >= 6 && symbolIsOverlayed(s.symbol)) { + if (zoom >= 6 && symbolIsOverlayed(s.symbol)) { c.drawText(s.symbol(0).toString(), p.x, p.y+4, symbStrPaint) c.drawText(s.symbol(0).toString(), p.x, p.y+4, symbPaint) } From a50e18d987f62bd98f4f3ebd90ab1cf221fd5fd0 Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 5 Feb 2011 14:34:09 +0100 Subject: [PATCH 6/8] outsource resetting of positions table --- src/StorageDatabase.scala | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/StorageDatabase.scala b/src/StorageDatabase.scala index e99ebe6..023480b 100644 --- a/src/StorageDatabase.scala +++ b/src/StorageDatabase.scala @@ -91,25 +91,30 @@ class StorageDatabase(context : Context) extends db.execSQL(Position.TABLE_CREATE) Array("call", "lat", "lon").map(col => db.execSQL(Position.TABLE_INDEX.format(col, col))) } + def resetPositionsTable(db : SQLiteDatabase) { + db.execSQL(Position.TABLE_DROP) + db.execSQL(Position.TABLE_CREATE) + Array("call", "lat", "lon").map(col => db.execSQL(Position.TABLE_INDEX.format(col, col))) + // we can not call getPosts() here due to recursion issues + val c = db.query(Post.TABLE, Post.COLUMNS, "TYPE = 0 OR TYPE = 3", + null, null, null, "_ID DESC", null) + c.moveToFirst() + while (!c.isAfterLast()) { + val message = c.getString(c.getColumnIndexOrThrow(Post.MESSAGE)) + val ts = c.getLong(c.getColumnIndexOrThrow(Post.TS)) + addPosition(ts, message) + c.moveToNext() + } + c.close() + } + def resetPositionsTable() : Unit = resetPositionsTable(getWritableDatabase()) + override def onUpgrade(db: SQLiteDatabase, from : Int, to : Int) { if (from == 1 && to >= 2) { db.execSQL("ALTER TABLE %s ADD COLUMN %s".format(Post.TABLE, "TYPE INTEGER DEFAULT 0")) } if (from <= 4 && to >= 3) { - db.execSQL(Position.TABLE_DROP) - db.execSQL(Position.TABLE_CREATE) - Array("call", "lat", "lon").map(col => db.execSQL(Position.TABLE_INDEX.format(col, col))) - // we can not call getPosts() here due to recursion issues - val c = db.query(Post.TABLE, Post.COLUMNS, "TYPE = 0 OR TYPE = 3", - null, null, null, "_ID DESC", null) - c.moveToFirst() - while (!c.isAfterLast()) { - val message = c.getString(c.getColumnIndexOrThrow(Post.MESSAGE)) - val ts = c.getLong(c.getColumnIndexOrThrow(Post.TS)) - addPosition(ts, message) - c.moveToNext() - } - c.close() + resetPositionsTable(db) } } From b1ab9fef3fd7ea9937f6d2425d91ee67e3f21753 Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 5 Feb 2011 14:37:20 +0100 Subject: [PATCH 7/8] prevent wait/fc on upgrading db --- src/StorageDatabase.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/StorageDatabase.scala b/src/StorageDatabase.scala index 023480b..f6611b7 100644 --- a/src/StorageDatabase.scala +++ b/src/StorageDatabase.scala @@ -95,6 +95,7 @@ class StorageDatabase(context : Context) extends db.execSQL(Position.TABLE_DROP) db.execSQL(Position.TABLE_CREATE) Array("call", "lat", "lon").map(col => db.execSQL(Position.TABLE_INDEX.format(col, col))) + return; // this code causes a too long wait in onUpgrade... // we can not call getPosts() here due to recursion issues val c = db.query(Post.TABLE, Post.COLUMNS, "TYPE = 0 OR TYPE = 3", null, null, null, "_ID DESC", null) From f0e186d804dbc11b3488dd1f1536998949f70f8a Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 5 Feb 2011 14:37:38 +0100 Subject: [PATCH 8/8] reduce debug log verbosity --- src/StorageDatabase.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/StorageDatabase.scala b/src/StorageDatabase.scala index f6611b7..7d340b4 100644 --- a/src/StorageDatabase.scala +++ b/src/StorageDatabase.scala @@ -179,10 +179,12 @@ class StorageDatabase(context : Context) extends cv.put(Post.TYPE, posttype.asInstanceOf[java.lang.Integer]) cv.put(Post.STATUS, status) cv.put(Post.MESSAGE, message) - Log.d(TAG, "StorageDatabase.addPost: " + status + " - " + message) getWritableDatabase().insertOrThrow(Post.TABLE, Post.MESSAGE, cv) if (posttype == Post.TYPE_POST || posttype == Post.TYPE_INCMG) { addPosition(ts, message) + } else { + // only log status messages + Log.d(TAG, "StorageDatabase.addPost: " + status + " - " + message) } if (Post.trimCounter == 0) { trimPosts()