Fixed selected sat issue, minor code cleanup

pull/33/head
Arty Bishop 2020-08-04 16:54:53 +01:00
rodzic e003141637
commit 5db1f3bff9
3 zmienionych plików z 62 dodań i 60 usunięć

Wyświetl plik

@ -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,

Wyświetl plik

@ -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<SatPass>) {
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<SatPass>, dateNow: Date): Overlay =
private suspend fun getSatIcons(passList: List<SatPass>): Overlay =
withContext(Dispatchers.Default) {
val satIcon = resources.getDrawable(R.drawable.ic_map_sat, mainActivity.theme)
val overlayItems = mutableListOf<SatOverlayItem>()
val icon = resources.getDrawable(R.drawable.ic_map_sat, mainActivity.theme)
val items = mutableListOf<SatItem>()
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<SatOverlayItem> {
override fun onItemLongPress(index: Int, item: SatOverlayItem): Boolean {
val listener = object : ItemizedIconOverlay.OnItemGestureListener<SatItem> {
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<SatOverlayItem>(
overlayItems,
satIcon,
listener,
mainActivity
)
return@withContext ItemizedIconOverlay<SatItem>(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<GeoPoint>()
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<GeoPoint>()
private fun getSatFootprint(pass: SatPass): Overlay {
val rangeCircle = pass.predictor.getSatPos(dateNow).rangeCircle
val rangePoints = mutableListOf<GeoPoint>()
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 {

Wyświetl plik

@ -28,7 +28,7 @@
<color name="satTrack">#D50000</color>
<color name="satPrimary">#FFE082</color>
<color name="satSecondary">#80FFE082</color>
<color name="satTertiary">#26FFE082</color>
<color name="satOsmTemp">#26FFE082</color>
<!-- temp colors -->
<color name="shark">#202124</color>
<color name="shark_light">#2E2F32</color>