From 5db1f3bff908fd0aa82b84e15d0ec2b591f9fe74 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Tue, 4 Aug 2020 16:54:53 +0100 Subject: [PATCH] Fixed selected sat issue, minor code cleanup --- .../data/{SatOverlayItem.kt => SatItem.kt} | 2 +- .../look4sat/ui/fragments/MapOsmFragment.kt | 118 +++++++++--------- app/src/main/res/values/colors.xml | 2 +- 3 files changed, 62 insertions(+), 60 deletions(-) rename app/src/main/java/com/rtbishop/look4sat/data/{SatOverlayItem.kt => SatItem.kt} (75%) diff --git a/app/src/main/java/com/rtbishop/look4sat/data/SatOverlayItem.kt b/app/src/main/java/com/rtbishop/look4sat/data/SatItem.kt similarity index 75% rename from app/src/main/java/com/rtbishop/look4sat/data/SatOverlayItem.kt rename to app/src/main/java/com/rtbishop/look4sat/data/SatItem.kt index 86efd905..1d98c407 100644 --- a/app/src/main/java/com/rtbishop/look4sat/data/SatOverlayItem.kt +++ b/app/src/main/java/com/rtbishop/look4sat/data/SatItem.kt @@ -3,7 +3,7 @@ package com.rtbishop.look4sat.data import org.osmdroid.api.IGeoPoint import org.osmdroid.views.overlay.OverlayItem -data class SatOverlayItem( +data class SatItem( val name: String, val description: String, val position: IGeoPoint, diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapOsmFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapOsmFragment.kt index 296eed26..f57c04f3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapOsmFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapOsmFragment.kt @@ -6,6 +6,7 @@ import android.graphics.ColorMatrixColorFilter import android.graphics.Paint import android.os.Bundle import android.view.View +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -16,7 +17,7 @@ import com.rtbishop.look4sat.Look4SatApp import com.rtbishop.look4sat.R import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.data.Result -import com.rtbishop.look4sat.data.SatOverlayItem +import com.rtbishop.look4sat.data.SatItem import com.rtbishop.look4sat.data.SatPass import com.rtbishop.look4sat.databinding.FragmentMapOsmBinding import com.rtbishop.look4sat.ui.MainActivity @@ -43,21 +44,10 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { private lateinit var mainActivity: MainActivity private lateinit var viewModel: SharedViewModel private lateinit var binding: FragmentMapOsmBinding - - private val trackPaint = Paint().apply { - strokeWidth = 2f - style = Paint.Style.STROKE - color = Color.parseColor("#D50000") - strokeCap = Paint.Cap.ROUND - strokeJoin = Paint.Join.ROUND - isAntiAlias = true - } - - private val rangePaint = Paint().apply { - style = Paint.Style.FILL_AND_STROKE - color = Color.parseColor("#26FFE082") - isAntiAlias = true - } + private lateinit var trackPaint: Paint + private lateinit var footprintPaint: Paint + private lateinit var selectedPass: SatPass + private val dateNow = Date(System.currentTimeMillis()) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -69,6 +59,21 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { val prefs = PreferenceManager.getDefaultSharedPreferences(mainActivity.applicationContext) Configuration.getInstance().load(mainActivity.applicationContext, prefs) + trackPaint = Paint().apply { + strokeWidth = 2f + style = Paint.Style.STROKE + color = ContextCompat.getColor(mainActivity, R.color.satTrack) + strokeCap = Paint.Cap.ROUND + strokeJoin = Paint.Join.ROUND + isAntiAlias = true + } + + footprintPaint = Paint().apply { + style = Paint.Style.FILL_AND_STROKE + color = ContextCompat.getColor(mainActivity, R.color.satOsmTemp) + isAntiAlias = true + } + setupMapView() setupObservers() } @@ -91,28 +96,25 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { val tilesFilter = getColorFilter(Color.parseColor("#D50000")) overlayManager.tilesOverlay.setColorFilter(tilesFilter) - // fill overlays + // add overlays: 0 - GSP, 1 - SatTrack, 2 - SatFootprint, 3 - SatIcons val layers = listOf(FolderOverlay(), FolderOverlay(), FolderOverlay(), FolderOverlay()) overlays.addAll(layers) } } private fun getWikimediaTileSource(): OnlineTileSourceBase { - val wikimediaSourceArray = arrayOf("https://maps.wikimedia.org/osm-intl/") - val wikimediaCopyright = resources.getString(R.string.osmCopyright) - val wikimediaSourcePolicy = TileSourcePolicy( - 1, TileSourcePolicy.FLAG_NO_BULK and TileSourcePolicy.FLAG_NO_PREVENTIVE and - TileSourcePolicy.FLAG_USER_AGENT_MEANINGFUL and TileSourcePolicy.FLAG_USER_AGENT_NORMALIZED - ) return XYTileSource( "wikimedia", 2, 6, 256, ".png", - wikimediaSourceArray, - wikimediaCopyright, - wikimediaSourcePolicy + arrayOf("https://maps.wikimedia.org/osm-intl/"), + resources.getString(R.string.osmCopyright), + TileSourcePolicy( + 1, TileSourcePolicy.FLAG_NO_BULK and TileSourcePolicy.FLAG_NO_PREVENTIVE and + TileSourcePolicy.FLAG_USER_AGENT_MEANINGFUL and TileSourcePolicy.FLAG_USER_AGENT_NORMALIZED + ) ) } @@ -128,8 +130,11 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { viewModel.getPassList().observe(viewLifecycleOwner, Observer { satPasses -> when (satPasses) { is Result.Success -> { - val filteredPasses = satPasses.data.distinctBy { it.tle } - setupSatOverlay(filteredPasses) + if (satPasses.data.isNotEmpty()) { + val filteredPasses = satPasses.data.distinctBy { it.tle } + selectedPass = filteredPasses[0] + setupSatOverlay(filteredPasses) + } } } }) @@ -149,18 +154,19 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { private fun setupSatOverlay(passList: List) { lifecycleScope.launch { while (true) { - val dateNow = Date(System.currentTimeMillis()) - binding.mapView.overlays[3] = getSatOverlay(passList, dateNow) + dateNow.time = System.currentTimeMillis() + binding.mapView.overlays[3] = getSatIcons(passList) + binding.mapView.overlays[2] = getSatFootprint(selectedPass) binding.mapView.invalidate() delay(3000) } } } - private suspend fun getSatOverlay(passList: List, dateNow: Date): Overlay = + private suspend fun getSatIcons(passList: List): Overlay = withContext(Dispatchers.Default) { - val satIcon = resources.getDrawable(R.drawable.ic_map_sat, mainActivity.theme) - val overlayItems = mutableListOf() + val icon = resources.getDrawable(R.drawable.ic_map_sat, mainActivity.theme) + val items = mutableListOf() passList.forEach { val satPos = it.predictor.getSatPos(dateNow) @@ -171,44 +177,40 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { else if (lat < -85.05) lat = -85.05 if (lon > 180.0) lon -= 360.0 - val satItem = SatOverlayItem(it.tle.name, it.tle.name, GeoPoint(lat, lon), it) + val satItem = SatItem(it.tle.name, it.tle.name, GeoPoint(lat, lon), it) satItem.markerHotspot = OverlayItem.HotspotPlace.CENTER - overlayItems.add(satItem) + items.add(satItem) } - val listener = object : ItemizedIconOverlay.OnItemGestureListener { - override fun onItemLongPress(index: Int, item: SatOverlayItem): Boolean { + val listener = object : ItemizedIconOverlay.OnItemGestureListener { + override fun onItemLongPress(index: Int, item: SatItem): Boolean { return true } - override fun onItemSingleTapUp(index: Int, item: SatOverlayItem): Boolean { - setSatDetails(item.pass, dateNow) + override fun onItemSingleTapUp(index: Int, item: SatItem): Boolean { + selectedPass = item.pass + setSatDetails(item.pass) return true } } - return@withContext ItemizedIconOverlay( - overlayItems, - satIcon, - listener, - mainActivity - ) + return@withContext ItemizedIconOverlay(items, icon, listener, mainActivity) } - private fun setSatDetails(pass: SatPass, dateNow: Date) { - binding.mapView.overlays[1] = getSatTrack(pass, dateNow) - binding.mapView.overlays[2] = getSatFootprint(pass, dateNow) + private fun setSatDetails(pass: SatPass) { + binding.mapView.overlays[1] = getSatTrack(pass) + binding.mapView.overlays[2] = getSatFootprint(pass) // showSatInfo(pass) binding.mapView.invalidate() } - private fun getSatTrack(pass: SatPass, dateNow: Date): Overlay { + private fun getSatTrack(pass: SatPass): Overlay { val period = (24 * 60 / pass.tle.meanmo).toInt() val positions = pass.predictor.getPositions(dateNow, 20, 0, period * 3) val trackOverlay = FolderOverlay() val trackPoints = mutableListOf() - var oldLon = 0.0 + var oldLon = 0.0 positions.forEach { val newLat = Math.toDegrees(it.latitude) var newLon = Math.toDegrees(it.longitude) @@ -236,14 +238,11 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { return trackOverlay } - private fun getSatFootprint(pass: SatPass, dateNow: Date): Overlay { - val rangePoints = mutableListOf() + private fun getSatFootprint(pass: SatPass): Overlay { val rangeCircle = pass.predictor.getSatPos(dateNow).rangeCircle + val rangePoints = mutableListOf() var zeroPoint = GeoPoint(0.0, 0.0) - val satRange = Polygon().apply { - fillPaint.set(rangePaint) - outlinePaint.set(rangePaint) - } + rangeCircle.withIndex().forEach { var lat = it.value.lat var lon = it.value.lon @@ -256,9 +255,12 @@ class MapOsmFragment : Fragment(R.layout.fragment_map_osm) { rangePoints.add(GeoPoint(lat, lon)) } rangePoints.add(zeroPoint) - satRange.points = rangePoints - return satRange + return Polygon().apply { + fillPaint.set(footprintPaint) + outlinePaint.set(footprintPaint) + points = rangePoints + } } private fun getColorFilter(targetColor: Int): ColorMatrixColorFilter { diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ed96ac24..51469a07 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -28,7 +28,7 @@ #D50000 #FFE082 #80FFE082 - #26FFE082 + #26FFE082 #202124 #2E2F32