From 45a9d0803c9b726ffe78fc92a47f760a97d0c7bd Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Fri, 7 Jul 2017 23:07:08 +0200 Subject: [PATCH 01/35] Run checkStrikes asynchronous --- .../android/alert/handler/AlertHandler.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt b/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt index d1abbf36..07a31c6f 100644 --- a/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt +++ b/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt @@ -49,6 +49,8 @@ import org.blitzortung.android.protocol.ConsumerContainer import org.blitzortung.android.protocol.Event import org.blitzortung.android.util.MeasurementSystem import org.blitzortung.android.util.isAtLeast +import org.jetbrains.anko.async +import org.jetbrains.anko.uiThread class AlertHandler( @@ -192,9 +194,15 @@ class AlertHandler( } fun checkStrikes(strikes: Collection?) { - Log.v(Main.LOG_TAG, "AlertHandler.checkStrikes() strikes: ${strikes != null}, location: ${currentLocation != null}") - val alertResult = checkStrikes(strikes, currentLocation) - processResult(alertResult) + //Do the checkStrikes stuff in another thread + async { + Log.v(Main.LOG_TAG, "AlertHandler.checkStrikes() strikes: ${strikes != null}, location: ${currentLocation != null}") + val alertResult = checkStrikes(strikes, currentLocation) + + uiThread { + processResult(alertResult) + } + } } fun checkStrikes(strikes: Collection?, location: Location?): AlertResult? { From 9cdbf7f0f00281666e1b7b71889474470c613551 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 9 Jul 2017 14:10:08 +0200 Subject: [PATCH 02/35] Replace ItemizedOverlay with a custom StrikeListOverlay ItemizedOverlay is inteded to be used with a small number of items (dozens) The method "ItemizedOverlay.populate()" has to be run on the uiThread and takes longer the more items it has. That meant with 15k of Lightnings we would've a delay of ~ 5 seconds With the new custom StrikeListOverlay we have a constant 50-100ms time to add new strikes to the Overlay --- .../android/alert/handler/AlertHandler.kt | 4 +- .../java/org/blitzortung/android/app/Main.kt | 57 ++++----- .../android/app/view/HistogramView.kt | 9 +- .../android/app/view/LegendView.kt | 10 +- .../android/map/overlay/LightningShape.kt | 9 ++ .../android/map/overlay/RasterShape.kt | 35 +++--- ...StrikesOverlay.kt => StrikeListOverlay.kt} | 95 ++++++--------- .../android/map/overlay/StrikeOverlay.kt | 64 +++++++++++ .../android/map/overlay/StrikeOverlayItem.kt | 108 ------------------ .../android/map/overlay/StrikeShape.kt | 30 ++++- 10 files changed, 194 insertions(+), 227 deletions(-) create mode 100644 app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt rename app/src/main/java/org/blitzortung/android/map/overlay/{StrikesOverlay.kt => StrikeListOverlay.kt} (72%) create mode 100644 app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt delete mode 100644 app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlayItem.kt diff --git a/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt b/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt index 07a31c6f..a31d7738 100644 --- a/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt +++ b/app/src/main/java/org/blitzortung/android/alert/handler/AlertHandler.kt @@ -49,7 +49,7 @@ import org.blitzortung.android.protocol.ConsumerContainer import org.blitzortung.android.protocol.Event import org.blitzortung.android.util.MeasurementSystem import org.blitzortung.android.util.isAtLeast -import org.jetbrains.anko.async +import org.jetbrains.anko.doAsync import org.jetbrains.anko.uiThread @@ -195,7 +195,7 @@ class AlertHandler( fun checkStrikes(strikes: Collection?) { //Do the checkStrikes stuff in another thread - async { + doAsync { Log.v(Main.LOG_TAG, "AlertHandler.checkStrikes() strikes: ${strikes != null}, location: ${currentLocation != null}") val alertResult = checkStrikes(strikes, currentLocation) diff --git a/app/src/main/java/org/blitzortung/android/app/Main.kt b/app/src/main/java/org/blitzortung/android/app/Main.kt index ec9ba4de..11ebab9b 100644 --- a/app/src/main/java/org/blitzortung/android/app/Main.kt +++ b/app/src/main/java/org/blitzortung/android/app/Main.kt @@ -64,7 +64,7 @@ import org.blitzortung.android.map.OwnMapView import org.blitzortung.android.map.overlay.FadeOverlay import org.blitzortung.android.map.overlay.OwnLocationOverlay import org.blitzortung.android.map.overlay.ParticipantsOverlay -import org.blitzortung.android.map.overlay.StrikesOverlay +import org.blitzortung.android.map.overlay.StrikeListOverlay import org.blitzortung.android.map.overlay.color.ParticipantColorHandler import org.blitzortung.android.map.overlay.color.StrikeColorHandler import org.blitzortung.android.util.LogUtil @@ -78,7 +78,8 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { private lateinit var statusComponent: StatusComponent private lateinit var versionComponent: VersionComponent - private lateinit var strikesOverlay: StrikesOverlay + private lateinit var strikeColorHandler: StrikeColorHandler + private lateinit var strikeListOverlay: StrikeListOverlay private lateinit var participantsOverlay: ParticipantsOverlay private lateinit var ownLocationOverlay: OwnLocationOverlay private lateinit var fadeOverlay: FadeOverlay @@ -115,28 +116,28 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { clearDataIfRequested() - val initializeOverlay = strikesOverlay.parameters != resultParameters - with(strikesOverlay) { + val initializeOverlay = strikeListOverlay.parameters != resultParameters + with(strikeListOverlay) { parameters = resultParameters rasterParameters = event.rasterParameters referenceTime = event.referenceTime } if (event.incrementalData && !initializeOverlay) { - strikesOverlay.expireStrikes() + strikeListOverlay.expireStrikes() } else { - strikesOverlay.clear() + strikeListOverlay.clear() } if (initializeOverlay && event.totalStrikes != null) { - strikesOverlay.addStrikes(event.totalStrikes) + strikeListOverlay.addStrikes(event.totalStrikes) } else if (event.strikes != null) { - strikesOverlay.addStrikes(event.strikes) + strikeListOverlay.addStrikes(event.strikes) } - alert_view.setColorHandler(strikesOverlay.getColorHandler(), strikesOverlay.parameters.intervalDuration) + alert_view.setColorHandler(strikeColorHandler, strikeListOverlay.parameters.intervalDuration) - strikesOverlay.refresh() + strikeListOverlay.refresh() legend_view.requestLayout() @@ -180,19 +181,20 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { PreferenceManager.setDefaultValues(this, R.xml.preferences, false) preferences.registerOnSharedPreferenceChangeListener(this) - strikesOverlay = StrikesOverlay(this, StrikeColorHandler(preferences)) + strikeColorHandler = StrikeColorHandler(preferences) + strikeListOverlay = StrikeListOverlay(this, strikeColorHandler) participantsOverlay = ParticipantsOverlay(this, ParticipantColorHandler(preferences)) mapView.addZoomListener { zoomLevel -> - strikesOverlay.updateZoomLevel(zoomLevel) + strikeListOverlay.updateZoomLevel(zoomLevel) participantsOverlay.updateZoomLevel(zoomLevel) } - fadeOverlay = FadeOverlay(strikesOverlay.getColorHandler()) + fadeOverlay = FadeOverlay(strikeColorHandler) ownLocationOverlay = OwnLocationOverlay(this, mapView) addOverlay(fadeOverlay) - addOverlay(strikesOverlay) + addOverlay(strikeListOverlay) addOverlay(participantsOverlay) addOverlay(ownLocationOverlay) updateOverlays() @@ -268,13 +270,13 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { private fun setupCustomViews() { with(legend_view) { - strikesOverlay = this@Main.strikesOverlay + strikesOverlay = this@Main.strikeListOverlay setAlpha(150) setOnClickListener { openQuickSettingsDialog() } } with(alert_view) { - setColorHandler(strikesOverlay.getColorHandler(), strikesOverlay.parameters.intervalDuration) + setColorHandler(strikeColorHandler, strikeListOverlay.parameters.intervalDuration) setBackgroundColor(Color.TRANSPARENT) setAlpha(200) setOnClickListener { @@ -291,8 +293,8 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { } with(histogram_view) { - setStrikesOverlay(strikesOverlay) - setOnClickListener { + setStrikesOverlay(strikeListOverlay) + setOnClickListener { view -> val currentResult = currentResult if (currentResult != null) { val rasterParameters = currentResult.rasterParameters @@ -474,7 +476,7 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { Log.v(Main.LOG_TAG, "Main.clearData()") clearData = false - strikesOverlay.clear() + strikeListOverlay.clear() participantsOverlay.clear() } @@ -525,9 +527,9 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { if (keyCode == KeyEvent.KEYCODE_MENU) { Log.v(Main.LOG_TAG, "Main.onKeyUp(KEYCODE_MENU)") showPopupMenu(upper_row) - return true; + return true } - return super.onKeyUp(keyCode, event); + return super.onKeyUp(keyCode, event) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, keyString: String) { @@ -544,7 +546,7 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { PreferenceKey.MAP_TYPE -> { val mapTypeString = sharedPreferences.get(key, "SATELLITE") mapView.isSatellite = mapTypeString == "SATELLITE" - strikesOverlay.refresh() + strikeListOverlay.refresh() participantsOverlay.refresh() } @@ -555,7 +557,7 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { } PreferenceKey.COLOR_SCHEME -> { - strikesOverlay.refresh() + strikeListOverlay.refresh() participantsOverlay.refresh() } @@ -578,17 +580,18 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { } protected fun setHistoricStatusString() { - if (!strikesOverlay.hasRealtimeData()) { - val timeString = DateFormat.format("@ kk:mm", strikesOverlay.referenceTime) as String + if (!strikeListOverlay.hasRealtimeData()) { + val referenceTime = strikeListOverlay.referenceTime + strikeListOverlay.parameters.intervalOffset * 60 * 1000 + val timeString = DateFormat.format("@ kk:mm", referenceTime) as String setStatusString(timeString) } } protected fun setStatusString(runStatus: String) { - val numberOfStrikes = strikesOverlay.totalNumberOfStrikes + val numberOfStrikes = strikeListOverlay.totalNumberOfStrikes var statusText = resources.getQuantityString(R.plurals.strike, numberOfStrikes, numberOfStrikes) statusText += "/" - val intervalDuration = strikesOverlay.parameters.intervalDuration + val intervalDuration = strikeListOverlay.parameters.intervalDuration statusText += resources.getQuantityString(R.plurals.minute, intervalDuration, intervalDuration) statusText += " " + runStatus diff --git a/app/src/main/java/org/blitzortung/android/app/view/HistogramView.kt b/app/src/main/java/org/blitzortung/android/app/view/HistogramView.kt index 7fc0b70d..4aa102fd 100644 --- a/app/src/main/java/org/blitzortung/android/app/view/HistogramView.kt +++ b/app/src/main/java/org/blitzortung/android/app/view/HistogramView.kt @@ -28,7 +28,7 @@ import android.view.View import org.blitzortung.android.app.Main import org.blitzortung.android.app.R import org.blitzortung.android.data.provider.result.ResultEvent -import org.blitzortung.android.map.overlay.StrikesOverlay +import org.blitzortung.android.map.overlay.StrikeListOverlay import org.blitzortung.android.protocol.Event import org.blitzortung.android.util.TabletAwareView @@ -43,7 +43,7 @@ class HistogramView @JvmOverloads constructor( private val textPaint: Paint private val defaultForegroundColor: Int private val backgroundRect: RectF - private var strikesOverlay: StrikesOverlay? = null + private var strikesOverlay: StrikeListOverlay? = null private var histogram: IntArray? = null val dataConsumer = { event: Event -> @@ -82,7 +82,7 @@ class HistogramView @JvmOverloads constructor( val strikesOverlay = strikesOverlay val histogram = histogram if (strikesOverlay != null && histogram != null && histogram.size > 0) { - val colorHandler = strikesOverlay.getColorHandler() + val colorHandler = strikesOverlay.colorHandler val minutesPerColor = strikesOverlay.parameters.intervalDuration / colorHandler.numberOfColors val minutesPerBin = 5 val ratio = minutesPerColor / minutesPerBin @@ -119,7 +119,7 @@ class HistogramView @JvmOverloads constructor( } } - fun setStrikesOverlay(strikesOverlay: StrikesOverlay) { + fun setStrikesOverlay(strikesOverlay: StrikeListOverlay) { this.strikesOverlay = strikesOverlay } @@ -167,7 +167,6 @@ class HistogramView @JvmOverloads constructor( this.histogram = histogram return true } - return false } } diff --git a/app/src/main/java/org/blitzortung/android/app/view/LegendView.kt b/app/src/main/java/org/blitzortung/android/app/view/LegendView.kt index 5fd7d81b..a56f21c4 100644 --- a/app/src/main/java/org/blitzortung/android/app/view/LegendView.kt +++ b/app/src/main/java/org/blitzortung/android/app/view/LegendView.kt @@ -26,7 +26,7 @@ import android.graphics.RectF import android.util.AttributeSet import android.view.View import org.blitzortung.android.app.R -import org.blitzortung.android.map.overlay.StrikesOverlay +import org.blitzortung.android.map.overlay.StrikeListOverlay import org.blitzortung.android.util.TabletAwareView class LegendView @JvmOverloads constructor( @@ -43,7 +43,7 @@ class LegendView @JvmOverloads constructor( private val foregroundPaint: Paint private val backgroundRect: RectF private val legendColorRect: RectF - var strikesOverlay: StrikesOverlay? = null + var strikesOverlay: StrikeListOverlay? = null init { colorFieldSize = textSize @@ -101,9 +101,9 @@ class LegendView @JvmOverloads constructor( val width = Math.min(determineWidth(strikesOverlay?.parameters?.intervalDuration ?: 0), parentWidth.toFloat()) - val colorHandler = strikesOverlay?.getColorHandler() + val colorHandler = strikesOverlay?.colorHandler - var height = 0.0f; + var height = 0.0f if (colorHandler != null) { height = Math.min((colorFieldSize + padding) * colorHandler.colors.size + padding, parentHeight.toFloat()) @@ -125,7 +125,7 @@ class LegendView @JvmOverloads constructor( override fun onDraw(canvas: Canvas) { strikesOverlay?.let { strikesOverlay -> - val colorHandler = strikesOverlay.getColorHandler() + val colorHandler = strikesOverlay.colorHandler val minutesPerColor = strikesOverlay.parameters.intervalDuration / colorHandler.numberOfColors backgroundRect.set(0f, 0f, width.toFloat(), height.toFloat()) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt new file mode 100644 index 00000000..d316e8ad --- /dev/null +++ b/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt @@ -0,0 +1,9 @@ +package org.blitzortung.android.map.overlay + +import android.graphics.Canvas +import android.graphics.Paint +import com.google.android.maps.MapView + +interface LightningShape { + fun draw(canvas: Canvas, mapView: MapView, paint: Paint) +} \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt index 9ec3fe0d..8ecad3b0 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt @@ -23,21 +23,31 @@ import android.graphics.Paint import android.graphics.Paint.Align import android.graphics.Point import android.graphics.RectF -import android.graphics.drawable.shapes.Shape +import com.google.android.maps.GeoPoint +import com.google.android.maps.MapView -class RasterShape : Shape() { +class RasterShape(private val center: GeoPoint) : LightningShape { - private val rect: RectF + private val size: RectF private var color: Int = 0 private var alpha: Int = 0 private var multiplicity: Int = 0 private var textColor: Int = 0 init { - rect = RectF() + size = RectF() } - override fun draw(canvas: Canvas, paint: Paint) { + override fun draw(canvas: Canvas, mapView: MapView, paint: Paint) { + val centerPoint = Point() + mapView.projection.toPixels(center, centerPoint) + + val rect = RectF( + centerPoint.x + size.left, + centerPoint.y + size.top, + centerPoint.x + size.right, + centerPoint.y + size.bottom) + //Only draw visible Raster-Items if(canvas.quickReject(rect, Canvas.EdgeType.BW)){ return @@ -53,27 +63,26 @@ class RasterShape : Shape() { paint.alpha = calculateAlphaValue(textSize, 20, 80, 255, 60) paint.textAlign = Align.CENTER paint.textSize = textSize - canvas.drawText(multiplicity.toString(), 0.0f, 0.4f * textSize, paint) + canvas.drawText( + multiplicity.toString(), + centerPoint.x.toFloat(), + centerPoint.y.toFloat() + textSize / 2, + paint) } } - override fun hasAlpha(): Boolean { - return alpha != 255 - } - fun update(topLeft: Point, bottomRight: Point, color: Int, multiplicity: Int, textColor: Int) { val x1 = Math.min(topLeft.x.toFloat(), -MIN_SIZE) val y1 = Math.min(topLeft.y.toFloat(), -MIN_SIZE) val x2 = Math.max(bottomRight.x.toFloat(), MIN_SIZE) val y2 = Math.max(bottomRight.y.toFloat(), MIN_SIZE) - rect.set(x1, y1, x2, y2) - resize(rect.width(), rect.height()) + size.set(x1, y1, x2, y2) this.multiplicity = multiplicity this.color = color this.textColor = textColor - alpha = calculateAlphaValue(rect.width(), 10, 40, 255, 100) + alpha = calculateAlphaValue(size.width(), 10, 40, 255, 100) } private fun calculateAlphaValue(value: Float, minValue: Int, maxValue: Int, maxAlpha: Int, minAlpha: Int): Int { diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikesOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt similarity index 72% rename from app/src/main/java/org/blitzortung/android/map/overlay/StrikesOverlay.kt rename to app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 33ba16e7..23f0747e 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikesOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -21,13 +21,10 @@ package org.blitzortung.android.map.overlay import android.graphics.Canvas import android.graphics.Paint import android.graphics.Paint.Style -import android.graphics.drawable.Drawable -import android.graphics.drawable.ShapeDrawable -import android.graphics.drawable.shapes.Shape -import android.text.format.DateFormat import android.util.Log -import com.google.android.maps.ItemizedOverlay +import com.google.android.maps.GeoPoint import com.google.android.maps.MapView +import com.google.android.maps.Overlay import org.blitzortung.android.app.Main import org.blitzortung.android.app.R import org.blitzortung.android.data.Parameters @@ -38,10 +35,8 @@ import org.blitzortung.android.map.components.LayerOverlayComponent import org.blitzortung.android.map.overlay.color.ColorHandler import org.blitzortung.android.map.overlay.color.StrikeColorHandler -class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: StrikeColorHandler) : PopupOverlay(mapActivity, ItemizedOverlay.boundCenter(StrikesOverlay.DEFAULT_DRAWABLE)), LayerOverlay { - - var strikes: List - protected set +class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandler: StrikeColorHandler): Overlay(), LayerOverlay { + private val strikeList = mutableListOf() private val layerOverlayComponent: LayerOverlayComponent private var zoomLevel: Int = 0 @@ -51,16 +46,6 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri init { layerOverlayComponent = LayerOverlayComponent(mapActivity.resources.getString(R.string.strikes_layer)) - strikes = listOf() - populate() - } - - override fun createItem(index: Int): StrikeOverlayItem { - return strikes[index] - } - - override fun size(): Int { - return strikes.size } override fun draw(canvas: Canvas?, mapView: com.google.android.maps.MapView?, shadow: Boolean) { @@ -68,16 +53,24 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri super.draw(canvas, mapView, false) if (hasRasterParameters() && canvas != null && mapView != null) { - drawDataAreaRect(canvas, mapView) + val paint = Paint() + paint.color = colorHandler.lineColor + paint.style = Style.STROKE + + drawDataAreaRect(canvas, mapView, paint) + + strikeList.forEach { + it.draw(canvas, mapView, false) + } } } } - private fun drawDataAreaRect(canvas: Canvas, mapView: MapView) { - val paint = Paint() - paint.color = colorHandler.lineColor - paint.style = Style.STROKE + fun addStrikes(strikes: List) { + strikeList.addAll(strikes.map { StrikeOverlay(it) }) + } + private fun drawDataAreaRect(canvas: Canvas, mapView: MapView, paint: Paint) { val clipBounds = canvas.clipBounds val currentRasterParameters = rasterParameters if (currentRasterParameters != null) { @@ -98,30 +91,16 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri } } - fun addStrikes(strikes: List) { - Log.v(Main.LOG_TAG, "StrikesOverlay.addStrikes() #" + strikes.size) - this.strikes += strikes.map { StrikeOverlayItem(it) } - lastFocusedIndex = -1 - try { - populate() - } catch (throwable: Throwable) { - Log.w(Main.LOG_TAG, throwable) - } - } - fun expireStrikes() { val expireTime = referenceTime - parameters.intervalDuration * 60 * 1000 - val sizeBefore = strikes.size - strikes = strikes.filter { it.timestamp > expireTime } - Log.v(Main.LOG_TAG, "StrikesOverlay.expireStrikes() expired ${sizeBefore - strikes.size} from $sizeBefore") + val sizeBefore = strikeList.size + strikeList.removeAll { it.timestamp > expireTime } + Log.v(Main.LOG_TAG, "StrikesOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore") } fun clear() { - lastFocusedIndex = -1 - clearPopup() - strikes = listOf() - populate() + strikeList.clear() } fun updateZoomLevel(zoomLevel: Int) { @@ -131,8 +110,10 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri } } - fun getColorHandler(): ColorHandler { - return colorHandler + override fun onTap(p0: GeoPoint?, p1: MapView?): Boolean { + //TODO Implement onTap for the different strikes + Log.d(Main.LOG_TAG, "Tapped on StrikeList") + return super.onTap(p0, p1) } fun refresh() { @@ -140,9 +121,9 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri colorHandler.updateTarget() - var drawable: Shape? = null + var drawable: LightningShape? = null - for (item in strikes) { + for (item in strikeList) { val section = colorHandler.getColorSection( if (hasRealtimeData()) System.currentTimeMillis() @@ -161,8 +142,8 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri } // VisibleForTesting - protected fun updateAndReturnDrawable(item: StrikeOverlayItem, section: Int, colorHandler: ColorHandler): Shape { - val projection = activity.mapView.projection + protected fun updateAndReturnDrawable(item: StrikeOverlay, section: Int, colorHandler: ColorHandler): LightningShape { + val projection = mapActivity.mapView.projection val color = colorHandler.getColor(section) val textColor = colorHandler.textColor @@ -179,8 +160,8 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri return parameters.isRealtime() } - override fun onTap(index: Int): Boolean { - val item = strikes[index] + /*override fun onTap(index: Int): Boolean { + val item = strikeList[index] if (item.point != null && item.timestamp > 0) { var result = DateFormat.format("kk:mm:ss", item.timestamp) as String @@ -194,10 +175,10 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri return true } return false - } + }*/ val totalNumberOfStrikes: Int - get() = strikes.fold(0, { previous, item -> previous + item.multiplicity }) + get() = strikeList.fold(0, { previous, item -> previous + item.multiplicity }) override val name: String get() = layerOverlayComponent.name @@ -213,14 +194,4 @@ class StrikesOverlay(mapActivity: OwnMapActivity, private val colorHandler: Stri set(value) { layerOverlayComponent.visible = value } - - companion object { - private val DEFAULT_DRAWABLE: Drawable - - init { - val shape = StrikeShape() - shape.update(1f, 0) - DEFAULT_DRAWABLE = ShapeDrawable(shape) - } - } } \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt new file mode 100644 index 00000000..74903ccb --- /dev/null +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt @@ -0,0 +1,64 @@ +package org.blitzortung.android.map.overlay + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Point +import com.google.android.maps.GeoPoint +import com.google.android.maps.MapView +import com.google.android.maps.Projection +import org.blitzortung.android.data.Coordsys +import org.blitzortung.android.data.beans.RasterParameters +import org.blitzortung.android.data.beans.Strike + +class StrikeOverlay(strike: Strike) { + val timestamp: Long = strike.timestamp + val multiplicity = strike.multiplicity + private val center: GeoPoint = Coordsys.toMapCoords(strike.longitude, strike.latitude) + + var shape: LightningShape? = null + + fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { + shape?.run { + draw(canvas, mapView, Paint()) + } + } + + fun updateShape(rasterParameters: RasterParameters?, projection: Projection, color: Int, textColor: Int, zoomLevel: Int) { + var shape: LightningShape? = shape + if (rasterParameters != null) { + if (shape == null && shape !is RasterShape) { + shape = RasterShape(center) + } + + val lon_delta = rasterParameters.longitudeDelta / 2.0f * 1e6f + val lat_delta = rasterParameters.latitudeDelta / 2.0f * 1e6f + + projection.toPixels(center, centerPoint) + projection.toPixels(GeoPoint( + (center.latitudeE6 + lat_delta).toInt(), + (center.longitudeE6 - lon_delta).toInt()), topLeft) + projection.toPixels(GeoPoint( + (center.latitudeE6 - lat_delta).toInt(), + (center.longitudeE6 + lon_delta).toInt()), bottomRight) + topLeft.offset(-centerPoint.x, -centerPoint.y) + bottomRight.offset(-centerPoint.x, -centerPoint.y) + if (shape is RasterShape) { + shape.update(topLeft, bottomRight, color, multiplicity, textColor) + } + } else { + if (shape == null) { + shape = StrikeShape(center) + } + if (shape is StrikeShape) { + shape.update((zoomLevel + 1).toFloat(), color) + } + } + this.shape = shape + } + + companion object { + private val centerPoint: Point = Point() + private val topLeft: Point = Point() + private val bottomRight: Point = Point() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlayItem.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlayItem.kt deleted file mode 100644 index c6cf1b12..00000000 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlayItem.kt +++ /dev/null @@ -1,108 +0,0 @@ -/* - - Copyright 2015 Andreas Würl - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -package org.blitzortung.android.map.overlay - -import android.graphics.Point -import android.graphics.drawable.Drawable -import android.graphics.drawable.ShapeDrawable -import android.graphics.drawable.shapes.Shape -import com.google.android.maps.GeoPoint -import com.google.android.maps.OverlayItem -import com.google.android.maps.Projection -import org.blitzortung.android.data.Coordsys -import org.blitzortung.android.data.beans.RasterParameters -import org.blitzortung.android.data.beans.Strike - -class StrikeOverlayItem(strike: Strike) : OverlayItem(Coordsys.toMapCoords(strike.longitude, strike.latitude), "", ""), Strike { - override val timestamp: Long - override val multiplicity: Int - - init { - super.setMarker(ShapeDrawable()) - - timestamp = strike.timestamp - multiplicity = strike.multiplicity - } - - override fun setMarker(drawable: Drawable?) { - throw IllegalStateException("cannot overwrite marker of strike overlay item") - } - - private val drawable: ShapeDrawable - get() { - return getMarker(0) as ShapeDrawable - } - - var shape: Shape? - get() { - return drawable.shape - } - set(shape) { - drawable.shape = shape - } - - fun updateShape(rasterParameters: RasterParameters?, projection: Projection, color: Int, textColor: Int, zoomLevel: Int) { - var shape: Shape? = shape - if (rasterParameters != null) { - if (shape == null && shape !is RasterShape) { - shape = RasterShape() - } - - val lon_delta = rasterParameters.longitudeDelta / 2.0f * 1e6f - val lat_delta = rasterParameters.latitudeDelta / 2.0f * 1e6f - val geoPoint = point - projection.toPixels(geoPoint, center) - projection.toPixels(GeoPoint( - (geoPoint.latitudeE6 + lat_delta).toInt(), - (geoPoint.longitudeE6 - lon_delta).toInt()), topLeft) - projection.toPixels(GeoPoint( - (geoPoint.latitudeE6 - lat_delta).toInt(), - (geoPoint.longitudeE6 + lon_delta).toInt()), bottomRight) - topLeft.offset(-center.x, -center.y) - bottomRight.offset(-center.x, -center.y) - if (shape is RasterShape) { - shape.update(topLeft, bottomRight, color, multiplicity, textColor) - } - } else { - if (shape == null) { - shape = StrikeShape() - } - if (shape is StrikeShape) { - shape.update((zoomLevel + 1).toFloat(), color) - } - } - this.shape = shape - } - - override val longitude: Float - get() { - return point.longitudeE6 / 1e6f - } - - override val latitude: Float - get() { - return point.latitudeE6 / 1e6f - } - - companion object { - private val center = Point() - private val topLeft = Point() - private val bottomRight = Point() - } -} diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt index 8c40f2d1..a7a98cc6 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt @@ -20,23 +20,43 @@ package org.blitzortung.android.map.overlay import android.graphics.Canvas import android.graphics.Paint -import android.graphics.drawable.shapes.Shape +import android.graphics.Point +import com.google.android.maps.GeoPoint +import com.google.android.maps.MapView -class StrikeShape : Shape() { +class StrikeShape(private val center: GeoPoint) : LightningShape { private var size: Float = 0.toFloat() private var color: Int = 0 - override fun draw(canvas: Canvas, paint: Paint) { + override fun draw(canvas: Canvas, mapView: MapView, paint: Paint) { + mapView.projection.toPixels(center, centerPoint) + paint.color = color paint.style = Paint.Style.STROKE paint.strokeWidth = size / 4 - canvas.drawLine(-size / 2, 0.0f, size / 2, 0.0f, paint) - canvas.drawLine(0.0f, -size / 2, 0.0f, size / 2, paint) + + canvas.drawLine( + centerPoint.x - size / 2, + centerPoint.y.toFloat(), + centerPoint.x + size / 2, + centerPoint.y.toFloat(), + paint) + + canvas.drawLine( + centerPoint.x.toFloat(), + centerPoint.y - size / 2, + centerPoint.x.toFloat(), + centerPoint.y + size / 2, + paint) } fun update(size: Float, color: Int) { this.size = size this.color = color } + + companion object { + private val centerPoint = Point() + } } From 733ed88d48a212f674a264769eb7a3df8388064d Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 9 Jul 2017 15:24:56 +0200 Subject: [PATCH 03/35] Removed unnecessary open flag inside HttpServiceClient --- .../java/org/blitzortung/android/jsonrpc/HttpServiceClient.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/jsonrpc/HttpServiceClient.kt b/app/src/main/java/org/blitzortung/android/jsonrpc/HttpServiceClient.kt index 26b4d834..63179324 100644 --- a/app/src/main/java/org/blitzortung/android/jsonrpc/HttpServiceClient.kt +++ b/app/src/main/java/org/blitzortung/android/jsonrpc/HttpServiceClient.kt @@ -19,8 +19,8 @@ package org.blitzortung.android.jsonrpc interface HttpServiceClient { - open fun shutdown() - open fun doRequest(data: String): String + fun shutdown() + fun doRequest(data: String): String var socketTimeout: Int var connectionTimeout: Int } From ebd8f24880fb88af5d57a3e8d9ac6a8149eb1012 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 9 Jul 2017 19:25:58 +0200 Subject: [PATCH 04/35] Use Elvis-Operator instead of if-else --- .../org/blitzortung/android/data/provider/result/ResultEvent.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt b/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt index de2c07e8..a4cd5a98 100644 --- a/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt +++ b/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt @@ -48,7 +48,7 @@ data class ResultEvent( } else { sb.append("Result(") val currentStrikes = strikes - sb.append(if (currentStrikes != null) currentStrikes.size else 0).append(" strikes, ") + sb.append(currentStrikes?.size ?: 0).append(" strikes, ") sb.append(parameters) if (rasterParameters != null) { sb.append(", ").append(rasterParameters) From decedc25874e81809d5cb10888a4342187ea9509 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 9 Jul 2017 22:48:02 +0200 Subject: [PATCH 05/35] Removed current_section from StrikeListOverlay current_section was -1 and was compared to the generated section of a strike. The value was never set --- .../org/blitzortung/android/map/overlay/StrikeListOverlay.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 23f0747e..0ec2f5a5 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -117,8 +117,6 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle } fun refresh() { - val current_section = -1 - colorHandler.updateTarget() var drawable: LightningShape? = null @@ -131,7 +129,7 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle referenceTime, item.timestamp, parameters.intervalDuration) - if (hasRasterParameters() || current_section != section) { + if (hasRasterParameters()) { drawable = updateAndReturnDrawable(item, section, colorHandler) } else { if (drawable != null) { From 8d4a763645d6d5653ce6655fbba10ee884c8fb7e Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 9 Jul 2017 22:50:01 +0200 Subject: [PATCH 06/35] Reuse Paint-Object of StrikeListOverlay instead of creating a new one for every StrikeOverlay --- .../org/blitzortung/android/map/overlay/StrikeListOverlay.kt | 3 ++- .../java/org/blitzortung/android/map/overlay/StrikeOverlay.kt | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 0ec2f5a5..4b418995 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -59,8 +59,9 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle drawDataAreaRect(canvas, mapView, paint) + paint.style = Style.FILL strikeList.forEach { - it.draw(canvas, mapView, false) + it.draw(canvas, mapView, false, paint) } } } diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt index 74903ccb..782e9b18 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt @@ -17,9 +17,9 @@ class StrikeOverlay(strike: Strike) { var shape: LightningShape? = null - fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { + fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean, paint: Paint) { shape?.run { - draw(canvas, mapView, Paint()) + draw(canvas, mapView, paint) } } From b454bc646bb25ddcd703ffba99f58d87c118df64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 10 Jul 2017 00:01:43 +0200 Subject: [PATCH 07/35] enable extended mode for beta --- app/build.gradle | 4 +-- .../java/org/blitzortung/android/app/Main.kt | 27 +++++++------------ .../android/map/overlay/StrikeListOverlay.kt | 2 +- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f56eebfa..312bf555 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 191 - versionName "1.5.19" + versionCode 192 + versionName "1.6-beta1" multiDexEnabled true } buildTypes { diff --git a/app/src/main/java/org/blitzortung/android/app/Main.kt b/app/src/main/java/org/blitzortung/android/app/Main.kt index 11ebab9b..b8b3208d 100644 --- a/app/src/main/java/org/blitzortung/android/app/Main.kt +++ b/app/src/main/java/org/blitzortung/android/app/Main.kt @@ -33,7 +33,6 @@ import android.os.Bundle import android.os.Handler import android.os.IBinder import android.preference.PreferenceManager -import android.provider.Settings import android.text.format.DateFormat import android.util.Log import android.view.KeyEvent @@ -73,8 +72,6 @@ import org.blitzortung.android.util.isAtLeast import org.jetbrains.anko.intentFor class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { - private val androidIdsForExtendedFunctionality = emptySet() // setOf("f0f71d2b06703e28") - private lateinit var statusComponent: StatusComponent private lateinit var versionComponent: VersionComponent @@ -210,7 +207,7 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { buttonColumnHandler.addAllElements(historyController.getButtons(), ButtonGroup.DATA_UPDATING) - setupDebugModeButton() + setupDetailModeButton() buttonColumnHandler.updateButtonColumn() @@ -250,21 +247,17 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { bindService(serviceIntent, serviceConnection, 0) } - private fun setupDebugModeButton() { - val androidId = Settings.Secure.getString(baseContext.contentResolver, Settings.Secure.ANDROID_ID) - Log.v(Main.LOG_TAG, "AndroidId: $androidId") - if ((androidId != null && androidIdsForExtendedFunctionality.contains(androidId))) { - with(toggleExtendedMode) { - isEnabled = true - visibility = View.VISIBLE - - setOnClickListener { - BOApplication.dataHandler.toggleExtendedMode() - reloadData() - } + private fun setupDetailModeButton() { + with(toggleExtendedMode) { + isEnabled = true + visibility = View.VISIBLE - buttonColumnHandler.addElement(this, ButtonGroup.DATA_UPDATING) + setOnClickListener { + BOApplication.dataHandler.toggleExtendedMode() + reloadData() } + + buttonColumnHandler.addElement(this, ButtonGroup.DATA_UPDATING) } } diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 4b418995..0e652ab1 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -97,7 +97,7 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle val sizeBefore = strikeList.size strikeList.removeAll { it.timestamp > expireTime } - Log.v(Main.LOG_TAG, "StrikesOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore") + Log.v(Main.LOG_TAG, "StrikesListOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore") } fun clear() { From d32f8d081ce6d413430c1c4edec963b1b2f5edaf Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 10 Jul 2017 18:12:43 +0200 Subject: [PATCH 08/35] Revert "Removed current_section from StrikeListOverlay" This reverts commit decedc25874e81809d5cb10888a4342187ea9509. --- .../org/blitzortung/android/map/overlay/StrikeListOverlay.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 0e652ab1..697e6cd8 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -118,6 +118,8 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle } fun refresh() { + val current_section = -1 + colorHandler.updateTarget() var drawable: LightningShape? = null @@ -130,7 +132,7 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle referenceTime, item.timestamp, parameters.intervalDuration) - if (hasRasterParameters()) { + if (hasRasterParameters() || current_section != section) { drawable = updateAndReturnDrawable(item, section, colorHandler) } else { if (drawable != null) { From 84008065a84ef4719bd61cbec0960b3c5da602ea Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 10 Jul 2017 19:22:01 +0200 Subject: [PATCH 09/35] Draw the strikes even when we have no RasterParameters --- .../android/map/overlay/StrikeListOverlay.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 697e6cd8..a25c4454 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -52,17 +52,21 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle if (!shadow) { super.draw(canvas, mapView, false) - if (hasRasterParameters() && canvas != null && mapView != null) { - val paint = Paint() + if(canvas == null || mapView == null) { + return + } + + val paint = Paint() + if (hasRasterParameters()) { paint.color = colorHandler.lineColor paint.style = Style.STROKE drawDataAreaRect(canvas, mapView, paint) + } - paint.style = Style.FILL - strikeList.forEach { - it.draw(canvas, mapView, false, paint) - } + paint.style = Style.FILL + strikeList.forEach { + it.draw(canvas, mapView, false, paint) } } } From 1d3e6dd4b2cafe4ef45c75bdc4d594d2be82d8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 10 Jul 2017 19:41:02 +0200 Subject: [PATCH 10/35] enable extended strike mode --- .../blitzortung/android/data/provider/result/ResultEvent.kt | 1 + .../blitzortung/android/map/overlay/StrikeListOverlay.kt | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt b/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt index a4cd5a98..226a836f 100644 --- a/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt +++ b/app/src/main/java/org/blitzortung/android/data/provider/result/ResultEvent.kt @@ -54,6 +54,7 @@ data class ResultEvent( sb.append(", ").append(rasterParameters) } sb.append(", incrementalData=$incrementalData") + sb.append(", referenceTime=$referenceTime") sb.append(")") } diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index a25c4454..84ccea9f 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -100,8 +100,10 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle val expireTime = referenceTime - parameters.intervalDuration * 60 * 1000 val sizeBefore = strikeList.size - strikeList.removeAll { it.timestamp > expireTime } - Log.v(Main.LOG_TAG, "StrikesListOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore") + val first_time = strikeList.first().timestamp + val difference = first_time - expireTime + strikeList.removeAll { it.timestamp < expireTime } + Log.v(Main.LOG_TAG, "StrikesListOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore (first: $first_time, difference: $difference, ref: $referenceTime") } fun clear() { From 928b3747ed1db1ccb8f756ab923e47feb5cee6a7 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 10 Jul 2017 20:19:29 +0200 Subject: [PATCH 11/35] Simplitfy if-statement inside StrikeOverlay --- .../java/org/blitzortung/android/map/overlay/StrikeOverlay.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt index 782e9b18..36a97435 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt @@ -26,7 +26,7 @@ class StrikeOverlay(strike: Strike) { fun updateShape(rasterParameters: RasterParameters?, projection: Projection, color: Int, textColor: Int, zoomLevel: Int) { var shape: LightningShape? = shape if (rasterParameters != null) { - if (shape == null && shape !is RasterShape) { + if (shape !is RasterShape) { shape = RasterShape(center) } From 7a2a9109b1b6fe3a4b6e6fe2fb2c90f823e7831f Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 10 Jul 2017 20:19:45 +0200 Subject: [PATCH 12/35] Draw StrikeShape only when visible on the screen --- .../blitzortung/android/map/overlay/StrikeShape.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt index a7a98cc6..4721b948 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt @@ -32,6 +32,17 @@ class StrikeShape(private val center: GeoPoint) : LightningShape { override fun draw(canvas: Canvas, mapView: MapView, paint: Paint) { mapView.projection.toPixels(center, centerPoint) + //Only draw it when its visible + if(canvas.quickReject( + centerPoint.x - size / 2, + centerPoint.y - size / 2, + centerPoint.x + size / 2, + centerPoint.y + size /2, + Canvas.EdgeType.BW)) { + + return + } + paint.color = color paint.style = Paint.Style.STROKE paint.strokeWidth = size / 4 From addbb2cffa41fbb82cf71527c34ffbd01848f18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 17 Jul 2017 00:05:49 +0200 Subject: [PATCH 13/35] fixed broken tests --- .../android/app/components/VersionComponentTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index a5794062..b925215b 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 191 - val CURRENT_VERSION_NAME = "1.5.19" + val CURRENT_VERSION_CODE = 192 + val CURRENT_VERSION_NAME = "1.6-beta1" } } \ No newline at end of file From c0a75e4f9d4910604cb4476768b0e49e678db32f Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 17 Jul 2017 14:24:57 +0200 Subject: [PATCH 14/35] Allow null-Locations to be sent E.g. when the LocationProvider has been disabled by the user, we need to invalid the current Location --- .../blitzortung/android/location/LocationHandler.kt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt b/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt index 69fe4bd7..71f73b29 100644 --- a/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt +++ b/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt @@ -119,17 +119,10 @@ open class LocationHandler( } private fun sendLocationUpdate(location: Location?) { - if (!(location?.isValid ?: true)) { - Log.w(Main.LOG_TAG, "LocationHandler.sendLocationUpdate() invalid location $location") - } - sendLocationUpdateToListeners(if (location != null && location.isValid) location else null) - } + val location = location?.takeIf { it.isValid } - private fun sendLocationUpdateToListeners(location: Location?) { - if (location != null) { - Log.v(Main.LOG_TAG, "LocationHandler.sendLocationUpdateToListeners($location)") - consumerContainer.storeAndBroadcast(LocationEvent(location)) - } + Log.i(Main.LOG_TAG, "LocationHandler.sendLocationUpdate() location $location") + consumerContainer.storeAndBroadcast(LocationEvent(location)) } fun requestUpdates(locationConsumer: (LocationEvent) -> Unit) { From fe7e500cdc33774cab266e4e36aee3e38288f7a6 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 17 Jul 2017 14:28:29 +0200 Subject: [PATCH 15/35] When isInBackground is changed, reconfigure the current LocationProvider We just need to re-request location updates from LocationManager instead of stopping/starting the whole LocationProvider --- .../android/location/LocationHandler.kt | 11 +++------ .../location/provider/GPSLocationProvider.kt | 2 +- .../location/provider/LocationProvider.kt | 5 ++++ .../provider/ManagerLocationProvider.kt | 23 +++++++++++++++---- .../provider/ManualLocationProvider.kt | 2 ++ 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt b/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt index 71f73b29..1366d47b 100644 --- a/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt +++ b/app/src/main/java/org/blitzortung/android/location/LocationHandler.kt @@ -27,7 +27,6 @@ import org.blitzortung.android.app.R import org.blitzortung.android.app.view.PreferenceKey import org.blitzortung.android.app.view.get import org.blitzortung.android.location.provider.LocationProvider -import org.blitzortung.android.location.provider.ManagerLocationProvider import org.blitzortung.android.location.provider.createLocationProvider import org.blitzortung.android.protocol.ConsumerContainer import org.jetbrains.anko.longToast @@ -145,15 +144,11 @@ open class LocationHandler( } private fun updateProvider() { - shutdown() - provider?.run { - if (this is ManagerLocationProvider) { - backgroundMode = this@LocationHandler.backgroundMode - } + //Reconfigure the Provider only, when its running + if(isRunning) + reconfigureProvider(this@LocationHandler.backgroundMode) } - - start() } fun shutdown() { diff --git a/app/src/main/java/org/blitzortung/android/location/provider/GPSLocationProvider.kt b/app/src/main/java/org/blitzortung/android/location/provider/GPSLocationProvider.kt index 4437fe7d..f9e3cd26 100644 --- a/app/src/main/java/org/blitzortung/android/location/provider/GPSLocationProvider.kt +++ b/app/src/main/java/org/blitzortung/android/location/provider/GPSLocationProvider.kt @@ -13,7 +13,7 @@ class GPSLocationProvider(context: Context, : ManagerLocationProvider(context, backgroundMode, locationUpdate, LocationManager.GPS_PROVIDER) { override val minTime: Long - get() = if(backgroundMode) 1200 else 1000 + get() = if(isInBackground) 1200 else 1000 override val isPermissionGranted: Boolean get() = PermissionChecker.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED diff --git a/app/src/main/java/org/blitzortung/android/location/provider/LocationProvider.kt b/app/src/main/java/org/blitzortung/android/location/provider/LocationProvider.kt index 61bc5b9e..47dee4e5 100644 --- a/app/src/main/java/org/blitzortung/android/location/provider/LocationProvider.kt +++ b/app/src/main/java/org/blitzortung/android/location/provider/LocationProvider.kt @@ -33,6 +33,11 @@ abstract class LocationProvider(protected val locationUpdate: (Location?) -> Uni open fun shutdown() { isRunning = false + //Invalidate the current location, when the provider is stopped + sendLocationUpdate(null) + Log.v(Main.LOG_TAG, "LocationProvider.shutdown() type: $type" ) } + + abstract fun reconfigureProvider(isInBackground: Boolean) } \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/location/provider/ManagerLocationProvider.kt b/app/src/main/java/org/blitzortung/android/location/provider/ManagerLocationProvider.kt index e19962b2..2239ed11 100644 --- a/app/src/main/java/org/blitzortung/android/location/provider/ManagerLocationProvider.kt +++ b/app/src/main/java/org/blitzortung/android/location/provider/ManagerLocationProvider.kt @@ -11,7 +11,7 @@ import org.jetbrains.anko.locationManager abstract class ManagerLocationProvider( protected val context: Context, - var backgroundMode: Boolean = true, + protected var isInBackground: Boolean = true, locationUpdate: (Location?) -> Unit, override val type: String ) : LocationProvider(locationUpdate), LocationListener { @@ -19,10 +19,10 @@ abstract class ManagerLocationProvider( protected val locationManager = context.locationManager protected open val minTime: Long - get() = if (backgroundMode) 120000 else 20000 + get() = if (isInBackground) 120000 else 20000 protected open val minDistance: Float - get() = if (backgroundMode) 200f else 50f + get() = if (isInBackground) 200f else 50f override fun start() { //Don't start the LocationProvider if we dont have any permissions @@ -33,7 +33,7 @@ abstract class ManagerLocationProvider( super.start() - Log.v(Main.LOG_TAG, "ManagerLocationProvider.start() background: $backgroundMode, type: $type, minTime: $minTime, minDistance: $minDistance") + Log.v(Main.LOG_TAG, "ManagerLocationProvider.start() background: $isInBackground, type: $type, minTime: $minTime, minDistance: $minDistance") if (locationManager.allProviders.contains(type)) { locationManager.requestLocationUpdates(type, minTime, minDistance, this) @@ -79,5 +79,20 @@ abstract class ManagerLocationProvider( super.shutdown() } + override fun reconfigureProvider(isInBackground: Boolean) { + this.isInBackground = isInBackground + + if(!isRunning) { + Log.w(Main.LOG_TAG, "Provider MUST NOT be reconfigured when its not running") + + return + } + + Log.d(Main.LOG_TAG, "ManagerLocationProvider: Reconfigure provider, background: ${this.isInBackground}") + + locationManager.removeUpdates(this) + locationManager.requestLocationUpdates(type, minTime, minDistance, this) + } + abstract val isPermissionGranted: Boolean } diff --git a/app/src/main/java/org/blitzortung/android/location/provider/ManualLocationProvider.kt b/app/src/main/java/org/blitzortung/android/location/provider/ManualLocationProvider.kt index 78ace1bf..3247ec6f 100644 --- a/app/src/main/java/org/blitzortung/android/location/provider/ManualLocationProvider.kt +++ b/app/src/main/java/org/blitzortung/android/location/provider/ManualLocationProvider.kt @@ -54,4 +54,6 @@ class ManualLocationProvider(locationUpdate: (Location?) -> Unit, private val sh super.shutdown() } + + override fun reconfigureProvider(isInBackground: Boolean) { /* Nothing to do here */ } } \ No newline at end of file From e771beb8b714cb1630722b741a57f8105f2dd1d3 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Thu, 13 Jul 2017 17:17:24 +0200 Subject: [PATCH 16/35] Tapping onto the Alert-View inside the Map now displays the AlertDialog --- .../org/blitzortung/android/app/view/AlertView.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt b/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt index 3670e97e..03916ec3 100644 --- a/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt +++ b/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt @@ -25,13 +25,18 @@ import android.graphics.Paint.Style import android.location.Location import android.util.AttributeSet import android.util.Log +import android.view.MotionEvent import android.view.View import org.blitzortung.android.alert.AlertResult import org.blitzortung.android.alert.data.AlertSector import org.blitzortung.android.alert.event.AlertEvent import org.blitzortung.android.alert.event.AlertResultEvent +import org.blitzortung.android.app.AppService +import org.blitzortung.android.app.BOApplication import org.blitzortung.android.app.Main import org.blitzortung.android.app.R +import org.blitzortung.android.dialogs.AlertDialog +import org.blitzortung.android.dialogs.AlertDialogColorHandler import org.blitzortung.android.location.LocationEvent import org.blitzortung.android.map.overlay.color.ColorHandler import org.blitzortung.android.util.TabletAwareView @@ -90,6 +95,15 @@ class AlertView @JvmOverloads constructor( } background.color = 0xffb0b0b0.toInt() + + setOnTouchListener { view, motionEvent -> + if(motionEvent.action == MotionEvent.ACTION_UP) { + AlertDialog(context, AppService.instance, AlertDialogColorHandler(BOApplication.sharedPreferences)) + .show() + } + + return@setOnTouchListener true + } } fun enableDescriptionText() { From 146f2fae145288d463a97ac6ff2463014d9155cc Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 17 Jul 2017 11:34:01 +0200 Subject: [PATCH 17/35] Show AlertDialog after LongClick on AlertView instead of single Touch --- .../org/blitzortung/android/app/view/AlertView.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt b/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt index 03916ec3..309e74ef 100644 --- a/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt +++ b/app/src/main/java/org/blitzortung/android/app/view/AlertView.kt @@ -25,7 +25,6 @@ import android.graphics.Paint.Style import android.location.Location import android.util.AttributeSet import android.util.Log -import android.view.MotionEvent import android.view.View import org.blitzortung.android.alert.AlertResult import org.blitzortung.android.alert.data.AlertSector @@ -96,13 +95,11 @@ class AlertView @JvmOverloads constructor( background.color = 0xffb0b0b0.toInt() - setOnTouchListener { view, motionEvent -> - if(motionEvent.action == MotionEvent.ACTION_UP) { - AlertDialog(context, AppService.instance, AlertDialogColorHandler(BOApplication.sharedPreferences)) - .show() - } + setOnLongClickListener { + AlertDialog(context, AppService.instance, AlertDialogColorHandler(BOApplication.sharedPreferences)) + .show() - return@setOnTouchListener true + true } } From b4814eb69f4e573a275cd59b4bb5649d45d7d981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 17 Jul 2017 22:19:13 +0200 Subject: [PATCH 18/35] prepare beta release --- app/build.gradle | 4 ++-- .../android/app/components/VersionComponentTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 312bf555..a6829c2c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 192 - versionName "1.6-beta1" + versionCode 193 + versionName "1.6-beta2" multiDexEnabled true } buildTypes { diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index b925215b..542d14f8 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 192 - val CURRENT_VERSION_NAME = "1.6-beta1" + val CURRENT_VERSION_CODE = 193 + val CURRENT_VERSION_NAME = "1.6-beta2" } } \ No newline at end of file From 92bc941b9750ffee1d1378ecd325c3f0bdfa89f2 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Mon, 17 Jul 2017 23:02:53 +0200 Subject: [PATCH 19/35] Created Preference to keep the current zoom level when centering own location The new Preference allows the user to choose whether to keep the current zoom level during centering the map on the own location --- .../java/org/blitzortung/android/app/Main.kt | 22 +++++++++++++++---- .../android/app/view/PreferenceKey.kt | 3 ++- app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/preferences.xml | 7 ++++++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/app/Main.kt b/app/src/main/java/org/blitzortung/android/app/Main.kt index b8b3208d..02fce6ec 100644 --- a/app/src/main/java/org/blitzortung/android/app/Main.kt +++ b/app/src/main/java/org/blitzortung/android/app/Main.kt @@ -97,6 +97,9 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { private var currentResult: ResultEvent? = null + private val keepZoomOnGotoOwnLocation: Boolean + inline get() = BOApplication.sharedPreferences.get(PreferenceKey.KEEP_ZOOM_GOTO_OWN_LOCATION, false) + val dataEventConsumer: (DataEvent) -> Unit = { event -> if (event is RequestStartedEvent) { Log.d(Main.LOG_TAG, "Main.onDataUpdate() received request started event") @@ -276,9 +279,16 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { if (alertHandler.alertEnabled) { val currentLocation = alertHandler.currentLocation if (currentLocation != null) { - var radius = determineTargetZoomRadius(alertHandler) + val diameter = if(!keepZoomOnGotoOwnLocation) { + var radius = determineTargetZoomRadius(alertHandler) + + //Calculate the new diameter + 1.5f * 2f * radius + } else { + //User doesn't want to zoom, so we do not provide a diameter + null + } - val diameter = 1.5f * 2f * radius animateToLocationAndVisibleSize(currentLocation.longitude, currentLocation.latitude, diameter) } } @@ -321,14 +331,18 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { } } - private fun animateToLocationAndVisibleSize(longitude: Double, latitude: Double, diameter: Float) { + private fun animateToLocationAndVisibleSize(longitude: Double, latitude: Double, diameter: Float?) { Log.d(Main.LOG_TAG, "Main.animateAndZoomTo() %.4f, %.4f, %.0fkm".format(longitude, latitude, diameter)) val mapView = mapView val controller = mapView.controller val startZoomLevel = mapView.zoomLevel - val targetZoomLevel = mapView.calculateTargetZoomLevel(diameter * 1000f) + //If no diameter is provided, we keep the current zoomLevel + val targetZoomLevel = if(diameter is Float) + mapView.calculateTargetZoomLevel(diameter * 1000f) + else + startZoomLevel controller.animateTo(GeoPoint((latitude * 1e6).toInt(), (longitude * 1e6).toInt()), { if (startZoomLevel != targetZoomLevel) { diff --git a/app/src/main/java/org/blitzortung/android/app/view/PreferenceKey.kt b/app/src/main/java/org/blitzortung/android/app/view/PreferenceKey.kt index da820360..37648742 100644 --- a/app/src/main/java/org/blitzortung/android/app/view/PreferenceKey.kt +++ b/app/src/main/java/org/blitzortung/android/app/view/PreferenceKey.kt @@ -49,7 +49,8 @@ enum class PreferenceKey(val key: String) { HISTORIC_TIMESTEP("historic_timestep"), LOCATION_MODE("location_mode"), LOCATION_LONGITUDE("location_longitude"), - LOCATION_LATITUDE("location_latitude"); + LOCATION_LATITUDE("location_latitude"), + KEEP_ZOOM_GOTO_OWN_LOCATION("keep_zoom_goto_own_location"); override fun toString(): String { return key diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d4a37310..6c9bc943 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -347,4 +347,6 @@ Eigener Standort Größe des Standort-Symbols Einstellung der Größe des Standort-Symbols + Zoom beibehalten + Einstellung zur Beibehaltung des aktuellen Zooms beim Zentrieren des eigenen Standorts \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11121c68..2b61c15f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -352,4 +352,6 @@ Own location Own location symbol size Set the size of the own location symbol + Setting to keep the current zoom when centering the own location + Keep zoom \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 13ae5d2e..c09d1467 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -104,6 +104,13 @@ min="50" /> + Date: Tue, 18 Jul 2017 18:11:44 +0200 Subject: [PATCH 20/35] Fixed bug inside StrikeListOverlay when strikeList is empty --- .../org/blitzortung/android/map/overlay/StrikeListOverlay.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 84ccea9f..da03380a 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -100,8 +100,8 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle val expireTime = referenceTime - parameters.intervalDuration * 60 * 1000 val sizeBefore = strikeList.size - val first_time = strikeList.first().timestamp - val difference = first_time - expireTime + val first_time = strikeList.firstOrNull()?.timestamp + val difference = first_time?.let { it - expireTime } strikeList.removeAll { it.timestamp < expireTime } Log.v(Main.LOG_TAG, "StrikesListOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore (first: $first_time, difference: $difference, ref: $referenceTime") } From a995feac70b72d9fbb8de2ad0b011ad425cb70d2 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Tue, 18 Jul 2017 19:43:48 +0200 Subject: [PATCH 21/35] Calculate totalNumbersOfStrikes inside StrikeListOverlay only when the strikeList itself has changed Before that commit, every second the new status line was created, the totalNumberOfStrikes was calculated which consumes alot of cpu when there are more than 15k of lightnings. From now on, the totalNumberOfStrikes will be calculated only once when the strikeList has been changed --- .../android/map/overlay/StrikeListOverlay.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index da03380a..8da1b037 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -73,6 +73,8 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle fun addStrikes(strikes: List) { strikeList.addAll(strikes.map { StrikeOverlay(it) }) + + updateTotalNumberOfStrikes() } private fun drawDataAreaRect(canvas: Canvas, mapView: MapView, paint: Paint) { @@ -104,10 +106,14 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle val difference = first_time?.let { it - expireTime } strikeList.removeAll { it.timestamp < expireTime } Log.v(Main.LOG_TAG, "StrikesListOverlay.expireStrikes() expired ${sizeBefore - strikeList.size} from $sizeBefore (first: $first_time, difference: $difference, ref: $referenceTime") + + updateTotalNumberOfStrikes() } fun clear() { strikeList.clear() + + updateTotalNumberOfStrikes() } fun updateZoomLevel(zoomLevel: Int) { @@ -184,8 +190,12 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle return false }*/ - val totalNumberOfStrikes: Int - get() = strikeList.fold(0, { previous, item -> previous + item.multiplicity }) + private fun updateTotalNumberOfStrikes() { + totalNumberOfStrikes = strikeList.fold(0, { previous, item -> previous + item.multiplicity }) + } + + var totalNumberOfStrikes: Int = 0 + private set override val name: String get() = layerOverlayComponent.name From d3679537175d9be38a9f5ca1e273ebf3e14f1083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Sat, 22 Jul 2017 12:14:49 +0200 Subject: [PATCH 22/35] prepare release --- app/build.gradle | 4 ++-- .../android/app/components/VersionComponentTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a6829c2c..ea3a0e9d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 193 - versionName "1.6-beta2" + versionCode 195 + versionName "1.6-beta3" multiDexEnabled true } buildTypes { diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index 542d14f8..a29db46f 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 193 - val CURRENT_VERSION_NAME = "1.6-beta2" + val CURRENT_VERSION_CODE = 195 + val CURRENT_VERSION_NAME = "1.6-beta3" } } \ No newline at end of file From 0e9dbc195920654edd839887a0401feedf321adb Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 23 Jul 2017 13:44:20 +0200 Subject: [PATCH 23/35] Set the defaultValue as currentValue during initalization of SlidePreference onSetInitialValue is only called, when a value is actually persisted. If we still use the default value of a preference, onSetInitialValue is never called. Thats why we have to set the currentValue ourself and it will be overriden later if onSetInitialValue is called --- .../org/blitzortung/android/preferences/SlidePreferences.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/blitzortung/android/preferences/SlidePreferences.kt b/app/src/main/java/org/blitzortung/android/preferences/SlidePreferences.kt index 44c8f5dc..efe5d640 100644 --- a/app/src/main/java/org/blitzortung/android/preferences/SlidePreferences.kt +++ b/app/src/main/java/org/blitzortung/android/preferences/SlidePreferences.kt @@ -34,12 +34,15 @@ class SlidePreferences(context: Context, attrs: AttributeSet) : DialogPreference private val maximumValue: Int private var valueText: TextView? = null private var slider: SeekBar? = null - private var currentValue: Int = 0 + private var currentValue: Int private var minimumValue: Int init { unitSuffix = " " + attrs.getAttributeValue(ATTRIBUTE_NAMESPACE, "text") defaultValue = attrs.getAttributeIntValue(ATTRIBUTE_NAMESPACE, "defaultValue", 30) + //Initial value is the default value. + //When there is a value presisted, it will be set afterwards through onSetInitialValue + currentValue = defaultValue minimumValue = attrs.getAttributeIntValue(null, "min", 0) //If there is a minimum value, we always add the minimum-value to the slider From ee62efeedd9402116187299d9ad3438a61e8cb33 Mon Sep 17 00:00:00 2001 From: Andreas Sinz Date: Sun, 23 Jul 2017 21:21:37 +0200 Subject: [PATCH 24/35] Readded StrikePopup on Tap --- .../blitzortung/android/map/StrikePopup.kt | 28 +++++++++++++ .../android/map/overlay/LightningShape.kt | 4 ++ .../android/map/overlay/RasterShape.kt | 12 ++++++ .../android/map/overlay/StrikeListOverlay.kt | 42 ++++++++++--------- .../android/map/overlay/StrikeOverlay.kt | 12 +++++- .../android/map/overlay/StrikeShape.kt | 11 +++++ 6 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/org/blitzortung/android/map/StrikePopup.kt diff --git a/app/src/main/java/org/blitzortung/android/map/StrikePopup.kt b/app/src/main/java/org/blitzortung/android/map/StrikePopup.kt new file mode 100644 index 00000000..8da9c9a6 --- /dev/null +++ b/app/src/main/java/org/blitzortung/android/map/StrikePopup.kt @@ -0,0 +1,28 @@ +package org.blitzortung.android.map + +import android.text.format.DateFormat +import android.view.View +import android.widget.TextView +import org.blitzortung.android.app.R +import org.blitzortung.android.map.overlay.RasterShape +import org.blitzortung.android.map.overlay.StrikeOverlay +import org.blitzortung.android.map.overlay.StrikeShape + + +fun createStrikePopUp(popUp: View, strikeOverlay: StrikeOverlay): View { + var result = DateFormat.format("kk:mm:ss", strikeOverlay.timestamp) as String + + if (strikeOverlay.shape is RasterShape) { + result += ", #%d".format(strikeOverlay.multiplicity) + } else if (strikeOverlay.shape is StrikeShape) { + result += " (%.4f %.4f)".format(strikeOverlay.center.longitudeE6 / 1e6, strikeOverlay.center.latitudeE6 / 1e6) + } + + with(popUp.findViewById(R.id.popup_text) as TextView) { + setBackgroundColor(-2013265920) + setPadding(5, 5, 5, 5) + setText(result) + } + + return popUp +} \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt index d316e8ad..4c90583e 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/LightningShape.kt @@ -2,8 +2,12 @@ package org.blitzortung.android.map.overlay import android.graphics.Canvas import android.graphics.Paint +import com.google.android.maps.GeoPoint import com.google.android.maps.MapView +import com.google.android.maps.Projection interface LightningShape { fun draw(canvas: Canvas, mapView: MapView, paint: Paint) + + fun isPointInside(tappedGeoPoint: GeoPoint, projection: Projection): Boolean } \ No newline at end of file diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt index 8ecad3b0..93829aaa 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/RasterShape.kt @@ -25,6 +25,7 @@ import android.graphics.Point import android.graphics.RectF import com.google.android.maps.GeoPoint import com.google.android.maps.MapView +import com.google.android.maps.Projection class RasterShape(private val center: GeoPoint) : LightningShape { @@ -71,6 +72,17 @@ class RasterShape(private val center: GeoPoint) : LightningShape { } } + override fun isPointInside(tappedGeoPoint: GeoPoint, projection: Projection): Boolean { + val shapeCenter = Point() + projection.toPixels(center, shapeCenter) + + val tappedPoint = Point() + projection.toPixels(tappedGeoPoint, tappedPoint) + + return tappedPoint.x >= shapeCenter.x + size.left && tappedPoint.x <= shapeCenter.x + size.right + && tappedPoint.y >= shapeCenter.y + size.top && tappedPoint.y <= shapeCenter.y + size.bottom + } + fun update(topLeft: Point, bottomRight: Point, color: Int, multiplicity: Int, textColor: Int) { val x1 = Math.min(topLeft.x.toFloat(), -MIN_SIZE) val y1 = Math.min(topLeft.y.toFloat(), -MIN_SIZE) diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt index 8da1b037..ef74fb94 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeListOverlay.kt @@ -22,6 +22,7 @@ import android.graphics.Canvas import android.graphics.Paint import android.graphics.Paint.Style import android.util.Log +import android.view.ViewGroup import com.google.android.maps.GeoPoint import com.google.android.maps.MapView import com.google.android.maps.Overlay @@ -31,7 +32,9 @@ import org.blitzortung.android.data.Parameters import org.blitzortung.android.data.beans.RasterParameters import org.blitzortung.android.data.beans.Strike import org.blitzortung.android.map.OwnMapActivity +import org.blitzortung.android.map.OwnMapView import org.blitzortung.android.map.components.LayerOverlayComponent +import org.blitzortung.android.map.createStrikePopUp import org.blitzortung.android.map.overlay.color.ColorHandler import org.blitzortung.android.map.overlay.color.StrikeColorHandler @@ -123,10 +126,26 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle } } - override fun onTap(p0: GeoPoint?, p1: MapView?): Boolean { - //TODO Implement onTap for the different strikes + override fun onTap(point: GeoPoint, map: MapView): Boolean { Log.d(Main.LOG_TAG, "Tapped on StrikeList") - return super.onTap(p0, p1) + + val strikeTapped = strikeList.firstOrNull { it.pointIsInside(point, map.projection) } + + val popup = (map as OwnMapView).popup + map.removeView(popup) + + if(strikeTapped != null) { + val newPopup = createStrikePopUp(popup, strikeTapped) + + val mapParams = MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, + point, 0, 0, MapView.LayoutParams.BOTTOM_CENTER) + + map.addView(newPopup, mapParams) + + return true + } + + return false } fun refresh() { @@ -173,23 +192,6 @@ class StrikeListOverlay(private val mapActivity: OwnMapActivity, val colorHandle return parameters.isRealtime() } - /*override fun onTap(index: Int): Boolean { - val item = strikeList[index] - if (item.point != null && item.timestamp > 0) { - var result = DateFormat.format("kk:mm:ss", item.timestamp) as String - - if (item.shape is RasterShape) { - result += ", #%d".format(item.multiplicity) - } else if (item.shape is StrikeShape) { - result += " (%.4f %.4f)".format(item.longitude, item.latitude) - } - - showPopup(item.point, result) - return true - } - return false - }*/ - private fun updateTotalNumberOfStrikes() { totalNumberOfStrikes = strikeList.fold(0, { previous, item -> previous + item.multiplicity }) } diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt index 36a97435..c51392ed 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeOverlay.kt @@ -3,9 +3,14 @@ package org.blitzortung.android.map.overlay import android.graphics.Canvas import android.graphics.Paint import android.graphics.Point +import android.text.format.DateFormat +import android.view.View +import android.view.ViewGroup +import android.widget.TextView import com.google.android.maps.GeoPoint import com.google.android.maps.MapView import com.google.android.maps.Projection +import org.blitzortung.android.app.R import org.blitzortung.android.data.Coordsys import org.blitzortung.android.data.beans.RasterParameters import org.blitzortung.android.data.beans.Strike @@ -13,7 +18,7 @@ import org.blitzortung.android.data.beans.Strike class StrikeOverlay(strike: Strike) { val timestamp: Long = strike.timestamp val multiplicity = strike.multiplicity - private val center: GeoPoint = Coordsys.toMapCoords(strike.longitude, strike.latitude) + val center: GeoPoint = Coordsys.toMapCoords(strike.longitude, strike.latitude) var shape: LightningShape? = null @@ -56,6 +61,11 @@ class StrikeOverlay(strike: Strike) { this.shape = shape } + fun pointIsInside(point: GeoPoint, projection: Projection): Boolean { + return shape?.isPointInside(point, projection) + ?: false + } + companion object { private val centerPoint: Point = Point() private val topLeft: Point = Point() diff --git a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt index 4721b948..b67acb6a 100644 --- a/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt +++ b/app/src/main/java/org/blitzortung/android/map/overlay/StrikeShape.kt @@ -23,8 +23,19 @@ import android.graphics.Paint import android.graphics.Point import com.google.android.maps.GeoPoint import com.google.android.maps.MapView +import com.google.android.maps.Projection class StrikeShape(private val center: GeoPoint) : LightningShape { + override fun isPointInside(tappedGeoPoint: GeoPoint, projection: Projection): Boolean { + val shapeCenter = Point() + projection.toPixels(center, shapeCenter) + + val tappedPoint = Point() + projection.toPixels(tappedGeoPoint, tappedPoint) + + return tappedPoint.x >= shapeCenter.x - size / 2 && tappedPoint.x <= shapeCenter.x + size / 2 + && tappedPoint.y >= shapeCenter.y - size / 2 && tappedPoint.y <= shapeCenter.y + size / 2 + } private var size: Float = 0.toFloat() private var color: Int = 0 From 8719a34b1cfcd149d4bb9029c49b02f111a9249f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Sun, 8 Apr 2018 23:43:27 +0200 Subject: [PATCH 25/35] update dependency versions --- app/build.gradle | 4 ++-- build.gradle | 4 +++- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 55b6b289..b24742fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = "1.1.4-2" + ext.kotlin_version = "1.2.31" repositories { mavenCentral() } @@ -53,7 +53,7 @@ dependencies { compile "org.jetbrains.anko:anko-sdk23:$anko_version" // sdk19, sdk21, sdk23 are also available compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version" // For appcompat-v7 bindings testCompile 'junit:junit:4.12' - testCompile 'org.assertj:assertj-core:3.8.0' + testCompile 'org.assertj:assertj-core:3.9.1' testCompile 'com.nhaarman:mockito-kotlin:1.5.0' testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" diff --git a/build.gradle b/build.gradle index 13365ce5..7791be13 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.1.0' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.1' // NOTE: Do not place your application dependencies here; they belong @@ -16,6 +17,7 @@ buildscript { allprojects { repositories { jcenter() + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c14e3fa7..236751fd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Mar 05 21:20:31 CET 2017 +#Sun Apr 08 23:33:32 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip From e713359a8da345e57f6e4e37f8dd1401f92c3e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Sun, 8 Apr 2018 23:47:53 +0200 Subject: [PATCH 26/35] fix version --- app/build.gradle | 2 +- .../blitzortung/android/app/components/VersionComponentTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b24742fa..d20f3e71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 197 + versionCode 196 versionName "1.6-beta4" multiDexEnabled true } diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index 4fea5479..8026d257 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 197 + val CURRENT_VERSION_CODE = 196 val CURRENT_VERSION_NAME = "1.6-beta4" } } \ No newline at end of file From 3bafd143d8a2dc76f9fea8fe7324ab154e82ad7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 00:13:19 +0200 Subject: [PATCH 27/35] handle non existent Blitzortung data files --- .../BlitzortungHttpDataProvider.kt | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/blitzortung/android/data/provider/blitzortung/BlitzortungHttpDataProvider.kt b/app/src/main/java/org/blitzortung/android/data/provider/blitzortung/BlitzortungHttpDataProvider.kt index 2bdadd19..9bab4e67 100644 --- a/app/src/main/java/org/blitzortung/android/data/provider/blitzortung/BlitzortungHttpDataProvider.kt +++ b/app/src/main/java/org/blitzortung/android/data/provider/blitzortung/BlitzortungHttpDataProvider.kt @@ -30,6 +30,9 @@ import org.blitzortung.android.data.provider.DataProvider import org.blitzortung.android.data.provider.DataProviderType import org.blitzortung.android.data.provider.result.ResultEvent import java.io.BufferedReader +import java.io.ByteArrayInputStream +import java.io.FileNotFoundException +import java.io.InputStreamReader import java.net.* import java.util.* import java.util.zip.GZIPInputStream @@ -62,7 +65,7 @@ class BlitzortungHttpDataProvider @JvmOverloads constructor( val urlString = urlFormatter.getUrlFor(type, region, intervalTime, useGzipCompression) - Log.v(Main.LOG_TAG, "BlitzortungHttpDataProvider.readFromUrl() $urlString") + try { val url: URL @@ -78,10 +81,20 @@ class BlitzortungHttpDataProvider @JvmOverloads constructor( reader = inputStream.bufferedReader() } catch (e: Exception) { - Log.w(Main.LOG_TAG, "BlitzortungHttpDataProvider.readFromUrl() URL $urlString failed") - throw RuntimeException(e) + when (e) { + is FileNotFoundException -> { + Log.w(Main.LOG_TAG, "BlitzortungHttpDataProvider.readFromUrl() $urlString not found") + return BufferedReader(InputStreamReader(ByteArrayInputStream("".toByteArray()))) + } + else -> { + Log.w(Main.LOG_TAG, "BlitzortungHttpDataProvider.readFromUrl() $urlString failed") + throw RuntimeException(e) + } + } } + Log.v(Main.LOG_TAG, "BlitzortungHttpDataProvider.readFromUrl() $urlString") + return reader } From 3c5609a62c923d8d99bcbeddab1f84ce3380ff07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 00:14:08 +0200 Subject: [PATCH 28/35] update version --- app/build.gradle | 2 +- .../blitzortung/android/app/components/VersionComponentTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d20f3e71..b24742fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 196 + versionCode 197 versionName "1.6-beta4" multiDexEnabled true } diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index 8026d257..4fea5479 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 196 + val CURRENT_VERSION_CODE = 197 val CURRENT_VERSION_NAME = "1.6-beta4" } } \ No newline at end of file From f90a37a849cf077d2078cb8520ab5e6ddc0a41c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 00:16:20 +0200 Subject: [PATCH 29/35] update version --- app/build.gradle | 2 +- .../blitzortung/android/app/components/VersionComponentTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b24742fa..22526d73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { applicationId "org.blitzortung.android.app" minSdkVersion 9 targetSdkVersion 25 - versionCode 197 + versionCode 198 versionName "1.6-beta4" multiDexEnabled true } diff --git a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt index 4fea5479..c50af640 100644 --- a/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt +++ b/app/src/test/java/org/blitzortung/android/app/components/VersionComponentTest.kt @@ -61,7 +61,7 @@ class VersionComponentTest { } companion object { - val CURRENT_VERSION_CODE = 197 + val CURRENT_VERSION_CODE = 198 val CURRENT_VERSION_NAME = "1.6-beta4" } } \ No newline at end of file From 3e3dc1adb6e6af461c042459d7bbddcbe9246f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 21:20:04 +0200 Subject: [PATCH 30/35] disable detail mode --- app/src/main/java/org/blitzortung/android/app/Main.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/blitzortung/android/app/Main.kt b/app/src/main/java/org/blitzortung/android/app/Main.kt index 02fce6ec..0aceb61d 100644 --- a/app/src/main/java/org/blitzortung/android/app/Main.kt +++ b/app/src/main/java/org/blitzortung/android/app/Main.kt @@ -210,7 +210,7 @@ class Main : OwnMapActivity(), OnSharedPreferenceChangeListener { buttonColumnHandler.addAllElements(historyController.getButtons(), ButtonGroup.DATA_UPDATING) - setupDetailModeButton() + //setupDetailModeButton() buttonColumnHandler.updateButtonColumn() From f1df24311e9d7443fd2dff0ea96bd69fcdf3964c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 21:25:39 +0200 Subject: [PATCH 31/35] try to fix travis build --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b8aaed33..ec0acdde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,4 @@ -sudo: false - language: android -# Gradle needs JDK8 -jdk: oraclejdk8 - android: components: # Uncomment the lines below if you want to From 80b53213a6965fce3bb3ee12e65cb2ea6c3edeb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 21:30:40 +0200 Subject: [PATCH 32/35] update build tool --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 22526d73..0c643bba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ apply plugin: 'jacoco' apply plugin: 'com.github.kt3k.coveralls' android { - buildToolsVersion '25.0.3' + buildToolsVersion '27.0.3' defaultConfig { compileSdkVersion "Google Inc.:Google APIs:24" applicationId "org.blitzortung.android.app" From e22437798b0f430837b2fa0463f24fc42c708c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 21:35:24 +0200 Subject: [PATCH 33/35] accept build tool license --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec0acdde..ec5c511e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ android: - tools # The BuildTools version used by your project - - build-tools-25.0.3 + - build-tools-27.0.3 # The SDK version used to compile your project - android-24 From ab2a8d77bbcad7e91729e45f43435fdf11661927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 21:43:56 +0200 Subject: [PATCH 34/35] update jacoco --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0c643bba..9378801e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ android { } jacoco { - toolVersion = "0.7.9" + toolVersion = "0.8.1" } def anko_version = '0.9.1' diff --git a/build.gradle b/build.gradle index 7791be13..32ba26b3 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.1.0' - classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.1' + classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 1e2927c0f9b5b3a26d083e9ca1fc032f96f1a496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Mon, 9 Apr 2018 22:09:42 +0200 Subject: [PATCH 35/35] cleanup project --- app/build.gradle | 30 ++++++++++-------------------- build.gradle | 6 ++++-- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9378801e..807250c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,3 @@ -buildscript { - ext.kotlin_version = "1.2.31" - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' @@ -48,15 +38,15 @@ jacoco { def anko_version = '0.9.1' dependencies { - compile 'com.android.support:appcompat-v7:25.3.1' - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile "org.jetbrains.anko:anko-sdk23:$anko_version" // sdk19, sdk21, sdk23 are also available - compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version" // For appcompat-v7 bindings - testCompile 'junit:junit:4.12' - testCompile 'org.assertj:assertj-core:3.9.1' - testCompile 'com.nhaarman:mockito-kotlin:1.5.0' - testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" - testCompile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - testCompile 'org.robolectric:robolectric:3.4.2' + implementation 'com.android.support:appcompat-v7:25.3.1' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.anko:anko-sdk23:$anko_version" // sdk19, sdk21, sdk23 are also available + implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version" // For appcompat-v7 bindings + testImplementation 'junit:junit:4.12' + testImplementation 'org.assertj:assertj-core:3.9.1' + testImplementation 'com.nhaarman:mockito-kotlin:1.5.0' + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" + testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + testImplementation 'org.robolectric:robolectric:3.4.2' } diff --git a/build.gradle b/build.gradle index 32ba26b3..f9438130 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext.kotlin_version = '1.2.31' repositories { - jcenter() google() + jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' // NOTE: Do not place your application dependencies here; they belong @@ -16,8 +18,8 @@ buildscript { allprojects { repositories { - jcenter() google() + jcenter() } }